[SCSI] bnx2fc: Call bnx2fc_return_rqe and bnx2fc_get_next_rqe with tgt lock held
authorNithin Sujir <nsujir@broadcom.com>
Fri, 18 Mar 2011 00:13:31 +0000 (17:13 -0700)
committerJames Bottomley <James.Bottomley@suse.de>
Wed, 23 Mar 2011 16:37:02 +0000 (11:37 -0500)
tgt lock is needed during -
        bnx2fc_return_rqe to protect the rq_prod_idx.
        bnx2fc_get_next_rqe to protect rq_cons_idx

Signed-off-by: Nithin Nayak Sujir <nsujir@broadcom.com>
Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: Bhanu Prakash Gollapudi <bprakash@broadcom.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/bnx2fc/bnx2fc_hwi.c

index 4f4096836742d6aab1331de14e777d1107bd4c29..3de1ce73bdd3afa64e3e9db6998871495900cfd5 100644 (file)
@@ -590,7 +590,10 @@ static void bnx2fc_process_unsol_compl(struct bnx2fc_rport *tgt, u16 wqe)
 
                num_rq = (frame_len + BNX2FC_RQ_BUF_SZ - 1) / BNX2FC_RQ_BUF_SZ;
 
+               spin_lock_bh(&tgt->tgt_lock);
                rq_data = (unsigned char *)bnx2fc_get_next_rqe(tgt, num_rq);
+               spin_unlock_bh(&tgt->tgt_lock);
+
                if (rq_data) {
                        buf = rq_data;
                } else {
@@ -603,8 +606,10 @@ static void bnx2fc_process_unsol_compl(struct bnx2fc_rport *tgt, u16 wqe)
                        }
 
                        for (i = 0; i < num_rq; i++) {
+                               spin_lock_bh(&tgt->tgt_lock);
                                rq_data = (unsigned char *)
                                           bnx2fc_get_next_rqe(tgt, 1);
+                               spin_unlock_bh(&tgt->tgt_lock);
                                len = BNX2FC_RQ_BUF_SZ;
                                memcpy(buf1, rq_data, len);
                                buf1 += len;
@@ -615,13 +620,15 @@ static void bnx2fc_process_unsol_compl(struct bnx2fc_rport *tgt, u16 wqe)
 
                if (buf != rq_data)
                        kfree(buf);
+               spin_lock_bh(&tgt->tgt_lock);
                bnx2fc_return_rqe(tgt, num_rq);
+               spin_unlock_bh(&tgt->tgt_lock);
                break;
 
        case FCOE_ERROR_DETECTION_CQE_TYPE:
                /*
-                *In case of error reporting CQE a single RQ entry
-                * is consumes.
+                * In case of error reporting CQE a single RQ entry
+                * is consumed.
                 */
                spin_lock_bh(&tgt->tgt_lock);
                num_rq = 1;
@@ -705,6 +712,7 @@ static void bnx2fc_process_unsol_compl(struct bnx2fc_rport *tgt, u16 wqe)
                 *In case of warning reporting CQE a single RQ entry
                 * is consumes.
                 */
+               spin_lock_bh(&tgt->tgt_lock);
                num_rq = 1;
                err_entry = (struct fcoe_err_report_entry *)
                             bnx2fc_get_next_rqe(tgt, 1);
@@ -717,6 +725,7 @@ static void bnx2fc_process_unsol_compl(struct bnx2fc_rport *tgt, u16 wqe)
                        err_entry->tx_buf_off, err_entry->rx_buf_off);
 
                bnx2fc_return_rqe(tgt, 1);
+               spin_unlock_bh(&tgt->tgt_lock);
                break;
 
        default: