#define DBG_RX          0x0200
 #define DBG_TX          0x0400
 static unsigned int debugflags;
+static unsigned int nbds_max = 16;
 #endif /* NDEBUG */
 
 static struct nbd_device nbd_dev[MAX_NBD];
                return -EIO;
        }
 
-       for (i = 0; i < MAX_NBD; i++) {
+       if (nbds_max > MAX_NBD) {
+               printk(KERN_CRIT "nbd: cannot allocate more than %u nbds; %u requested.\n", MAX_NBD,
+                               nbds_max);
+               return -EINVAL;
+       }
+
+       for (i = 0; i < nbds_max; i++) {
                struct gendisk *disk = alloc_disk(1);
                if (!disk)
                        goto out;
        dprintk(DBG_INIT, "nbd: debugflags=0x%x\n", debugflags);
 
        devfs_mk_dir("nbd");
-       for (i = 0; i < MAX_NBD; i++) {
+       for (i = 0; i < nbds_max; i++) {
                struct gendisk *disk = nbd_dev[i].disk;
                nbd_dev[i].file = NULL;
                nbd_dev[i].magic = LO_MAGIC;
 static void __exit nbd_cleanup(void)
 {
        int i;
-       for (i = 0; i < MAX_NBD; i++) {
+       for (i = 0; i < nbds_max; i++) {
                struct gendisk *disk = nbd_dev[i].disk;
+               nbd_dev[i].magic = 0;
                if (disk) {
                        del_gendisk(disk);
                        blk_cleanup_queue(disk->queue);
 MODULE_DESCRIPTION("Network Block Device");
 MODULE_LICENSE("GPL");
 
+module_param(nbds_max, int, 0444);
+MODULE_PARM_DESC(nbds_max, "How many network block devices to initialize.");
 #ifndef NDEBUG
 module_param(debugflags, int, 0644);
 MODULE_PARM_DESC(debugflags, "flags for controlling debug output");