Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 2094
b: refs/heads/master
c: 8fa728a
h: refs/heads/master
v: v3
  • Loading branch information
Jeff Garzik committed Jun 17, 2005
1 parent b4daa5c commit e5d001b
Show file tree
Hide file tree
Showing 20 changed files with 123 additions and 50 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3471c288036bf0835a82d0b1bbce2002f6e68390
refs/heads/master: 8fa728a26886f56a9ee10a44fea0ddda301d21c3
3 changes: 1 addition & 2 deletions trunk/Documentation/scsi/scsi_mid_low_api.txt
Original file line number Diff line number Diff line change
Expand Up @@ -936,8 +936,7 @@ Details:
*
* Returns SUCCESS if command aborted else FAILED
*
* Locks: struct Scsi_Host::host_lock held (with irqsave) on entry
* and assumed to be held on return.
* Locks: None held
*
* Calling context: kernel thread
*
Expand Down
5 changes: 0 additions & 5 deletions trunk/drivers/message/fusion/mptscsih.c
Original file line number Diff line number Diff line change
Expand Up @@ -1707,7 +1707,6 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
MPT_FRAME_HDR *mf;
u32 ctx2abort;
int scpnt_idx;
spinlock_t *host_lock = SCpnt->device->host->host_lock;

/* If we can't locate our host adapter structure, return FAILED status.
*/
Expand Down Expand Up @@ -1755,7 +1754,6 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)

hd->abortSCpnt = SCpnt;

spin_unlock_irq(host_lock);
if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK,
SCpnt->device->channel, SCpnt->device->id, SCpnt->device->lun,
ctx2abort, 2 /* 2 second timeout */)
Expand All @@ -1772,8 +1770,6 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
hd->tmPending = 0;
hd->tmState = TM_STATE_NONE;

spin_lock_irq(host_lock);

/* Unmap the DMA buffers, if any. */
if (SCpnt->use_sg) {
pci_unmap_sg(ioc->pcidev, (struct scatterlist *) SCpnt->request_buffer,
Expand All @@ -1789,7 +1785,6 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
mpt_free_msg_frame(ioc, mf);
return FAILED;
}
spin_lock_irq(host_lock);
return SUCCESS;
}

Expand Down
13 changes: 12 additions & 1 deletion trunk/drivers/s390/scsi/zfcp_scsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,7 @@ zfcp_port_lookup(struct zfcp_adapter *adapter, int channel, scsi_id_t id)
* FAILED - otherwise
*/
int
zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
__zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
{
int retval = SUCCESS;
struct zfcp_fsf_req *new_fsf_req, *old_fsf_req;
Expand Down Expand Up @@ -611,6 +611,17 @@ zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
return retval;
}

int
zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
{
int rc;
struct Scsi_Host *scsi_host = scpnt->device->host;
spin_lock_irq(scsi_host->host_lock);
rc = __zfcp_scsi_eh_abort_handler(scpnt);
spin_unlock_irq(scsi_host->host_lock);
return rc;
}

/*
* function: zfcp_scsi_eh_device_reset_handler
*
Expand Down
8 changes: 4 additions & 4 deletions trunk/drivers/scsi/aic7xxx/aic79xx_osm.c
Original file line number Diff line number Diff line change
Expand Up @@ -941,7 +941,7 @@ ahd_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
*/
cmd->scsi_done = scsi_done;

ahd_midlayer_entrypoint_lock(ahd, &flags);
ahd_lock(ahd, &flags);

/*
* Close the race of a command that was in the process of
Expand All @@ -955,7 +955,7 @@ ahd_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
ahd_cmd_set_transaction_status(cmd, CAM_REQUEUE_REQ);
ahd_linux_queue_cmd_complete(ahd, cmd);
ahd_schedule_completeq(ahd);
ahd_midlayer_entrypoint_unlock(ahd, &flags);
ahd_unlock(ahd, &flags);
return (0);
}
dev = ahd_linux_get_device(ahd, cmd->device->channel,
Expand All @@ -965,7 +965,7 @@ ahd_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
ahd_cmd_set_transaction_status(cmd, CAM_RESRC_UNAVAIL);
ahd_linux_queue_cmd_complete(ahd, cmd);
ahd_schedule_completeq(ahd);
ahd_midlayer_entrypoint_unlock(ahd, &flags);
ahd_unlock(ahd, &flags);
printf("%s: aic79xx_linux_queue - Unable to allocate device!\n",
ahd_name(ahd));
return (0);
Expand All @@ -979,7 +979,7 @@ ahd_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
dev->flags |= AHD_DEV_ON_RUN_LIST;
ahd_linux_run_device_queues(ahd);
}
ahd_midlayer_entrypoint_unlock(ahd, &flags);
ahd_unlock(ahd, &flags);
return (0);
}

Expand Down
4 changes: 4 additions & 0 deletions trunk/drivers/scsi/aic7xxx/aic7xxx_osm.c
Original file line number Diff line number Diff line change
Expand Up @@ -2249,6 +2249,8 @@ ahc_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag)
printf(" 0x%x", cmd->cmnd[cdb_byte]);
printf("\n");

spin_lock_irq(&ahc->platform_data->spin_lock);

/*
* First determine if we currently own this command.
* Start by searching the device queue. If not found
Expand Down Expand Up @@ -2503,6 +2505,8 @@ ahc_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag)
}
spin_lock_irq(&ahc->platform_data->spin_lock);
}

spin_unlock_irq(&ahc->platform_data->spin_lock);
return (retval);
}

Expand Down
15 changes: 14 additions & 1 deletion trunk/drivers/scsi/aic7xxx_old.c
Original file line number Diff line number Diff line change
Expand Up @@ -10585,7 +10585,7 @@ aic7xxx_panic_abort(struct aic7xxx_host *p, Scsi_Cmnd *cmd)
* Abort the current SCSI command(s).
*-F*************************************************************************/
static int
aic7xxx_abort(Scsi_Cmnd *cmd)
__aic7xxx_abort(Scsi_Cmnd *cmd)
{
struct aic7xxx_scb *scb = NULL;
struct aic7xxx_host *p;
Expand Down Expand Up @@ -10802,6 +10802,19 @@ aic7xxx_abort(Scsi_Cmnd *cmd)
return SUCCESS;
}

static int
aic7xxx_abort(Scsi_Cmnd *cmd)
{
int rc;

spin_lock_irq(cmd->device->host->host_lock);
rc = __aic7xxx_abort(cmd);
spin_unlock_irq(cmd->device->host->host_lock);

return rc;
}


/*+F*************************************************************************
* Function:
* aic7xxx_reset
Expand Down
14 changes: 13 additions & 1 deletion trunk/drivers/scsi/ibmmca.c
Original file line number Diff line number Diff line change
Expand Up @@ -2118,7 +2118,7 @@ static int ibmmca_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
return 0;
}

static int ibmmca_abort(Scsi_Cmnd * cmd)
static int __ibmmca_abort(Scsi_Cmnd * cmd)
{
/* Abort does not work, as the adapter never generates an interrupt on
* whatever situation is simulated, even when really pending commands
Expand Down Expand Up @@ -2225,6 +2225,18 @@ static int ibmmca_abort(Scsi_Cmnd * cmd)
}
}

static int ibmmca_abort(Scsi_Cmnd * cmd)
{
struct Scsi_Host *shpnt = cmd->device->host;
int rc;

spin_lock_irq(shpnt->host_lock);
rc = __ibmmca_abort(cmd);
spin_unlock_irq(shpnt->host_lock);

return rc;
}

static int ibmmca_host_reset(Scsi_Cmnd * cmd)
{
struct Scsi_Host *shpnt;
Expand Down
2 changes: 0 additions & 2 deletions trunk/drivers/scsi/ibmvscsi/ibmvscsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -874,9 +874,7 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd)
return FAILED;
}

spin_unlock_irq(hostdata->host->host_lock);
wait_for_completion(&evt->comp);
spin_lock_irq(hostdata->host->host_lock);

/* make sure we got a good response */
if (unlikely(srp_rsp.srp.generic.type != SRP_RSP_TYPE)) {
Expand Down
12 changes: 11 additions & 1 deletion trunk/drivers/scsi/in2000.c
Original file line number Diff line number Diff line change
Expand Up @@ -1671,7 +1671,7 @@ static int in2000_bus_reset(Scsi_Cmnd * cmd)
return SUCCESS;
}

static int in2000_abort(Scsi_Cmnd * cmd)
static int __in2000_abort(Scsi_Cmnd * cmd)
{
struct Scsi_Host *instance;
struct IN2000_hostdata *hostdata;
Expand Down Expand Up @@ -1792,6 +1792,16 @@ static int in2000_abort(Scsi_Cmnd * cmd)
return SUCCESS;
}

static int in2000_abort(Scsi_Cmnd * cmd)
{
int rc;

spin_lock_irq(cmd->device->host->host_lock);
rc = __in2000_abort(cmd);
spin_unlock_irq(cmd->device->host->host_lock);

return rc;
}


#define MAX_IN2000_HOSTS 3
Expand Down
24 changes: 12 additions & 12 deletions trunk/drivers/scsi/ipr.c
Original file line number Diff line number Diff line change
Expand Up @@ -3068,6 +3068,12 @@ static int ipr_cancel_op(struct scsi_cmnd * scsi_cmd)
ioa_cfg = (struct ipr_ioa_cfg *)scsi_cmd->device->host->hostdata;
res = scsi_cmd->device->hostdata;

/* If we are currently going through reset/reload, return failed.
* This will force the mid-layer to call ipr_eh_host_reset,
* which will then go to sleep and wait for the reset to complete
*/
if (ioa_cfg->in_reset_reload || ioa_cfg->ioa_is_dead)
return FAILED;
if (!res || (!ipr_is_gscsi(res) && !ipr_is_vset_device(res)))
return FAILED;

Expand Down Expand Up @@ -3118,23 +3124,17 @@ static int ipr_cancel_op(struct scsi_cmnd * scsi_cmd)
**/
static int ipr_eh_abort(struct scsi_cmnd * scsi_cmd)
{
struct ipr_ioa_cfg *ioa_cfg;
unsigned long flags;
int rc;

ENTER;
ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata;

/* If we are currently going through reset/reload, return failed. This will force the
mid-layer to call ipr_eh_host_reset, which will then go to sleep and wait for the
reset to complete */
if (ioa_cfg->in_reset_reload)
return FAILED;
if (ioa_cfg->ioa_is_dead)
return FAILED;
if (!scsi_cmd->device->hostdata)
return FAILED;
spin_lock_irqsave(scsi_cmd->device->host->host_lock, flags);
rc = ipr_cancel_op(scsi_cmd);
spin_unlock_irqrestore(scsi_cmd->device->host->host_lock, flags);

LEAVE;
return ipr_cancel_op(scsi_cmd);
return rc;
}

/**
Expand Down
7 changes: 7 additions & 0 deletions trunk/drivers/scsi/ips.c
Original file line number Diff line number Diff line change
Expand Up @@ -819,12 +819,15 @@ ips_eh_abort(Scsi_Cmnd * SC)
ips_ha_t *ha;
ips_copp_wait_item_t *item;
int ret;
unsigned long cpu_flags;
struct Scsi_Host *host;

METHOD_TRACE("ips_eh_abort", 1);

if (!SC)
return (FAILED);

host = SC->device->host;
ha = (ips_ha_t *) SC->device->host->hostdata;

if (!ha)
Expand All @@ -833,6 +836,8 @@ ips_eh_abort(Scsi_Cmnd * SC)
if (!ha->active)
return (FAILED);

IPS_LOCK_SAVE(host->host_lock, cpu_flags);

/* See if the command is on the copp queue */
item = ha->copp_waitlist.head;
while ((item) && (item->scsi_cmd != SC))
Expand All @@ -851,6 +856,8 @@ ips_eh_abort(Scsi_Cmnd * SC)
/* command must have already been sent */
ret = (FAILED);
}

IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags);
return ret;
}

Expand Down
12 changes: 11 additions & 1 deletion trunk/drivers/scsi/lpfc/lpfc_scsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -798,7 +798,7 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *))
}

static int
lpfc_abort_handler(struct scsi_cmnd *cmnd)
__lpfc_abort_handler(struct scsi_cmnd *cmnd)
{
struct lpfc_hba *phba =
(struct lpfc_hba *)cmnd->device->host->hostdata[0];
Expand Down Expand Up @@ -917,6 +917,16 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd)
return ret == IOCB_SUCCESS ? SUCCESS : FAILED;
}

static int
lpfc_abort_handler(struct scsi_cmnd *cmnd)
{
int rc;
spin_lock_irq(cmnd->device->host->host_lock);
rc = __lpfc_abort_handler(cmnd);
spin_unlock_irq(cmnd->device->host->host_lock);
return rc;
}

static int
lpfc_reset_lun_handler(struct scsi_cmnd *cmnd)
{
Expand Down
17 changes: 16 additions & 1 deletion trunk/drivers/scsi/megaraid/megaraid_mbox.c
Original file line number Diff line number Diff line change
Expand Up @@ -2566,7 +2566,7 @@ megaraid_mbox_dpc(unsigned long devp)
* aborted. All the commands issued to the F/W must complete.
**/
static int
megaraid_abort_handler(struct scsi_cmnd *scp)
__megaraid_abort_handler(struct scsi_cmnd *scp)
{
adapter_t *adapter;
mraid_device_t *raid_dev;
Expand Down Expand Up @@ -2699,6 +2699,21 @@ megaraid_abort_handler(struct scsi_cmnd *scp)
return FAILED;
}

static int
megaraid_abort_handler(struct scsi_cmnd *scp)
{
adapter_t *adapter;
int rc;

adapter = SCP2ADAPTER(scp);

spin_lock_irq(adapter->host_lock);
rc = __megaraid_abort_handler(scp);
spin_unlock_irq(adapter->host_lock);

return rc;
}


/**
* megaraid_reset_handler - device reset hadler for mailbox based driver
Expand Down
8 changes: 7 additions & 1 deletion trunk/drivers/scsi/qla1280.c
Original file line number Diff line number Diff line change
Expand Up @@ -1098,7 +1098,13 @@ qla1280_error_action(struct scsi_cmnd *cmd, enum action action)
static int
qla1280_eh_abort(struct scsi_cmnd * cmd)
{
return qla1280_error_action(cmd, ABORT_COMMAND);
int rc;

spin_lock_irq(cmd->device->host->host_lock);
rc = qla1280_error_action(cmd, ABORT_COMMAND);
spin_unlock_irq(cmd->device->host->host_lock);

return rc;
}

/**************************************************************************
Expand Down
2 changes: 0 additions & 2 deletions trunk/drivers/scsi/qla2xxx/qla_os.c
Original file line number Diff line number Diff line change
Expand Up @@ -476,7 +476,6 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
serial = cmd->serial_number;

/* Check active list for command command. */
spin_unlock_irq(ha->host->host_lock);
spin_lock(&ha->hardware_lock);
for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) {
sp = ha->outstanding_cmds[i];
Expand Down Expand Up @@ -516,7 +515,6 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
}
spin_lock(&ha->hardware_lock);
}
spin_lock_irq(ha->host->host_lock);

qla_printk(KERN_INFO, ha,
"scsi(%ld:%d:%d): Abort command issued -- %lx %x.\n", ha->host_no,
Expand Down
Loading

0 comments on commit e5d001b

Please sign in to comment.