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