File 0007-fipvlan-clean-up-state-machine-for-pfd_add.patch of Package fcoe-utils.3610
From 53a1a696c33fc64c76bd29831ed61c8e50fbc495 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Wed, 14 May 2014 16:01:10 +0200
Subject: fipvlan: clean up state machine for pfd_add
pfd_add just adds the fd to the internal list without any checking.
So use the 'fip_ready' flag to track this.
Signed-off-by: Hannes Reinecke <hare@suse.de>
---
fipvlan.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/fipvlan.c b/fipvlan.c
index 9f3b07d..a183233 100644
--- a/fipvlan.c
+++ b/fipvlan.c
@@ -398,10 +398,17 @@ static void rtnl_recv_newlink(struct nlmsghdr *nh)
/* already tracking, update operstate and return */
iff->running = running;
if (!iff->running) {
- pfd_remove(iff->ps);
+ if (iff->fip_ready) {
+ pfd_remove(iff->ps);
+ iff->fip_ready = false;
+ }
return;
}
- pfd_add(iff->ps);
+ if (iff->ps >= 0 && !iff->fip_ready) {
+ pfd_add(iff->ps);
+ iff->fip_ready = true;
+ }
+
if (!config.start)
return;
@@ -441,6 +448,7 @@ static void rtnl_recv_newlink(struct nlmsghdr *nh)
iff->ifindex = ifm->ifi_index;
iff->running = running;
iff->fip_ready = false;
+ iff->ps = -1;
if (ifla[IFLA_LINK])
iff->iflink = *(int *)RTA_DATA(ifla[IFLA_LINK]);
else
@@ -814,7 +822,8 @@ static int probe_fip_interface(struct iff *iff)
if (iff->req_sent)
return 0;
- if (!iff->fip_ready) {
+ if (iff->ps < 0) {
+ iff->fip_ready = false;
iff->ps = fip_socket(iff->ifindex, FIP_NONE);
if (iff->ps < 0) {
FIP_LOG_DBG("if %d not ready\n", iff->ifindex);
@@ -822,6 +831,8 @@ static int probe_fip_interface(struct iff *iff)
}
setsockopt(iff->ps, SOL_PACKET, PACKET_ORIGDEV,
&origdev, sizeof(origdev));
+ }
+ if (!iff->fip_ready) {
pfd_add(iff->ps);
iff->fip_ready = true;
}
--
1.8.4.5