diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
index a35189098581b3705ec3fca6003e527ad98504f8..c2e5ba599418d03789371205d2b53e163835262a 100644
--- a/drivers/block/nbd.c
+++ b/drivers/block/nbd.c
@@ -1704,14 +1704,6 @@ static int nbd_dev_add(int index)
 	int err = -ENOMEM;
 	int first_minor = index << part_shift;
 
-	/*
-	 * Too big index can cause duplicate creation of sysfs files/links,
-	 * because MKDEV() expect that the max first minor is MINORMASK, or
-	 * index << part_shift can overflow.
-	 */
-	if (first_minor < index || first_minor > MINORMASK)
-		return -EINVAL;
-
 	nbd = kzalloc(sizeof(struct nbd_device), GFP_KERNEL);
 	if (!nbd)
 		goto out;
@@ -1844,8 +1836,20 @@ static int nbd_genl_connect(struct sk_buff *skb, struct genl_info *info)
 	if (!netlink_capable(skb, CAP_SYS_ADMIN))
 		return -EPERM;
 
-	if (info->attrs[NBD_ATTR_INDEX])
+	if (info->attrs[NBD_ATTR_INDEX]) {
 		index = nla_get_u32(info->attrs[NBD_ATTR_INDEX]);
+
+		/*
+		 * Too big first_minor can cause duplicate creation of
+		 * sysfs files/links, since index << part_shift might
+		 * overflow, or MKDEV() expect that the max bits of
+		 * first_minor is 20.
+		 */
+		if (index < 0 || index > MINORMASK >> part_shift) {
+			printk(KERN_ERR "nbd: illegal input index %d\n", index);
+			return -EINVAL;
+		}
+	}
 	if (!info->attrs[NBD_ATTR_SOCKETS]) {
 		printk(KERN_ERR "nbd: must specify at least one socket\n");
 		return -EINVAL;