Commit ab19d52b authored by Matthew Wilcox's avatar Matthew Wilcox Committed by James Bottomley

[SCSI] Simplify error handling a bit

 - to_do was never set to SYM_EH_DO_COMPLETE, so remove that code
 - move the spinlocks inside the common error handler code path
Signed-off-by: default avatarMatthew Wilcox <matthew@wil.cx>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent b6d105d7
...@@ -712,7 +712,6 @@ static void sym53c8xx_timer(unsigned long npref) ...@@ -712,7 +712,6 @@ static void sym53c8xx_timer(unsigned long npref)
* What we will do regarding the involved SCSI command. * What we will do regarding the involved SCSI command.
*/ */
#define SYM_EH_DO_IGNORE 0 #define SYM_EH_DO_IGNORE 0
#define SYM_EH_DO_COMPLETE 1
#define SYM_EH_DO_WAIT 2 #define SYM_EH_DO_WAIT 2
/* /*
...@@ -764,25 +763,18 @@ static int sym_eh_handler(int op, char *opname, struct scsi_cmnd *cmd) ...@@ -764,25 +763,18 @@ static int sym_eh_handler(int op, char *opname, struct scsi_cmnd *cmd)
dev_warn(&cmd->device->sdev_gendev, "%s operation started.\n", opname); dev_warn(&cmd->device->sdev_gendev, "%s operation started.\n", opname);
spin_lock_irq(cmd->device->host->host_lock);
/* This one is queued in some place -> to wait for completion */ /* This one is queued in some place -> to wait for completion */
FOR_EACH_QUEUED_ELEMENT(&np->busy_ccbq, qp) { FOR_EACH_QUEUED_ELEMENT(&np->busy_ccbq, qp) {
struct sym_ccb *cp = sym_que_entry(qp, struct sym_ccb, link_ccbq); struct sym_ccb *cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
if (cp->cmd == cmd) { if (cp->cmd == cmd) {
to_do = SYM_EH_DO_WAIT; to_do = SYM_EH_DO_WAIT;
goto prepare; break;
} }
} }
prepare: if (to_do == SYM_EH_DO_WAIT) {
/* Prepare stuff to either ignore, complete or wait for completion */
switch(to_do) {
default:
case SYM_EH_DO_IGNORE:
break;
case SYM_EH_DO_WAIT:
init_completion(&ep->done); init_completion(&ep->done);
/* fall through */
case SYM_EH_DO_COMPLETE:
ep->old_done = cmd->scsi_done; ep->old_done = cmd->scsi_done;
cmd->scsi_done = sym_eh_done; cmd->scsi_done = sym_eh_done;
SYM_UCMD_PTR(cmd)->eh_wait = ep; SYM_UCMD_PTR(cmd)->eh_wait = ep;
...@@ -818,9 +810,6 @@ static int sym_eh_handler(int op, char *opname, struct scsi_cmnd *cmd) ...@@ -818,9 +810,6 @@ static int sym_eh_handler(int op, char *opname, struct scsi_cmnd *cmd)
} }
ep->to_do = to_do; ep->to_do = to_do;
/* Complete the command with locks held as required by the driver */
if (to_do == SYM_EH_DO_COMPLETE)
sym_xpt_done2(np, cmd, DID_ABORT);
/* Wait for completion with locks released, as required by kernel */ /* Wait for completion with locks released, as required by kernel */
if (to_do == SYM_EH_DO_WAIT) { if (to_do == SYM_EH_DO_WAIT) {
...@@ -836,6 +825,7 @@ static int sym_eh_handler(int op, char *opname, struct scsi_cmnd *cmd) ...@@ -836,6 +825,7 @@ static int sym_eh_handler(int op, char *opname, struct scsi_cmnd *cmd)
if (ep->timed_out) if (ep->timed_out)
sts = -2; sts = -2;
} }
spin_unlock_irq(cmd->device->host->host_lock);
dev_warn(&cmd->device->sdev_gendev, "%s operation %s.\n", opname, dev_warn(&cmd->device->sdev_gendev, "%s operation %s.\n", opname,
sts==0 ? "complete" :sts==-2 ? "timed-out" : "failed"); sts==0 ? "complete" :sts==-2 ? "timed-out" : "failed");
return sts ? SCSI_FAILED : SCSI_SUCCESS; return sts ? SCSI_FAILED : SCSI_SUCCESS;
...@@ -847,46 +837,22 @@ static int sym_eh_handler(int op, char *opname, struct scsi_cmnd *cmd) ...@@ -847,46 +837,22 @@ static int sym_eh_handler(int op, char *opname, struct scsi_cmnd *cmd)
*/ */
static int sym53c8xx_eh_abort_handler(struct scsi_cmnd *cmd) static int sym53c8xx_eh_abort_handler(struct scsi_cmnd *cmd)
{ {
int rc; return sym_eh_handler(SYM_EH_ABORT, "ABORT", cmd);
spin_lock_irq(cmd->device->host->host_lock);
rc = sym_eh_handler(SYM_EH_ABORT, "ABORT", cmd);
spin_unlock_irq(cmd->device->host->host_lock);
return rc;
} }
static int sym53c8xx_eh_device_reset_handler(struct scsi_cmnd *cmd) static int sym53c8xx_eh_device_reset_handler(struct scsi_cmnd *cmd)
{ {
int rc; return sym_eh_handler(SYM_EH_DEVICE_RESET, "DEVICE RESET", cmd);
spin_lock_irq(cmd->device->host->host_lock);
rc = sym_eh_handler(SYM_EH_DEVICE_RESET, "DEVICE RESET", cmd);
spin_unlock_irq(cmd->device->host->host_lock);
return rc;
} }
static int sym53c8xx_eh_bus_reset_handler(struct scsi_cmnd *cmd) static int sym53c8xx_eh_bus_reset_handler(struct scsi_cmnd *cmd)
{ {
int rc; return sym_eh_handler(SYM_EH_BUS_RESET, "BUS RESET", cmd);
spin_lock_irq(cmd->device->host->host_lock);
rc = sym_eh_handler(SYM_EH_BUS_RESET, "BUS RESET", cmd);
spin_unlock_irq(cmd->device->host->host_lock);
return rc;
} }
static int sym53c8xx_eh_host_reset_handler(struct scsi_cmnd *cmd) static int sym53c8xx_eh_host_reset_handler(struct scsi_cmnd *cmd)
{ {
int rc; return sym_eh_handler(SYM_EH_HOST_RESET, "HOST RESET", cmd);
spin_lock_irq(cmd->device->host->host_lock);
rc = sym_eh_handler(SYM_EH_HOST_RESET, "HOST RESET", cmd);
spin_unlock_irq(cmd->device->host->host_lock);
return rc;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment