diff options
author | Peter Rajnoha <prajnoha@redhat.com> | 2010-08-11 23:13:53 -0400 |
---|---|---|
committer | Alasdair G Kergon <agk@redhat.com> | 2010-08-11 23:13:53 -0400 |
commit | 856a6f1dbd8940e72755af145ebcd806408ecedd (patch) | |
tree | e9fcdd440e5a4dbc58ffe59699b918d34b1cdd21 /drivers/md | |
parent | 094ea9a071f68bd6f56c3f8cdeb5263727b68ce9 (diff) |
dm ioctl: return uevent flag after rename
All the dm ioctls that generate uevents set the DM_UEVENT_GENERATED flag so
that userspace knows whether or not to wait for a uevent to be processed
before continuing,
The dm rename ioctl sets this flag but was not structured to return it
to userspace. This patch restructures the rename ioctl processing to
behave like the other ioctls that return data and so fix this.
Signed-off-by: Peter Rajnoha <prajnoha@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/dm-ioctl.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index 4bc4c4fca90d..79ee5ba217f2 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c | |||
@@ -285,19 +285,20 @@ retry: | |||
285 | up_write(&_hash_lock); | 285 | up_write(&_hash_lock); |
286 | } | 286 | } |
287 | 287 | ||
288 | static int dm_hash_rename(uint32_t cookie, uint32_t *flags, const char *old, | 288 | static struct mapped_device *dm_hash_rename(struct dm_ioctl *param, |
289 | const char *new) | 289 | const char *new) |
290 | { | 290 | { |
291 | char *new_name, *old_name; | 291 | char *new_name, *old_name; |
292 | struct hash_cell *hc; | 292 | struct hash_cell *hc; |
293 | struct dm_table *table; | 293 | struct dm_table *table; |
294 | struct mapped_device *md; | ||
294 | 295 | ||
295 | /* | 296 | /* |
296 | * duplicate new. | 297 | * duplicate new. |
297 | */ | 298 | */ |
298 | new_name = kstrdup(new, GFP_KERNEL); | 299 | new_name = kstrdup(new, GFP_KERNEL); |
299 | if (!new_name) | 300 | if (!new_name) |
300 | return -ENOMEM; | 301 | return ERR_PTR(-ENOMEM); |
301 | 302 | ||
302 | down_write(&_hash_lock); | 303 | down_write(&_hash_lock); |
303 | 304 | ||
@@ -306,24 +307,24 @@ static int dm_hash_rename(uint32_t cookie, uint32_t *flags, const char *old, | |||
306 | */ | 307 | */ |
307 | hc = __get_name_cell(new); | 308 | hc = __get_name_cell(new); |
308 | if (hc) { | 309 | if (hc) { |
309 | DMWARN("asked to rename to an already existing name %s -> %s", | 310 | DMWARN("asked to rename to an already-existing name %s -> %s", |
310 | old, new); | 311 | param->name, new); |
311 | dm_put(hc->md); | 312 | dm_put(hc->md); |
312 | up_write(&_hash_lock); | 313 | up_write(&_hash_lock); |
313 | kfree(new_name); | 314 | kfree(new_name); |
314 | return -EBUSY; | 315 | return ERR_PTR(-EBUSY); |
315 | } | 316 | } |
316 | 317 | ||
317 | /* | 318 | /* |
318 | * Is there such a device as 'old' ? | 319 | * Is there such a device as 'old' ? |
319 | */ | 320 | */ |
320 | hc = __get_name_cell(old); | 321 | hc = __get_name_cell(param->name); |
321 | if (!hc) { | 322 | if (!hc) { |
322 | DMWARN("asked to rename a non existent device %s -> %s", | 323 | DMWARN("asked to rename a non-existent device %s -> %s", |
323 | old, new); | 324 | param->name, new); |
324 | up_write(&_hash_lock); | 325 | up_write(&_hash_lock); |
325 | kfree(new_name); | 326 | kfree(new_name); |
326 | return -ENXIO; | 327 | return ERR_PTR(-ENXIO); |
327 | } | 328 | } |
328 | 329 | ||
329 | /* | 330 | /* |
@@ -345,13 +346,14 @@ static int dm_hash_rename(uint32_t cookie, uint32_t *flags, const char *old, | |||
345 | dm_table_put(table); | 346 | dm_table_put(table); |
346 | } | 347 | } |
347 | 348 | ||
348 | if (!dm_kobject_uevent(hc->md, KOBJ_CHANGE, cookie)) | 349 | if (!dm_kobject_uevent(hc->md, KOBJ_CHANGE, param->event_nr)) |
349 | *flags |= DM_UEVENT_GENERATED_FLAG; | 350 | param->flags |= DM_UEVENT_GENERATED_FLAG; |
350 | 351 | ||
351 | dm_put(hc->md); | 352 | md = hc->md; |
352 | up_write(&_hash_lock); | 353 | up_write(&_hash_lock); |
353 | kfree(old_name); | 354 | kfree(old_name); |
354 | return 0; | 355 | |
356 | return md; | ||
355 | } | 357 | } |
356 | 358 | ||
357 | /*----------------------------------------------------------------- | 359 | /*----------------------------------------------------------------- |
@@ -760,6 +762,7 @@ static int dev_rename(struct dm_ioctl *param, size_t param_size) | |||
760 | { | 762 | { |
761 | int r; | 763 | int r; |
762 | char *new_name = (char *) param + param->data_start; | 764 | char *new_name = (char *) param + param->data_start; |
765 | struct mapped_device *md; | ||
763 | 766 | ||
764 | if (new_name < param->data || | 767 | if (new_name < param->data || |
765 | invalid_str(new_name, (void *) param + param_size) || | 768 | invalid_str(new_name, (void *) param + param_size) || |
@@ -772,10 +775,14 @@ static int dev_rename(struct dm_ioctl *param, size_t param_size) | |||
772 | if (r) | 775 | if (r) |
773 | return r; | 776 | return r; |
774 | 777 | ||
775 | param->data_size = 0; | 778 | md = dm_hash_rename(param, new_name); |
779 | if (IS_ERR(md)) | ||
780 | return PTR_ERR(md); | ||
776 | 781 | ||
777 | return dm_hash_rename(param->event_nr, ¶m->flags, param->name, | 782 | __dev_status(md, param); |
778 | new_name); | 783 | dm_put(md); |
784 | |||
785 | return 0; | ||
779 | } | 786 | } |
780 | 787 | ||
781 | static int dev_set_geometry(struct dm_ioctl *param, size_t param_size) | 788 | static int dev_set_geometry(struct dm_ioctl *param, size_t param_size) |