summaryrefslogtreecommitdiff
path: root/drivers/md
diff options
context:
space:
mode:
authorMikulas Patocka <mpatocka@redhat.com>2011-08-02 15:32:06 +0400
committerAlasdair G Kergon <agk@redhat.com>2011-08-02 15:32:06 +0400
commit0ddf9644cc26e74ed671525e61a17bdbebf18da6 (patch)
treefa10cf2fda8f52c0da7f2f1fcec54f2ce2d5bd1f /drivers/md
parenta3998799fb4df0b0af8271a7d50c4269032397aa (diff)
downloadlinux-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/md')
-rw-r--r--drivers/md/dm-ioctl.c63
1 files changed, 36 insertions, 27 deletions
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
index 1622a6bc0bfd..99d38a6925a4 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;