tcm_fc: Check for aborted sequence
authorMark Rustad <mark.d.rustad@intel.com>
Mon, 22 Apr 2013 16:49:55 +0000 (09:49 -0700)
committerNicholas Bellinger <nab@linux-iscsi.org>
Thu, 25 Apr 2013 08:05:28 +0000 (01:05 -0700)
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>
drivers/target/tcm_fc/tfc_io.c

index b6fd4cf428401a17f32c193f8c5633e216d7a669..e415af32115a80bd7927627e826731b2c8b461c3 100644 (file)
@@ -103,6 +103,13 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
        use_sg = !(remaining % 4);
 
        while (remaining) {
+               struct fc_seq *seq = cmd->seq;
+
+               if (!seq) {
+                       pr_debug("%s: Command aborted, xid 0x%x\n",
+                                __func__, ep->xid);
+                       break;
+               }
                if (!mem_len) {
                        sg = sg_next(sg);
                        mem_len = min((size_t)sg->length, remaining);
@@ -169,7 +176,7 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
                        f_ctl |= FC_FC_END_SEQ;
                fc_fill_fc_hdr(fp, FC_RCTL_DD_SOL_DATA, ep->did, ep->sid,
                               FC_TYPE_FCP, f_ctl, fh_off);
-               error = lport->tt.seq_send(lport, cmd->seq, fp);
+               error = lport->tt.seq_send(lport, seq, fp);
                if (error) {
                        /* XXX For now, initiator will retry */
                        pr_err_ratelimited("%s: Failed to send frame %p, "