Message ID | 20200709105145.9211-14-mwilck@suse.com (mailing list archive) |
---|---|
State | Not Applicable, archived |
Delegated to: | christophe varoqui |
Headers | show |
Series | multipath-tools series part V: removed path handling | expand |
On Thu, Jul 09, 2020 at 12:51:37PM +0200, mwilck@suse.com wrote: > From: Martin Wilck <mwilck@suse.com> > > Treat this like a WWID mismatch. > > Signed-off-by: Martin Wilck <mwilck@suse.com> > --- > libmultipath/structs_vec.c | 37 +++++++++++++++++++++++-------------- > 1 file changed, 23 insertions(+), 14 deletions(-) > > diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c > index 5dd37d5..8651b98 100644 > --- a/libmultipath/structs_vec.c > +++ b/libmultipath/structs_vec.c > @@ -118,6 +118,12 @@ bool update_pathvec_from_dm(vector pathvec, struct multipath *mpp, > goto delete_pg; > > vector_foreach_slot(pgp->paths, pp, j) { > + > + if (pp->mpp && pp->mpp != mpp) { > + condlog(0, "BUG: %s: found path %s which is already in %s", > + mpp->alias, pp->dev, pp->mpp->alias); > + goto bad_path; > + } > pp->mpp = mpp; > > if (pp->udev) { > @@ -163,25 +169,28 @@ bool update_pathvec_from_dm(vector pathvec, struct multipath *mpp, > > condlog(0, "%s: path %s WWID %s doesn't match, removing from map", > mpp->wwid, pp->dev_t, pp->wwid); > - /* > - * This path exists, but in the wong map. > - * We can't reload the map from here. > - * Instead, treat this path like "missing udev", > - * which it probably is. > - * check_path() will trigger an uevent > - * and reset pp->tick. > - */ > - must_reload = true; > - pp->mpp = NULL; > - dm_fail_path(mpp->alias, pp->dev_t); > - vector_del_slot(pgp->paths, j--); > - pp->initialized = INIT_MISSING_UDEV; > - pp->tick = 1; > + goto bad_path; > } > condlog(2, "%s: adding new path %s", > mpp->alias, pp->dev); > store_path(pathvec, pp); > + > } > + continue; > + > + bad_path: > + /* > + * This path exists, but in the wrong map. > + * We can't reload the map from here. > + * Instead, treat this path like "missing udev". > + * check_path() will trigger an uevent and reset pp->tick. > + */ > + must_reload = true; > + pp->mpp = NULL; > + dm_fail_path(mpp->alias, pp->dev_t); > + vector_del_slot(pgp->paths, j--); > + pp->initialized = INIT_MISSING_UDEV; > + pp->tick = 1; Is there a reason not to call orphan_path() to clean up things like any open fd, until we figure out what to do with the path. > } > if (VECTOR_SIZE(pgp->paths) != 0) > continue; > -- > 2.26.2 -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
On Sun, 2020-07-19 at 00:12 -0500, Benjamin Marzinski wrote: > On Thu, Jul 09, 2020 at 12:51:37PM +0200, mwilck@suse.com wrote: > > From: Martin Wilck <mwilck@suse.com> > > > > Treat this like a WWID mismatch. > > > > Signed-off-by: Martin Wilck <mwilck@suse.com> > > --- > > libmultipath/structs_vec.c | 37 +++++++++++++++++++++++----------- > > --- > > 1 file changed, 23 insertions(+), 14 deletions(-) > > > > diff --git a/libmultipath/structs_vec.c > > b/libmultipath/structs_vec.c > > index 5dd37d5..8651b98 100644 > > --- a/libmultipath/structs_vec.c > > +++ b/libmultipath/structs_vec.c > > > > [...] > > + bad_path: > > + /* > > + * This path exists, but in the wrong map. > > + * We can't reload the map from here. > > + * Instead, treat this path like "missing > > udev". > > + * check_path() will trigger an uevent and > > reset pp->tick. > > + */ > > + must_reload = true; > > + pp->mpp = NULL; > > + dm_fail_path(mpp->alias, pp->dev_t); > > + vector_del_slot(pgp->paths, j--); > > + pp->initialized = INIT_MISSING_UDEV; > > + pp->tick = 1; > > Is there a reason not to call orphan_path() to clean up things like > any > open fd, until we figure out what to do with the path. Thanks for the suggestion. It makes sense for the 2nd "bad_path" condition but not for the first. I'll treat the two cases differently. Regards Martin -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c index 5dd37d5..8651b98 100644 --- a/libmultipath/structs_vec.c +++ b/libmultipath/structs_vec.c @@ -118,6 +118,12 @@ bool update_pathvec_from_dm(vector pathvec, struct multipath *mpp, goto delete_pg; vector_foreach_slot(pgp->paths, pp, j) { + + if (pp->mpp && pp->mpp != mpp) { + condlog(0, "BUG: %s: found path %s which is already in %s", + mpp->alias, pp->dev, pp->mpp->alias); + goto bad_path; + } pp->mpp = mpp; if (pp->udev) { @@ -163,25 +169,28 @@ bool update_pathvec_from_dm(vector pathvec, struct multipath *mpp, condlog(0, "%s: path %s WWID %s doesn't match, removing from map", mpp->wwid, pp->dev_t, pp->wwid); - /* - * This path exists, but in the wong map. - * We can't reload the map from here. - * Instead, treat this path like "missing udev", - * which it probably is. - * check_path() will trigger an uevent - * and reset pp->tick. - */ - must_reload = true; - pp->mpp = NULL; - dm_fail_path(mpp->alias, pp->dev_t); - vector_del_slot(pgp->paths, j--); - pp->initialized = INIT_MISSING_UDEV; - pp->tick = 1; + goto bad_path; } condlog(2, "%s: adding new path %s", mpp->alias, pp->dev); store_path(pathvec, pp); + } + continue; + + bad_path: + /* + * This path exists, but in the wrong map. + * We can't reload the map from here. + * Instead, treat this path like "missing udev". + * check_path() will trigger an uevent and reset pp->tick. + */ + must_reload = true; + pp->mpp = NULL; + dm_fail_path(mpp->alias, pp->dev_t); + vector_del_slot(pgp->paths, j--); + pp->initialized = INIT_MISSING_UDEV; + pp->tick = 1; } if (VECTOR_SIZE(pgp->paths) != 0) continue;