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 <agrover@xxxxxxxxxx> --- 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, ¶m_kernel, ioctl_flags, ¶m, ¶m_flags); -- 2.9.3 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel