[SCSI] libfcoe: update FIP FCF D flag from advertisments
authorJoe Eykholt <jeykholt@cisco.com>
Fri, 11 Jun 2010 23:44:20 +0000 (16:44 -0700)
committerJames Bottomley <James.Bottomley@suse.de>
Tue, 27 Jul 2010 17:01:48 +0000 (12:01 -0500)
Allow the D flag (indicating that keep-alives are not needed) to
be updated dynamically from received FIP advertisements.

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 4893098..27c21ca 100644 (file)
@@ -769,18 +769,21 @@ static void fcoe_ctlr_recv_adv(struct fcoe_ctlr *fip, struct sk_buff *skb)
                list_add(&fcf->list, &fip->fcfs);
        } else {
                /*
-                * Flags in advertisements are ignored once the FCF is
-                * selected.  Flags in unsolicited advertisements are
-                * ignored after a usable solicited advertisement
-                * has been received.
+                * Update the FCF's keep-alive descriptor flags.
+                * Other flag changes from new advertisements are
+                * ignored after a solicited advertisement is
+                * received and the FCF is selectable (usable).
                 */
+               fcf->fd_flags = new.fd_flags;
+               if (!fcoe_ctlr_fcf_usable(fcf))
+                       fcf->flags = new.flags;
+
                if (fcf == fip->sel_fcf && !fcf->fd_flags) {
                        fip->ctlr_ka_time -= fcf->fka_period;
                        fip->ctlr_ka_time += new.fka_period;
                        if (time_before(fip->ctlr_ka_time, fip->timer.expires))
                                mod_timer(&fip->timer, fip->ctlr_ka_time);
-               } else if (!fcoe_ctlr_fcf_usable(fcf))
-                       fcf->flags = new.flags;
+               }
                fcf->fka_period = new.fka_period;
                memcpy(fcf->fcf_mac, new.fcf_mac, ETH_ALEN);
        }