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

Commit 35061e21 authored by Hiral Shah's avatar Hiral Shah Committed by Christoph Hellwig
Browse files

Fnic: Improper resue of exchange Ids



IOs belonging to an rport are aborted with Internal terminate option
when rport goes offline. Any new IO issued to the rport during this
time can reuse the terminated exchange which will cause inconsistent
state of the exchange between local port and remote port.

fc_rport_priv is set to RPORT_ST_DELETE before exchanges are aborted by
libfc. Not issuing amy more I/O requests when RPORT_ST_DELETE is set,
will avoid inconsistent state of the exchange between local port and
remote port.

- Increment fnic version from 1.6.0.13 to 1.6.0.14

Signed-off-by: default avatarHiral Shah <hishah@cisco.com>
Signed-off-by: default avatarSesidhar Baddela <sebaddel@cisco.com>
Signed-off-by: default avatarAnil Chintalapati <achintal@cisco.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 042b356a
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -39,7 +39,7 @@


#define DRV_NAME		"fnic"
#define DRV_NAME		"fnic"
#define DRV_DESCRIPTION		"Cisco FCoE HBA Driver"
#define DRV_DESCRIPTION		"Cisco FCoE HBA Driver"
#define DRV_VERSION		"1.6.0.13"
#define DRV_VERSION		"1.6.0.14"
#define PFX			DRV_NAME ": "
#define PFX			DRV_NAME ": "
#define DFX                     DRV_NAME "%d: "
#define DFX                     DRV_NAME "%d: "


+11 −0
Original line number Original line Diff line number Diff line
@@ -423,6 +423,7 @@ static int fnic_queuecommand_lck(struct scsi_cmnd *sc, void (*done)(struct scsi_
	int sg_count = 0;
	int sg_count = 0;
	unsigned long flags;
	unsigned long flags;
	unsigned long ptr;
	unsigned long ptr;
	struct fc_rport_priv *rdata;


	if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_IO_BLOCKED)))
	if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_IO_BLOCKED)))
		return SCSI_MLQUEUE_HOST_BUSY;
		return SCSI_MLQUEUE_HOST_BUSY;
@@ -436,6 +437,16 @@ static int fnic_queuecommand_lck(struct scsi_cmnd *sc, void (*done)(struct scsi_
		return 0;
		return 0;
	}
	}


	rdata = lp->tt.rport_lookup(lp, rport->port_id);
	if (!rdata || (rdata->rp_state == RPORT_ST_DELETE)) {
		FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
			"returning IO as rport is removed\n");
		atomic64_inc(&fnic_stats->misc_stats.rport_not_ready);
		sc->result = DID_NO_CONNECT;
		done(sc);
		return 0;
	}

	if (lp->state != LPORT_ST_READY || !(lp->link_up))
	if (lp->state != LPORT_ST_READY || !(lp->link_up))
		return SCSI_MLQUEUE_HOST_BUSY;
		return SCSI_MLQUEUE_HOST_BUSY;