]> git.hungrycats.org Git - linux/commitdiff
[PATCH] dm: Repair persistent minors
authorAndrew Morton <akpm@digeo.com>
Sat, 14 Jun 2003 14:22:09 +0000 (07:22 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Sat, 14 Jun 2003 14:22:09 +0000 (07:22 -0700)
From: Joe Thornber <thornber@sistina.com>

Split the dm_create() function into two variants, depending on whether you
want the device to have a specific minor number.  This avoids the broken
overloading of the minor argument to the old dm_create().

drivers/md/dm-ioctl.c
drivers/md/dm.c
drivers/md/dm.h

index 180182d4f7c7fd3789528f08ca2350f3f776b745..05d6d1dad63d4f4b28b585f06a1dca6078437ef8 100644 (file)
@@ -560,7 +560,6 @@ static int create(struct dm_ioctl *param, struct dm_ioctl *user)
        int r;
        struct dm_table *t;
        struct mapped_device *md;
-       unsigned int minor = 0;
 
        r = check_name(param->name);
        if (r)
@@ -577,9 +576,10 @@ static int create(struct dm_ioctl *param, struct dm_ioctl *user)
        }
 
        if (param->flags & DM_PERSISTENT_DEV_FLAG)
-               minor = minor(to_kdev_t(param->dev));
+               r = dm_create_with_minor(minor(to_kdev_t(param->dev)), t, &md);
+       else
+               r = dm_create(t, &md);
 
-       r = dm_create(minor, t, &md);
        if (r) {
                dm_table_put(t);
                return r;
index fac9ee14b254e4f603e4ffc26f7e9a0f0ec5dd8a..05e6ffc49d3e39178f6f1a0f3e61800c705f91ea 100644 (file)
@@ -569,7 +569,7 @@ static int next_free_minor(unsigned int *minor)
 /*
  * Allocate and initialise a blank device with a given minor.
  */
-static struct mapped_device *alloc_dev(unsigned int minor)
+static struct mapped_device *alloc_dev(unsigned int minor, int persistent)
 {
        int r;
        struct mapped_device *md = kmalloc(sizeof(*md), GFP_KERNEL);
@@ -580,7 +580,7 @@ static struct mapped_device *alloc_dev(unsigned int minor)
        }
 
        /* get a minor number for the dev */
-       r = (minor < 0) ? next_free_minor(&minor) : specific_minor(minor);
+       r = persistent ? specific_minor(minor) : next_free_minor(&minor);
        if (r < 0) {
                kfree(md);
                return NULL;
@@ -660,13 +660,13 @@ static void __unbind(struct mapped_device *md)
 /*
  * Constructor for a new device.
  */
-int dm_create(unsigned int minor, struct dm_table *table,
-             struct mapped_device **result)
+static int create_aux(unsigned int minor, int persistent,
+                     struct dm_table *table, struct mapped_device **result)
 {
        int r;
        struct mapped_device *md;
 
-       md = alloc_dev(minor);
+       md = alloc_dev(minor, persistent);
        if (!md)
                return -ENXIO;
 
@@ -681,6 +681,17 @@ int dm_create(unsigned int minor, struct dm_table *table,
        return 0;
 }
 
+int dm_create(struct dm_table *table, struct mapped_device **result)
+{
+       return create_aux(0, 0, table, result);
+}
+
+int dm_create_with_minor(unsigned int minor,
+                        struct dm_table *table, struct mapped_device **result)
+{
+       return create_aux(minor, 1, table, result);
+}
+
 void dm_get(struct mapped_device *md)
 {
        atomic_inc(&md->holders);
index ca4b5cbc95cacafb4096aa707dea8a46895f8180..1760f0aca7cdd2c6c84f563497cbfd689942ecb6 100644 (file)
@@ -51,8 +51,9 @@ struct mapped_device;
  * Functions for manipulating a struct mapped_device.
  * Drop the reference with dm_put when you finish with the object.
  *---------------------------------------------------------------*/
-int dm_create(unsigned int minor, struct dm_table *table,
-             struct mapped_device **md);
+int dm_create(struct dm_table *table, struct mapped_device **md);
+int dm_create_with_minor(unsigned int minor, struct dm_table *table,
+                        struct mapped_device **md);
 
 /*
  * Reference counting for md.