IB/srp: Process all error completions
authorBart Van Assche <bvanassche@acm.org>
Mon, 26 Nov 2012 10:16:40 +0000 (11:16 +0100)
committerRoland Dreier <roland@purestorage.com>
Sat, 1 Dec 2012 01:40:31 +0000 (17:40 -0800)
If the RDMA RC connection is closed, tell the SCSI mid-layer to
terminate all pending commands instead of only the first.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Acked-by: David Dillow <dillowda@ornl.gov>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/ulp/srp/ib_srp.c

index c288330..f0843ef 100644 (file)
@@ -1274,8 +1274,12 @@ static void srp_handle_qp_err(enum ib_wc_status wc_status,
                              enum ib_wc_opcode wc_opcode,
                              struct srp_target_port *target)
 {
-       shost_printk(KERN_ERR, target->scsi_host, PFX "failed %s status %d\n",
-                    wc_opcode & IB_WC_RECV ? "receive" : "send", wc_status);
+       if (!target->qp_in_error) {
+               shost_printk(KERN_ERR, target->scsi_host,
+                            PFX "failed %s status %d\n",
+                            wc_opcode & IB_WC_RECV ? "receive" : "send",
+                            wc_status);
+       }
        target->qp_in_error = true;
 }
 
@@ -1290,7 +1294,6 @@ static void srp_recv_completion(struct ib_cq *cq, void *target_ptr)
                        srp_handle_recv(target, &wc);
                } else {
                        srp_handle_qp_err(wc.status, wc.opcode, target);
-                       break;
                }
        }
 }
@@ -1307,7 +1310,6 @@ static void srp_send_completion(struct ib_cq *cq, void *target_ptr)
                        list_add(&iu->list, &target->free_tx);
                } else {
                        srp_handle_qp_err(wc.status, wc.opcode, target);
-                       break;
                }
        }
 }