]> git.ipfire.org Git - people/pmueller/ipfire-3.x.git/blobdiff - multipath-tools/patches/0083-RHBZ-1080055-orphan-paths-on-reload.patch
multipath-tools: Update to snapshot from 2013-02-22
[people/pmueller/ipfire-3.x.git] / multipath-tools / patches / 0083-RHBZ-1080055-orphan-paths-on-reload.patch
diff --git a/multipath-tools/patches/0083-RHBZ-1080055-orphan-paths-on-reload.patch b/multipath-tools/patches/0083-RHBZ-1080055-orphan-paths-on-reload.patch
new file mode 100644 (file)
index 0000000..8eaee74
--- /dev/null
@@ -0,0 +1,85 @@
+---
+ 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;