Allows TABLE_STATUS to be used without specifying the dm device in the
ioctl, if it has previously been associated with a device.

Signed-off-by: Andy Grover <[email protected]>
---
 drivers/md/dm-ioctl.c | 25 ++++++++++++++++---------
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
index c5fc53c..c4c47a6 100644
--- a/drivers/md/dm-ioctl.c
+++ b/drivers/md/dm-ioctl.c
@@ -1504,13 +1504,19 @@ static int table_deps(struct file *filp, struct 
dm_ioctl *param, size_t param_si
  */
 static int table_status(struct file *filp, struct dm_ioctl *param, size_t 
param_size)
 {
+       struct dm_file *priv = filp->private_data;
        struct mapped_device *md;
        struct dm_table *table;
        int srcu_idx;
 
-       md = find_device(param);
-       if (!md)
-               return -ENXIO;
+       if (priv && priv->md) {
+               md = priv->md;
+               dm_get(md);
+       } else {
+               md = find_device(param);
+               if (!md)
+                       return -ENXIO;
+       }
 
        __dev_status(md, param);
 
@@ -1868,12 +1874,6 @@ static int ctl_ioctl(struct file *file, uint command, 
struct dm_ioctl __user *us
        if (cmd == DM_VERSION_CMD)
                return 0;
 
-       /*
-        * Cannot use files that have been associated for most ioctls.
-        * See dev_assoc_set().
-        */
-       if (file->private_data)
-               return -EINVAL;
 
        fn = lookup_ioctl(cmd, &ioctl_flags);
        if (!fn) {
@@ -1882,6 +1882,13 @@ static int ctl_ioctl(struct file *file, uint command, 
struct dm_ioctl __user *us
        }
 
        /*
+        * Cannot use files that have been associated for ioctls other than
+        * VERSION and TABLE_STATUS.
+        */
+       if (file->private_data && cmd != DM_TABLE_STATUS_CMD)
+               return -EINVAL;
+
+       /*
         * Copy the parameters into kernel space.
         */
        r = copy_params(user, &param_kernel, ioctl_flags, &param, &param_flags);
-- 
2.9.3

--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to