[iscsi-initiator-utils: 80/109] Resolves: #749051

Chris Leech cleech at fedoraproject.org
Tue Dec 10 21:26:07 UTC 2013


commit 19b05a07d4488385f767caa6fdfadf47d84c41be
Author: mchristi <mchristi at redhat.com>
Date:   Thu Oct 27 19:47:37 2011 +0000

    Resolves: #749051

 iscsi-initiator-utils-add-rh-ver.patch         |    2 +-
 iscsi-initiator-utils-sync-uio-0.7.0.14g.patch | 1486 ++++++++++++++++++++++++
 iscsi-initiator-utils.spec                     |   13 +-
 3 files changed, 1497 insertions(+), 4 deletions(-)
---
diff --git a/iscsi-initiator-utils-add-rh-ver.patch b/iscsi-initiator-utils-add-rh-ver.patch
index b463c72..77ffc58 100644
--- a/iscsi-initiator-utils-add-rh-ver.patch
+++ b/iscsi-initiator-utils-add-rh-ver.patch
@@ -5,7 +5,7 @@
   * some other maintainer could merge a patch without going through us
   */
 -#define ISCSI_VERSION_STR	"2.0-872"
-+#define ISCSI_VERSION_STR	"2.0-872.28.el6"
++#define ISCSI_VERSION_STR	"2.0-872.31.el6"
  #define ISCSI_VERSION_FILE	"/sys/module/scsi_transport_iscsi/version"
  
  #endif
diff --git a/iscsi-initiator-utils-sync-uio-0.7.0.14g.patch b/iscsi-initiator-utils-sync-uio-0.7.0.14g.patch
new file mode 100644
index 0000000..c19f851
--- /dev/null
+++ b/iscsi-initiator-utils-sync-uio-0.7.0.14g.patch
@@ -0,0 +1,1486 @@
+diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/RELEASE.TXT open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/RELEASE.TXT
+--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/RELEASE.TXT	2011-10-26 07:21:46.000000000 -0500
++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/RELEASE.TXT	2011-10-26 17:55:59.000000000 -0500
+@@ -1,7 +1,7 @@
+                               Release Notes
+                         Broadcom uIP Linux Driver
+                             Version 0.7.0.14
+-                               08/23/2011
++                               10/25/2011
+ 
+                           Broadcom Corporation
+                          5300 California Avenue,
+@@ -10,7 +10,7 @@
+                Copyright (c) 2004 - 2011 Broadcom Corporation
+                            All rights reserved
+ 
+-uIP v0.7.0.14 (Aug 23, 2011)
++uIP v0.7.0.14 (Oct 25, 2011)
+ =======================================================
+    Fixes
+    -----
+@@ -23,11 +23,56 @@ uIP v0.7.0.14 (Aug 23, 2011)
+       Change:  Adjusted the routine which seeks the device->net entry
+                to include more logic instead of hard waiting for 5s.
+ 
++   2. Problem: Cont00058256 - Sessions fail after loginstress to via
++               simultaneous ipv4 and ipv6 dhcp
++      Cause:   Switching between DHCPv4/v6 coupled with VLAN exposed
++               a drawback in our nic_iface architecture design where
++               VLAN is not specified by iscsid.
++      Change:  The code was optimized and improved the performance when
++               switching between DHCPv4/v6+VLAN.  However, the ultimate
++               fix is to make use of the net config parameters introduced
++               in the newer open-iscsi util which will identify the
++               specific VLAN nic_iface to use.
++
++   3. Problem: Cont00058602 - Can't iboot using IPv6 offload path
++      Cause:   The bug was exposed by a fix in 0.7.0.14c where the
++               IPv6 router solicitation timeout exceeded the nic
++               enable thread timeout.
++      Change:  The IPv6 router solicitation timeout has been adjusted
++
++   4. Problem: Cont00058678 - Can not iboot target from ipv6 path
++               using VLAN
++      Cause:   A bug was found in the path request path where the vlan
++               iface's protocol family was not used correctly in the
++               iface search
++      Change:  This has been corrected
++
++   5. Problem: Cont00058994 - DOS vulnerability in uip during UDP flood
++      Cause:   The warning messages from the UDP handler was logging
++               at a rate faster than the log file logrotate rate
++               Therefore, the system's OOM eventually got kicked in to
++               start terminating running processes which includes iscsiuio
++      Change:  Moved several UDP warning messages from the default log
++               level to the debug log level
++      Impact:  All (minor)
++
++   6. Problem: Cont00059288 - Show segfault w/ Xen kernel
++      Cause:   The bnx2x chip_id was not read correctly from the PCIe BAR1
++               under the Xen kernel.  The error was in the mmap area.
++      Change:  Corrected the mmapping of the PCI MMIO space.
++      Impact:  Xen kernels
++
+    Enhancements
+    ------------
+    1. Change:  Added support for RHEL6.2 for out-of-box release
+    2. Change:  Updated the man page with -h and -p info
+    3. Change:  Updated the -h info
++   4. Change:  Added support for bnx2x-1.71.00
++   5. Change:  Changed the log file open error to a warning and let
++               the daemon progress
++   6. Change:  Added oom_adjust call to prevent OOM Killer from killing
++               iscsiuio when memory is low
++   7. Change:  Added mlockall setting to prevent page swap
+ 
+ 
+ uIP v0.7.0.13 (Aug 10, 2011)
+diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/uip/uip.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/uip/uip.c
+--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/uip/uip.c	2011-10-26 07:21:27.000000000 -0500
++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/uip/uip.c	2011-10-26 17:55:59.000000000 -0500
+@@ -1300,7 +1300,7 @@ void uip_process(struct uip_stack *ustac
+ 		u16_t len = ntohs(ipv6_hdr->ip6_plen);
+ 		if (len <= ustack->uip_len) {
+ 		} else {
+-			LOG_WARN(PFX
++			LOG_DEBUG(PFX
+ 				 "ip: packet shorter than reported in IP header"
+ 				 ":IPv6_BUF(ustack)->len: %d ustack->uip_len: "
+ 				 "%d", len, ustack->uip_len);
+@@ -1312,7 +1312,7 @@ void uip_process(struct uip_stack *ustac
+ 			ustack->uip_len = (tcp_ipv4_hdr->len[0] << 8) +
+ 			    tcp_ipv4_hdr->len[1];
+ 		} else {
+-			LOG_WARN(PFX
++			LOG_DEBUG(PFX
+ 				 "ip: packet shorter than reported in IP header"
+ 				 ":tcp_ipv4_hdr->len: %d ustack->uip_len:%d.",
+ 				 (tcp_ipv4_hdr->len[0] << 8) +
+@@ -1505,7 +1505,7 @@ icmp_input:
+ 	if (UDPBUF(ustack)->udpchksum != 0 && uip_udpchksum(ustack) != 0xffff) {
+ 		++ustack->stats.udp.drop;
+ 		++ustack->stats.udp.chkerr;
+-		LOG_WARN(PFX "udp: bad checksum.");
++		LOG_DEBUG(PFX "udp: bad checksum.");
+ 		goto drop;
+ 	}
+ #else /* UIP_UDP_CHECKSUMS */
+diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/iscsid_ipc.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/iscsid_ipc.c
+--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/iscsid_ipc.c	2011-10-26 07:21:46.000000000 -0500
++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/iscsid_ipc.c	2011-10-26 17:55:59.000000000 -0500
+@@ -111,8 +111,8 @@ static void *enable_nic_thread(void *dat
+ 	LOG_INFO(PFX "%s: started NIC enable thread state: 0x%x",
+ 		 nic->log_name, nic->state)
+ 
+-	    /*  Enable the NIC */
+-	    nic_enable(nic);
++	/*  Enable the NIC */
++	nic_enable(nic);
+ 
+ 	pthread_exit(NULL);
+ }
+@@ -206,7 +206,7 @@ static int parse_iface(void *arg)
+ {
+ 	int rc;
+ 	nic_t *nic = NULL;
+-	nic_interface_t *nic_iface, *next_nic_iface;
++	nic_interface_t *nic_iface, *vlan_iface, *base_nic_iface;
+ 	char *transport_name;
+ 	size_t transport_name_size;
+ 	nic_lib_handle_t *handle;
+@@ -356,24 +356,22 @@ static int parse_iface(void *arg)
+ 	LOG_INFO(PFX "%s library set using transport_name %s",
+ 		 nic->log_name, transport_name);
+ 
+-	/*  Create the network interface if it doesn't exist */
+-	nic_iface = nic_find_nic_iface_protocol(nic, vlan, ipam.ip_type);
++	/*  Create the base network interface if it doesn't exist */
++	nic_iface = nic_find_nic_iface_protocol(nic, 0, ipam.ip_type);
+ 	if (nic_iface == NULL) {
+-		LOG_INFO(PFX "%s couldn't find VLAN %d interface with "
++		LOG_INFO(PFX "%s couldn't find interface with "
+ 			 "ip_type: 0x%x creating it",
+-			 nic->log_name, vlan, ipam.ip_type);
++			 nic->log_name, ipam.ip_type);
+ 
+-		/*  Create the vlan interface */
++		/*  Create the nic interface */
+ 		nic_iface = nic_iface_init();
+ 
+ 		if (nic_iface == NULL) {
+-			LOG_ERR(PFX "Couldn't allocate nic_iface for VLAN: %d",
+-				nic_iface, vlan);
++			LOG_ERR(PFX "Couldn't allocate nic_iface", nic_iface);
+ 			goto done;
+ 		}
+ 
+ 		nic_iface->protocol = ipam.ip_type;
+-		nic_iface->vlan_id = vlan;
+ 		nic_add_nic_iface(nic, nic_iface);
+ 
+ 		persist_all_nic_iface(nic);
+@@ -384,6 +382,37 @@ static int parse_iface(void *arg)
+ 			 nic->log_name);
+ 	}
+ 
++	set_nic_iface(nic, nic_iface);
++
++	/* Find the vlan nic_interface */
++	if (vlan) {
++		vlan_iface = nic_find_vlan_iface_protocol(nic, nic_iface, vlan,
++							  ipam.ip_type);
++		if (vlan_iface == NULL) {
++			LOG_INFO(PFX "%s couldn't find interface with VLAN = %d"
++				 "ip_type: 0x%x creating it",
++				 nic->log_name, vlan, ipam.ip_type);
++
++			/*  Create the nic interface */
++			vlan_iface = nic_iface_init();
++
++			if (vlan_iface == NULL) {
++				LOG_ERR(PFX "Couldn't allocate nic_iface for "
++					"VLAN: %d", vlan_iface, vlan);
++				goto done;
++			}
++
++			vlan_iface->protocol = ipam.ip_type;
++			vlan_iface->vlan_id = vlan;
++			nic_add_vlan_iface(nic, nic_iface, vlan_iface);
++		} else {
++			LOG_INFO(PFX "%s: using existing vlan interface",
++				 nic->log_name);
++		}
++		base_nic_iface = nic_iface;
++		nic_iface = vlan_iface;
++	}
++
+ 	/*  Determine how to configure the IP address */
+ 	if (ipam.ip_type == AF_INET) {
+ 		if (memcmp(&ipam.addr4,
+@@ -509,24 +538,27 @@ diff:
+ 	}
+ 
+ 	/* Configuration changed, do VLAN WA */
+-	next_nic_iface = nic_iface->next;
+-	while (next_nic_iface) {
+-		if (next_nic_iface->vlan_id) {
+-			/* TODO: When VLAN support is placed in the iface file
+-			* revisit this code */
+-			next_nic_iface->ustack.ip_config =
++	vlan_iface = nic_iface->vlan_next;
++	while (vlan_iface) {
++		/* TODO: When VLAN support is placed in the iface file
++		* revisit this code */
++		if (vlan_iface->ustack.ip_config) {
++			vlan_iface->ustack.ip_config =
+ 				nic_iface->ustack.ip_config;
+-			memcpy(next_nic_iface->ustack.hostaddr,
++			memcpy(vlan_iface->ustack.hostaddr,
+ 			       nic_iface->ustack.hostaddr,
+ 			       sizeof(nic_iface->ustack.hostaddr));
+-			memcpy(next_nic_iface->ustack.netmask,
++			memcpy(vlan_iface->ustack.netmask,
+ 			       nic_iface->ustack.netmask,
+ 			       sizeof(nic_iface->ustack.netmask));
+-			memcpy(next_nic_iface->ustack.hostaddr6,
++			memcpy(vlan_iface->ustack.hostaddr6,
+ 			       nic_iface->ustack.hostaddr6,
+ 			       sizeof(nic_iface->ustack.hostaddr6));
++			memcpy(vlan_iface->ustack.netmask6,
++			       nic_iface->ustack.netmask6,
++			       sizeof(nic_iface->ustack.netmask6));
+ 		}
+-		next_nic_iface = next_nic_iface->next;
++		vlan_iface = vlan_iface->vlan_next;
+ 	}
+ 
+ enable_nic:
+diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2.c
+--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2.c	2011-10-26 07:21:27.000000000 -0500
++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2.c	2011-10-26 17:55:59.000000000 -0500
+@@ -396,6 +396,7 @@ static bnx2_t *bnx2_alloc(nic_t * nic)
+ 	/*  Clear out the bnx2 contents */
+ 	memset(bp, 0, sizeof(*bp));
+ 
++	bp->bar0_fd = INVALID_FD;
+ 	bp->flags = BNX2_UIO_TX_HAS_SENT;
+ 
+ 	bp->parent = nic;
+@@ -417,6 +418,7 @@ static int bnx2_open(nic_t * nic)
+ 	__u32 val;
+ 	uint32_t tx_cid;
+ 	__u32 msix_vector = 0;
++	char sysfs_resc_path[80];
+ 
+ 	/*  Sanity Check: validate the parameters */
+ 	if (nic == NULL) {
+@@ -465,6 +467,14 @@ static int bnx2_open(nic_t * nic)
+ 	}
+ 	nic->uio_minor = minor(uio_stat.st_rdev);
+ 
++	cnic_get_sysfs_pci_resource_path(nic, 0, sysfs_resc_path, 80);
++	bp->bar0_fd = open(sysfs_resc_path, O_RDWR | O_SYNC);
++	if (bp->bar0_fd < 0) {
++		LOG_ERR(PFX "%s: Could not open %s", nic->log_name,
++			sysfs_resc_path);
++		return -ENODEV;
++	}
++
+ 	/*  TODO: hardcoded with the cnic driver */
+ 	bp->rx_ring_size = 3;
+ 	bp->rx_buffer_size = 0x400;
+@@ -498,7 +508,7 @@ static int bnx2_open(nic_t * nic)
+ 	mlock(bp->rx_pkt_ring, sizeof(void *) * bp->rx_ring_size);
+ 
+ 	bp->reg = mmap(NULL, 0x12800, PROT_READ | PROT_WRITE, MAP_SHARED,
+-		       nic->fd, (off_t) 0);
++		       bp->bar0_fd, (off_t) 0);
+ 	if (bp->reg == MAP_FAILED) {
+ 		LOG_INFO(PFX "%s: Couldn't mmap registers: %s",
+ 			 nic->log_name, strerror(errno));
+@@ -758,6 +768,11 @@ static int bnx2_uio_close_resources(nic_
+ 		bp->reg = NULL;
+ 	}
+ 
++	if (bp->bar0_fd != INVALID_FD) {
++		close(bp->bar0_fd);
++		bp->bar0_fd = INVALID_FD;
++	}
++
+ 	if (nic->fd != INVALID_FD) {
+ 		rc = close(nic->fd);
+ 		if (rc != 0) {
+diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2.h open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2.h
+--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2.h	2011-10-26 07:21:27.000000000 -0500
++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2.h	2011-10-26 17:55:59.000000000 -0500
+@@ -250,6 +250,7 @@ typedef struct bnx2 {
+ #define BNX2_UIO_TX_HAS_SENT		0x0002
+ #define BNX2_OPENED			0x0004
+ 
++	int bar0_fd;
+ 	void *reg;		/* Pointer to the mapped registers      */
+ 
+ 	__u32 tx_bidx_io;
+diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2x.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2x.c
+--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2x.c	2011-10-26 07:21:46.000000000 -0500
++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2x.c	2011-10-26 17:55:59.000000000 -0500
+@@ -77,9 +77,6 @@ static const char library_uio_name[] = "
+ static const char cnic_uio_sysfs_name_tempate[] = "/sys/class/uio/uio%i/name";
+ static const char bnx2x_uio_sysfs_name[] = "bnx2x_cnic";
+ 
+-static const char cnic_uio_sysfs_resc_tempate[] =
+-    "/sys/class/uio/uio%i/device/resource";
+-
+ /*******************************************************************************
+  * String constants used to display human readable adapter name
+  ******************************************************************************/
+@@ -377,7 +374,7 @@ error:
+ 
+ static inline int bnx2x_is_ver70(bnx2x_t *bp)
+ {
+-	return (bp->version.major == 1 && bp->version.minor == 70);
++	return (bp->version.major == 1 && bp->version.minor >= 70);
+ }
+ 
+ static inline int bnx2x_is_ver60(bnx2x_t * bp)
+@@ -506,44 +503,10 @@ static int bnx2x_uio_verify(nic_t * nic)
+ 
+ 	LOG_INFO(PFX "%s: Verified is a cnic_uio device", nic->log_name);
+ 
+-      error:
++error:
+ 	return rc;
+ }
+ 
+-static unsigned long cnic_get_bar2(nic_t * nic)
+-{
+-	char *raw = NULL, *raw_tmp;
+-	uint32_t raw_size = 0;
+-	char temp_path[sizeof(cnic_uio_sysfs_resc_tempate) + 8];
+-	int rc = 0, i, new_line;
+-	unsigned long bar = 0;
+-
+-	/*  Build the path to determine uio name */
+-	snprintf(temp_path, sizeof(temp_path),
+-		 cnic_uio_sysfs_resc_tempate, nic->uio_minor);
+-
+-	rc = capture_file(&raw, &raw_size, temp_path);
+-	if (rc != 0)
+-		return 0;
+-
+-	/* Skip 2 lines to get to BAR2 */
+-	raw_tmp = raw;
+-	i = 0;
+-	new_line = 0;
+-	while (i++ < raw_size && new_line < 2) {
+-		if (*raw_tmp == '\n')
+-			new_line++;
+-		raw_tmp++;
+-	}
+-
+-	if (new_line == 2)
+-		sscanf(raw_tmp, "%lx ", &bar);
+-
+-	free(raw);
+-
+-	return bar;
+-}
+-
+ /*******************************************************************************
+  * bnx2x Utility Functions to get to the hardware consumer indexes
+  ******************************************************************************/
+@@ -635,7 +598,8 @@ static bnx2x_t *bnx2x_alloc(nic_t * nic)
+ 	/*  Clear out the CNIC contents */
+ 	memset(bp, 0, sizeof(*bp));
+ 
+-	bp->mem_fd = INVALID_FD;
++	bp->bar0_fd = INVALID_FD;
++	bp->bar2_fd = INVALID_FD;
+ 
+ 	bp->parent = nic;
+ 	nic->priv = (void *)bp;
+@@ -657,9 +621,8 @@ static int bnx2x_open(nic_t * nic)
+ 	struct stat uio_stat;
+ 	int i, rc;
+ 	__u32 val;
+-	unsigned long bar2;
+ 	int count;
+-
++	char sysfs_resc_path[80];
+ 	uint32_t bus;
+ 	uint32_t slot;
+ 	uint32_t func;
+@@ -722,20 +685,37 @@ static int bnx2x_open(nic_t * nic)
+ 	}
+ 	nic->uio_minor = minor(uio_stat.st_rdev);
+ 
+-	bar2 = cnic_get_bar2(nic);
+-	if (bar2 == 0) {
+-		LOG_ERR(PFX "%s: Could not read BAR2", nic->log_name);
++	cnic_get_sysfs_pci_resource_path(nic, 0, sysfs_resc_path, 80);
++	bp->bar0_fd = open(sysfs_resc_path, O_RDWR | O_SYNC);
++	if (bp->bar0_fd < 0) {
++		LOG_ERR(PFX "%s: Could not open %s", nic->log_name,
++			sysfs_resc_path);
+ 		return -ENODEV;
+ 	}
+ 
+-	bp->mem_fd = open("/dev/mem", O_RDWR | O_SYNC);
+-	if (bp->mem_fd < 0) {
+-		LOG_ERR(PFX "%s: Could not open /dev/mem", nic->log_name);
++	bp->reg = mmap(NULL, BNX2X_BAR_SIZE, PROT_READ | PROT_WRITE,
++			MAP_SHARED, bp->bar0_fd, (off_t) 0);
++
++	if (bp->reg == MAP_FAILED) {
++		LOG_INFO(PFX "%s: Couldn't mmap BAR registers: %s",
++			 nic->log_name, strerror(errno));
++		bp->reg = NULL;
++		rc = errno;
++		goto open_error;
++	}
++
++	msync(bp->reg, BNX2X_BAR_SIZE, MS_SYNC);
++
++	cnic_get_sysfs_pci_resource_path(nic, 2, sysfs_resc_path, 80);
++	bp->bar2_fd = open(sysfs_resc_path, O_RDWR | O_SYNC);
++	if (bp->bar2_fd < 0) {
++		LOG_ERR(PFX "%s: Could not open %s", nic->log_name,
++			sysfs_resc_path);
+ 		return -ENODEV;
+ 	}
+ 
+ 	bp->reg2 = mmap(NULL, BNX2X_BAR2_SIZE, PROT_READ | PROT_WRITE,
+-			MAP_SHARED, bp->mem_fd, (off_t) bar2);
++			MAP_SHARED, bp->bar2_fd, (off_t) 0);
+ 
+ 	if (bp->reg2 == MAP_FAILED) {
+ 		LOG_INFO(PFX "%s: Couldn't mmap BAR2 registers: %s",
+@@ -768,18 +748,6 @@ static int bnx2x_open(nic_t * nic)
+ 		goto open_error;
+ 	}
+ 
+-	bp->reg = mmap(NULL, BNX2X_BAR_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
+-		       nic->fd, (off_t) 0);
+-	if (bp->reg == MAP_FAILED) {
+-		LOG_INFO(PFX "%s: Couldn't mmap registers: %s",
+-			 nic->log_name, strerror(errno));
+-		bp->reg = NULL;
+-		rc = errno;
+-		goto open_error;
+-	}
+-
+-	msync(bp->reg, BNX2X_BAR_SIZE, MS_SYNC);
+-
+ 	if (bnx2x_is_ver60_plus(bp))
+ 		bp->status_blk_size = sizeof(struct host_sp_status_block);
+ 	else if (bnx2x_is_ver52(bp))
+@@ -1036,9 +1004,14 @@ open_error:
+ 		bp->rx_pkt_ring = NULL;
+ 	}
+ 
+-	if (bp->mem_fd != INVALID_FD) {
+-		close(bp->mem_fd);
+-		bp->mem_fd = INVALID_FD;
++	if (bp->bar2_fd != INVALID_FD) {
++		close(bp->bar2_fd);
++		bp->bar2_fd = INVALID_FD;
++	}
++
++	if (bp->bar0_fd != INVALID_FD) {
++		close(bp->bar0_fd);
++		bp->bar0_fd = INVALID_FD;
+ 	}
+ 
+ 	return rc;
+@@ -1108,9 +1081,14 @@ static int bnx2x_uio_close_resources(nic
+ 		bp->reg2 = NULL;
+ 	}
+ 
+-	if (bp->mem_fd != INVALID_FD) {
+-		close(bp->mem_fd);
+-		bp->mem_fd = INVALID_FD;
++	if (bp->bar2_fd != INVALID_FD) {
++		close(bp->bar2_fd);
++		bp->bar2_fd = INVALID_FD;
++	}
++
++	if (bp->bar0_fd != INVALID_FD) {
++		close(bp->bar0_fd);
++		bp->bar0_fd = INVALID_FD;
+ 	}
+ 
+ 	if (nic->fd != INVALID_FD) {
+diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2x.h open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2x.h
+--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2x.h	2011-10-26 07:21:27.000000000 -0500
++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2x.h	2011-10-26 17:55:59.000000000 -0500
+@@ -574,7 +574,8 @@ typedef struct bnx2x {
+ 	void *reg;		/* Pointer to the BAR1 mapped registers */
+ 	void *reg2;		/* Pointer to the BAR2 mapped registers */
+ 
+-	int mem_fd;
++	int bar0_fd;
++	int bar2_fd;
+ 
+ 	__u32 chip_id;
+ 	__u32 shmem_base;
+diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/cnic.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/cnic.c
+--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/cnic.c	2011-10-26 07:21:46.000000000 -0500
++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/cnic.c	2011-10-26 17:55:59.000000000 -0500
+@@ -325,7 +325,7 @@ int cnic_handle_ipv4_iscsi_path_req(nic_
+ 				    struct iscsi_uevent *ev,
+ 				    struct iscsi_path *path)
+ {
+-	nic_interface_t *nic_iface;
++	nic_interface_t *nic_iface, *vlan_iface;
+ 	struct in_addr src_addr, dst_addr,
+ 	    src_matching_addr, dst_matching_addr, netmask;
+ 	__u8 mac_addr[6];
+@@ -338,18 +338,50 @@ int cnic_handle_ipv4_iscsi_path_req(nic_
+ 	pthread_mutex_lock(&nic_list_mutex);
+ 
+ 	/*  Find the proper interface via VLAN id */
+-	nic_iface = nic_find_nic_iface_protocol(nic, path->vlan_id, AF_INET);
++	nic_iface = nic_find_nic_iface_protocol(nic, 0, AF_INET);
+ 	if (nic_iface == NULL) {
+-		nic_iface = nic_find_nic_iface_protocol(nic, 0, AF_INET);
+-		if (nic_iface == NULL) {
+-			pthread_mutex_unlock(&nic_list_mutex);
+-			LOG_ERR(PFX "%s: Couldn't find net_iface vlan_id: %d",
+-				nic->log_name, path->vlan_id);
+-			return -EINVAL;
+-		}
++		pthread_mutex_unlock(&nic_list_mutex);
++		LOG_ERR(PFX "%s: Couldn't find net_iface vlan_id: %d",
++			nic->log_name, path->vlan_id);
++		return -EINVAL;
++	}
++	if (path->vlan_id) {
++		vlan_iface = nic_find_vlan_iface_protocol(nic, nic_iface,
++							  path->vlan_id,
++							  AF_INET);
++		if (vlan_iface == NULL) {
++			LOG_INFO(PFX "%s couldn't find interface with VLAN = %d"
++				 "ip_type: 0x%x creating it",
++				 nic->log_name, path->vlan_id, AF_INET);
++
++			/*  Create the nic interface */
++			vlan_iface = nic_iface_init();
++
++			if (vlan_iface == NULL) {
++				LOG_ERR(PFX "Couldn't allocate nic_iface for "
++					"VLAN: %d", vlan_iface,
++					path->vlan_id);
++				return -EINVAL;
++			}
+ 
+-		nic_iface->vlan_id = path->vlan_id;
++			vlan_iface->protocol = nic_iface->protocol;
++			vlan_iface->vlan_id = path->vlan_id;
++			vlan_iface->ustack.ip_config =
++						nic_iface->ustack.ip_config;
++			memcpy(vlan_iface->ustack.hostaddr,
++			       nic_iface->ustack.hostaddr,
++			       sizeof(nic_iface->ustack.hostaddr));
++			memcpy(vlan_iface->ustack.netmask,
++			       nic_iface->ustack.netmask,
++			       sizeof(nic_iface->ustack.netmask));
++			nic_add_vlan_iface(nic, nic_iface, vlan_iface);
++		} else {
++			LOG_INFO(PFX "%s: using existing vlan interface",
++				 nic->log_name);
++		}
++		nic_iface = vlan_iface;
+ 	}
++
+ #define MAX_ARP_RETRY 4
+ 
+ 	memcpy(&dst_addr, &path->dst.v4_addr, sizeof(dst_addr));
+@@ -364,6 +396,9 @@ int cnic_handle_ipv4_iscsi_path_req(nic_
+ 	src_matching_addr.s_addr = src_addr.s_addr & netmask.s_addr;
+ 	dst_matching_addr.s_addr = dst_addr.s_addr & netmask.s_addr;
+ 
++	LOG_DEBUG(PFX "%s: src=%s", nic->log_name, inet_ntoa(src_addr));
++	LOG_DEBUG(PFX "%s: dst=%s", nic->log_name, inet_ntoa(dst_addr));
++	LOG_DEBUG(PFX "%s: nm=%s", nic->log_name, inet_ntoa(netmask));
+ 	if (src_matching_addr.s_addr != dst_matching_addr.s_addr) {
+ 		/*  If there is an assigned gateway address then use it
+ 		 *  if the source address doesn't match */
+@@ -374,6 +409,7 @@ int cnic_handle_ipv4_iscsi_path_req(nic_
+ 			       sizeof(dst_addr));
+ 		} else {
+ 			arp_retry = MAX_ARP_RETRY;
++			LOG_DEBUG(PFX "%s: no default", nic->log_name);
+ 			goto done;
+ 		}
+ 	}
+@@ -473,7 +509,7 @@ int cnic_handle_ipv6_iscsi_path_req(nic_
+ 				    struct iscsi_uevent *ev,
+ 				    struct iscsi_path *path)
+ {
+-	nic_interface_t *nic_iface;
++	nic_interface_t *nic_iface, *vlan_iface;
+ 	__u8 mac_addr[6];
+ 	int rc, i;
+ 	uint16_t neighbor_retry;
+@@ -492,18 +528,49 @@ int cnic_handle_ipv6_iscsi_path_req(nic_
+ 	pthread_mutex_lock(&nic_list_mutex);
+ 
+ 	/*  Find the proper interface via VLAN id */
+-	nic_iface = nic_find_nic_iface_protocol(nic, path->vlan_id, AF_INET6);
++	nic_iface = nic_find_nic_iface_protocol(nic, 0, AF_INET6);
+ 	if (nic_iface == NULL) {
+-		nic_iface = nic_find_nic_iface_protocol(nic, 0, AF_INET6);
+-		if (nic_iface == NULL) {
+-			pthread_mutex_unlock(&nic_list_mutex);
+-			LOG_ERR(PFX "%s: Couldn't find net_iface vlan_id: %d",
+-				nic->log_name, path->vlan_id);
+-			return -EINVAL;
++		pthread_mutex_unlock(&nic_list_mutex);
++		LOG_ERR(PFX "%s: Couldn't find net_iface vlan_id: %d",
++			nic->log_name, path->vlan_id);
++		return -EINVAL;
++	}
++	if (path->vlan_id) {
++		vlan_iface = nic_find_vlan_iface_protocol(nic, nic_iface,
++							  path->vlan_id,
++							  AF_INET6);
++		if (vlan_iface == NULL) {
++			LOG_INFO(PFX "%s couldn't find interface with VLAN = %d"
++				 "ip_type: 0x%x creating it",
++				 nic->log_name, path->vlan_id, AF_INET6);
++
++			/*  Create the nic interface */
++			vlan_iface = nic_iface_init();
++
++			if (vlan_iface == NULL) {
++				LOG_ERR(PFX "Couldn't allocate nic_iface for "
++					"VLAN: %d", vlan_iface,
++					path->vlan_id);
++				return -EINVAL;
++			}
++			vlan_iface->protocol = nic_iface->protocol;
++			vlan_iface->vlan_id = path->vlan_id;
++			vlan_iface->ustack.ip_config =
++						nic_iface->ustack.ip_config;
++			memcpy(vlan_iface->ustack.hostaddr6,
++			       nic_iface->ustack.hostaddr6,
++			       sizeof(nic_iface->ustack.hostaddr6));
++			memcpy(vlan_iface->ustack.netmask6,
++			       nic_iface->ustack.netmask6,
++			       sizeof(nic_iface->ustack.netmask6));
++			nic_add_vlan_iface(nic, nic_iface, vlan_iface);
++		} else {
++			LOG_INFO(PFX "%s: using existing vlan interface",
++				 nic->log_name);
+ 		}
+-
+-		nic_iface->vlan_id = path->vlan_id;
++		nic_iface = vlan_iface;
+ 	}
++
+ 	/*  Depending on the IPv6 address of the target we will need to
+ 	 *  determine whether we use the assigned IPv6 address or the
+ 	 *  link local IPv6 address */
+diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/logger.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/logger.c
+--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/logger.c	2011-10-26 07:21:46.000000000 -0500
++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/logger.c	2011-10-26 17:55:59.000000000 -0500
+@@ -109,7 +109,7 @@ void log_uip(char *level_str, char *fmt,
+ 		fflush(stdout);
+ 	}
+ 
+-      end:
++end:
+ 	va_end(ap2);
+ 	va_end(ap);
+ 	pthread_mutex_unlock(&main_log.lock);
+@@ -129,17 +129,26 @@ int init_logger(char *filename)
+ 
+ 	pthread_mutex_lock(&main_log.lock);
+ 
++	if (opt.debug != DEBUG_ON) {
++		rc = -EIO;
++		goto disable;
++	}
+ 	main_log.fp = fopen(filename, "a");
+ 	if (main_log.fp == NULL) {
+ 		printf("Could not create log file: %s <%s>\n",
+ 		       filename, strerror(errno));
+ 		rc = -EIO;
+ 	}
+-	main_log.enabled = LOGGER_ENABLED;
++disable:
++	if (rc)
++		main_log.enabled = LOGGER_DISABLED;
++	else
++		main_log.enabled = LOGGER_ENABLED;
+ 
+ 	pthread_mutex_unlock(&main_log.lock);
+ 
+-	LOG_INFO("Initialize logger using log file: %s", filename);
++	if (!rc)
++		LOG_INFO("Initialize logger using log file: %s", filename);
+ 
+ 	return rc;
+ }
+diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/main.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/main.c
+--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/main.c	2011-10-26 07:21:46.000000000 -0500
++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/main.c	2011-10-26 17:55:59.000000000 -0500
+@@ -48,6 +48,7 @@
+ #include <sys/utsname.h>
+ #include <net/ethernet.h>
+ #include <arpa/inet.h>
++#include <sys/mman.h>
+ 
+ #include "uip.h"
+ #include "uip_arp.h"
+@@ -143,11 +144,9 @@ signal_wait:
+ retry:
+ 		fini_logger(SHUTDOWN_LOGGER);
+ 		rc = init_logger(main_log.log_file);
+-		if (rc != 0) {
++		if (rc != 0)
+ 			printf("Could not initialize the logger in "
+ 			       "signal!\n");
+-			goto retry;
+-		}
+ 		goto signal_wait;
+ 	default:
+ 		break;
+@@ -198,6 +197,38 @@ static void daemon_init()
+ 	rc = chdir("/");
+ }
+ 
++#define ISCSI_OOM_PATH_LEN 48
++
++int oom_adjust(void)
++{
++	int fd;
++	char path[ISCSI_OOM_PATH_LEN];
++	struct stat statb;
++
++	if (nice(-10) < 0)
++		LOG_DEBUG("Could not increase process priority: %s",
++			  strerror(errno));
++
++	snprintf(path, ISCSI_OOM_PATH_LEN, "/proc/%d/oom_score_adj", getpid());
++	if (stat(path, &statb)) {
++		/* older kernel so use old oom_adj file */
++		snprintf(path, ISCSI_OOM_PATH_LEN, "/proc/%d/oom_adj",
++			 getpid());
++	}
++	fd = open(path, O_WRONLY);
++	if (fd < 0)
++		return -1;
++	if (write(fd, "-16", 3) < 0) /* for 2.6.11 */
++		LOG_DEBUG("Could not set oom score to -16: %s",
++			  strerror(errno));
++	if (write(fd, "-17", 3) < 0) /* for Andrea's patch */
++		LOG_DEBUG("Could not set oom score to -17: %s",
++			  strerror(errno));
++	close(fd);
++	return 0;
++}
++
++
+ /*******************************************************************************
+  * Main routine
+  ******************************************************************************/
+@@ -250,10 +281,8 @@ int main(int argc, char *argv[])
+ 	if (main_log.enabled == LOGGER_ENABLED) {
+ 		/*  initialize the logger */
+ 		rc = init_logger(main_log.log_file);
+-		if (rc != 0) {
+-			printf("Could not initialize the logger\n");
+-			goto error;
+-		}
++		if (rc != 0 && opt.debug == DEBUG_ON)
++			printf("WARN: Could not initialize the logger\n");
+ 	}
+ 
+ 	LOG_INFO("Started iSCSI uio stack: Ver " PACKAGE_VERSION);
+@@ -348,6 +377,16 @@ int main(int argc, char *argv[])
+ 	/* Using sysfs to discover iSCSI hosts */
+ 	nic_discover_iscsi_hosts();
+ 
++	/* oom-killer will not kill us at the night... */
++	if (oom_adjust())
++		LOG_DEBUG("Can not adjust oom-killer's pardon");
++
++	/* we don't want our active sessions to be paged out... */
++	if (mlockall(MCL_CURRENT | MCL_FUTURE)) {
++		LOG_ERR("failed to mlockall, exiting...");
++		goto error;
++	}
++
+ 	/*  Start the iscsid listener */
+ 	rc = iscsid_start();
+ 	if (rc != 0) {
+diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic.c
+--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic.c	2011-10-26 07:21:46.000000000 -0500
++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic.c	2011-10-26 17:55:59.000000000 -0500
+@@ -440,7 +440,7 @@ int nic_remove(nic_t * nic)
+ 	nic_t *prev, *current;
+ 	struct stat file_stat;
+ 	void *res;
+-	nic_interface_t *nic_iface, *next_nic_iface;
++	nic_interface_t *nic_iface, *next_nic_iface, *vlan_iface;
+ 
+ 	pthread_mutex_lock(&nic->nic_mutex);
+ 
+@@ -505,6 +505,12 @@ int nic_remove(nic_t * nic)
+ 		   nic_iface */
+ 		nic_iface = nic->nic_iface;
+ 		while (nic_iface != NULL) {
++			vlan_iface = nic_iface->vlan_next;
++			while (vlan_iface != NULL) {
++				next_nic_iface = vlan_iface->vlan_next;
++				free(vlan_iface);
++				vlan_iface = next_nic_iface;
++			}
+ 			next_nic_iface = nic_iface->next;
+ 			free(nic_iface);
+ 			nic_iface = next_nic_iface;
+@@ -532,7 +538,7 @@ int nic_remove(nic_t * nic)
+ void nic_close(nic_t * nic, NIC_SHUTDOWN_T graceful, int clean)
+ {
+ 	int rc;
+-	nic_interface_t *nic_iface;
++	nic_interface_t *nic_iface, *vlan_iface;
+ 	struct stat file_stat;
+ 
+ 	/*  The NIC could be configured by the uIP config file
+@@ -559,8 +565,14 @@ void nic_close(nic_t * nic, NIC_SHUTDOWN
+ 	nic_iface = nic->nic_iface;
+ 	while (nic_iface != NULL) {
+ 		if (!((nic_iface->flags & NIC_IFACE_PERSIST) ==
+-		      NIC_IFACE_PERSIST))
++		      NIC_IFACE_PERSIST)) {
+ 			uip_reset(&nic_iface->ustack);
++			vlan_iface = nic_iface->vlan_next;
++			while (vlan_iface != NULL) {
++				uip_reset(&vlan_iface->ustack);
++				vlan_iface = vlan_iface->vlan_next;
++			}
++		}
+ 		nic_iface = nic_iface->next;
+ 	}
+ 
+@@ -608,12 +620,13 @@ nic_interface_t *nic_iface_init()
+ 
+ 	memset(nic_iface, 0, sizeof(*nic_iface));
+ 	nic_iface->next = NULL;
++	nic_iface->vlan_next = NULL;
+ 
+ 	return nic_iface;
+ }
+ 
+ /**
+- *  nic_add_net_iface() - This function is used to add an interface to the 
++ *  nic_add_nic_iface() - This function is used to add an interface to the
+  *                        nic structure
+  *  @param nic - struct nic device to add the interface to
+  *  @param nic_iface - network interface used to add to the nic
+@@ -632,7 +645,7 @@ int nic_add_nic_iface(nic_t * nic, nic_i
+ 
+ 		/*  Check to see if this interface already exists via 2
+ 		 *  conditions: 1) VLAN 2) protocol */
+-		while (current->next != NULL) {
++		while (current != NULL) {
+ 			if ((current->protocol == nic_iface->protocol) &&
+ 			    (current->vlan_id == nic_iface->vlan_id)) {
+ 				LOG_WARN(PFX "%s: nic interface alread exists"
+@@ -641,7 +654,6 @@ int nic_add_nic_iface(nic_t * nic, nic_i
+ 					 current->protocol);
+ 				goto error;
+ 			}
+-
+ 			current = current->next;
+ 		}
+ 
+@@ -668,6 +680,60 @@ error:
+ 	return 0;
+ }
+ 
++/**
++ *  nic_add_vlan_iface() - This function is used to add a vlan interface to the
++ *                         nic structure
++ *  @param nic - struct nic device to add the interface to
++ *  @param nic_iface - network interface to be added to
++ *  @param vlan_iface - vlan interface used to add to the nic_iface
++ *  @return 0 on success, <0 on failure
++ */
++int nic_add_vlan_iface(nic_t *nic, nic_interface_t *nic_iface,
++		       nic_interface_t *vlan_iface)
++{
++	pthread_mutex_lock(&nic->nic_mutex);
++
++	/*  Add the nic_interface */
++	if (nic_iface == NULL)
++		goto error;
++	else {
++		nic_interface_t *current = nic_iface->vlan_next;
++
++		/*  Check to see if this interface already exists via 2
++		 *  conditions: 1) VLAN 2) protocol */
++		while (current != NULL) {
++			if ((current->protocol == vlan_iface->protocol) &&
++			    (current->vlan_id == vlan_iface->vlan_id)) {
++				LOG_WARN(PFX "%s: vlan interface already exists"
++					 "for VLAN: %d, protocol: %d",
++					 nic->log_name, current->vlan_id,
++					 current->protocol);
++				goto error;
++			}
++			current = current->vlan_next;
++		}
++
++		/*   This interface doesn't exists, we can safely add
++		 *   this nic interface */
++		current = nic_iface;
++		while (current->vlan_next != NULL)
++			current = current->vlan_next;
++
++		current->vlan_next = vlan_iface;
++	}
++
++	/* Set nic_interface common fields */
++	vlan_iface->parent = nic;
++	nic->num_of_nic_iface++;
++
++	LOG_INFO(PFX "%s: Added vlan interface for VLAN: %d, protocol: %d",
++		 nic->log_name, vlan_iface->vlan_id, vlan_iface->protocol);
++
++error:
++	pthread_mutex_unlock(&nic->nic_mutex);
++
++	return 0;
++}
+ /******************************************************************************
+  * Routine to process interrupts from the NIC device
+  ******************************************************************************/
+@@ -944,6 +1010,7 @@ int process_packets(nic_t * nic,
+ 		uint16_t type = 0;
+ 		int af_type = 0;
+ 		struct uip_stack *ustack;
++		nic_interface_t *vlan_iface;
+ 
+ 		if ((pkt->vlan_tag == 0) ||
+ 		    (NIC_VLAN_STRIP_ENABLED & nic->flags)) {
+@@ -970,8 +1037,7 @@ int process_packets(nic_t * nic,
+ 
+ 		/*  check if we have the given VLAN interface */
+ 		if (nic_iface == NULL) {
+-			nic_iface = nic_find_nic_iface_protocol(nic,
+-								pkt->vlan_tag,
++			nic_iface = nic_find_nic_iface_protocol(nic, 0,
+ 								af_type);
+ 			if (nic_iface == NULL) {
+ 				LOG_INFO(PFX "%s: Couldn't find interface for "
+@@ -993,11 +1059,58 @@ int process_packets(nic_t * nic,
+ 				}
+ 
+ 				nic_iface->protocol = af_type;
+-				nic_iface->vlan_id = pkt->vlan_tag;
++				nic_iface->vlan_id = 0;
+ 				nic_add_nic_iface(nic, nic_iface);
+ 
+ 				persist_all_nic_iface(nic);
+ 			}
++			if (pkt->vlan_tag) {
++				vlan_iface = nic_find_vlan_iface_protocol(nic,
++						nic_iface, pkt->vlan_tag,
++						af_type);
++				if (vlan_iface == NULL) {
++					LOG_INFO(PFX "%s couldn't find "
++						 "interface with VLAN ="
++						 " %d ip_type: 0x%x "
++						 "creating it",
++						 nic->log_name, pkt->vlan_tag,
++						 af_type);
++
++					/*  Create the nic interface */
++					vlan_iface = nic_iface_init();
++
++					if (vlan_iface == NULL) {
++						LOG_ERR(PFX "Couldn't allocate "
++							"nic_iface for VLAN: %d",
++							vlan_iface,
++							pkt->vlan_tag);
++						rc = 0;
++						goto done;
++					}
++					vlan_iface->protocol = af_type;
++					vlan_iface->vlan_id = pkt->vlan_tag;
++					nic_add_vlan_iface(nic, nic_iface,
++							   vlan_iface);
++					/* TODO: When VLAN support is placed */
++					/* in the iface file revisit this */
++					/* code */
++					memcpy(vlan_iface->ustack.hostaddr,
++					       nic_iface->ustack.hostaddr,
++					    sizeof(nic_iface->ustack.hostaddr));
++					memcpy(vlan_iface->ustack.netmask,
++					       nic_iface->ustack.netmask,
++					     sizeof(nic_iface->ustack.netmask));
++					memcpy(vlan_iface->ustack.netmask6,
++					       nic_iface->ustack.netmask6,
++					    sizeof(nic_iface->ustack.netmask6));
++					memcpy(vlan_iface->ustack.hostaddr6,
++					       nic_iface->ustack.hostaddr6,
++					   sizeof(nic_iface->ustack.hostaddr6));
++
++					persist_all_nic_iface(nic);
++				}
++				nic_iface = vlan_iface;
++			}
+ 		}
+ 
+ 		pkt->nic_iface = nic_iface;
+@@ -1095,10 +1208,19 @@ static int process_dhcp_loop(nic_t * nic
+ 	struct timeval total_time;
+ 
+ 	/* 10s loop time to wait for DHCP */
+-	if (nic_iface->ustack.ip_config == IPV4_CONFIG_DHCP)
++	switch (nic_iface->ustack.ip_config) {
++	case IPV4_CONFIG_DHCP:
+ 		wait_time.tv_sec = 10;
+-	else
++		break;
++	case IPV6_CONFIG_DHCP:
+ 		wait_time.tv_sec = 15;
++		break;
++	case IPV6_CONFIG_STATIC:
++		wait_time.tv_sec = 4;
++		break;
++	default:
++		wait_time.tv_sec = 2;
++	}
+ 	wait_time.tv_usec = 0;
+ 
+ 	s = nic_iface->ustack.dhcpc;
+@@ -1177,7 +1299,6 @@ void *nic_loop(void *arg)
+ 	/*  Signal the device to enable itself */
+ 	pthread_mutex_lock(&nic->nic_mutex);
+ 	pthread_cond_signal(&nic->nic_loop_started_cond);
+-	pthread_mutex_unlock(&nic->nic_mutex);
+ 
+ 	while ((event_loop_stop == 0) &&
+ 	       !(nic->flags & NIC_EXIT_MAIN_LOOP) &&
+@@ -1189,16 +1310,17 @@ void *nic_loop(void *arg)
+ 				  nic->log_name);
+ 
+ 			/*  Wait for the device to be enabled */
+-			pthread_mutex_lock(&nic->nic_mutex);
++			/* nic_mutex is already locked */
+ 			pthread_cond_wait(&nic->enable_wait_cond,
+ 					  &nic->nic_mutex);
+-			pthread_mutex_unlock(&nic->nic_mutex);
+ 
+-			if (nic->state == NIC_EXIT)
++			if (nic->state == NIC_EXIT) {
++				pthread_mutex_unlock(&nic->nic_mutex);
+ 				pthread_exit(NULL);
+-
++			}
+ 			LOG_DEBUG(PFX "%s: is now enabled", nic->log_name);
+ 		}
++		pthread_mutex_unlock(&nic->nic_mutex);
+ 
+ 		/*  initialize the device to send/rec data */
+ 		rc = (*nic->ops->open) (nic);
+@@ -1407,7 +1529,7 @@ skip:
+ 				 nic->log_name,
+ 				 nic_iface->vlan_id, nic_iface->protocol);
+ 
+-			nic_iface = nic_iface->next;
++			nic_iface = nic_iface->vlan_next;
+ 		}
+ 
+ 		if (nic->flags & NIC_DISABLED) {
+@@ -1458,20 +1580,27 @@ dev_close:
+ 
+ 			nic->flags &= ~NIC_GOING_DOWN;
+ 		} else {
+-
+ 			pthread_mutex_destroy(&nic->xmit_mutex);
+ 			pthread_mutex_init(&nic->xmit_mutex, NULL);
+ 
+ 			if (nic->flags & NIC_RESET_UIP) {
+ 				nic_interface_t *nic_iface = nic->nic_iface;
++				nic_interface_t *vlan_iface;
+ 				while (nic_iface != NULL) {
+ 					LOG_INFO(PFX "%s: resetting uIP stack",
+ 						 nic->log_name);
+ 					uip_reset(&nic_iface->ustack);
+-
++					vlan_iface = nic_iface->vlan_next;
++					while (vlan_iface != NULL) {
++						LOG_INFO(PFX "%s: resetting "
++							 "vlan uIP stack",
++							 nic->log_name);
++						uip_reset(&vlan_iface->ustack);
++						vlan_iface =
++							vlan_iface->vlan_next;
++					}
+ 					nic_iface = nic_iface->next;
+ 				}
+-
+ 				nic->flags &= ~NIC_RESET_UIP;
+ 			}
+ 		}
+@@ -1486,8 +1615,8 @@ dev_close:
+ 			/*  Signal we are done closing CNIC/UIO device */
+ 			pthread_cond_broadcast(&nic->disable_wait_cond);
+ 		}
+-		pthread_mutex_unlock(&nic->nic_mutex);
+ 	}
++	pthread_mutex_unlock(&nic->nic_mutex);
+ 
+ 	LOG_INFO(PFX "%s: nic loop thread exited", nic->log_name);
+ 
+diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic.h open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic.h
+--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic.h	2011-10-26 07:21:46.000000000 -0500
++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic.h	2011-10-26 17:55:59.000000000 -0500
+@@ -130,6 +130,7 @@ typedef struct nic_interface {
+ 	time_t start_time;
+ 
+ 	struct uip_stack ustack;
++	struct nic_interface *vlan_next;
+ } nic_interface_t;
+ 
+ /******************************************************************************
+@@ -302,11 +303,13 @@ typedef struct nic {
+ int load_all_nic_libraries();
+ 
+ nic_t *nic_init();
+-void nic_add(nic_t * nic);
+-int nic_remove(nic_t * nic);
++void nic_add(nic_t *nic);
++int nic_remove(nic_t *nic);
+ 
+-int nic_add_nic_iface(nic_t * nic, nic_interface_t * nic_iface);
+-int nic_process_intr(nic_t * nic, int discard_check);
++int nic_add_nic_iface(nic_t *nic, nic_interface_t *nic_iface);
++int nic_add_vlan_iface(nic_t *nic, nic_interface_t *nic_iface,
++		       nic_interface_t *vlan_iface);
++int nic_process_intr(nic_t *nic, int discard_check);
+ 
+ nic_interface_t *nic_iface_init();
+ 
+@@ -340,6 +343,10 @@ struct nic_interface *nic_find_nic_iface
+ struct nic_interface *nic_find_nic_iface_protocol(nic_t * nic,
+ 						  uint16_t vlan_id,
+ 						  uint16_t protocol);
++struct nic_interface *nic_find_vlan_iface_protocol(nic_t *nic,
++						   nic_interface_t *nic_iface,
++						   uint16_t vlan_id,
++						   uint16_t protocol);
+ int find_nic_lib_using_pci_id(uint32_t vendor, uint32_t device,
+ 			      uint32_t subvendor, uint32_t subdevice,
+ 			      nic_lib_handle_t ** handle,
+diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_nl.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_nl.c
+--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_nl.c	2011-10-26 07:21:46.000000000 -0500
++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_nl.c	2011-10-26 17:55:59.000000000 -0500
+@@ -329,7 +329,7 @@ static int ctldev_handle(char *data)
+ 
+ 	if (ev->type == ISCSI_KEVENT_PATH_REQ) {
+ 		struct timespec sleep_rem;
+-		nic_interface_t *nic_iface;
++		nic_interface_t *nic_iface, *vlan_iface;
+ 		uint16_t ip_type;
+ 
+ 		if (path->ip_addr_len == 4)
+@@ -339,52 +339,56 @@ static int ctldev_handle(char *data)
+ 		else
+ 			ip_type = 0;
+ 
+-		nic_iface = nic_find_nic_iface_protocol(nic, path->vlan_id,
+-							ip_type);
++		/* Find the parent nic_iface */
++		nic_iface = nic_find_nic_iface_protocol(nic, 0,	ip_type);
+ 		if (nic_iface == NULL) {
+-			nic_interface_t *default_iface;
+-			default_iface = nic_find_nic_iface_protocol(nic,
+-								    0, ip_type);
+-			if (default_iface == NULL) {
+-				LOG_ERR(PFX "%s: Couldn't find default iface "
+-					"vlan: %d ip_type: %d "
+-					"ip_addr_len: %d to clone",
+-					nic->log_name, path->vlan_id, ip_type,
+-					path->ip_addr_len);
+-				goto error;
+-			}
+-
+-			nic_iface = nic_iface_init();
+-			if (nic_iface == NULL) {
+-				LOG_ERR(PFX "%s: Couldn't allocate space for "
+-					"vlan: %d ip_type: %d "
+-					"ip_addr_len: %d",
+-					nic->log_name, path->vlan_id, ip_type,
+-					path->ip_addr_len);
+-
+-				goto error;
++			LOG_ERR(PFX "%s: Couldn't find nic iface "
++				"vlan: %d ip_type: %d "
++				"ip_addr_len: %d to clone",
++				nic->log_name, path->vlan_id, ip_type,
++				path->ip_addr_len);
++			goto error;
++		}
++		if (path->vlan_id) {
++			vlan_iface = nic_find_vlan_iface_protocol(nic,
++					nic_iface, path->vlan_id, ip_type);
++			if (vlan_iface == NULL) {
++				/* Create a vlan_iface */
++				vlan_iface = nic_iface_init();
++				if (vlan_iface == NULL) {
++					LOG_ERR(PFX "%s: Couldn't allocate "
++						"space for vlan: %d ip_type: "
++						"%d ip_addr_len: %d",
++						nic->log_name, path->vlan_id,
++						ip_type, path->ip_addr_len);
++					goto error;
++				}
++
++				vlan_iface->protocol = ip_type;
++				vlan_iface->vlan_id = path->vlan_id;
++				nic_add_vlan_iface(nic, nic_iface, vlan_iface);
++
++				/* TODO: When VLAN support is placed in */
++				/* the iface file revisit this code */
++				vlan_iface->ustack.ip_config =
++					nic_iface->ustack.ip_config;
++				memcpy(vlan_iface->ustack.hostaddr,
++				       nic_iface->ustack.hostaddr,
++				       sizeof(nic_iface->ustack.hostaddr));
++				memcpy(vlan_iface->ustack.netmask,
++				       nic_iface->ustack.netmask,
++				       sizeof(nic_iface->ustack.netmask));
++				memcpy(vlan_iface->ustack.netmask6,
++				       nic_iface->ustack.netmask6,
++				       sizeof(nic_iface->ustack.netmask6));
++				memcpy(vlan_iface->ustack.hostaddr6,
++				       nic_iface->ustack.hostaddr6,
++				       sizeof(nic_iface->ustack.hostaddr6));
++
++				persist_all_nic_iface(nic);
++				nic_disable(nic, 0);
++				nic_iface = vlan_iface;
+ 			}
+-
+-			nic_iface->protocol = ip_type;
+-			nic_iface->vlan_id = path->vlan_id;
+-			nic_add_nic_iface(nic, nic_iface);
+-
+-			/* TODO: When VLAN support is placed in the iface file
+-			 * revisit this code */
+-			nic_iface->ustack.ip_config =
+-			    default_iface->ustack.ip_config;
+-			memcpy(nic_iface->ustack.hostaddr,
+-			       default_iface->ustack.hostaddr,
+-			       sizeof(nic_iface->ustack.hostaddr));
+-			memcpy(nic_iface->ustack.netmask,
+-			       default_iface->ustack.netmask,
+-			       sizeof(nic_iface->ustack.netmask));
+-			memcpy(nic_iface->ustack.hostaddr6,
+-			       default_iface->ustack.hostaddr6,
+-			       sizeof(nic_iface->ustack.hostaddr6));
+-
+-			persist_all_nic_iface(nic);
+-			nic_disable(nic, 0);
+ 		}
+ 
+ 		/*  Force enable the NIC */
+diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_utils.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_utils.c
+--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_utils.c	2011-10-26 07:21:46.000000000 -0500
++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_utils.c	2011-10-26 17:55:59.000000000 -0500
+@@ -78,6 +78,8 @@ static const char host_template[] = "hos
+ static const char iscsi_host_path_template[] = "/sys/class/iscsi_host/host%d";
+ static const char iscsi_host_path_netdev_template[] =
+     "/sys/class/iscsi_host/host%d/netdev";
++static const char cnic_uio_sysfs_resc_template[] =
++	"/sys/class/uio/uio%i/device/resource%i";
+ 
+ /**
+  *  manually_trigger_uio_event() - If the uio file node doesn't exist then
+@@ -824,6 +826,15 @@ int nic_fill_name(nic_t * nic)
+ 	return 0;
+ }
+ 
++void cnic_get_sysfs_pci_resource_path(nic_t *nic, int resc_no,
++				      char *sys_path, size_t size)
++{
++	/*  Build the path to sysfs pci resource */
++	snprintf(sys_path, size,
++		 cnic_uio_sysfs_resc_template, nic->uio_minor, resc_no);
++
++}
++
+ void prepare_library(nic_t * nic)
+ {
+ 	int rc;
+@@ -925,13 +936,23 @@ int nic_enable(nic_t * nic)
+ 		rc = gettimeofday(&tp, NULL);
+ 		ts.tv_sec = tp.tv_sec;
+ 		ts.tv_nsec = tp.tv_usec * 1000;
+-		/* Changed the timeout to 10s to accommodate for DHCP
+-		   timeout */
+ 		ts.tv_sec += 10;
+ 
+-		/*  Wait for the device to be disabled */
++		/*  Wait for the device to be enabled */
+ 		rc = pthread_cond_timedwait(&nic->enable_done_cond,
+ 					    &nic->nic_mutex, &ts);
++#if 0
++		if (rc || !nic->flags & NIC_ENABLED) {
++			/* Give it one more shout */
++			pthread_cond_broadcast(&nic->enable_wait_cond);
++			rc = gettimeofday(&tp, NULL);
++			ts.tv_sec = tp.tv_sec;
++			ts.tv_nsec = tp.tv_usec * 1000;
++			ts.tv_sec += 5;
++			rc = pthread_cond_timedwait(&nic->enable_done_cond,
++						    &nic->nic_mutex, &ts);
++		}
++#endif
+ 		nic->flags &= ~NIC_ENABLED_PENDING;
+ 		pthread_mutex_unlock(&nic->nic_mutex);
+ 
+@@ -940,6 +961,24 @@ int nic_enable(nic_t * nic)
+ 		} else {
+ 			LOG_ERR(PFX "%s: waiting to finish nic_enable err:%s",
+ 				nic->log_name, strerror(rc));
++			/* Must clean up the ustack */
++			nic_interface_t *nic_iface = nic->nic_iface;
++			nic_interface_t *vlan_iface;
++			while (nic_iface != NULL) {
++				LOG_INFO(PFX "%s: resetting uIP stack",
++					 nic->log_name);
++				uip_reset(&nic_iface->ustack);
++				vlan_iface = nic_iface->vlan_next;
++				while (vlan_iface != NULL) {
++					LOG_INFO(PFX "%s: resetting "
++						 "vlan uIP stack",
++						 nic->log_name);
++					uip_reset(&vlan_iface->ustack);
++					vlan_iface =
++						vlan_iface->vlan_next;
++				}
++				nic_iface = nic_iface->next;
++			}
+ 		}
+ 
+ 		return rc;
+@@ -979,7 +1018,7 @@ int nic_disable(nic_t * nic, int going_d
+ 		rc = gettimeofday(&tp, NULL);
+ 		ts.tv_sec = tp.tv_sec;
+ 		ts.tv_nsec = tp.tv_usec * 1000;
+-		ts.tv_sec += 5;	/*  TODO: hardcoded wait for 2 seconds */
++		ts.tv_sec += 5;	/*  TODO: hardcoded wait for 5 seconds */
+ 
+ 		/*  Wait for the device to be disabled */
+ 		rc = pthread_cond_timedwait(&nic->disable_wait_cond,
+@@ -1087,7 +1126,7 @@ error:
+  */
+ void nic_set_all_nic_iface_mac_to_parent(nic_t * nic)
+ {
+-	nic_interface_t *current;
++	nic_interface_t *current, *vlan_current;
+ 
+ 	pthread_mutex_lock(&nic->nic_mutex);
+ 
+@@ -1097,6 +1136,11 @@ void nic_set_all_nic_iface_mac_to_parent
+ 		 *  adapter */
+ 		memcpy(current->mac_addr, nic->mac_addr, 6);
+ 
++		vlan_current = current->vlan_next;
++		while (vlan_current != NULL) {
++			memcpy(vlan_current->mac_addr, nic->mac_addr, 6);
++			vlan_current = vlan_current->vlan_next;
++		}
+ 		current = current->next;
+ 	}
+ 
+@@ -1286,20 +1330,80 @@ nic_interface_t *nic_find_nic_iface_prot
+ 
+ void persist_all_nic_iface(nic_t * nic)
+ {
+-	nic_interface_t *current;
++	nic_interface_t *current, *vlan_iface;
+ 
+ 	pthread_mutex_lock(&nic->nic_mutex);
+ 
+ 	current = nic->nic_iface;
+ 	while (current != NULL) {
+ 		current->flags |= NIC_IFACE_PERSIST;
+-
++		vlan_iface = current->vlan_next;
++		while (vlan_iface != NULL) {
++			vlan_iface->flags |= NIC_IFACE_PERSIST;
++			vlan_iface = vlan_iface->vlan_next;
++		}
+ 		current = current->next;
+ 	}
+ 
+ 	pthread_mutex_unlock(&nic->nic_mutex);
+ }
+ 
++/**
++ *  nic_find_vlan_iface_protocol() - This function is used to find an interface
++ *                                   from the NIC
++ *  @param nic_iface - Base NIC to look for the vlan interfaces
++ *  @param vlan_id - VLAN id to look for
++ *  @param protocol - either AF_INET or AF_INET6
++ *  @return nic_iface - if found network interface with the given VLAN ID
++ *                      if not found a NULL is returned
++ */
++nic_interface_t *nic_find_vlan_iface_protocol(nic_t *nic,
++					      nic_interface_t *nic_iface,
++					      uint16_t vlan_id,
++					      uint16_t protocol)
++{
++	nic_interface_t *current;
++
++	pthread_mutex_lock(&nic->nic_mutex);
++
++	current = nic_iface->vlan_next;
++	while (current != NULL) {
++		if ((current->vlan_id == vlan_id) &&
++		    (current->protocol == protocol)) {
++			pthread_mutex_unlock(&nic->nic_mutex);
++			return current;
++		}
++		current = current->vlan_next;
++	}
++
++	pthread_mutex_unlock(&nic->nic_mutex);
++	return NULL;
++}
++
++void set_nic_iface(nic_t *nic, nic_interface_t *nic_iface)
++{
++	nic_interface_t *current, *prev;
++
++	pthread_mutex_lock(&nic->nic_mutex);
++
++	if (nic->nic_iface == nic_iface)
++		goto done;
++
++	prev = nic->nic_iface;
++	current = nic->nic_iface->next;
++	while (current != NULL) {
++		if (current == nic_iface) {
++			prev->next = current->next;
++			current->next = nic->nic_iface;
++			nic->nic_iface = current;
++			goto done;
++		}
++		prev = current;
++		current = current->next;
++	}
++done:
++	pthread_mutex_unlock(&nic->nic_mutex);
++}
+ /*******************************************************************************
+  *  Packet management utility functions
+  ******************************************************************************/
+diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_utils.h open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_utils.h
+--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_utils.h	2011-10-26 07:21:46.000000000 -0500
++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_utils.h	2011-10-26 17:55:59.000000000 -0500
+@@ -68,12 +68,15 @@ void nic_fill_ethernet_header(nic_interf
+ 			      uint16_t ether_type);
+ 
+ nic_interface_t *nic_find_nic_iface(nic_t * nic, uint16_t vlan_id);
++void set_nic_iface(nic_t *nic, nic_interface_t *nic_iface);
+ 
+ void persist_all_nic_iface(nic_t * nic);
+ 
+ int add_vlan_interfaces(nic_t * nic);
+ 
+ int nic_verify_uio_sysfs_name(nic_t * nic);
++void cnic_get_sysfs_pci_resource_path(nic_t *nic, int resc_no,
++				      char *sys_path, size_t size);
+ void nic_close_all();
+ void nic_remove_all();
+ 
diff --git a/iscsi-initiator-utils.spec b/iscsi-initiator-utils.spec
index 986c784..0bd39cf 100644
--- a/iscsi-initiator-utils.spec
+++ b/iscsi-initiator-utils.spec
@@ -3,7 +3,7 @@
 Summary: iSCSI daemon and utility programs
 Name: iscsi-initiator-utils
 Version: 6.2.0.872
-Release: 30%{?dist}
+Release: 31%{?dist}
 Source0: http://people.redhat.com/mchristi/iscsi/rhel6.0/source/open-iscsi-2.0-872-rc4-bnx2i.tar.gz
 Source1: iscsid.init
 Source2: iscsidevs.init
@@ -49,8 +49,10 @@ Patch17: iscsi-initiator-utils-fix-ipv6-boot.patch
 Patch18: iscsi-initiator-utils-Add-Netconfig-support-through-libiscsi.patch
 # libiscsi offload support
 Patch19: iscsi-initiator-utils-libiscsi-to-support-offload.patch
+# sync iscsiuio to 0.7.0.14g
+Patch20: iscsi-initiator-utils-sync-uio-0.7.0.14g.patch
 # add rhel version info to iscsi tools
-Patch20: iscsi-initiator-utils-add-rh-ver.patch
+Patch21: iscsi-initiator-utils-add-rh-ver.patch
 
 Group: System Environment/Daemons
 License: GPLv2+
@@ -98,7 +100,8 @@ developing applications that use %{name}.
 %patch17 -p1 -b .fix-ipv6-boot
 %patch18 -p1 -b .Add-Netconfig-support-through-libiscsi
 %patch19 -p1 -b .libiscsi-to-support-offload
-%patch20 -p1 -b .add-rh-ver
+%patch20 -p1 -b .sync-uio-0.7.0.14g
+%patch21 -p1 -b .add-rh-ver
 
 %build
 cd utils/open-isns
@@ -224,6 +227,10 @@ fi
 %{_includedir}/libiscsi.h
 
 %changelog
+* Tue Oct 25 2011 Mike Christie <mcrhsit at redhat.com> 6.2.0.872.31
+- 749051 Sync iscsiuio to iscsiuio-0.7.0.14g to fix boot hang
+  when connection is lost during startup.
+
 * Tue Oct 18 2011 Mike Christie <mcrhsit at redhat.com> 6.2.0.872.30
 - 602959 rotate iscsiuio/brcm_iscsiuio log.
 


More information about the scm-commits mailing list