Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6
[cascardo/linux.git] / drivers / md / dm-ioctl.c
index 6e1b51d..b441d82 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/init.h>
 #include <linux/wait.h>
 #include <linux/slab.h>
-#include <linux/devfs_fs_kernel.h>
 #include <linux/dm-ioctl.h>
 #include <linux/hdreg.h>
 
@@ -74,7 +73,6 @@ static int dm_hash_init(void)
 static void dm_hash_exit(void)
 {
        dm_hash_remove_all(0);
-       devfs_remove(DM_DIR);
 }
 
 /*-----------------------------------------------------------------
@@ -170,15 +168,6 @@ static void free_cell(struct hash_cell *hc)
        }
 }
 
-/*
- * devfs stuff.
- */
-static int unregister_with_devfs(struct hash_cell *hc)
-{
-       devfs_remove(DM_DIR"/%s", hc->name);
-       return 0;
-}
-
 /*
  * The kdev_t and uuid of a device can never change once it is
  * initially inserted.
@@ -234,7 +223,6 @@ static void __hash_remove(struct hash_cell *hc)
        /* remove from the dev hash */
        list_del(&hc->uuid_list);
        list_del(&hc->name_list);
-       unregister_with_devfs(hc);
        dm_set_mdptr(hc->md, NULL);
 
        table = dm_get_table(hc->md);
@@ -330,8 +318,6 @@ static int dm_hash_rename(const char *old, const char *new)
        /*
         * rename and move the name cell.
         */
-       unregister_with_devfs(hc);
-
        list_del(&hc->name_list);
        old_name = hc->name;
        hc->name = new_name;
@@ -620,9 +606,14 @@ static struct hash_cell *__find_device_hash_cell(struct dm_ioctl *param)
                return __get_name_cell(param->name);
 
        md = dm_get_md(huge_decode_dev(param->dev));
-       if (md)
-               mdptr = dm_get_mdptr(md);
+       if (!md)
+               goto out;
 
+       mdptr = dm_get_mdptr(md);
+       if (!mdptr)
+               dm_put(md);
+
+out:
        return mdptr;
 }
 
@@ -774,7 +765,7 @@ out:
 static int do_suspend(struct dm_ioctl *param)
 {
        int r = 0;
-       int do_lockfs = 1;
+       unsigned suspend_flags = DM_SUSPEND_LOCKFS_FLAG;
        struct mapped_device *md;
 
        md = find_device(param);
@@ -782,10 +773,12 @@ static int do_suspend(struct dm_ioctl *param)
                return -ENXIO;
 
        if (param->flags & DM_SKIP_LOCKFS_FLAG)
-               do_lockfs = 0;
+               suspend_flags &= ~DM_SUSPEND_LOCKFS_FLAG;
+       if (param->flags & DM_NOFLUSH_FLAG)
+               suspend_flags |= DM_SUSPEND_NOFLUSH_FLAG;
 
        if (!dm_suspended(md))
-               r = dm_suspend(md, do_lockfs);
+               r = dm_suspend(md, suspend_flags);
 
        if (!r)
                r = __dev_status(md, param);
@@ -797,7 +790,7 @@ static int do_suspend(struct dm_ioctl *param)
 static int do_resume(struct dm_ioctl *param)
 {
        int r = 0;
-       int do_lockfs = 1;
+       unsigned suspend_flags = DM_SUSPEND_LOCKFS_FLAG;
        struct hash_cell *hc;
        struct mapped_device *md;
        struct dm_table *new_map;
@@ -823,9 +816,11 @@ static int do_resume(struct dm_ioctl *param)
        if (new_map) {
                /* Suspend if it isn't already suspended */
                if (param->flags & DM_SKIP_LOCKFS_FLAG)
-                       do_lockfs = 0;
+                       suspend_flags &= ~DM_SUSPEND_LOCKFS_FLAG;
+               if (param->flags & DM_NOFLUSH_FLAG)
+                       suspend_flags |= DM_SUSPEND_NOFLUSH_FLAG;
                if (!dm_suspended(md))
-                       dm_suspend(md, do_lockfs);
+                       dm_suspend(md, suspend_flags);
 
                r = dm_swap_table(md, new_map);
                if (r) {
@@ -1478,7 +1473,7 @@ static int ctl_ioctl(struct inode *inode, struct file *file,
        return r;
 }
 
-static struct file_operations _ctl_fops = {
+static const struct file_operations _ctl_fops = {
        .ioctl   = ctl_ioctl,
        .owner   = THIS_MODULE,
 };
@@ -1486,7 +1481,6 @@ static struct file_operations _ctl_fops = {
 static struct miscdevice _dm_misc = {
        .minor          = MISC_DYNAMIC_MINOR,
        .name           = DM_NAME,
-       .devfs_name     = "mapper/control",
        .fops           = &_ctl_fops
 };