diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c
index 5ac5ffe..1b26432 100644
--- a/drivers/infiniband/core/device.c
+++ b/drivers/infiniband/core/device.c
@@ -57,6 +57,8 @@ struct ib_client_data {
 static LIST_HEAD(device_list);
 static LIST_HEAD(client_list);
 
+static atomic_t node_count;
+
 /*
  * device_mutex protects access to both device_list and client_list.
  * There's no real point to using multiple locks or something fancier
@@ -174,9 +176,17 @@ static int end_port(struct ib_device *device)
  */
 struct ib_device *ib_alloc_device(size_t size)
 {
+	struct ib_device *device;
+
 	BUG_ON(size < sizeof (struct ib_device));
 
-	return kzalloc(size, GFP_KERNEL);
+	device = kzalloc(size, GFP_KERNEL);
+
+	if (device != NULL) {
+		device->node_number = atomic_add_return(1, &node_count);
+	}
+
+	return device;
 }
 EXPORT_SYMBOL(ib_alloc_device);
 
diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c
index 0ed02b7..b3de8c7 100644
--- a/drivers/infiniband/hw/mlx4/mad.c
+++ b/drivers/infiniband/hw/mlx4/mad.c
@@ -34,6 +34,7 @@
 #include <rdma/ib_smi.h>
 
 #include <linux/mlx4/cmd.h>
+#include <linux/utsname.h>
 
 #include "mlx4_ib.h"
 
@@ -189,7 +190,23 @@ static void node_desc_override(struct ib_device *dev,
 	     mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) &&
 	    mad->mad_hdr.method == IB_MGMT_METHOD_GET_RESP &&
 	    mad->mad_hdr.attr_id == IB_SMP_ATTR_NODE_DESC) {
+		int len;
+		char *dot = strchr(init_utsname()->nodename, '.');
+
+		if (dot)
+			len = dot - init_utsname()->nodename;
+		else
+			len = strlen(init_utsname()->nodename);
+
+		if (len > 64)
+			len = 64;
+
 		spin_lock(&to_mdev(dev)->sm_lock);
+		if (!dev->user_node_desc) {
+			memset(dev->node_desc, 0, 64);
+			memcpy(dev->node_desc, init_utsname()->nodename, len);
+			snprintf(&dev->node_desc[strlen(dev->node_desc)], (64-len), " HCA-%d", dev->node_number);
+		}
 		memcpy(((struct ib_smp *) mad)->data, dev->node_desc, 64);
 		spin_unlock(&to_mdev(dev)->sm_lock);
 	}
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
index d8287d9..25a2b8d 100644
--- a/drivers/infiniband/hw/mlx4/main.c
+++ b/drivers/infiniband/hw/mlx4/main.c
@@ -262,6 +262,7 @@ static int mlx4_ib_modify_device(struct ib_device *ibdev, int mask,
 
 	if (mask & IB_DEVICE_MODIFY_NODE_DESC) {
 		spin_lock(&to_mdev(ibdev)->sm_lock);
+		ibdev->user_node_desc = 1;
 		memcpy(ibdev->node_desc, props->node_desc, 64);
 		spin_unlock(&to_mdev(ibdev)->sm_lock);
 	}
diff --git a/drivers/infiniband/hw/mthca/mthca_mad.c b/drivers/infiniband/hw/mthca/mthca_mad.c
index acfa41d..cdd295a 100644
--- a/drivers/infiniband/hw/mthca/mthca_mad.c
+++ b/drivers/infiniband/hw/mthca/mthca_mad.c
@@ -36,6 +36,7 @@
 
 #include <linux/string.h>
 #include <linux/slab.h>
+#include <linux/utsname.h>
 
 #include <rdma/ib_verbs.h>
 #include <rdma/ib_mad.h>
@@ -149,7 +150,22 @@ static void node_desc_override(struct ib_device *dev,
 	     mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) &&
 	    mad->mad_hdr.method == IB_MGMT_METHOD_GET_RESP &&
 	    mad->mad_hdr.attr_id == IB_SMP_ATTR_NODE_DESC) {
+		int len;
+		char *dot = strchr(init_utsname()->nodename, '.');
+
+		if (dot)
+			len = dot - init_utsname()->nodename;
+		else
+			len = strlen(init_utsname()->nodename);
+
+		if (len > 64)
+			len = 64;
 		mutex_lock(&to_mdev(dev)->cap_mask_mutex);
+		if (!dev->user_node_desc) {
+			memset(dev->node_desc, 0, 64);
+			memcpy(dev->node_desc, init_utsname()->nodename, len);
+			snprintf(&dev->node_desc[strlen(dev->node_desc)], (64-len), " HCA-%d", dev->node_number);
+		}
 		memcpy(((struct ib_smp *) mad)->data, dev->node_desc, 64);
 		mutex_unlock(&to_mdev(dev)->cap_mask_mutex);
 	}
diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c
index 6bcde1c..662e3fe 100644
--- a/drivers/infiniband/hw/mthca/mthca_provider.c
+++ b/drivers/infiniband/hw/mthca/mthca_provider.c
@@ -199,6 +199,7 @@ static int mthca_modify_device(struct ib_device *ibdev,
 	if (mask & IB_DEVICE_MODIFY_NODE_DESC) {
 		if (mutex_lock_interruptible(&to_mdev(ibdev)->cap_mask_mutex))
 			return -ERESTARTSYS;
+		ibdev->user_node_desc = 1;
 		memcpy(ibdev->node_desc, props->node_desc, 64);
 		mutex_unlock(&to_mdev(ibdev)->cap_mask_mutex);
 	}
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index 11f3960..3cfac7f 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -1040,6 +1040,8 @@ struct ib_device {
 
 	char			     node_desc[64];
 	__be64			     node_guid;
+	int                          node_number;
+	u8                           user_node_desc;
 	u8                           node_type;
 	u8                           phys_port_cnt;
 };
diff --git a/ofed_scripts/openibd b/ofed_scripts/openibd
index e4f739c..629bbc1 100755
--- a/ofed_scripts/openibd
+++ b/ofed_scripts/openibd
@@ -809,19 +809,6 @@ start()
         RC=$[ $RC + $my_rc ]
     fi
 
-    # Add node description to sysfs
-    IBSYSDIR="/sys/class/infiniband"
-    if [ -d ${IBSYSDIR} ]; then
-        declare -i hca_id=1
-        for hca in ${IBSYSDIR}/*
-        do
-            if [ -e ${hca}/node_desc ]; then
-                echo -n "$(hostname -s) HCA-${hca_id}" >> ${hca}/node_desc
-            fi
-            let hca_id++
-        done
-    fi
-    
     /sbin/modprobe ib_umad > /dev/null 2>&1
     RC=$[ $RC + $? ]
     /sbin/modprobe ib_uverbs > /dev/null 2>&1
