]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/md/dm-ioctl.c
[MTD] JEDEC probe: kill some inline bloat
[linux-2.6-omap-h63xx.git] / drivers / md / dm-ioctl.c
index 4510ad8f971c366f4979403f4b0e13075f9d944b..138200bf5e0befa90ff67d7ac50c231313f94380 100644 (file)
@@ -700,7 +700,7 @@ static int dev_rename(struct dm_ioctl *param, size_t param_size)
        int r;
        char *new_name = (char *) param + param->data_start;
 
-       if (new_name < (char *) (param + 1) ||
+       if (new_name < (char *) param->data ||
            invalid_str(new_name, (void *) param + param_size)) {
                DMWARN("Invalid new logical volume name supplied.");
                return -EINVAL;
@@ -726,7 +726,7 @@ static int dev_set_geometry(struct dm_ioctl *param, size_t param_size)
        if (!md)
                return -ENXIO;
 
-       if (geostr < (char *) (param + 1) ||
+       if (geostr < (char *) param->data ||
            invalid_str(geostr, (void *) param + param_size)) {
                DMWARN("Invalid geometry supplied.");
                goto out;
@@ -765,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);
@@ -773,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);
@@ -788,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;
@@ -814,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) {
@@ -1229,7 +1233,7 @@ static int target_message(struct dm_ioctl *param, size_t param_size)
        if (r)
                goto out;
 
-       if (tmsg < (struct dm_target_msg *) (param + 1) ||
+       if (tmsg < (struct dm_target_msg *) param->data ||
            invalid_str(tmsg->message, (void *) param + param_size)) {
                DMWARN("Invalid target message parameters.");
                r = -EINVAL;
@@ -1354,7 +1358,7 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl **param)
        if (tmp.data_size < sizeof(tmp))
                return -EINVAL;
 
-       dmi = (struct dm_ioctl *) vmalloc(tmp.data_size);
+       dmi = vmalloc(tmp.data_size);
        if (!dmi)
                return -ENOMEM;
 
@@ -1469,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,
 };
@@ -1511,3 +1515,35 @@ void dm_interface_exit(void)
 
        dm_hash_exit();
 }
+
+/**
+ * dm_copy_name_and_uuid - Copy mapped device name & uuid into supplied buffers
+ * @md: Pointer to mapped_device
+ * @name: Buffer (size DM_NAME_LEN) for name
+ * @uuid: Buffer (size DM_UUID_LEN) for uuid or empty string if uuid not defined
+ */
+int dm_copy_name_and_uuid(struct mapped_device *md, char *name, char *uuid)
+{
+       int r = 0;
+       struct hash_cell *hc;
+
+       if (!md)
+               return -ENXIO;
+
+       dm_get(md);
+       down_read(&_hash_lock);
+       hc = dm_get_mdptr(md);
+       if (!hc || hc->md != md) {
+               r = -ENXIO;
+               goto out;
+       }
+
+       strcpy(name, hc->name);
+       strcpy(uuid, hc->uuid ? : "");
+
+out:
+       up_read(&_hash_lock);
+       dm_put(md);
+
+       return r;
+}