Re: [RFC][PATCH 2/6] fnic: add fnic_scsi.c and fnic_io.h.

James Smart
2008-08-25T19:17:50Z

Mike Christie wrote:
> jeykholt@cisco.com wrote:
>> + * fnic_queuecommand
>> + * Routine to send a scsi cdb
>> + * Called with host_lock held and interrupts disabled.
>> + */
>> +int fnic_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
>> +{
>> + struct fc_lport *lp;
>> + struct fc_rport *rport;
>> + struct fnic_io_req *io_req;
>> + struct fnic *fnic;
>> + struct vnic_wq_copy *wq;
>> + int ret;
>> + u32 sg_count;
>> + unsigned long flags;
>> +
>> + rport = starget_to_rport(scsi_target(sc->device));
>> + ret = fc_remote_port_chkready(rport);
>> + if (ret) {
>> + sc->result = ret;
>> + done(sc);
>> + return 0;
>> + }
>> +
>> + lp = shost_priv(sc->device->host);
>> + if (lp->state != LPORT_ST_READY || !(lp->link_status & FC_LINK_UP)) {
>> + sc->result = DID_NO_CONNECT << 16;
>
> You should use SCSI_MLQUEUE_HOST_BUSY here, becuase we set the link
> status/state and then will block rports, if a io has passed the rport
> check then sees the updated state we will fail it when it should be
> requeued until the fc class decides what to do.

Are you sure ? I would assume that if you passed the chkready() test,
but still don't have connectivity to the device, you should be failing
it with a DID_NO_CONNECT. The chkready(), paired with the
fc_remote_port_delete()/blocked luns, should cover the temporary losses
of connectivity.

-- james s