block: add an optional probe callback to major_names
[linux-2.6-microblaze.git] / block / genhd.c
index 81017bd..2052116 100644 (file)
@@ -402,6 +402,7 @@ static struct blk_major_name {
        struct blk_major_name *next;
        int major;
        char name[16];
+       void (*probe)(dev_t devt);
 } *major_names[BLKDEV_MAJOR_HASH_SIZE];
 static DEFINE_MUTEX(major_names_lock);
 
@@ -444,7 +445,8 @@ void blkdev_show(struct seq_file *seqf, off_t offset)
  * See Documentation/admin-guide/devices.txt for the list of allocated
  * major numbers.
  */
-int register_blkdev(unsigned int major, const char *name)
+int __register_blkdev(unsigned int major, const char *name,
+               void (*probe)(dev_t devt))
 {
        struct blk_major_name **n, *p;
        int index, ret = 0;
@@ -483,6 +485,7 @@ int register_blkdev(unsigned int major, const char *name)
        }
 
        p->major = major;
+       p->probe = probe;
        strlcpy(p->name, name, sizeof(p->name));
        p->next = NULL;
        index = major_to_index(major);
@@ -505,8 +508,7 @@ out:
        mutex_unlock(&major_names_lock);
        return ret;
 }
-
-EXPORT_SYMBOL(register_blkdev);
+EXPORT_SYMBOL(__register_blkdev);
 
 void unregister_blkdev(unsigned int major, const char *name)
 {
@@ -1033,6 +1035,19 @@ static ssize_t disk_badblocks_store(struct device *dev,
 
 static void request_gendisk_module(dev_t devt)
 {
+       unsigned int major = MAJOR(devt);
+       struct blk_major_name **n;
+
+       mutex_lock(&major_names_lock);
+       for (n = &major_names[major_to_index(major)]; *n; n = &(*n)->next) {
+               if ((*n)->major == major && (*n)->probe) {
+                       (*n)->probe(devt);
+                       mutex_unlock(&major_names_lock);
+                       return;
+               }
+       }
+       mutex_unlock(&major_names_lock);
+
        if (request_module("block-major-%d-%d", MAJOR(devt), MINOR(devt)) > 0)
                /* Make old-style 2.4 aliases work */
                request_module("block-major-%d", MAJOR(devt));