--- /dev/null
+---
+ libmultipath/structs_vec.c | 31 +++++++++++++++++++++++++++----
+ multipathd/main.c | 4 ++++
+ 2 files changed, 31 insertions(+), 4 deletions(-)
+
+Index: multipath-tools-130222/libmultipath/structs_vec.c
+===================================================================
+--- multipath-tools-130222.orig/libmultipath/structs_vec.c
++++ multipath-tools-130222/libmultipath/structs_vec.c
+@@ -280,12 +280,38 @@ update_multipath_status (struct multipat
+ return 0;
+ }
+
++void sync_paths(struct multipath *mpp, vector pathvec)
++{
++ struct path *pp;
++ struct pathgroup *pgp;
++ int found, i, j;
++
++ vector_foreach_slot (mpp->paths, pp, i) {
++ found = 0;
++ vector_foreach_slot(mpp->pg, pgp, j) {
++ if (find_slot(pgp->paths, (void *)pp) != -1) {
++ found = 1;
++ break;
++ }
++ }
++ if (!found) {
++ condlog(3, "%s dropped path %s", mpp->alias, pp->dev);
++ vector_del_slot(mpp->paths, i--);
++ orphan_path(pp);
++ }
++ }
++ update_mpp_paths(mpp, pathvec);
++ vector_foreach_slot (mpp->paths, pp, i)
++ pp->mpp = mpp;
++}
++
+ extern int
+ update_multipath_strings (struct multipath *mpp, vector pathvec)
+ {
+ if (!mpp)
+ return 1;
+
++ update_mpp_paths(mpp, pathvec);
+ condlog(4, "%s: %s", mpp->alias, __FUNCTION__);
+
+ free_multipath_attributes(mpp);
+@@ -294,6 +320,7 @@ update_multipath_strings (struct multipa
+
+ if (update_multipath_table(mpp, pathvec))
+ return 1;
++ sync_paths(mpp, pathvec);
+
+ if (update_multipath_status(mpp))
+ return 1;
+@@ -494,13 +521,9 @@ int update_multipath (struct vectors *ve
+ return 2;
+ }
+
+- free_pgvec(mpp->pg, KEEP_PATHS);
+- mpp->pg = NULL;
+-
+ if (__setup_multipath(vecs, mpp, reset))
+ return 1; /* mpp freed in setup_multipath */
+
+- adopt_paths(vecs->pathvec, mpp, 0);
+ /*
+ * compare checkers states with DM states
+ */
+Index: multipath-tools-130222/multipathd/main.c
+===================================================================
+--- multipath-tools-130222.orig/multipathd/main.c
++++ multipath-tools-130222/multipathd/main.c
+@@ -1152,6 +1152,10 @@ check_path (struct vectors * vecs, struc
+ pp->dev);
+ pp->dmstate = PSTATE_UNDEF;
+ }
++ /* if update_multipath_strings orphaned the path, quit early */
++ if (!pp->mpp)
++ return;
++
+ pp->chkrstate = newstate;
+ if (newstate != pp->state) {
+ int oldstate = pp->state;