diff options
author | Christoph Hellwig <hch@infradead.org> | 2011-07-11 14:49:23 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2011-08-30 12:09:41 -0700 |
commit | 92bd401ba7248946a4215d65ae9b1993ae66db2c (patch) | |
tree | 14eefb08b7586e6c19ccdbbd0e6a77913798b3f6 /drivers | |
parent | fe2d1851e9dc69da8de5dfe3fc748d041c31e25a (diff) |
[SCSI] libsas: sas_queuecommand doesnt need host_lock
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/libsas/sas_scsi_host.c | 25 |
1 files changed, 3 insertions, 22 deletions
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c index eeba76cdf774..ba3acd416add 100644 --- a/drivers/scsi/libsas/sas_scsi_host.c +++ b/drivers/scsi/libsas/sas_scsi_host.c @@ -182,27 +182,12 @@ int sas_queue_up(struct sas_task *task) return 0; } -/** - * sas_queuecommand -- Enqueue a command for processing - * @parameters: See SCSI Core documentation - * - * Note: XXX: Remove the host unlock/lock pair when SCSI Core can - * call us without holding an IRQ spinlock... - */ -static int sas_queuecommand_lck(struct scsi_cmnd *cmd, - void (*scsi_done)(struct scsi_cmnd *)) - __releases(host->host_lock) - __acquires(dev->sata_dev.ap->lock) - __releases(dev->sata_dev.ap->lock) - __acquires(host->host_lock) +int sas_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) { int res = 0; struct domain_device *dev = cmd_to_domain_dev(cmd); - struct Scsi_Host *host = cmd->device->host; struct sas_internal *i = to_sas_internal(host->transportt); - spin_unlock_irq(host->host_lock); - { struct sas_ha_struct *sas_ha = dev->port->ha; struct sas_task *task; @@ -210,7 +195,7 @@ static int sas_queuecommand_lck(struct scsi_cmnd *cmd, /* If the device fell off, no sense in issuing commands */ if (dev->gone) { cmd->result = DID_BAD_TARGET << 16; - scsi_done(cmd); + cmd->scsi_done(cmd); goto out; } @@ -228,7 +213,6 @@ static int sas_queuecommand_lck(struct scsi_cmnd *cmd, if (!task) goto out; - cmd->scsi_done = scsi_done; /* Queue up, Direct Mode or Task Collector Mode. */ if (sas_ha->lldd_max_execute_num < 2) res = i->dft->lldd_execute_task(task, 1, GFP_ATOMIC); @@ -243,18 +227,15 @@ static int sas_queuecommand_lck(struct scsi_cmnd *cmd, if (res == -SAS_QUEUE_FULL) { cmd->result = DID_SOFT_ERROR << 16; /* retry */ res = 0; - scsi_done(cmd); + cmd->scsi_done(cmd); } goto out; } } out: - spin_lock_irq(host->host_lock); return res; } -DEF_SCSI_QCMD(sas_queuecommand) - static void sas_eh_finish_cmd(struct scsi_cmnd *cmd) { struct sas_task *task = TO_SAS_TASK(cmd); |