Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3abf85b5 authored by Peter Rajnoha's avatar Peter Rajnoha Committed by Alasdair G Kergon
Browse files

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: default avatarPeter Rajnoha <prajnoha@redhat.com>
Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
parent a97f925a
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -285,7 +285,8 @@ retry:
	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;
	struct hash_cell *hc;
@@ -344,7 +345,8 @@ static int dm_hash_rename(uint32_t cookie, const char *old, const char *new)
		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);
	up_write(&_hash_lock);
@@ -736,10 +738,10 @@ static int dev_remove(struct dm_ioctl *param, size_t param_size)
	__hash_remove(hc);
	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);
	param->data_size = 0;
	return 0;
}

@@ -773,7 +775,9 @@ static int dev_rename(struct dm_ioctl *param, size_t param_size)
		return r;

	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)
@@ -899,8 +903,8 @@ static int do_resume(struct dm_ioctl *param)

	if (dm_suspended_md(md)) {
		r = dm_resume(md);
		if (!r)
			dm_kobject_uevent(md, KOBJ_CHANGE, param->event_nr);
		if (!r && !dm_kobject_uevent(md, KOBJ_CHANGE, param->event_nr))
			param->flags |= DM_UEVENT_GENERATED_FLAG;
	}

	if (old_map)
@@ -1477,6 +1481,7 @@ static int validate_params(uint cmd, struct dm_ioctl *param)
{
	/* Always clear this flag */
	param->flags &= ~DM_BUFFER_FULL_FLAG;
	param->flags &= ~DM_UEVENT_GENERATED_FLAG;

	/* Ignores parameters */
	if (cmd == DM_REMOVE_ALL_CMD ||
+4 −3
Original line number Diff line number Diff line
@@ -2618,18 +2618,19 @@ out:
/*-----------------------------------------------------------------
 * 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)
{
	char udev_cookie[DM_COOKIE_LENGTH];
	char *envp[] = { udev_cookie, NULL };

	if (!cookie)
		kobject_uevent(&disk_to_dev(md->disk)->kobj, action);
		return kobject_uevent(&disk_to_dev(md->disk)->kobj, action);
	else {
		snprintf(udev_cookie, DM_COOKIE_LENGTH, "%s=%u",
			 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);
	}
}

+2 −2
Original line number Diff line number Diff line
@@ -125,7 +125,7 @@ void dm_stripe_exit(void);
int dm_open_count(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);

int dm_io_init(void);
+7 −2
Original line number Diff line number Diff line
@@ -266,9 +266,9 @@ enum {
#define DM_DEV_SET_GEOMETRY	_IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl)

#define DM_VERSION_MAJOR	4
#define DM_VERSION_MINOR	16
#define DM_VERSION_MINOR	17
#define DM_VERSION_PATCHLEVEL	0
#define DM_VERSION_EXTRA	"-ioctl (2009-11-05)"
#define DM_VERSION_EXTRA	"-ioctl (2010-03-05)"

/* Status bits */
#define DM_READONLY_FLAG	(1 << 0) /* In/Out */
@@ -316,4 +316,9 @@ enum {
 */
#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 */