[dm-devel] dm_ioctl: Only send a change uevent when a resume ioctl changes the device.
Mike Snitzer
snitzer at redhat.com
Tue Jan 26 18:09:29 UTC 2010
On Tue, Jan 26 2010 at 12:56pm -0500,
Dave Wysochanski <dwysocha at redhat.com> wrote:
> Resume ioctls may result in no changes to the device and thus they
> should not generate change uevents. For example, if a device is
> not suspended when a resume ioctl occurs, we should not send a
> uevent.
>
> Signed-off-by: Dave Wysochanski <dwysocha at redhat.com>
> ---
> drivers/md/dm-ioctl.c | 12 ++++++++----
> 1 files changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
> index 1d66932..0c1cf53 100644
> --- a/drivers/md/dm-ioctl.c
> +++ b/drivers/md/dm-ioctl.c
> @@ -851,6 +851,7 @@ static int do_suspend(struct dm_ioctl *param)
>
> static int do_resume(struct dm_ioctl *param)
> {
> + int send_uevent = 0;
> int r = 0;
> unsigned suspend_flags = DM_SUSPEND_LOCKFS_FLAG;
> struct hash_cell *hc;
> @@ -895,18 +896,21 @@ static int do_resume(struct dm_ioctl *param)
> set_disk_ro(dm_disk(md), 0);
> else
> set_disk_ro(dm_disk(md), 1);
> + send_uevent = 1;
> }
> -
> - if (dm_suspended_md(md))
> + if (dm_suspended_md(md)) {
> r = dm_resume(md);
> + send_uevent = 1;
> + }
>
> if (old_map)
> dm_table_destroy(old_map);
>
> - if (!r) {
> + if (send_uevent)
> dm_kobject_uevent(md, KOBJ_CHANGE, param->event_nr);
> +
> + if (!r)
> r = __dev_status(md, param);
> - }
>
> dm_put(md);
> return r;
Seems you're sending the uevent even if resume failed. Is that intended?
Also, can dm_kobject_uevent() come before dm_table_destroy()?
If so this would be a bit simpler:
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
index 1d66932..e3cf568 100644
--- a/drivers/md/dm-ioctl.c
+++ b/drivers/md/dm-ioctl.c
@@ -897,16 +897,17 @@ static int do_resume(struct dm_ioctl *param)
set_disk_ro(dm_disk(md), 1);
}
- if (dm_suspended_md(md))
+ if (dm_suspended_md(md)) {
r = dm_resume(md);
+ if (!r)
+ dm_kobject_uevent(md, KOBJ_CHANGE, param->event_nr);
+ }
if (old_map)
dm_table_destroy(old_map);
- if (!r) {
- dm_kobject_uevent(md, KOBJ_CHANGE, param->event_nr);
+ if (!r)
r = __dev_status(md, param);
- }
dm_put(md);
return r;
More information about the dm-devel
mailing list