forked from luck/tmp_suning_uos_patched
[SCSI] advansys: Enable interrupts earlier in queuecommand
Move as much as possible outside the critical section in queuecommand, eg: - Set the scsi_done field before acquiring the lock - Call asc_scsi_done after dropping the lock Also remove a comment suggesting we should enable interrupts (now we do) and do some minor reformatting for readability. Signed-off-by: Matthew Wilcox <matthew@wil.cx> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
349d2c4429
commit
b2a7a4ba04
@ -3176,23 +3176,24 @@ static void asc_scsi_done(struct scsi_cmnd *scp)
|
||||
* in the 'scp' result field.
|
||||
*/
|
||||
static int
|
||||
advansys_queuecommand(struct scsi_cmnd *scp, void (*done) (struct scsi_cmnd *))
|
||||
advansys_queuecommand(struct scsi_cmnd *scp, void (*done)(struct scsi_cmnd *))
|
||||
{
|
||||
struct Scsi_Host *shost;
|
||||
asc_board_t *boardp;
|
||||
ulong flags;
|
||||
struct Scsi_Host *shost = scp->device->host;
|
||||
asc_board_t *boardp = ASC_BOARDP(shost);
|
||||
unsigned long flags;
|
||||
int asc_res, result = 0;
|
||||
|
||||
shost = scp->device->host;
|
||||
boardp = ASC_BOARDP(shost);
|
||||
ASC_STATS(shost, queuecommand);
|
||||
|
||||
/* host_lock taken by mid-level prior to call but need to protect */
|
||||
/* against own ISR */
|
||||
spin_lock_irqsave(&boardp->lock, flags);
|
||||
|
||||
scp->scsi_done = done;
|
||||
|
||||
/*
|
||||
* host_lock taken by mid-level prior to call, but need
|
||||
* to protect against own ISR
|
||||
*/
|
||||
spin_lock_irqsave(&boardp->lock, flags);
|
||||
asc_res = asc_execute_scsi_cmnd(scp);
|
||||
spin_unlock_irqrestore(&boardp->lock, flags);
|
||||
|
||||
switch (asc_res) {
|
||||
case ASC_NOERROR:
|
||||
break;
|
||||
@ -3201,11 +3202,9 @@ advansys_queuecommand(struct scsi_cmnd *scp, void (*done) (struct scsi_cmnd *))
|
||||
break;
|
||||
case ASC_ERROR:
|
||||
default:
|
||||
/* Interrupts could be enabled here. */
|
||||
asc_scsi_done(scp);
|
||||
break;
|
||||
}
|
||||
spin_unlock_irqrestore(&boardp->lock, flags);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user