@@ -1018,7 +1018,7 @@ int domap(struct multipath *mpp, char *params, int is_daemon)
mpp->action = ACT_NOTHING;
else {
conf = get_multipath_config();
- mpp->wait_for_udev = 1;
+ mpp->wait_for_udev = UDEV_WAIT_STARTED;
mpp->uev_wait_tick = conf->uev_wait_timeout;
put_multipath_config(conf);
}
@@ -430,6 +430,12 @@ enum prio_update_type {
PRIO_UPDATE_MARGINAL,
};
+enum udev_wait_states {
+ UDEV_WAIT_DONE = 0,
+ UDEV_WAIT_STARTED,
+ UDEV_WAIT_RELOAD,
+};
+
struct multipath {
char wwid[WWID_SIZE];
char alias_old[WWID_SIZE];
@@ -441,7 +447,7 @@ struct multipath {
int bestpg;
int queuedio;
int action;
- int wait_for_udev;
+ enum udev_wait_states wait_for_udev;
int uev_wait_tick;
int pgfailback;
int failback_tick;
@@ -812,7 +812,7 @@ cli_reload(void *v, struct strbuf *reply, void *data)
if (!mpp)
return -ENODEV;
- if (mpp->wait_for_udev) {
+ if (mpp->wait_for_udev != UDEV_WAIT_DONE) {
condlog(2, "%s: device not fully created, failing reload",
mpp->alias);
return 1;
@@ -841,7 +841,7 @@ cli_resize(void *v, struct strbuf *reply, void *data)
if (!mpp)
return -ENODEV;
- if (mpp->wait_for_udev) {
+ if (mpp->wait_for_udev != UDEV_WAIT_DONE) {
condlog(2, "%s: device not fully created, failing resize",
mpp->alias);
return 1;
@@ -1046,7 +1046,7 @@ cli_suspend(void * v, struct strbuf *reply, void * data)
if (!mpp)
return 1;
- if (mpp->wait_for_udev) {
+ if (mpp->wait_for_udev != UDEV_WAIT_DONE) {
condlog(2, "%s: device not fully created, failing suspend",
mpp->alias);
return 1;
@@ -1078,7 +1078,7 @@ cli_resume(void * v, struct strbuf *reply, void * data)
return 1;
udev_flags = (mpp->skip_kpartx)? MPATH_UDEV_NO_KPARTX_FLAG : 0;
- if (mpp->wait_for_udev) {
+ if (mpp->wait_for_udev != UDEV_WAIT_DONE) {
condlog(2, "%s: device not fully created, failing resume",
mpp->alias);
return 1;
@@ -1131,7 +1131,7 @@ cli_reassign (void * v, struct strbuf *reply, void * data)
if (!mpp)
return 1;
- if (mpp->wait_for_udev) {
+ if (mpp->wait_for_udev != UDEV_WAIT_DONE) {
condlog(2, "%s: device not fully created, failing reassign",
mpp->alias);
return 1;
@@ -1406,7 +1406,7 @@ static int cli_set_marginal(void * v, struct strbuf *reply, void * data)
condlog(2, "%s: set marginal path %s (operator)",
pp->mpp->alias, pp->dev_t);
- if (pp->mpp->wait_for_udev) {
+ if (pp->mpp->wait_for_udev != UDEV_WAIT_DONE) {
condlog(2, "%s: device not fully created, failing set marginal",
pp->mpp->alias);
return 1;
@@ -1433,7 +1433,7 @@ static int cli_unset_marginal(void * v, struct strbuf *reply, void * data)
condlog(2, "%s: unset marginal path %s (operator)",
pp->mpp->alias, pp->dev_t);
- if (pp->mpp->wait_for_udev) {
+ if (pp->mpp->wait_for_udev != UDEV_WAIT_DONE) {
condlog(2, "%s: device not fully created, "
"failing unset marginal", pp->mpp->alias);
return 1;
@@ -1461,7 +1461,7 @@ static int cli_unset_all_marginal(void * v, struct strbuf *reply, void * data)
if (!mpp)
return -ENODEV;
- if (mpp->wait_for_udev) {
+ if (mpp->wait_for_udev != UDEV_WAIT_DONE) {
condlog(2, "%s: device not fully created, "
"failing unset all marginal", mpp->alias);
return 1;
@@ -331,7 +331,7 @@ static bool unblock_reconfigure(void)
*/
void remove_map_callback(struct multipath *mpp)
{
- if (mpp->wait_for_udev > 0)
+ if (mpp->wait_for_udev != UDEV_WAIT_DONE)
unblock_reconfigure();
}
@@ -871,7 +871,7 @@ ev_add_map (char * dev, const char * alias, struct vectors * vecs)
mpp = find_mp_by_alias(vecs->mpvec, alias);
if (mpp) {
- if (mpp->wait_for_udev > 1) {
+ if (mpp->wait_for_udev == UDEV_WAIT_RELOAD) {
condlog(2, "%s: performing delayed actions",
mpp->alias);
if (update_map(mpp, vecs, 0))
@@ -882,8 +882,8 @@ ev_add_map (char * dev, const char * alias, struct vectors * vecs)
reassign_maps = conf->reassign_maps;
put_multipath_config(conf);
dm_get_info(mpp->alias, &mpp->dmi);
- if (mpp->wait_for_udev) {
- mpp->wait_for_udev = 0;
+ if (mpp->wait_for_udev != UDEV_WAIT_DONE) {
+ mpp->wait_for_udev = UDEV_WAIT_DONE;
if (!need_to_delay_reconfig(vecs) &&
unblock_reconfigure())
return 0;
@@ -1241,7 +1241,7 @@ ev_add_path (struct path * pp, struct vectors * vecs, int need_do_map)
}
if (mpp)
trigger_path_udev_change(pp, true);
- if (mpp && mpp->wait_for_udev &&
+ if (mpp && mpp->wait_for_udev != UDEV_WAIT_DONE &&
(pathcount(mpp, PATH_UP) > 0 ||
(pathcount(mpp, PATH_GHOST) > 0 &&
path_get_tpgs(pp) != TPGS_IMPLICIT &&
@@ -1249,7 +1249,7 @@ ev_add_path (struct path * pp, struct vectors * vecs, int need_do_map)
/* if wait_for_udev is set and valid paths exist */
condlog(3, "%s: delaying path addition until %s is fully initialized",
pp->dev, mpp->alias);
- mpp->wait_for_udev = 2;
+ mpp->wait_for_udev = UDEV_WAIT_RELOAD;
orphan_path(pp, "waiting for create to complete");
return 0;
}
@@ -1433,8 +1433,8 @@ ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map)
flush_map_nopaths(mpp, vecs))
goto out;
- if (mpp->wait_for_udev) {
- mpp->wait_for_udev = 2;
+ if (mpp->wait_for_udev != UDEV_WAIT_DONE) {
+ mpp->wait_for_udev = UDEV_WAIT_RELOAD;
retval = REMOVE_PATH_DELAY;
goto out;
}
@@ -1646,8 +1646,8 @@ uev_update_path (struct uevent *uev, struct vectors * vecs)
if (needs_ro_update(mpp, ro)) {
condlog(2, "%s: update path write_protect to '%d' (uevent)", uev->kernel, ro);
- if (mpp->wait_for_udev)
- mpp->wait_for_udev = 2;
+ if (mpp->wait_for_udev != UDEV_WAIT_DONE)
+ mpp->wait_for_udev = UDEV_WAIT_RELOAD;
else {
if (ro == 1)
pp->mpp->force_readonly = 1;
@@ -1661,7 +1661,7 @@ uev_update_path (struct uevent *uev, struct vectors * vecs)
}
}
if (auto_resize != AUTO_RESIZE_NEVER && mpp &&
- !mpp->wait_for_udev) {
+ mpp->wait_for_udev == UDEV_WAIT_DONE) {
struct pathgroup *pgp;
struct path *pp2;
unsigned int i, j;
@@ -2018,13 +2018,13 @@ followover_should_failback(struct multipath *mpp)
static bool
missing_uev_wait_tick(struct multipath *mpp, bool *timed_out)
{
- if (mpp->wait_for_udev && --mpp->uev_wait_tick <= 0) {
- int wait = mpp->wait_for_udev;
+ if (mpp->wait_for_udev != UDEV_WAIT_DONE && --mpp->uev_wait_tick <= 0) {
+ enum udev_wait_states wait = mpp->wait_for_udev;
- mpp->wait_for_udev = 0;
+ mpp->wait_for_udev = UDEV_WAIT_DONE;
*timed_out = true;
condlog(0, "%s: timeout waiting on creation uevent. enabling reloads", mpp->alias);
- return wait > 1;
+ return wait == UDEV_WAIT_RELOAD;
}
return false;
}
@@ -2635,7 +2635,8 @@ static bool update_mpp_prio(struct multipath *mpp)
enum prio_update_type prio_update = mpp->prio_update;
mpp->prio_update = PRIO_UPDATE_NONE;
- if (mpp->wait_for_udev || prio_update == PRIO_UPDATE_NONE)
+ if (mpp->wait_for_udev != UDEV_WAIT_DONE ||
+ prio_update == PRIO_UPDATE_NONE)
return false;
condlog(4, "prio refresh");
@@ -3246,7 +3247,7 @@ need_to_delay_reconfig(struct vectors * vecs)
return 0;
vector_foreach_slot(vecs->mpvec, mpp, i) {
- if (mpp->wait_for_udev)
+ if (mpp->wait_for_udev != UDEV_WAIT_DONE)
return 1;
}
return 0;
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> --- libmultipath/configure.c | 2 +- libmultipath/structs.h | 8 +++++++- multipathd/cli_handlers.c | 16 ++++++++-------- multipathd/main.c | 35 ++++++++++++++++++----------------- 4 files changed, 34 insertions(+), 27 deletions(-)