cnic: Fix missing ISCSI_KEVENT_IF_DOWN message
authorMichael Chan <mchan@broadcom.com>
Tue, 3 Jun 2014 06:08:48 +0000 (23:08 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 3 Jun 2014 06:16:41 +0000 (23:16 -0700)
The iSCSI netlink message needs to be sent before the ulp_ops is cleared
as it is sent through a function pointer in the ulp_ops.  This bug
causes iscsid to not get the message when the bnx2i driver is unloaded.

Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/cnic.c

index 8da1060f03f023d9b0cfabd59579c01beaab85ad..a4b25bc7113a6fb1882ba6b0062dbc046eb15896 100644 (file)
@@ -608,6 +608,10 @@ static int cnic_unregister_device(struct cnic_dev *dev, int ulp_type)
                pr_err("%s: Bad type %d\n", __func__, ulp_type);
                return -EINVAL;
        }
+
+       if (ulp_type == CNIC_ULP_ISCSI)
+               cnic_send_nlmsg(cp, ISCSI_KEVENT_IF_DOWN, NULL);
+
        mutex_lock(&cnic_lock);
        if (rcu_dereference(cp->ulp_ops[ulp_type])) {
                RCU_INIT_POINTER(cp->ulp_ops[ulp_type], NULL);
@@ -620,9 +624,7 @@ static int cnic_unregister_device(struct cnic_dev *dev, int ulp_type)
        }
        mutex_unlock(&cnic_lock);
 
-       if (ulp_type == CNIC_ULP_ISCSI)
-               cnic_send_nlmsg(cp, ISCSI_KEVENT_IF_DOWN, NULL);
-       else if (ulp_type == CNIC_ULP_FCOE)
+       if (ulp_type == CNIC_ULP_FCOE)
                dev->fcoe_cap = NULL;
 
        synchronize_rcu();