[SCSI] bnx2fc: Do not attempt destroying NPIV port twice
authorBhanu Prakash Gollapudi <bprakash@broadcom.com>
Fri, 5 Aug 2011 00:38:39 +0000 (17:38 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Sat, 27 Aug 2011 14:35:30 +0000 (08:35 -0600)
When NPIV ports are created/deleted rapidly there is a race condition between
bnx2fc_vport_destroy() from sysfs and bnx2fc_flogi_resp(), which could try to
delete the NPIV port from the list twice. Fix is to loop through the list of
NPIV ports to find a match, and only when it exists remove it.

Signed-off-by: Bhanu Prakash Gollapudi <bprakash@broadcom.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/bnx2fc/bnx2fc_fcoe.c

index 9e2bf398ff91e2015fcd79ac29666700f4b34f33..21792e7eaeb2cda8394811e399e1ee4a648369fb 100644 (file)
@@ -1028,8 +1028,20 @@ static int bnx2fc_vport_destroy(struct fc_vport *vport)
        struct fc_lport *n_port = shost_priv(shost);
        struct fc_lport *vn_port = vport->dd_data;
        struct fcoe_port *port = lport_priv(vn_port);
+       struct fc_lport *v_port;
+       bool found = false;
 
        mutex_lock(&n_port->lp_mutex);
+       list_for_each_entry(v_port, &n_port->vports, list)
+               if (v_port->vport == vport) {
+                       found = true;
+                       break;
+               }
+
+       if (!found) {
+               mutex_unlock(&n_port->lp_mutex);
+               return -ENOENT;
+       }
        list_del(&vn_port->list);
        mutex_unlock(&n_port->lp_mutex);
        queue_work(bnx2fc_wq, &port->destroy_work);