.eh_action              = sd_eh_action,
 };
 
+/*
+ * Dummy kobj_map->probe function.
+ * The default ->probe function will call modprobe, which is
+ * pointless as this module is already loaded.
+ */
+static struct kobject *sd_default_probe(dev_t devt, int *partno, void *data)
+{
+       return NULL;
+}
+
 /*
  * Device no to disk mapping:
  * 
 static int sd_remove(struct device *dev)
 {
        struct scsi_disk *sdkp;
+       dev_t devt;
 
        sdkp = dev_get_drvdata(dev);
+       devt = disk_devt(sdkp->disk);
        scsi_autopm_get_device(sdkp->device);
 
        async_synchronize_full_domain(&scsi_sd_probe_domain);
        del_gendisk(sdkp->disk);
        sd_shutdown(dev);
 
+       blk_register_region(devt, SD_MINORS, NULL,
+                           sd_default_probe, NULL, NULL);
+
        mutex_lock(&sd_ref_mutex);
        dev_set_drvdata(dev, NULL);
        put_device(&sdkp->dev);
 
        SCSI_LOG_HLQUEUE(3, printk("init_sd: sd driver entry point\n"));
 
-       for (i = 0; i < SD_MAJORS; i++)
-               if (register_blkdev(sd_major(i), "sd") == 0)
-                       majors++;
+       for (i = 0; i < SD_MAJORS; i++) {
+               if (register_blkdev(sd_major(i), "sd") != 0)
+                       continue;
+               majors++;
+               blk_register_region(sd_major(i), SD_MINORS, NULL,
+                                   sd_default_probe, NULL, NULL);
+       }
 
        if (!majors)
                return -ENODEV;
 
        class_unregister(&sd_disk_class);
 
-       for (i = 0; i < SD_MAJORS; i++)
+       for (i = 0; i < SD_MAJORS; i++) {
+               blk_unregister_region(sd_major(i), SD_MINORS);
                unregister_blkdev(sd_major(i), "sd");
+       }
 }
 
 module_init(init_sd);