[dm-devel] [PATCH 14/16] Simplify uevent processing
Hannes Reinecke
hare at suse.de
Mon Apr 30 10:26:06 UTC 2012
We can get all sort of information from the udev device, so we
don't need to add our own fields here.
Signed-off-by: Hannes Reinecke <hare at suse.de>
---
libmultipath/blacklist.c | 28 +++++----
libmultipath/blacklist.h | 8 +-
libmultipath/discovery.c | 14 ++++-
libmultipath/structs.c | 2 +-
libmultipath/structs.h | 2 +-
libmultipath/uevent.c | 139 ++++++++++++++-------------------------------
libmultipath/uevent.h | 5 --
multipathd/main.c | 97 +++++++++++++-------------------
multipathd/main.h | 4 +-
9 files changed, 117 insertions(+), 182 deletions(-)
diff --git a/libmultipath/blacklist.c b/libmultipath/blacklist.c
index f369517..7807482 100644
--- a/libmultipath/blacklist.c
+++ b/libmultipath/blacklist.c
@@ -140,7 +140,7 @@ setup_default_blist (struct config * conf)
}
int
-_blacklist_exceptions (vector elist, char * str)
+_blacklist_exceptions (vector elist, const char * str)
{
int i;
struct blentry * ele;
@@ -153,7 +153,7 @@ _blacklist_exceptions (vector elist, char * str)
}
int
-_blacklist (vector blist, char * str)
+_blacklist (vector blist, const char * str)
{
int i;
struct blentry * ble;
@@ -166,7 +166,8 @@ _blacklist (vector blist, char * str)
}
int
-_blacklist_exceptions_device(vector elist, char * vendor, char * product)
+_blacklist_exceptions_device(vector elist, const char * vendor,
+ const char * product)
{
int i;
struct blentry_device * ble;
@@ -180,7 +181,7 @@ _blacklist_exceptions_device(vector elist, char * vendor, char * product)
}
int
-_blacklist_device (vector blist, char * vendor, char * product)
+_blacklist_device (vector blist, const char * vendor, const char * product)
{
int i;
struct blentry_device * ble;
@@ -202,7 +203,8 @@ _blacklist_device (vector blist, char * vendor, char * product)
condlog(3, "%s: %s", dev, (M))
void
-log_filter (char *dev, char *vendor, char *product, char *wwid, int r)
+log_filter (const char *dev, const char *vendor, const char *product,
+ const char *wwid, int r)
{
/*
* Try to sort from most likely to least.
@@ -232,7 +234,8 @@ log_filter (char *dev, char *vendor, char *product, char *wwid, int r)
}
int
-_filter_device (vector blist, vector elist, char * vendor, char * product)
+_filter_device (vector blist, vector elist,
+ const char * vendor, const char * product)
{
if (!vendor || !product)
return 0;
@@ -244,7 +247,8 @@ _filter_device (vector blist, vector elist, char * vendor, char * product)
}
int
-filter_device (vector blist, vector elist, char * vendor, char * product)
+filter_device (vector blist, vector elist,
+ const char * vendor, const char * product)
{
int r = _filter_device(blist, elist, vendor, product);
log_filter(NULL, vendor, product, NULL, r);
@@ -252,7 +256,7 @@ filter_device (vector blist, vector elist, char * vendor, char * product)
}
int
-_filter_devnode (vector blist, vector elist, char * dev)
+_filter_devnode (vector blist, vector elist, const char * dev)
{
if (!dev)
return 0;
@@ -264,7 +268,7 @@ _filter_devnode (vector blist, vector elist, char * dev)
}
int
-filter_devnode (vector blist, vector elist, char * dev)
+filter_devnode (vector blist, vector elist, const char * dev)
{
int r = _filter_devnode(blist, elist, dev);
log_filter(dev, NULL, NULL, NULL, r);
@@ -272,7 +276,7 @@ filter_devnode (vector blist, vector elist, char * dev)
}
int
-_filter_wwid (vector blist, vector elist, char * wwid)
+_filter_wwid (vector blist, vector elist, const char * wwid)
{
if (!wwid)
return 0;
@@ -284,7 +288,7 @@ _filter_wwid (vector blist, vector elist, char * wwid)
}
int
-filter_wwid (vector blist, vector elist, char * wwid)
+filter_wwid (vector blist, vector elist, const char * wwid)
{
int r = _filter_wwid(blist, elist, wwid);
log_filter(NULL, NULL, NULL, wwid, r);
@@ -327,7 +331,7 @@ free_blacklist (vector blist)
vector_foreach_slot (blist, ble, i) {
if (ble) {
regfree(&ble->regex);
- FREE(ble->str);
+ FREE((char *)ble->str);
FREE(ble);
}
}
diff --git a/libmultipath/blacklist.h b/libmultipath/blacklist.h
index cdbebef..937c98d 100644
--- a/libmultipath/blacklist.h
+++ b/libmultipath/blacklist.h
@@ -12,7 +12,7 @@
#define MATCH_DEVNODE_BLIST_EXCEPT -MATCH_DEVNODE_BLIST
struct blentry {
- char * str;
+ const char * str;
regex_t regex;
int origin;
};
@@ -27,9 +27,9 @@ struct blentry_device {
int setup_default_blist (struct config *);
int alloc_ble_device (vector);
-int filter_devnode (vector, vector, char *);
-int filter_wwid (vector, vector, char *);
-int filter_device (vector, vector, char *, char *);
+int filter_devnode (vector, vector, const char *);
+int filter_wwid (vector, vector, const char *);
+int filter_device (vector, vector, const char *, const char *);
int filter_path (struct config *, struct path *);
int store_ble (vector, char *, int);
int set_ble_device (vector, char *, char *, int);
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index 7adda2a..d666bfe 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -104,6 +104,8 @@ path_discovery (vector pathvec, struct config * conf, int flag)
udev_list_entry_foreach(entry,
udev_enumerate_get_list_entry(udev_iter)) {
+ const char *sysname;
+
devpath = udev_list_entry_get_name(entry);
condlog(4, "Discover device %s", devpath);
udevice = udev_device_new_from_syspath(conf->udev, devpath);
@@ -112,8 +114,16 @@ path_discovery (vector pathvec, struct config * conf, int flag)
r++;
continue;
}
- if(!strncmp(udev_device_get_devtype(udevice), "disk", 4))
- r += path_discover(pathvec, conf, udevice, flag);
+ sysname = udev_device_get_sysname(udevice);
+ if (strncmp(udev_device_get_devtype(udevice), "disk", 4)) {
+ condlog(4, "%s: Ignore non-disk device", sysname);
+ continue;
+ }
+ if (udev_device_get_sysattr_value(udevice, "partition")) {
+ condlog(4, "%s: Ignore partition", sysname);
+ continue;
+ }
+ r += path_discover(pathvec, conf, udevice, flag);
udev_device_unref(udevice);
}
udev_enumerate_unref(udev_iter);
diff --git a/libmultipath/structs.c b/libmultipath/structs.c
index 3c0fe90..f0f1b60 100644
--- a/libmultipath/structs.c
+++ b/libmultipath/structs.c
@@ -308,7 +308,7 @@ find_mp_by_str (vector mpvec, char * str)
}
struct path *
-find_path_by_dev (vector pathvec, char * dev)
+find_path_by_dev (vector pathvec, const char * dev)
{
int i;
struct path * pp;
diff --git a/libmultipath/structs.h b/libmultipath/structs.h
index 4f643ef..a497896 100644
--- a/libmultipath/structs.h
+++ b/libmultipath/structs.h
@@ -246,7 +246,7 @@ struct multipath * find_mp_by_str (vector mp, char * wwid);
struct multipath * find_mp_by_minor (vector mp, int minor);
struct path * find_path_by_devt (vector pathvec, char * devt);
-struct path * find_path_by_dev (vector pathvec, char * dev);
+struct path * find_path_by_dev (vector pathvec, const char * dev);
struct path * first_path (struct multipath * mpp);
int pathcountgr (struct pathgroup *, int);
diff --git a/libmultipath/uevent.c b/libmultipath/uevent.c
index 5450dd7..c1d45b0 100644
--- a/libmultipath/uevent.c
+++ b/libmultipath/uevent.c
@@ -34,7 +34,7 @@
#include <sys/socket.h>
#include <sys/user.h>
#include <sys/un.h>
-#include <linux/types.h>
+#include <sys/types.h>
#include <linux/netlink.h>
#include <pthread.h>
#include <limits.h>
@@ -217,65 +217,28 @@ int uevent_listen(void)
goto out;
}
while (1) {
- int i = 0;
- char *pos, *end;
struct uevent *uev;
struct udev_device *dev;
- struct udev_list_entry *list_entry;
dev = udev_monitor_receive_device(monitor);
if (!dev) {
condlog(0, "failed getting udev device");
continue;
}
-
+ if (udev_device_get_sysattr_value(dev, "partition")) {
+ condlog(3, "Ignoring partition uevent");
+ continue;
+ }
uev = alloc_uevent();
if (!uev) {
condlog(1, "lost uevent, oom");
continue;
}
- pos = uev->buffer;
- end = pos + HOTPLUG_BUFFER_SIZE + OBJECT_SIZE - 1;
- udev_list_entry_foreach(list_entry,
- udev_device_get_properties_list_entry(dev)) {
- const char *name, *value;
- int bytes;
-
- name = udev_list_entry_get_name(list_entry);
- if (!name)
- name = "(null)";
- value = udev_list_entry_get_value(list_entry);
- if (!value)
- value = "(null)";
- bytes = snprintf(pos, end - pos, "%s=%s", name,
- value);
- if (pos + bytes >= end) {
- condlog(2, "buffer overflow for uevent");
- break;
- }
- uev->envp[i] = pos;
- pos += bytes;
- *pos = '\0';
- pos++;
- if (strcmp(name, "DEVPATH") == 0)
- uev->devpath = uev->envp[i] + 8;
- if (strcmp(name, "ACTION") == 0)
- uev->action = uev->envp[i] + 7;
- i++;
- if (i == HOTPLUG_NUM_ENVP - 1)
- break;
- }
uev->udev = dev;
- uev->envp[i] = NULL;
- condlog(3, "uevent '%s' from '%s'", uev->action, uev->devpath);
- uev->kernel = strrchr(uev->devpath, '/');
- if (uev->kernel)
- uev->kernel++;
-
- /* print payload environment */
- for (i = 0; uev->envp[i] != NULL; i++)
- condlog(5, "%s", uev->envp[i]);
+ condlog(3, "uevent '%s' from '%s'",
+ udev_device_get_action(dev),
+ udev_device_get_devpath(dev));
/*
* Queue uevent and poke service pthread.
@@ -297,58 +260,43 @@ out:
extern int
uevent_get_major(struct uevent *uev)
{
- char *p, *q;
- int i, major = -1;
-
- for (i = 0; uev->envp[i] != NULL; i++) {
- if (!strncmp(uev->envp[i], "MAJOR", 5) && strlen(uev->envp[i]) > 6) {
- p = uev->envp[i] + 6;
- major = strtoul(p, &q, 10);
- if (p == q) {
- condlog(2, "invalid major '%s'", p);
- major = -1;
- }
- break;
- }
+ dev_t dev_devt;
+ int m = 0;
+
+ if (uev->udev) {
+ dev_devt = udev_device_get_devnum(uev->udev);
+ m = major(dev_devt);
}
- return major;
+ return m;
}
extern int
uevent_get_minor(struct uevent *uev)
{
- char *p, *q;
- int i, minor = -1;
-
- for (i = 0; uev->envp[i] != NULL; i++) {
- if (!strncmp(uev->envp[i], "MINOR", 5) && strlen(uev->envp[i]) > 6) {
- p = uev->envp[i] + 6;
- minor = strtoul(p, &q, 10);
- if (p == q) {
- condlog(2, "invalid minor '%s'", p);
- minor = -1;
- }
- break;
- }
+ dev_t dev_devt;
+ int m = 0;
+
+ if (uev->udev) {
+ dev_devt = udev_device_get_devnum(uev->udev);
+ m = minor(dev_devt);
}
- return minor;
+ return m;
}
extern int
uevent_get_disk_ro(struct uevent *uev)
{
- char *p, *q;
- int i, ro = -1;
-
- for (i = 0; uev->envp[i] != NULL; i++) {
- if (!strncmp(uev->envp[i], "DISK_RO", 6) && strlen(uev->envp[i]) > 7) {
- p = uev->envp[i] + 8;
- ro = strtoul(p, &q, 10);
- if (p == q) {
- condlog(2, "invalid read_only setting '%s'", p);
- ro = -1;
- }
- break;
+ const char *p = NULL;
+ char *q;
+ int ro = -1;
+
+ if (uev->udev)
+ p = udev_device_get_property_value(uev->udev, "DISK_RO");
+ if (p) {
+ ro = strtoul(p, &q, 10);
+ if (p == q) {
+ condlog(2, "invalid read_only setting '%s'", p);
+ ro = -1;
}
}
return ro;
@@ -357,16 +305,15 @@ uevent_get_disk_ro(struct uevent *uev)
extern char *
uevent_get_dm_name(struct uevent *uev)
{
- char *p = NULL;
- int i;
-
- for (i = 0; uev->envp[i] != NULL; i++) {
- if (!strncmp(uev->envp[i], "DM_NAME", 6) &&
- strlen(uev->envp[i]) > 7) {
- p = MALLOC(strlen(uev->envp[i] + 8) + 1);
- strcpy(p, uev->envp[i] + 8);
- break;
- }
+ const char *p = NULL;
+ char *name = NULL;
+
+ if (uev->udev)
+ p = udev_device_get_property_value(uev->udev, "DM_NAME");
+ if (p) {
+ name = MALLOC(strlen(p) + 1);
+ if (name)
+ strcpy(name, p);
}
- return p;
+ return name;
}
diff --git a/libmultipath/uevent.h b/libmultipath/uevent.h
index 64f00b7..542ec0b 100644
--- a/libmultipath/uevent.h
+++ b/libmultipath/uevent.h
@@ -16,11 +16,6 @@
struct uevent {
struct list_head node;
struct udev_device *udev;
- char buffer[HOTPLUG_BUFFER_SIZE + OBJECT_SIZE];
- char *devpath;
- char *action;
- char *kernel;
- char *envp[HOTPLUG_NUM_ENVP];
};
int is_uevent_busy(void);
diff --git a/multipathd/main.c b/multipathd/main.c
index f7625ca..3845880 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -242,26 +242,28 @@ uev_add_map (struct uevent * uev, struct vectors * vecs)
char *alias;
int major = -1, minor = -1, rc;
- condlog(3, "%s: add map (uevent)", uev->kernel);
+ condlog(3, "%s: add map (uevent)", udev_device_get_sysname(uev->udev));
alias = uevent_get_dm_name(uev);
if (!alias) {
- condlog(3, "%s: No DM_NAME in uevent", uev->kernel);
+ condlog(3, "%s: No DM_NAME in uevent",
+ udev_device_get_sysname(uev->udev));
major = uevent_get_major(uev);
minor = uevent_get_minor(uev);
alias = dm_mapname(major, minor);
if (!alias) {
condlog(2, "%s: mapname not found for %d:%d",
- uev->kernel, major, minor);
+ udev_device_get_sysname(uev->udev),
+ major, minor);
return 1;
}
}
- rc = ev_add_map(uev->kernel, alias, vecs);
+ rc = ev_add_map(udev_device_get_sysname(uev->udev), alias, vecs);
FREE(alias);
return rc;
}
int
-ev_add_map (char * dev, char * alias, struct vectors * vecs)
+ev_add_map (const char * dev, char * alias, struct vectors * vecs)
{
char * refwwid;
struct multipath * mpp;
@@ -300,7 +302,7 @@ ev_add_map (char * dev, char * alias, struct vectors * vecs)
condlog(2, "%s: devmap %s registered", alias, dev);
return 0;
}
- refwwid = get_refwwid(dev, DEV_DEVMAP, vecs->pathvec);
+ refwwid = get_refwwid((char *)dev, DEV_DEVMAP, vecs->pathvec);
if (refwwid) {
r = coalesce_paths(vecs, NULL, refwwid, 0);
@@ -323,10 +325,12 @@ uev_remove_map (struct uevent * uev, struct vectors * vecs)
int minor;
struct multipath *mpp;
- condlog(2, "%s: remove map (uevent)", uev->kernel);
+ condlog(2, "%s: remove map (uevent)",
+ udev_device_get_sysname(uev->udev));
alias = uevent_get_dm_name(uev);
if (!alias) {
- condlog(3, "%s: No DM_NAME in uevent, ignoring", uev->kernel);
+ condlog(3, "%s: No DM_NAME in uevent, ignoring",
+ udev_device_get_sysname(uev->udev));
return 0;
}
minor = uevent_get_minor(uev);
@@ -334,7 +338,7 @@ uev_remove_map (struct uevent * uev, struct vectors * vecs)
if (!mpp) {
condlog(2, "%s: devmap not registered, can't remove",
- uev->kernel);
+ udev_device_get_sysname(uev->udev));
goto out;
}
if (strcmp(mpp->alias, alias)) {
@@ -351,7 +355,7 @@ out:
}
int
-ev_remove_map (char * devname, char * alias, int minor, struct vectors * vecs)
+ev_remove_map (const char * devname, char * alias, int minor, struct vectors * vecs)
{
struct multipath * mpp;
@@ -374,20 +378,14 @@ static int
uev_add_path (struct uevent *uev, struct vectors * vecs)
{
struct path *pp;
+ const char *sysname = udev_device_get_sysname(uev->udev);
- condlog(2, "%s: add path (uevent)", uev->kernel);
- if (strstr(uev->kernel, "..") != NULL) {
- /*
- * Don't allow relative device names in the pathvec
- */
- condlog(0, "%s: path name is invalid", uev->kernel);
- return 1;
- }
+ condlog(2, "%s: add path (uevent)", sysname);
- pp = find_path_by_dev(vecs->pathvec, uev->kernel);
+ pp = find_path_by_dev(vecs->pathvec, sysname);
if (pp) {
condlog(0, "%s: spurious uevent, path already in pathvec",
- uev->kernel);
+ sysname);
if (pp->mpp)
return 0;
} else {
@@ -400,7 +398,7 @@ uev_add_path (struct uevent *uev, struct vectors * vecs)
if (!(pp = store_pathinfo(vecs->pathvec, conf->hwtable,
udevice, DI_ALL))) {
condlog(0, "%s: failed to store path info",
- uev->kernel);
+ sysname);
udev_device_unref(udevice);
return 1;
}
@@ -555,13 +553,14 @@ static int
uev_remove_path (struct uevent *uev, struct vectors * vecs)
{
struct path *pp;
+ const char *sysname = udev_device_get_sysname(uev->udev);
- condlog(2, "%s: remove path (uevent)", uev->kernel);
- pp = find_path_by_dev(vecs->pathvec, uev->kernel);
+ condlog(2, "%s: remove path (uevent)", sysname);
+ pp = find_path_by_dev(vecs->pathvec, sysname);
if (!pp) {
/* Not an error; path might have been purged earlier */
- condlog(0, "%s: path already removed", uev->kernel);
+ condlog(0, "%s: path already removed", sysname);
return 0;
}
@@ -665,6 +664,7 @@ static int
uev_update_path (struct uevent *uev, struct vectors * vecs)
{
int retval, ro;
+ const char *sysname = udev_device_get_sysname(uev->udev);
ro = uevent_get_disk_ro(uev);
@@ -672,18 +672,18 @@ uev_update_path (struct uevent *uev, struct vectors * vecs)
struct path * pp;
condlog(2, "%s: update path write_protect to '%d' (uevent)",
- uev->kernel, ro);
- pp = find_path_by_dev(vecs->pathvec, uev->kernel);
+ sysname, ro);
+ pp = find_path_by_dev(vecs->pathvec, sysname);
if (!pp) {
condlog(0, "%s: spurious uevent, path not found",
- uev->kernel);
+ sysname);
return 1;
}
if (pp->mpp)
retval = reload_map(vecs, pp->mpp);
condlog(2, "%s: map %s reloaded (retval %d)",
- uev->kernel, pp->mpp->alias, retval);
+ pp->dev, pp->mpp->alias, retval);
}
@@ -738,38 +738,17 @@ uxsock_trigger (char * str, char ** reply, int * len, void * trigger_data)
return r;
}
-static int
-uev_discard(char * devpath)
-{
- char *tmp;
- char a[11], b[11];
-
- /*
- * keep only block devices, discard partitions
- */
- tmp = strstr(devpath, "/block/");
- if (tmp == NULL){
- condlog(4, "no /block/ in '%s'", devpath);
- return 1;
- }
- if (sscanf(tmp, "/block/%10s", a) != 1 ||
- sscanf(tmp, "/block/%10[^/]/%10s", a, b) == 2) {
- condlog(4, "discard event on %s", devpath);
- return 1;
- }
- return 0;
-}
-
int
uev_trigger (struct uevent * uev, void * trigger_data)
{
int r = 0;
struct vectors * vecs;
+ const char *action = udev_device_get_action(uev->udev);
+ const char *sysname = udev_device_get_sysname(uev->udev);
vecs = (struct vectors *)trigger_data;
- if (uev_discard(uev->devpath))
- return 0;
+ condlog(3, "%s: uevent '%s'", sysname, action);
pthread_cleanup_push(cleanup_lock, &vecs->lock);
lock(vecs->lock);
@@ -780,12 +759,12 @@ uev_trigger (struct uevent * uev, void * trigger_data)
* Add events are ignored here as the tables
* are not fully initialised then.
*/
- if (!strncmp(uev->kernel, "dm-", 3)) {
- if (!strncmp(uev->action, "change", 6)) {
+ if (!strncmp(sysname, "dm-", 3)) {
+ if (!action || !strncmp(action, "change", 6)) {
r = uev_add_map(uev, vecs);
goto out;
}
- if (!strncmp(uev->action, "remove", 6)) {
+ if (action && !strncmp(action, "remove", 6)) {
r = uev_remove_map(uev, vecs);
goto out;
}
@@ -796,18 +775,18 @@ uev_trigger (struct uevent * uev, void * trigger_data)
* path add/remove event
*/
if (filter_devnode(conf->blist_devnode, conf->elist_devnode,
- uev->kernel) > 0)
+ udev_device_get_sysname(uev->udev)) > 0)
goto out;
- if (!strncmp(uev->action, "add", 3)) {
+ if (!action || !strncmp(action, "add", 3)) {
r = uev_add_path(uev, vecs);
goto out;
}
- if (!strncmp(uev->action, "remove", 6)) {
+ if (action && !strncmp(action, "remove", 6)) {
r = uev_remove_path(uev, vecs);
goto out;
}
- if (!strncmp(uev->action, "change", 6)) {
+ if (action && !strncmp(action, "change", 6)) {
r = uev_update_path(uev, vecs);
goto out;
}
diff --git a/multipathd/main.h b/multipathd/main.h
index 242f5e1..af825d5 100644
--- a/multipathd/main.h
+++ b/multipathd/main.h
@@ -21,8 +21,8 @@ const char * daemon_status(void);
int reconfigure (struct vectors *);
int ev_add_path (struct path *, struct vectors *);
int ev_remove_path (struct path *, struct vectors *);
-int ev_add_map (char *, char *, struct vectors *);
-int ev_remove_map (char *, char *, int, struct vectors *);
+int ev_add_map (const char *, char *, struct vectors *);
+int ev_remove_map (const char *, char *, int, struct vectors *);
void sync_map_state (struct multipath *);
void * mpath_alloc_prin_response(int prin_sa);
int prin_do_scsi_ioctl(char *, int rq_servact, struct prin_resp * resp,
--
1.7.3.4
More information about the dm-devel
mailing list