aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave C Boutcher <boutcher@cs.umn.edu>2006-03-23 14:47:07 -0500
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2006-04-13 11:13:16 -0400
commit9b833e428ad24dc7cec2c0c7e6898caa91449c95 (patch)
tree6b65f8372acb4829c01c58ac0890e05bd6e35354
parent18c49b8cd69c360735df2cc6eeeb2593c01a81e8 (diff)
[SCSI] ibmvscsi: prevent scsi commands being sent in invalid state
There is a window where we can be re-enabling an adapter, but still allow SCSI commands to be sent to the target. This fix sets our window (request_limit) to -1 as soon as we know the adapter is being reenabled, and closes a very teeny tiny window where we could set the window back to 1 before we grab a lock. Signed-off-by: Dave Boutcher <sleddog@us.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
-rw-r--r--drivers/scsi/ibmvscsi/ibmvscsi.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c
index eaefeddb2b4a..a279d0a8dff5 100644
--- a/drivers/scsi/ibmvscsi/ibmvscsi.c
+++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
@@ -853,14 +853,15 @@ static int send_srp_login(struct ibmvscsi_host_data *hostdata)
853 login->max_requested_initiator_to_target_iulen = sizeof(union srp_iu); 853 login->max_requested_initiator_to_target_iulen = sizeof(union srp_iu);
854 login->required_buffer_formats = 0x0006; 854 login->required_buffer_formats = 0x0006;
855 855
856 spin_lock_irqsave(hostdata->host->host_lock, flags);
856 /* Start out with a request limit of 1, since this is negotiated in 857 /* Start out with a request limit of 1, since this is negotiated in
857 * the login request we are just sending 858 * the login request we are just sending
858 */ 859 */
859 atomic_set(&hostdata->request_limit, 1); 860 atomic_set(&hostdata->request_limit, 1);
860 861
861 spin_lock_irqsave(hostdata->host->host_lock, flags);
862 rc = ibmvscsi_send_srp_event(evt_struct, hostdata); 862 rc = ibmvscsi_send_srp_event(evt_struct, hostdata);
863 spin_unlock_irqrestore(hostdata->host->host_lock, flags); 863 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
864 printk("ibmvscsic: sent SRP login\n");
864 return rc; 865 return rc;
865}; 866};
866 867
@@ -1179,6 +1180,7 @@ void ibmvscsi_handle_crq(struct viosrp_crq *crq,
1179 /* We need to re-setup the interpartition connection */ 1180 /* We need to re-setup the interpartition connection */
1180 printk(KERN_INFO 1181 printk(KERN_INFO
1181 "ibmvscsi: Re-enabling adapter!\n"); 1182 "ibmvscsi: Re-enabling adapter!\n");
1183 atomic_set(&hostdata->request_limit, -1);
1182 purge_requests(hostdata, DID_REQUEUE); 1184 purge_requests(hostdata, DID_REQUEUE);
1183 if (ibmvscsi_reenable_crq_queue(&hostdata->queue, 1185 if (ibmvscsi_reenable_crq_queue(&hostdata->queue,
1184 hostdata) == 0) 1186 hostdata) == 0)