diff options
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/dm-ioctl.c | 14 | ||||
-rw-r--r-- | drivers/md/dm.c | 25 | ||||
-rw-r--r-- | drivers/md/dm.h | 3 |
3 files changed, 31 insertions, 11 deletions
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index 1128d3fba797..1c871736f48c 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c | |||
@@ -276,7 +276,7 @@ retry: | |||
276 | up_write(&_hash_lock); | 276 | up_write(&_hash_lock); |
277 | } | 277 | } |
278 | 278 | ||
279 | static int dm_hash_rename(const char *old, const char *new) | 279 | static int dm_hash_rename(uint32_t cookie, const char *old, const char *new) |
280 | { | 280 | { |
281 | char *new_name, *old_name; | 281 | char *new_name, *old_name; |
282 | struct hash_cell *hc; | 282 | struct hash_cell *hc; |
@@ -333,7 +333,7 @@ static int dm_hash_rename(const char *old, const char *new) | |||
333 | dm_table_put(table); | 333 | dm_table_put(table); |
334 | } | 334 | } |
335 | 335 | ||
336 | dm_kobject_uevent(hc->md); | 336 | dm_kobject_uevent(hc->md, KOBJ_CHANGE, cookie); |
337 | 337 | ||
338 | dm_put(hc->md); | 338 | dm_put(hc->md); |
339 | up_write(&_hash_lock); | 339 | up_write(&_hash_lock); |
@@ -680,6 +680,9 @@ static int dev_remove(struct dm_ioctl *param, size_t param_size) | |||
680 | 680 | ||
681 | __hash_remove(hc); | 681 | __hash_remove(hc); |
682 | up_write(&_hash_lock); | 682 | up_write(&_hash_lock); |
683 | |||
684 | dm_kobject_uevent(md, KOBJ_REMOVE, param->event_nr); | ||
685 | |||
683 | dm_put(md); | 686 | dm_put(md); |
684 | param->data_size = 0; | 687 | param->data_size = 0; |
685 | return 0; | 688 | return 0; |
@@ -715,7 +718,7 @@ static int dev_rename(struct dm_ioctl *param, size_t param_size) | |||
715 | return r; | 718 | return r; |
716 | 719 | ||
717 | param->data_size = 0; | 720 | param->data_size = 0; |
718 | return dm_hash_rename(param->name, new_name); | 721 | return dm_hash_rename(param->event_nr, param->name, new_name); |
719 | } | 722 | } |
720 | 723 | ||
721 | static int dev_set_geometry(struct dm_ioctl *param, size_t param_size) | 724 | static int dev_set_geometry(struct dm_ioctl *param, size_t param_size) |
@@ -842,8 +845,11 @@ static int do_resume(struct dm_ioctl *param) | |||
842 | if (dm_suspended(md)) | 845 | if (dm_suspended(md)) |
843 | r = dm_resume(md); | 846 | r = dm_resume(md); |
844 | 847 | ||
845 | if (!r) | 848 | |
849 | if (!r) { | ||
850 | dm_kobject_uevent(md, KOBJ_CHANGE, param->event_nr); | ||
846 | r = __dev_status(md, param); | 851 | r = __dev_status(md, param); |
852 | } | ||
847 | 853 | ||
848 | dm_put(md); | 854 | dm_put(md); |
849 | return r; | 855 | return r; |
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 36142e947ffc..a9210bb594e7 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -24,6 +24,13 @@ | |||
24 | 24 | ||
25 | #define DM_MSG_PREFIX "core" | 25 | #define DM_MSG_PREFIX "core" |
26 | 26 | ||
27 | /* | ||
28 | * Cookies are numeric values sent with CHANGE and REMOVE | ||
29 | * uevents while resuming, removing or renaming the device. | ||
30 | */ | ||
31 | #define DM_COOKIE_ENV_VAR_NAME "DM_COOKIE" | ||
32 | #define DM_COOKIE_LENGTH 24 | ||
33 | |||
27 | static const char *_name = DM_NAME; | 34 | static const char *_name = DM_NAME; |
28 | 35 | ||
29 | static unsigned int major = 0; | 36 | static unsigned int major = 0; |
@@ -1731,11 +1738,7 @@ int dm_resume(struct mapped_device *md) | |||
1731 | clear_bit(DMF_SUSPENDED, &md->flags); | 1738 | clear_bit(DMF_SUSPENDED, &md->flags); |
1732 | 1739 | ||
1733 | dm_table_unplug_all(map); | 1740 | dm_table_unplug_all(map); |
1734 | |||
1735 | dm_kobject_uevent(md); | ||
1736 | |||
1737 | r = 0; | 1741 | r = 0; |
1738 | |||
1739 | out: | 1742 | out: |
1740 | dm_table_put(map); | 1743 | dm_table_put(map); |
1741 | mutex_unlock(&md->suspend_lock); | 1744 | mutex_unlock(&md->suspend_lock); |
@@ -1746,9 +1749,19 @@ out: | |||
1746 | /*----------------------------------------------------------------- | 1749 | /*----------------------------------------------------------------- |
1747 | * Event notification. | 1750 | * Event notification. |
1748 | *---------------------------------------------------------------*/ | 1751 | *---------------------------------------------------------------*/ |
1749 | void dm_kobject_uevent(struct mapped_device *md) | 1752 | void dm_kobject_uevent(struct mapped_device *md, enum kobject_action action, |
1753 | unsigned cookie) | ||
1750 | { | 1754 | { |
1751 | kobject_uevent(&disk_to_dev(md->disk)->kobj, KOBJ_CHANGE); | 1755 | char udev_cookie[DM_COOKIE_LENGTH]; |
1756 | char *envp[] = { udev_cookie, NULL }; | ||
1757 | |||
1758 | if (!cookie) | ||
1759 | kobject_uevent(&disk_to_dev(md->disk)->kobj, action); | ||
1760 | else { | ||
1761 | snprintf(udev_cookie, DM_COOKIE_LENGTH, "%s=%u", | ||
1762 | DM_COOKIE_ENV_VAR_NAME, cookie); | ||
1763 | kobject_uevent_env(&disk_to_dev(md->disk)->kobj, action, envp); | ||
1764 | } | ||
1752 | } | 1765 | } |
1753 | 1766 | ||
1754 | uint32_t dm_next_uevent_seq(struct mapped_device *md) | 1767 | uint32_t dm_next_uevent_seq(struct mapped_device *md) |
diff --git a/drivers/md/dm.h b/drivers/md/dm.h index a31506d93e91..b5935c610c44 100644 --- a/drivers/md/dm.h +++ b/drivers/md/dm.h | |||
@@ -92,7 +92,8 @@ void dm_stripe_exit(void); | |||
92 | int dm_open_count(struct mapped_device *md); | 92 | int dm_open_count(struct mapped_device *md); |
93 | int dm_lock_for_deletion(struct mapped_device *md); | 93 | int dm_lock_for_deletion(struct mapped_device *md); |
94 | 94 | ||
95 | void dm_kobject_uevent(struct mapped_device *md); | 95 | void dm_kobject_uevent(struct mapped_device *md, enum kobject_action action, |
96 | unsigned cookie); | ||
96 | 97 | ||
97 | int dm_kcopyd_init(void); | 98 | int dm_kcopyd_init(void); |
98 | void dm_kcopyd_exit(void); | 99 | void dm_kcopyd_exit(void); |