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

Mike Christie
2008-08-25T18:41:29Z

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.