On Fri, Sep 24, 2010 at 01:44:00PM -0700, Nicholas A. Bellinger wrote: > On Fri, 2010-09-24 at 08:41 -0500, Brian King wrote: > > On 09/23/2010 06:37 PM, Nicholas A. Bellinger wrote: > > > @@ -651,7 +655,6 @@ static inline void scsi_cmd_get_serial(struct Scsi_Host *host, struct scsi_cmnd > > > int scsi_dispatch_cmd(struct scsi_cmnd *cmd) > > > { > > > struct Scsi_Host *host = cmd->device->host; > > > - unsigned long flags = 0; > > > unsigned long timeout; > > > int rtn = 0; > > > > > > @@ -736,15 +739,11 @@ int scsi_dispatch_cmd(struct scsi_cmnd *cmd) > > > scsi_done(cmd); > > > goto out; > > > } > > > - > > > - spin_lock_irqsave(host->host_lock, flags); > > > /* > > > - * AK: unlikely race here: for some reason the timer could > > > - * expire before the serial number is set up below. > > > - * > > > - * TODO: kill serial or move to blk layer > > > + * Note that scsi_cmd_get_serial() used to be called here, but > > > + * now we expect the legacy SCSI LLDs that actually need this > > > + * to call it directly within their SHT->queuecommand() caller. > > > */ > > > - scsi_cmd_get_serial(host, cmd); > > > > > > if (unlikely(host->shost_state == SHOST_DEL)) { > > > cmd->result = (DID_NO_CONNECT << 16); > > > @@ -753,7 +752,7 @@ int scsi_dispatch_cmd(struct scsi_cmnd *cmd) > > > trace_scsi_dispatch_cmd_start(cmd); > > > rtn = host->hostt->queuecommand(cmd, scsi_done); > > > } > > > - spin_unlock_irqrestore(host->host_lock, flags); > > > + > > > if (rtn) { > > > trace_scsi_dispatch_cmd_error(cmd, rtn); > > > if (rtn != SCSI_MLQUEUE_DEVICE_BUSY && > > > > Are you planning a future revision that moves the acquiring of the host lock > > into the LLDD's queuecommand for all the other drivers you don't currently > > touch in this patch set? > > > > Hi Brian, > > I was under the impression that this would be unnecessary for the vast > majority of existing LLD drivers, but if you are aware of specific LLDs > that would still need the struct Scsi_Host->host_lock held in their > SHT->queuecommand() for whaterver reason please let me know and I would > be happy to include this into an RFCv4. > > Thanks for your comments! zfcp relies on having the interrupts disabled when calling queuecommand. Without the spin_lock_irqsave in scsi_dispatch_cmd, the locking in zfcp_fsf_send_fcp_command_task has to be changed from spin_lock(&qdio->req_q_lock) to spin_lock_irqsave. It is a simple change, but other drivers might have similar requirements. Christof -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html