diff options
author | Christoph Hellwig <hch@lst.de> | 2005-11-29 15:36:16 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-29 16:03:01 -0500 |
commit | 238f9b063dcc9f23493a0d3fecca29fe332d4905 (patch) | |
tree | a2ddb44e978ade378774290a4fb697a232a890b6 /drivers | |
parent | 238f58d898df941aa9d1cb390fb27ff4febe8965 (diff) |
[PATCH] fix megaraid.c locking
This fixes locking in megaraid.c, namely:
(1) make sure megaraid_queue release the adapter lock by changing the
code to have a single return
(2) remove the errornous scsi_assign_lock call
Testing by Burton Windle.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Burton Windle <bwindle@fint.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/megaraid.c | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c index dfea346b00a5..f9792528e33f 100644 --- a/drivers/scsi/megaraid.c +++ b/drivers/scsi/megaraid.c | |||
@@ -380,23 +380,23 @@ megaraid_queue(Scsi_Cmnd *scmd, void (*done)(Scsi_Cmnd *)) | |||
380 | 380 | ||
381 | spin_lock_irqsave(&adapter->lock, flags); | 381 | spin_lock_irqsave(&adapter->lock, flags); |
382 | scb = mega_build_cmd(adapter, scmd, &busy); | 382 | scb = mega_build_cmd(adapter, scmd, &busy); |
383 | if (!scb) | ||
384 | goto out; | ||
383 | 385 | ||
384 | if(scb) { | 386 | scb->state |= SCB_PENDQ; |
385 | scb->state |= SCB_PENDQ; | 387 | list_add_tail(&scb->list, &adapter->pending_list); |
386 | list_add_tail(&scb->list, &adapter->pending_list); | ||
387 | 388 | ||
388 | /* | 389 | /* |
389 | * Check if the HBA is in quiescent state, e.g., during a | 390 | * Check if the HBA is in quiescent state, e.g., during a |
390 | * delete logical drive opertion. If it is, don't run | 391 | * delete logical drive opertion. If it is, don't run |
391 | * the pending_list. | 392 | * the pending_list. |
392 | */ | 393 | */ |
393 | if(atomic_read(&adapter->quiescent) == 0) { | 394 | if (atomic_read(&adapter->quiescent) == 0) |
394 | mega_runpendq(adapter); | 395 | mega_runpendq(adapter); |
395 | } | ||
396 | return 0; | ||
397 | } | ||
398 | spin_unlock_irqrestore(&adapter->lock, flags); | ||
399 | 396 | ||
397 | busy = 0; | ||
398 | out: | ||
399 | spin_unlock_irqrestore(&adapter->lock, flags); | ||
400 | return busy; | 400 | return busy; |
401 | } | 401 | } |
402 | 402 | ||
@@ -4677,7 +4677,6 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
4677 | 4677 | ||
4678 | adapter->flag = flag; | 4678 | adapter->flag = flag; |
4679 | spin_lock_init(&adapter->lock); | 4679 | spin_lock_init(&adapter->lock); |
4680 | scsi_assign_lock(host, &adapter->lock); | ||
4681 | 4680 | ||
4682 | host->cmd_per_lun = max_cmd_per_lun; | 4681 | host->cmd_per_lun = max_cmd_per_lun; |
4683 | host->max_sectors = max_sectors_per_io; | 4682 | host->max_sectors = max_sectors_per_io; |