Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 154265
b: refs/heads/master
c: 60935eb
h: refs/heads/master
i:
  154263: c38549a
v: v3
  • Loading branch information
Milan Broz authored and Alasdair G Kergon committed Jun 22, 2009
1 parent 542547f commit fb01d87
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 486d220fe4909b5745c4faa67faddd30a707abe2
refs/heads/master: 60935eb21d3c5bac79618000f38f92c249d153c4
14 changes: 10 additions & 4 deletions trunk/drivers/md/dm-ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ static void dm_hash_remove_all(int keep_open_devices)
up_write(&_hash_lock);
}

static int dm_hash_rename(const char *old, const char *new)
static int dm_hash_rename(uint32_t cookie, const char *old, const char *new)
{
char *new_name, *old_name;
struct hash_cell *hc;
Expand Down Expand Up @@ -333,7 +333,7 @@ static int dm_hash_rename(const char *old, const char *new)
dm_table_put(table);
}

dm_kobject_uevent(hc->md);
dm_kobject_uevent(hc->md, KOBJ_CHANGE, cookie);

dm_put(hc->md);
up_write(&_hash_lock);
Expand Down Expand Up @@ -680,6 +680,9 @@ 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);

dm_put(md);
param->data_size = 0;
return 0;
Expand Down Expand Up @@ -715,7 +718,7 @@ static int dev_rename(struct dm_ioctl *param, size_t param_size)
return r;

param->data_size = 0;
return dm_hash_rename(param->name, new_name);
return dm_hash_rename(param->event_nr, param->name, new_name);
}

static int dev_set_geometry(struct dm_ioctl *param, size_t param_size)
Expand Down Expand Up @@ -842,8 +845,11 @@ static int do_resume(struct dm_ioctl *param)
if (dm_suspended(md))
r = dm_resume(md);

if (!r)

if (!r) {
dm_kobject_uevent(md, KOBJ_CHANGE, param->event_nr);
r = __dev_status(md, param);
}

dm_put(md);
return r;
Expand Down
25 changes: 19 additions & 6 deletions trunk/drivers/md/dm.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@

#define DM_MSG_PREFIX "core"

/*
* Cookies are numeric values sent with CHANGE and REMOVE
* uevents while resuming, removing or renaming the device.
*/
#define DM_COOKIE_ENV_VAR_NAME "DM_COOKIE"
#define DM_COOKIE_LENGTH 24

static const char *_name = DM_NAME;

static unsigned int major = 0;
Expand Down Expand Up @@ -1731,11 +1738,7 @@ int dm_resume(struct mapped_device *md)
clear_bit(DMF_SUSPENDED, &md->flags);

dm_table_unplug_all(map);

dm_kobject_uevent(md);

r = 0;

out:
dm_table_put(map);
mutex_unlock(&md->suspend_lock);
Expand All @@ -1746,9 +1749,19 @@ int dm_resume(struct mapped_device *md)
/*-----------------------------------------------------------------
* Event notification.
*---------------------------------------------------------------*/
void dm_kobject_uevent(struct mapped_device *md)
void dm_kobject_uevent(struct mapped_device *md, enum kobject_action action,
unsigned cookie)
{
kobject_uevent(&disk_to_dev(md->disk)->kobj, KOBJ_CHANGE);
char udev_cookie[DM_COOKIE_LENGTH];
char *envp[] = { udev_cookie, NULL };

if (!cookie)
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);
}
}

uint32_t dm_next_uevent_seq(struct mapped_device *md)
Expand Down
3 changes: 2 additions & 1 deletion trunk/drivers/md/dm.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ 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);
void dm_kobject_uevent(struct mapped_device *md, enum kobject_action action,
unsigned cookie);

int dm_kcopyd_init(void);
void dm_kcopyd_exit(void);
Expand Down
14 changes: 12 additions & 2 deletions trunk/include/linux/dm-ioctl.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,16 @@ struct dm_ioctl {
__u32 target_count; /* in/out */
__s32 open_count; /* out */
__u32 flags; /* in/out */

/*
* event_nr holds either the event number (input and output) or the
* udev cookie value (input only).
* The DM_DEV_WAIT ioctl takes an event number as input.
* The DM_SUSPEND, DM_DEV_REMOVE and DM_DEV_RENAME ioctls
* use the field as a cookie to return in the DM_COOKIE
* variable with the uevents they issue.
* For output, the ioctls return the event number, not the cookie.
*/
__u32 event_nr; /* in/out */
__u32 padding;

Expand Down Expand Up @@ -256,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 14
#define DM_VERSION_MINOR 15
#define DM_VERSION_PATCHLEVEL 0
#define DM_VERSION_EXTRA "-ioctl (2008-04-23)"
#define DM_VERSION_EXTRA "-ioctl (2009-04-01)"

/* Status bits */
#define DM_READONLY_FLAG (1 << 0) /* In/Out */
Expand Down

0 comments on commit fb01d87

Please sign in to comment.