Skip to content

Commit

Permalink
[SCSI] advansys: Enable interrupts earlier in queuecommand
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Matthew Wilcox authored and James Bottomley committed Oct 12, 2007
1 parent 349d2c4 commit b2a7a4b
Showing 1 changed file with 11 additions and 12 deletions.
23 changes: 11 additions & 12 deletions drivers/scsi/advansys.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
scp->scsi_done = done;

/* host_lock taken by mid-level prior to call but need to protect */
/* against own ISR */
/*
* 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;
asc_res = asc_execute_scsi_cmnd(scp);
spin_unlock_irqrestore(&boardp->lock, flags);

switch (asc_res) {
case ASC_NOERROR:
break;
Expand All @@ -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;
}
Expand Down

0 comments on commit b2a7a4b

Please sign in to comment.