提交 3abf85b5 编写于 作者: P Peter Rajnoha 提交者: Alasdair G Kergon

dm ioctl: introduce flag indicating uevent was generated

Set a new DM_UEVENT_GENERATED_FLAG when returning from ioctls to
indicate that a uevent was actually generated.  This tells the userspace
caller that it may need to wait for the event to be processed.
Signed-off-by: NPeter Rajnoha <prajnoha@redhat.com>
Signed-off-by: NAlasdair G Kergon <agk@redhat.com>
上级 a97f925a
...@@ -285,7 +285,8 @@ static void dm_hash_remove_all(int keep_open_devices) ...@@ -285,7 +285,8 @@ static void dm_hash_remove_all(int keep_open_devices)
up_write(&_hash_lock); up_write(&_hash_lock);
} }
static int dm_hash_rename(uint32_t cookie, const char *old, const char *new) static int dm_hash_rename(uint32_t cookie, uint32_t *flags, const char *old,
const char *new)
{ {
char *new_name, *old_name; char *new_name, *old_name;
struct hash_cell *hc; struct hash_cell *hc;
...@@ -344,7 +345,8 @@ static int dm_hash_rename(uint32_t cookie, const char *old, const char *new) ...@@ -344,7 +345,8 @@ static int dm_hash_rename(uint32_t cookie, const char *old, const char *new)
dm_table_put(table); dm_table_put(table);
} }
dm_kobject_uevent(hc->md, KOBJ_CHANGE, cookie); if (!dm_kobject_uevent(hc->md, KOBJ_CHANGE, cookie))
*flags |= DM_UEVENT_GENERATED_FLAG;
dm_put(hc->md); dm_put(hc->md);
up_write(&_hash_lock); up_write(&_hash_lock);
...@@ -736,10 +738,10 @@ static int dev_remove(struct dm_ioctl *param, size_t param_size) ...@@ -736,10 +738,10 @@ static int dev_remove(struct dm_ioctl *param, size_t param_size)
__hash_remove(hc); __hash_remove(hc);
up_write(&_hash_lock); up_write(&_hash_lock);
dm_kobject_uevent(md, KOBJ_REMOVE, param->event_nr); if (!dm_kobject_uevent(md, KOBJ_REMOVE, param->event_nr))
param->flags |= DM_UEVENT_GENERATED_FLAG;
dm_put(md); dm_put(md);
param->data_size = 0;
return 0; return 0;
} }
...@@ -773,7 +775,9 @@ static int dev_rename(struct dm_ioctl *param, size_t param_size) ...@@ -773,7 +775,9 @@ static int dev_rename(struct dm_ioctl *param, size_t param_size)
return r; return r;
param->data_size = 0; param->data_size = 0;
return dm_hash_rename(param->event_nr, param->name, new_name);
return dm_hash_rename(param->event_nr, &param->flags, param->name,
new_name);
} }
static int dev_set_geometry(struct dm_ioctl *param, size_t param_size) static int dev_set_geometry(struct dm_ioctl *param, size_t param_size)
...@@ -899,8 +903,8 @@ static int do_resume(struct dm_ioctl *param) ...@@ -899,8 +903,8 @@ static int do_resume(struct dm_ioctl *param)
if (dm_suspended_md(md)) { if (dm_suspended_md(md)) {
r = dm_resume(md); r = dm_resume(md);
if (!r) if (!r && !dm_kobject_uevent(md, KOBJ_CHANGE, param->event_nr))
dm_kobject_uevent(md, KOBJ_CHANGE, param->event_nr); param->flags |= DM_UEVENT_GENERATED_FLAG;
} }
if (old_map) if (old_map)
...@@ -1477,6 +1481,7 @@ static int validate_params(uint cmd, struct dm_ioctl *param) ...@@ -1477,6 +1481,7 @@ static int validate_params(uint cmd, struct dm_ioctl *param)
{ {
/* Always clear this flag */ /* Always clear this flag */
param->flags &= ~DM_BUFFER_FULL_FLAG; param->flags &= ~DM_BUFFER_FULL_FLAG;
param->flags &= ~DM_UEVENT_GENERATED_FLAG;
/* Ignores parameters */ /* Ignores parameters */
if (cmd == DM_REMOVE_ALL_CMD || if (cmd == DM_REMOVE_ALL_CMD ||
......
...@@ -2618,18 +2618,19 @@ int dm_resume(struct mapped_device *md) ...@@ -2618,18 +2618,19 @@ int dm_resume(struct mapped_device *md)
/*----------------------------------------------------------------- /*-----------------------------------------------------------------
* Event notification. * Event notification.
*---------------------------------------------------------------*/ *---------------------------------------------------------------*/
void dm_kobject_uevent(struct mapped_device *md, enum kobject_action action, int dm_kobject_uevent(struct mapped_device *md, enum kobject_action action,
unsigned cookie) unsigned cookie)
{ {
char udev_cookie[DM_COOKIE_LENGTH]; char udev_cookie[DM_COOKIE_LENGTH];
char *envp[] = { udev_cookie, NULL }; char *envp[] = { udev_cookie, NULL };
if (!cookie) if (!cookie)
kobject_uevent(&disk_to_dev(md->disk)->kobj, action); return kobject_uevent(&disk_to_dev(md->disk)->kobj, action);
else { else {
snprintf(udev_cookie, DM_COOKIE_LENGTH, "%s=%u", snprintf(udev_cookie, DM_COOKIE_LENGTH, "%s=%u",
DM_COOKIE_ENV_VAR_NAME, cookie); DM_COOKIE_ENV_VAR_NAME, cookie);
kobject_uevent_env(&disk_to_dev(md->disk)->kobj, action, envp); return kobject_uevent_env(&disk_to_dev(md->disk)->kobj,
action, envp);
} }
} }
......
...@@ -125,8 +125,8 @@ void dm_stripe_exit(void); ...@@ -125,8 +125,8 @@ void dm_stripe_exit(void);
int dm_open_count(struct mapped_device *md); int dm_open_count(struct mapped_device *md);
int dm_lock_for_deletion(struct mapped_device *md); int dm_lock_for_deletion(struct mapped_device *md);
void dm_kobject_uevent(struct mapped_device *md, enum kobject_action action, int dm_kobject_uevent(struct mapped_device *md, enum kobject_action action,
unsigned cookie); unsigned cookie);
int dm_io_init(void); int dm_io_init(void);
void dm_io_exit(void); void dm_io_exit(void);
......
...@@ -266,9 +266,9 @@ enum { ...@@ -266,9 +266,9 @@ enum {
#define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl) #define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl)
#define DM_VERSION_MAJOR 4 #define DM_VERSION_MAJOR 4
#define DM_VERSION_MINOR 16 #define DM_VERSION_MINOR 17
#define DM_VERSION_PATCHLEVEL 0 #define DM_VERSION_PATCHLEVEL 0
#define DM_VERSION_EXTRA "-ioctl (2009-11-05)" #define DM_VERSION_EXTRA "-ioctl (2010-03-05)"
/* Status bits */ /* Status bits */
#define DM_READONLY_FLAG (1 << 0) /* In/Out */ #define DM_READONLY_FLAG (1 << 0) /* In/Out */
...@@ -316,4 +316,9 @@ enum { ...@@ -316,4 +316,9 @@ enum {
*/ */
#define DM_QUERY_INACTIVE_TABLE_FLAG (1 << 12) /* In */ #define DM_QUERY_INACTIVE_TABLE_FLAG (1 << 12) /* In */
/*
* If set, a uevent was generated for which the caller may need to wait.
*/
#define DM_UEVENT_GENERATED_FLAG (1 << 13) /* Out */
#endif /* _LINUX_DM_IOCTL_H */ #endif /* _LINUX_DM_IOCTL_H */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册