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

Commit b69ae0ae authored by Joe Eykholt's avatar Joe Eykholt Committed by James Bottomley
Browse files

[SCSI] libfcoe: fix checking of conflicting fabrics in fcoe_ctlr_select()



The check for conflicting fabrics in fcoe_ctlr_select()
ignores any FCFs that aren't usable.  This is a minor
problem now but becomes more pronounced after later patches.

Signed-off-by: default avatarJoe Eykholt <jeykholt@cisco.com>
Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent c47036a7
Loading
Loading
Loading
Loading
+10 −7
Original line number Original line Diff line number Diff line
@@ -1361,12 +1361,22 @@ static void fcoe_ctlr_select(struct fcoe_ctlr *fip)
{
{
	struct fcoe_fcf *fcf;
	struct fcoe_fcf *fcf;
	struct fcoe_fcf *best = NULL;
	struct fcoe_fcf *best = NULL;
	struct fcoe_fcf *first;

	first = list_first_entry(&fip->fcfs, struct fcoe_fcf, list);


	list_for_each_entry(fcf, &fip->fcfs, list) {
	list_for_each_entry(fcf, &fip->fcfs, list) {
		LIBFCOE_FIP_DBG(fip, "consider FCF for fab %16.16llx "
		LIBFCOE_FIP_DBG(fip, "consider FCF for fab %16.16llx "
				"VFID %d map %x val %d\n",
				"VFID %d map %x val %d\n",
				fcf->fabric_name, fcf->vfid,
				fcf->fabric_name, fcf->vfid,
				fcf->fc_map, fcoe_ctlr_mtu_valid(fcf));
				fcf->fc_map, fcoe_ctlr_mtu_valid(fcf));
		if (fcf->fabric_name != first->fabric_name ||
		    fcf->vfid != first->vfid ||
		    fcf->fc_map != first->fc_map) {
			LIBFCOE_FIP_DBG(fip, "Conflicting fabric, VFID, "
					"or FC-MAP\n");
			return NULL;
		}
		if (!fcoe_ctlr_fcf_usable(fcf)) {
		if (!fcoe_ctlr_fcf_usable(fcf)) {
			LIBFCOE_FIP_DBG(fip, "FCF for fab %16.16llx "
			LIBFCOE_FIP_DBG(fip, "FCF for fab %16.16llx "
					"map %x %svalid %savailable\n",
					"map %x %svalid %savailable\n",
@@ -1380,13 +1390,6 @@ static void fcoe_ctlr_select(struct fcoe_ctlr *fip)
			best = fcf;
			best = fcf;
			continue;
			continue;
		}
		}
		if (fcf->fabric_name != best->fabric_name ||
		    fcf->vfid != best->vfid ||
		    fcf->fc_map != best->fc_map) {
			LIBFCOE_FIP_DBG(fip, "Conflicting fabric, VFID, "
					"or FC-MAP\n");
			return;
		}
		if (fcf->pri < best->pri)
		if (fcf->pri < best->pri)
			best = fcf;
			best = fcf;
	}
	}