]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
Revert "bnx2fc: Fix kernel panic when deleting NPIV ports"
authorBob Picco <bob.picco@oracle.com>
Tue, 31 Jan 2012 19:46:18 +0000 (14:46 -0500)
committerBob Picco <bob.picco@oracle.com>
Thu, 2 Feb 2012 23:03:23 +0000 (18:03 -0500)
This reverts commit 49aa932d3fe9c6b175d30d9e9d575f532f650cfc.

drivers/scsi/bnx2fc/bnx2fc.h
drivers/scsi/bnx2fc/bnx2fc_fcoe.c
drivers/scsi/bnx2fc/bnx2fc_hwi.c

index 856fcbfbb7e96ca518e43b4a955503a63feebc5f..0a404bfb44feb9324522101898125aaabea43b83 100644 (file)
@@ -152,6 +152,7 @@ struct bnx2fc_percpu_s {
        spinlock_t fp_work_lock;
 };
 
+
 struct bnx2fc_hba {
        struct list_head link;
        struct cnic_dev *cnic;
@@ -178,7 +179,6 @@ struct bnx2fc_hba {
                #define BNX2FC_CTLR_INIT_DONE           1
                #define BNX2FC_CREATE_DONE              2
        struct fcoe_ctlr ctlr;
-       struct list_head vports;
        u8 vlan_enabled;
        int vlan_id;
        u32 next_conn_id;
@@ -232,11 +232,6 @@ struct bnx2fc_hba {
 
 #define bnx2fc_from_ctlr(fip) container_of(fip, struct bnx2fc_hba, ctlr)
 
-struct bnx2fc_lport {
-       struct list_head list;
-       struct fc_lport *lport;
-};
-
 struct bnx2fc_cmd_mgr {
        struct bnx2fc_hba *hba;
        u16 next_idx;
@@ -428,7 +423,6 @@ struct bnx2fc_work {
 struct bnx2fc_unsol_els {
        struct fc_lport *lport;
        struct fc_frame *fp;
-       struct bnx2fc_hba *hba;
        struct work_struct unsol_els_work;
 };
 
index bdf62a5fc192a5aaa3673b1d620a9749e4cb1427..ab255fbc7f36332f43583f7c546d459dd61fcbd0 100644 (file)
@@ -1225,7 +1225,6 @@ static int bnx2fc_interface_setup(struct bnx2fc_hba *hba,
        hba->ctlr.get_src_addr = bnx2fc_get_src_mac;
        set_bit(BNX2FC_CTLR_INIT_DONE, &hba->init_done);
 
-       INIT_LIST_HEAD(&hba->vports);
        rc = bnx2fc_netdev_setup(hba);
        if (rc)
                goto setup_err;
@@ -1262,15 +1261,8 @@ static struct fc_lport *bnx2fc_if_create(struct bnx2fc_hba *hba,
        struct fcoe_port        *port;
        struct Scsi_Host        *shost;
        struct fc_vport         *vport = dev_to_vport(parent);
-       struct bnx2fc_lport     *blport;
        int                     rc = 0;
 
-       blport = kzalloc(sizeof(struct bnx2fc_lport), GFP_KERNEL);
-       if (!blport) {
-               BNX2FC_HBA_DBG(hba->ctlr.lp, "Unable to alloc bnx2fc_lport\n");
-               return NULL;
-       }
-
        /* Allocate Scsi_Host structure */
        if (!npiv)
                lport = libfc_host_alloc(&bnx2fc_shost_template, sizeof(*port));
@@ -1279,7 +1271,7 @@ static struct fc_lport *bnx2fc_if_create(struct bnx2fc_hba *hba,
 
        if (!lport) {
                printk(KERN_ERR PFX "could not allocate scsi host structure\n");
-               goto free_blport;
+               return NULL;
        }
        shost = lport->host;
        port = lport_priv(lport);
@@ -1335,20 +1327,12 @@ static struct fc_lport *bnx2fc_if_create(struct bnx2fc_hba *hba,
        }
 
        bnx2fc_interface_get(hba);
-
-       spin_lock_bh(&hba->hba_lock);
-       blport->lport = lport;
-       list_add_tail(&blport->list, &hba->vports);
-       spin_unlock_bh(&hba->hba_lock);
-
        return lport;
 
 shost_err:
        scsi_remove_host(shost);
 lp_config_err:
        scsi_host_put(lport->host);
-free_blport:
-       kfree(blport);
        return NULL;
 }
 
@@ -1364,7 +1348,6 @@ static void bnx2fc_if_destroy(struct fc_lport *lport)
 {
        struct fcoe_port *port = lport_priv(lport);
        struct bnx2fc_hba *hba = port->priv;
-       struct bnx2fc_lport *blport, *tmp;
 
        BNX2FC_HBA_DBG(hba->ctlr.lp, "ENTERED bnx2fc_if_destroy\n");
        /* Stop the transmit retry timer */
@@ -1389,15 +1372,6 @@ static void bnx2fc_if_destroy(struct fc_lport *lport)
        /* Free memory used by statistical counters */
        fc_lport_free_stats(lport);
 
-       spin_lock_bh(&hba->hba_lock);
-       list_for_each_entry_safe(blport, tmp, &hba->vports, list) {
-               if (blport->lport == lport) {
-                       list_del(&blport->list);
-                       kfree(blport);
-               }
-       }
-       spin_unlock_bh(&hba->hba_lock);
-
        /* Release Scsi_Host */
        scsi_host_put(lport->host);
 
index 78baa46c39cd8a3275264ac1ce71d99e971c2e75..f756d5f85c7a70bd35814f994361e11d411e6b40 100644 (file)
@@ -480,36 +480,16 @@ int bnx2fc_send_session_destroy_req(struct bnx2fc_hba *hba,
        return rc;
 }
 
-static bool is_valid_lport(struct bnx2fc_hba *hba, struct fc_lport *lport)
-{
-       struct bnx2fc_lport *blport;
-
-       spin_lock_bh(&hba->hba_lock);
-       list_for_each_entry(blport, &hba->vports, list) {
-               if (blport->lport == lport) {
-                       spin_unlock_bh(&hba->hba_lock);
-                       return true;
-               }
-       }
-       spin_unlock_bh(&hba->hba_lock);
-       return false;
-
-}
-
-
 static void bnx2fc_unsol_els_work(struct work_struct *work)
 {
        struct bnx2fc_unsol_els *unsol_els;
        struct fc_lport *lport;
-       struct bnx2fc_hba *hba;
        struct fc_frame *fp;
 
        unsol_els = container_of(work, struct bnx2fc_unsol_els, unsol_els_work);
        lport = unsol_els->lport;
        fp = unsol_els->fp;
-       hba = unsol_els->hba;
-       if (is_valid_lport(hba, lport))
-               fc_exch_recv(lport, fp);
+       fc_exch_recv(lport, fp);
        kfree(unsol_els);
 }
 
@@ -519,7 +499,6 @@ void bnx2fc_process_l2_frame_compl(struct bnx2fc_rport *tgt,
 {
        struct fcoe_port *port = tgt->port;
        struct fc_lport *lport = port->lport;
-       struct bnx2fc_hba *hba = port->priv;
        struct bnx2fc_unsol_els *unsol_els;
        struct fc_frame_header *fh;
        struct fc_frame *fp;
@@ -580,7 +559,6 @@ void bnx2fc_process_l2_frame_compl(struct bnx2fc_rport *tgt,
                fr_eof(fp) = FC_EOF_T;
                fr_crc(fp) = cpu_to_le32(~crc);
                unsol_els->lport = lport;
-               unsol_els->hba = hba;
                unsol_els->fp = fp;
                INIT_WORK(&unsol_els->unsol_els_work, bnx2fc_unsol_els_work);
                queue_work(bnx2fc_wq, &unsol_els->unsol_els_work);