Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 92bd401b authored by Christoph Hellwig's avatar Christoph Hellwig Committed by James Bottomley
Browse files

[SCSI] libsas: sas_queuecommand doesnt need host_lock

parent fe2d1851
Loading
Loading
Loading
Loading
+3 −22
Original line number Original line Diff line number Diff line
@@ -182,27 +182,12 @@ int sas_queue_up(struct sas_task *task)
	return 0;
	return 0;
}
}


/**
int sas_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
 * 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 res = 0;
	int res = 0;
	struct domain_device *dev = cmd_to_domain_dev(cmd);
	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);
	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_ha_struct *sas_ha = dev->port->ha;
		struct sas_task *task;
		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 the device fell off, no sense in issuing commands */
		if (dev->gone) {
		if (dev->gone) {
			cmd->result = DID_BAD_TARGET << 16;
			cmd->result = DID_BAD_TARGET << 16;
			scsi_done(cmd);
			cmd->scsi_done(cmd);
			goto out;
			goto out;
		}
		}


@@ -228,7 +213,6 @@ static int sas_queuecommand_lck(struct scsi_cmnd *cmd,
		if (!task)
		if (!task)
			goto out;
			goto out;


		cmd->scsi_done = scsi_done;
		/* Queue up, Direct Mode or Task Collector Mode. */
		/* Queue up, Direct Mode or Task Collector Mode. */
		if (sas_ha->lldd_max_execute_num < 2)
		if (sas_ha->lldd_max_execute_num < 2)
			res = i->dft->lldd_execute_task(task, 1, GFP_ATOMIC);
			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) {
			if (res == -SAS_QUEUE_FULL) {
				cmd->result = DID_SOFT_ERROR << 16; /* retry */
				cmd->result = DID_SOFT_ERROR << 16; /* retry */
				res = 0;
				res = 0;
				scsi_done(cmd);
				cmd->scsi_done(cmd);
			}
			}
			goto out;
			goto out;
		}
		}
	}
	}
out:
out:
	spin_lock_irq(host->host_lock);
	return res;
	return res;
}
}


DEF_SCSI_QCMD(sas_queuecommand)

static void sas_eh_finish_cmd(struct scsi_cmnd *cmd)
static void sas_eh_finish_cmd(struct scsi_cmnd *cmd)
{
{
	struct sas_task *task = TO_SAS_TASK(cmd);
	struct sas_task *task = TO_SAS_TASK(cmd);