[SCSI] libfcoe: fix checking of conflicting fabrics in fcoe_ctlr_select()
authorJoe Eykholt <jeykholt@cisco.com>
Wed, 1 Dec 2010 00:19:51 +0000 (16:19 -0800)
committerJames Bottomley <James.Bottomley@suse.de>
Tue, 21 Dec 2010 18:24:32 +0000 (12:24 -0600)
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: Joe Eykholt <jeykholt@cisco.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/fcoe/libfcoe.c

index 4d0be20cb73d23d50e3cdaae4b80c86f46bfda57..826c260f7951119765e22cf08436f0f7c472401e 100644 (file)
@@ -1361,12 +1361,22 @@ static void fcoe_ctlr_select(struct fcoe_ctlr *fip)
 {
        struct fcoe_fcf *fcf;
        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) {
                LIBFCOE_FIP_DBG(fip, "consider FCF for fab %16.16llx "
                                "VFID %d map %x val %d\n",
                                fcf->fabric_name, fcf->vfid,
                                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)) {
                        LIBFCOE_FIP_DBG(fip, "FCF for fab %16.16llx "
                                        "map %x %svalid %savailable\n",
@@ -1380,13 +1390,6 @@ static void fcoe_ctlr_select(struct fcoe_ctlr *fip)
                        best = fcf;
                        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)
                        best = fcf;
        }