Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/drzeus/mmc
[pandora-kernel.git] / drivers / md / dm-ioctl.c
index 3edb347..cd6a184 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>
 
@@ -68,14 +67,12 @@ static int dm_hash_init(void)
 {
        init_buckets(_name_buckets);
        init_buckets(_uuid_buckets);
-       devfs_mk_dir(DM_DIR);
        return 0;
 }
 
 static void dm_hash_exit(void)
 {
        dm_hash_remove_all(0);
-       devfs_remove(DM_DIR);
 }
 
 /*-----------------------------------------------------------------
@@ -171,25 +168,6 @@ static void free_cell(struct hash_cell *hc)
        }
 }
 
-/*
- * devfs stuff.
- */
-static int register_with_devfs(struct hash_cell *hc)
-{
-       struct gendisk *disk = dm_disk(hc->md);
-
-       devfs_mk_bdev(MKDEV(disk->major, disk->first_minor),
-                     S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP,
-                     DM_DIR "/%s", hc->name);
-       return 0;
-}
-
-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.
@@ -226,7 +204,6 @@ static int dm_hash_insert(const char *name, const char *uuid, struct mapped_devi
                }
                list_add(&cell->uuid_list, _uuid_buckets + hash_str(uuid));
        }
-       register_with_devfs(cell);
        dm_get(md);
        dm_set_mdptr(md, cell);
        up_write(&_hash_lock);
@@ -246,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);
@@ -342,16 +318,11 @@ 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;
        list_add(&hc->name_list, _name_buckets + hash_str(new_name));
 
-       /* rename the device node in devfs */
-       register_with_devfs(hc);
-
        /*
         * Wake up any dm event waiters.
         */
@@ -635,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;
 }
 
@@ -789,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);
@@ -797,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);
@@ -812,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;
@@ -838,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) {
@@ -1501,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
 };