From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Mon, 17 Jan 2022 14:45:38 -0600 Subject: [PATCH] libmultipath: make helper function to trigger path uevents Pull the code that checks if a path needs to trigger a uevent, and triggers, out of trigger_paths_udev_change() and into a new function, trigger_path_udev_change(). This function will be used separately by a future patch. No functional changes. Signed-off-by: Benjamin Marzinski --- libmultipath/configure.c | 79 +++++++++++++++++++++------------------- libmultipath/configure.h | 1 + 2 files changed, 43 insertions(+), 37 deletions(-) diff --git a/libmultipath/configure.c b/libmultipath/configure.c index 7edb355b..043e4232 100644 --- a/libmultipath/configure.c +++ b/libmultipath/configure.c @@ -565,11 +565,8 @@ unref: } void -trigger_paths_udev_change(struct multipath *mpp, bool is_mpath) +trigger_path_udev_change(struct path *pp, bool is_mpath) { - struct pathgroup *pgp; - struct path *pp; - int i, j; /* * If a path changes from multipath to non-multipath, we must * synthesize an artificial "add" event, otherwise the LVM2 rules @@ -577,6 +574,45 @@ trigger_paths_udev_change(struct multipath *mpp, bool is_mpath) * irritate ourselves with an "add", so use "change". */ const char *action = is_mpath ? "change" : "add"; + const char *env; + + if (!pp->udev) + return; + /* + * Paths that are already classified as multipath + * members don't need another uevent. + */ + env = udev_device_get_property_value( + pp->udev, "DM_MULTIPATH_DEVICE_PATH"); + + if (is_mpath && env != NULL && !strcmp(env, "1")) { + /* + * If FIND_MULTIPATHS_WAIT_UNTIL is not "0", + * path is in "maybe" state and timer is running + * Send uevent now (see multipath.rules). + */ + env = udev_device_get_property_value( + pp->udev, "FIND_MULTIPATHS_WAIT_UNTIL"); + if (env == NULL || !strcmp(env, "0")) + return; + } else if (!is_mpath && + (env == NULL || !strcmp(env, "0"))) + return; + + condlog(3, "triggering %s uevent for %s (is %smultipath member)", + action, pp->dev, is_mpath ? "" : "no "); + sysfs_attr_set_value(pp->udev, "uevent", + action, strlen(action)); + trigger_partitions_udev_change(pp->udev, action, + strlen(action)); +} + +void +trigger_paths_udev_change(struct multipath *mpp, bool is_mpath) +{ + struct pathgroup *pgp; + struct path *pp; + int i, j; if (!mpp || !mpp->pg) return; @@ -584,39 +620,8 @@ trigger_paths_udev_change(struct multipath *mpp, bool is_mpath) vector_foreach_slot (mpp->pg, pgp, i) { if (!pgp->paths) continue; - vector_foreach_slot(pgp->paths, pp, j) { - const char *env; - - if (!pp->udev) - continue; - /* - * Paths that are already classified as multipath - * members don't need another uevent. - */ - env = udev_device_get_property_value( - pp->udev, "DM_MULTIPATH_DEVICE_PATH"); - - if (is_mpath && env != NULL && !strcmp(env, "1")) { - /* - * If FIND_MULTIPATHS_WAIT_UNTIL is not "0", - * path is in "maybe" state and timer is running - * Send uevent now (see multipath.rules). - */ - env = udev_device_get_property_value( - pp->udev, "FIND_MULTIPATHS_WAIT_UNTIL"); - if (env == NULL || !strcmp(env, "0")) - continue; - } else if (!is_mpath && - (env == NULL || !strcmp(env, "0"))) - continue; - - condlog(3, "triggering %s uevent for %s (is %smultipath member)", - action, pp->dev, is_mpath ? "" : "no "); - sysfs_attr_set_value(pp->udev, "uevent", - action, strlen(action)); - trigger_partitions_udev_change(pp->udev, action, - strlen(action)); - } + vector_foreach_slot(pgp->paths, pp, j) + trigger_path_udev_change(pp, is_mpath); } mpp->needs_paths_uevent = 0; diff --git a/libmultipath/configure.h b/libmultipath/configure.h index efe18b7d..2bf73e65 100644 --- a/libmultipath/configure.h +++ b/libmultipath/configure.h @@ -56,6 +56,7 @@ int coalesce_paths (struct vectors *vecs, vector curmp, char * refwwid, int forc int get_refwwid (enum mpath_cmds cmd, const char *dev, enum devtypes dev_type, vector pathvec, char **wwid); struct udev_device *get_udev_device(const char *dev, enum devtypes dev_type); +void trigger_path_udev_change(struct path *pp, bool is_mpath); void trigger_paths_udev_change(struct multipath *mpp, bool is_mpath); void trigger_partitions_udev_change(struct udev_device *dev, const char *action, int len);