From: Mikulas Patocka Move parameter filling from find_device to __find_device_hash_cell. This patch causes ioctls using __find_device_hash_cell (DM_DEV_REMOVE_CMD, DM_DEV_SUSPEND_CMD - resume, DM_TABLE_CLEAR_CMD) to return device parameters, bringing them into line with the other ioctls. Signed-off-by: Mikulas Patocka Signed-off-by: Alasdair G Kergon --- drivers/md/dm-ioctl.c | 63 ++++++++++++++++++++++++++--------------------- include/linux/dm-ioctl.h | 4 +- 2 files changed, 38 insertions(+), 29 deletions(-) Index: linux-3.0/drivers/md/dm-ioctl.c =================================================================== --- linux-3.0.orig/drivers/md/dm-ioctl.c +++ linux-3.0/drivers/md/dm-ioctl.c @@ -719,24 +719,49 @@ static int dev_create(struct dm_ioctl *p static struct hash_cell *__find_device_hash_cell(struct dm_ioctl *param) { struct mapped_device *md; - void *mdptr = NULL; + struct hash_cell *hc = NULL; - if (*param->uuid) - return __get_uuid_cell(param->uuid); + if (*param->uuid) { + hc = __get_uuid_cell(param->uuid); + if (!hc) + return NULL; + goto fill_params; + } - if (*param->name) - return __get_name_cell(param->name); + if (*param->name) { + hc = __get_name_cell(param->name); + if (!hc) + return NULL; + goto fill_params; + } md = dm_get_md(huge_decode_dev(param->dev)); if (!md) - goto out; + return NULL; - mdptr = dm_get_mdptr(md); - if (!mdptr) + hc = dm_get_mdptr(md); + if (!hc) { dm_put(md); + return NULL; + } -out: - return mdptr; +fill_params: + /* + * Sneakily write in both the name and the uuid + * while we have the cell. + */ + strlcpy(param->name, hc->name, sizeof(param->name)); + if (hc->uuid) + strlcpy(param->uuid, hc->uuid, sizeof(param->uuid)); + else + param->uuid[0] = '\0'; + + if (hc->new_map) + param->flags |= DM_INACTIVE_PRESENT_FLAG; + else + param->flags &= ~DM_INACTIVE_PRESENT_FLAG; + + return hc; } static struct mapped_device *find_device(struct dm_ioctl *param) @@ -746,24 +771,8 @@ static struct mapped_device *find_device down_read(&_hash_lock); hc = __find_device_hash_cell(param); - if (hc) { + if (hc) md = hc->md; - - /* - * Sneakily write in both the name and the uuid - * while we have the cell. - */ - strlcpy(param->name, hc->name, sizeof(param->name)); - if (hc->uuid) - strlcpy(param->uuid, hc->uuid, sizeof(param->uuid)); - else - param->uuid[0] = '\0'; - - if (hc->new_map) - param->flags |= DM_INACTIVE_PRESENT_FLAG; - else - param->flags &= ~DM_INACTIVE_PRESENT_FLAG; - } up_read(&_hash_lock); return md; Index: linux-3.0/include/linux/dm-ioctl.h =================================================================== --- linux-3.0.orig/include/linux/dm-ioctl.h +++ linux-3.0/include/linux/dm-ioctl.h @@ -267,9 +267,9 @@ enum { #define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl) #define DM_VERSION_MAJOR 4 -#define DM_VERSION_MINOR 20 +#define DM_VERSION_MINOR 21 #define DM_VERSION_PATCHLEVEL 0 -#define DM_VERSION_EXTRA "-ioctl (2011-02-02)" +#define DM_VERSION_EXTRA "-ioctl (2011-07-06)" /* Status bits */ #define DM_READONLY_FLAG (1 << 0) /* In/Out */