[SCSI] libfc: Remove usage of the Scsi_Host's host_lock

This patch removes the use of the Scsi_Host's host_lock
within fc_queuecommand. It also removes the DEF_SCSI_QCMD
usage so that libfc has fully moved on to the new
queuecommand interface.

Signed-off-by: Robert Love <robert.w.love@intel.com>
Tested-by: Ross Brattain <ross.b.brattain@intel.com>
Reviewed-by: Nicholas A. Bellinger <nab@linux-iscsi.org>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
Robert Love 2011-01-28 16:04:29 -08:00 committed by James Bottomley
parent 925cedae2b
commit 04885b16a1

View file

@ -1789,15 +1789,14 @@ static inline int fc_fcp_lport_queue_ready(struct fc_lport *lport)
/** /**
* fc_queuecommand() - The queuecommand function of the SCSI template * fc_queuecommand() - The queuecommand function of the SCSI template
* @shost: The Scsi_Host that the command was issued to
* @cmd: The scsi_cmnd to be executed * @cmd: The scsi_cmnd to be executed
* @done: The callback function to be called when the scsi_cmnd is complete
* *
* This is the i/o strategy routine, called by the SCSI layer. This routine * This is the i/o strategy routine, called by the SCSI layer.
* is called with the host_lock held.
*/ */
static int fc_queuecommand_lck(struct scsi_cmnd *sc_cmd, void (*done)(struct scsi_cmnd *)) int fc_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *sc_cmd)
{ {
struct fc_lport *lport; struct fc_lport *lport = shost_priv(shost);
struct fc_rport *rport = starget_to_rport(scsi_target(sc_cmd->device)); struct fc_rport *rport = starget_to_rport(scsi_target(sc_cmd->device));
struct fc_fcp_pkt *fsp; struct fc_fcp_pkt *fsp;
struct fc_rport_libfc_priv *rpriv; struct fc_rport_libfc_priv *rpriv;
@ -1805,15 +1804,12 @@ static int fc_queuecommand_lck(struct scsi_cmnd *sc_cmd, void (*done)(struct scs
int rc = 0; int rc = 0;
struct fcoe_dev_stats *stats; struct fcoe_dev_stats *stats;
lport = shost_priv(sc_cmd->device->host);
rval = fc_remote_port_chkready(rport); rval = fc_remote_port_chkready(rport);
if (rval) { if (rval) {
sc_cmd->result = rval; sc_cmd->result = rval;
done(sc_cmd); sc_cmd->scsi_done(sc_cmd);
return 0; return 0;
} }
spin_unlock_irq(lport->host->host_lock);
if (!*(struct fc_remote_port **)rport->dd_data) { if (!*(struct fc_remote_port **)rport->dd_data) {
/* /*
@ -1821,7 +1817,7 @@ static int fc_queuecommand_lck(struct scsi_cmnd *sc_cmd, void (*done)(struct scs
* online * online
*/ */
sc_cmd->result = DID_IMM_RETRY << 16; sc_cmd->result = DID_IMM_RETRY << 16;
done(sc_cmd); sc_cmd->scsi_done(sc_cmd);
goto out; goto out;
} }
@ -1845,7 +1841,6 @@ static int fc_queuecommand_lck(struct scsi_cmnd *sc_cmd, void (*done)(struct scs
*/ */
fsp->cmd = sc_cmd; /* save the cmd */ fsp->cmd = sc_cmd; /* save the cmd */
fsp->rport = rport; /* set the remote port ptr */ fsp->rport = rport; /* set the remote port ptr */
sc_cmd->scsi_done = done;
/* /*
* set up the transfer length * set up the transfer length
@ -1886,11 +1881,8 @@ static int fc_queuecommand_lck(struct scsi_cmnd *sc_cmd, void (*done)(struct scs
rc = SCSI_MLQUEUE_HOST_BUSY; rc = SCSI_MLQUEUE_HOST_BUSY;
} }
out: out:
spin_lock_irq(lport->host->host_lock);
return rc; return rc;
} }
DEF_SCSI_QCMD(fc_queuecommand)
EXPORT_SYMBOL(fc_queuecommand); EXPORT_SYMBOL(fc_queuecommand);
/** /**