diff options
author | Mikulas Patocka <mpatocka@redhat.com> | 2011-08-02 11:32:06 (GMT) |
---|---|---|
committer | Alasdair G Kergon <agk@redhat.com> | 2011-08-02 11:32:06 (GMT) |
commit | 0ddf9644cc26e74ed671525e61a17bdbebf18da6 (patch) | |
tree | fa10cf2fda8f52c0da7f2f1fcec54f2ce2d5bd1f /drivers | |
parent | a3998799fb4df0b0af8271a7d50c4269032397aa (diff) | |
download | linux-0ddf9644cc26e74ed671525e61a17bdbebf18da6.tar.xz |
dm ioctl: fill in device parameters in more ioctls
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 <mpatocka@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/md/dm-ioctl.c | 63 |
1 files changed, 36 insertions, 27 deletions
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index 1622a6b..99d38a6 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c @@ -719,24 +719,49 @@ static int dev_create(struct dm_ioctl *param, size_t param_size) 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(struct dm_ioctl *param) 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; |