diff options
-rw-r--r-- | drivers/target/tcm_fc/tcm_fc.h | 1 | ||||
-rw-r--r-- | drivers/target/tcm_fc/tfc_cmd.c | 10 | ||||
-rw-r--r-- | drivers/target/tcm_fc/tfc_io.c | 2 |
3 files changed, 11 insertions, 2 deletions
diff --git a/drivers/target/tcm_fc/tcm_fc.h b/drivers/target/tcm_fc/tcm_fc.h index 830657908db8..c5eb3c33c3db 100644 --- a/drivers/target/tcm_fc/tcm_fc.h +++ b/drivers/target/tcm_fc/tcm_fc.h | |||
@@ -122,6 +122,7 @@ struct ft_cmd { | |||
122 | /* Local sense buffer */ | 122 | /* Local sense buffer */ |
123 | unsigned char ft_sense_buffer[TRANSPORT_SENSE_BUFFER]; | 123 | unsigned char ft_sense_buffer[TRANSPORT_SENSE_BUFFER]; |
124 | u32 was_ddp_setup:1; /* Set only if ddp is setup */ | 124 | u32 was_ddp_setup:1; /* Set only if ddp is setup */ |
125 | u32 aborted:1; /* Set if aborted by reset or timeout */ | ||
125 | struct scatterlist *sg; /* Set only if DDP is setup */ | 126 | struct scatterlist *sg; /* Set only if DDP is setup */ |
126 | u32 sg_cnt; /* No. of item in scatterlist */ | 127 | u32 sg_cnt; /* No. of item in scatterlist */ |
127 | }; | 128 | }; |
diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c index 62dec9715ce5..a375f257aabc 100644 --- a/drivers/target/tcm_fc/tfc_cmd.c +++ b/drivers/target/tcm_fc/tfc_cmd.c | |||
@@ -121,6 +121,8 @@ int ft_queue_status(struct se_cmd *se_cmd) | |||
121 | struct fc_exch *ep; | 121 | struct fc_exch *ep; |
122 | size_t len; | 122 | size_t len; |
123 | 123 | ||
124 | if (cmd->aborted) | ||
125 | return 0; | ||
124 | ft_dump_cmd(cmd, __func__); | 126 | ft_dump_cmd(cmd, __func__); |
125 | ep = fc_seq_exch(cmd->seq); | 127 | ep = fc_seq_exch(cmd->seq); |
126 | lport = ep->lp; | 128 | lport = ep->lp; |
@@ -187,6 +189,8 @@ int ft_write_pending(struct se_cmd *se_cmd) | |||
187 | 189 | ||
188 | ft_dump_cmd(cmd, __func__); | 190 | ft_dump_cmd(cmd, __func__); |
189 | 191 | ||
192 | if (cmd->aborted) | ||
193 | return 0; | ||
190 | ep = fc_seq_exch(cmd->seq); | 194 | ep = fc_seq_exch(cmd->seq); |
191 | lport = ep->lp; | 195 | lport = ep->lp; |
192 | fp = fc_frame_alloc(lport, sizeof(*txrdy)); | 196 | fp = fc_frame_alloc(lport, sizeof(*txrdy)); |
@@ -252,10 +256,10 @@ static void ft_recv_seq(struct fc_seq *sp, struct fc_frame *fp, void *arg) | |||
252 | struct ft_cmd *cmd = arg; | 256 | struct ft_cmd *cmd = arg; |
253 | struct fc_frame_header *fh; | 257 | struct fc_frame_header *fh; |
254 | 258 | ||
255 | if (IS_ERR(fp)) { | 259 | if (unlikely(IS_ERR(fp))) { |
256 | /* XXX need to find cmd if queued */ | 260 | /* XXX need to find cmd if queued */ |
257 | cmd->seq = NULL; | 261 | cmd->seq = NULL; |
258 | transport_generic_free_cmd(&cmd->se_cmd, 0); | 262 | cmd->aborted = true; |
259 | return; | 263 | return; |
260 | } | 264 | } |
261 | 265 | ||
@@ -399,6 +403,8 @@ int ft_queue_tm_resp(struct se_cmd *se_cmd) | |||
399 | struct se_tmr_req *tmr = se_cmd->se_tmr_req; | 403 | struct se_tmr_req *tmr = se_cmd->se_tmr_req; |
400 | enum fcp_resp_rsp_codes code; | 404 | enum fcp_resp_rsp_codes code; |
401 | 405 | ||
406 | if (cmd->aborted) | ||
407 | return 0; | ||
402 | switch (tmr->response) { | 408 | switch (tmr->response) { |
403 | case TMR_FUNCTION_COMPLETE: | 409 | case TMR_FUNCTION_COMPLETE: |
404 | code = FCP_TMF_CMPL; | 410 | code = FCP_TMF_CMPL; |
diff --git a/drivers/target/tcm_fc/tfc_io.c b/drivers/target/tcm_fc/tfc_io.c index 2b693eefac55..dc7c0db26e20 100644 --- a/drivers/target/tcm_fc/tfc_io.c +++ b/drivers/target/tcm_fc/tfc_io.c | |||
@@ -81,6 +81,8 @@ int ft_queue_data_in(struct se_cmd *se_cmd) | |||
81 | void *from; | 81 | void *from; |
82 | void *to = NULL; | 82 | void *to = NULL; |
83 | 83 | ||
84 | if (cmd->aborted) | ||
85 | return 0; | ||
84 | ep = fc_seq_exch(cmd->seq); | 86 | ep = fc_seq_exch(cmd->seq); |
85 | lport = ep->lp; | 87 | lport = ep->lp; |
86 | cmd->seq = lport->tt.seq_start_next(cmd->seq); | 88 | cmd->seq = lport->tt.seq_start_next(cmd->seq); |