aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target/tcm_fc
diff options
context:
space:
mode:
authorMark Rustad <mark.d.rustad@intel.com>2013-04-22 12:49:55 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2013-04-25 04:05:28 -0400
commitd3682b1aeba088957a210e3abc2c71dba63d6def (patch)
tree49e8ceedd508668cdcf351fd411d4ec4168a2781 /drivers/target/tcm_fc
parent72438cddd6d39b293dbc37836a4d3e691d26c356 (diff)
tcm_fc: Check for aborted sequence
Add a check for an aborted sequence, which has a NULL sequence pointer, to avoid target crashes. The most relevant messages from the crash (entered from video capture) include: BUG: unable to handle kernel paging request at ffffffffffffffdf IP: [<ffffffffa02d514c>] fc_seq_send+0x3c/0x150 [libfc] ... Call Trace: [<ffffffffa0443de6>] ft_queue_data_in+0x266/0x560 [tcm_fc] Signed-off-by: Mark Rustad <mark.d.rustad@intel.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target/tcm_fc')
-rw-r--r--drivers/target/tcm_fc/tfc_io.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/target/tcm_fc/tfc_io.c b/drivers/target/tcm_fc/tfc_io.c
index b6fd4cf42840..e415af32115a 100644
--- a/drivers/target/tcm_fc/tfc_io.c
+++ b/drivers/target/tcm_fc/tfc_io.c
@@ -103,6 +103,13 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
103 use_sg = !(remaining % 4); 103 use_sg = !(remaining % 4);
104 104
105 while (remaining) { 105 while (remaining) {
106 struct fc_seq *seq = cmd->seq;
107
108 if (!seq) {
109 pr_debug("%s: Command aborted, xid 0x%x\n",
110 __func__, ep->xid);
111 break;
112 }
106 if (!mem_len) { 113 if (!mem_len) {
107 sg = sg_next(sg); 114 sg = sg_next(sg);
108 mem_len = min((size_t)sg->length, remaining); 115 mem_len = min((size_t)sg->length, remaining);
@@ -169,7 +176,7 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
169 f_ctl |= FC_FC_END_SEQ; 176 f_ctl |= FC_FC_END_SEQ;
170 fc_fill_fc_hdr(fp, FC_RCTL_DD_SOL_DATA, ep->did, ep->sid, 177 fc_fill_fc_hdr(fp, FC_RCTL_DD_SOL_DATA, ep->did, ep->sid,
171 FC_TYPE_FCP, f_ctl, fh_off); 178 FC_TYPE_FCP, f_ctl, fh_off);
172 error = lport->tt.seq_send(lport, cmd->seq, fp); 179 error = lport->tt.seq_send(lport, seq, fp);
173 if (error) { 180 if (error) {
174 /* XXX For now, initiator will retry */ 181 /* XXX For now, initiator will retry */
175 pr_err_ratelimited("%s: Failed to send frame %p, " 182 pr_err_ratelimited("%s: Failed to send frame %p, "