--- a/nbd.c	2006-06-24 19:26:32.000000000 +0300
+++ b/nbd.c	2006-06-24 19:31:09.000000000 +0300
@@ -57,6 +57,7 @@
 #include <linux/compiler.h>
 #include <linux/err.h>
 #include <linux/kernel.h>
+#include <linux/ide.h>
 #include <net/sock.h>
 
 #include <linux/devfs_fs_kernel.h>
@@ -503,6 +504,7 @@
 		     unsigned int cmd, unsigned long arg)
 {
 	struct nbd_device *lo = inode->i_bdev->bd_disk->private_data;
+	struct gendisk * disk = inode->i_bdev->bd_disk;
 	int error;
 	struct request sreq ;
 
@@ -582,7 +584,9 @@
 	case NBD_DO_IT:
 		if (!lo->file)
 			return -EINVAL;
+		disk->flags &= ~GENHD_FL_SUPPRESS_PARTITION_INFO;
 		nbd_do_it(lo);
+		disk->flags |= GENHD_FL_SUPPRESS_PARTITION_INFO;
 		/* on return tidy up in case we have a signal */
 		/* Forcibly shutdown the socket causing all listeners
 		 * to error
@@ -648,7 +652,7 @@
 	}
 
 	for (i = 0; i < nbds_max; i++) {
-		struct gendisk *disk = alloc_disk(1);
+		struct gendisk *disk = alloc_disk(1 << PARTN_BITS);
 		if (!disk)
 			goto out;
 		nbd_dev[i].disk = disk;
@@ -685,7 +689,7 @@
 		nbd_dev[i].blksize = 1024;
 		nbd_dev[i].bytesize = 0x7ffffc00ULL << 10; /* 2TB */
 		disk->major = NBD_MAJOR;
-		disk->first_minor = i;
+		disk->first_minor = i << PARTN_BITS;
 		disk->fops = &nbd_fops;
 		disk->private_data = &nbd_dev[i];
 		disk->flags |= GENHD_FL_SUPPRESS_PARTITION_INFO;
