group_paths() is a wrapper around the pgpolicy functions, that pulls out
the common code from the beginning and the end. However since
one_group() didn't free the mp->paths vector, it has to set it to NULL,
to avoid having the wrapper code do that. Also, the pathgroups in
group_by_prio are now needlessly sorted afterwards.

Signed-off-by: Benjamin Marzinski <bmarz...@redhat.com>
---
 libmultipath/configure.c  |  2 +-
 libmultipath/pgpolicies.c | 65 +++++++++++++--------------------------
 libmultipath/pgpolicies.h |  2 +-
 3 files changed, 23 insertions(+), 46 deletions(-)

diff --git a/libmultipath/configure.c b/libmultipath/configure.c
index b09ef529..3c309d64 100644
--- a/libmultipath/configure.c
+++ b/libmultipath/configure.c
@@ -387,7 +387,7 @@ int setup_map(struct multipath *mpp, char *params, int 
params_size,
                vector_free(mpp->pg);
                mpp->pg = NULL;
        }
-       if (mpp->pgpolicyfn && mpp->pgpolicyfn(mpp))
+       if (group_paths(mpp))
                return 1;
 
        /*
diff --git a/libmultipath/pgpolicies.c b/libmultipath/pgpolicies.c
index 660768a4..21d4f122 100644
--- a/libmultipath/pgpolicies.c
+++ b/libmultipath/pgpolicies.c
@@ -84,6 +84,26 @@ sort_pathgroups (struct multipath *mp) {
 }
 
 
+int group_paths(struct multipath *mp)
+{
+       if (!mp->pg)
+               mp->pg = vector_alloc();
+       if (!mp->pg)
+               return 1;
+
+       if (VECTOR_SIZE(mp->paths) > 0 &&
+           (!mp->pgpolicyfn || mp->pgpolicyfn(mp))) {
+               vector_free(mp->pg);
+               mp->pg = NULL;
+               return 1;
+       }
+
+       sort_pathgroups(mp);
+       vector_free(mp->paths);
+       mp->paths = NULL;
+       return 0;
+}
+
 /*
  * One path group per unique tgt_node_name present in the path vector
  */
@@ -95,12 +115,6 @@ int group_by_node_name(struct multipath * mp)
        struct pathgroup * pgp;
        struct path * pp2;
 
-       if (!mp->pg)
-               mp->pg = vector_alloc();
-
-       if (!mp->pg)
-               return 1;
-
        /* init the bitmap */
        bitmap = (int *)MALLOC(VECTOR_SIZE(mp->paths) * sizeof (int));
 
@@ -146,9 +160,6 @@ int group_by_node_name(struct multipath * mp)
                }
        }
        FREE(bitmap);
-       sort_pathgroups(mp);
-       free_pathvec(mp->paths, KEEP_PATHS);
-       mp->paths = NULL;
        return 0;
 out2:
        free_pathgroup(pgp, KEEP_PATHS);
@@ -171,12 +182,6 @@ int group_by_serial(struct multipath * mp)
        struct pathgroup * pgp;
        struct path * pp2;
 
-       if (!mp->pg)
-               mp->pg = vector_alloc();
-
-       if (!mp->pg)
-               return 1;
-
        /* init the bitmap */
        bitmap = (int *)MALLOC(VECTOR_SIZE(mp->paths) * sizeof (int));
 
@@ -221,9 +226,6 @@ int group_by_serial(struct multipath * mp)
                }
        }
        FREE(bitmap);
-       sort_pathgroups(mp);
-       free_pathvec(mp->paths, KEEP_PATHS);
-       mp->paths = NULL;
        return 0;
 out2:
        free_pathgroup(pgp, KEEP_PATHS);
@@ -241,12 +243,6 @@ int one_path_per_group(struct multipath *mp)
        struct path * pp;
        struct pathgroup * pgp;
 
-       if (!mp->pg)
-               mp->pg = vector_alloc();
-
-       if (!mp->pg)
-               return 1;
-
        for (i = 0; i < VECTOR_SIZE(mp->paths); i++) {
                pp = VECTOR_SLOT(mp->paths, i);
                pgp = alloc_pathgroup();
@@ -260,9 +256,6 @@ int one_path_per_group(struct multipath *mp)
                if (store_path(pgp->paths, pp))
                        goto out1;
        }
-       sort_pathgroups(mp);
-       free_pathvec(mp->paths, KEEP_PATHS);
-       mp->paths = NULL;
        return 0;
 out1:
        free_pathgroup(pgp, KEEP_PATHS);
@@ -276,15 +269,6 @@ int one_group(struct multipath *mp)        /* aka multibus 
*/
 {
        struct pathgroup * pgp;
 
-       if (VECTOR_SIZE(mp->paths) < 0)
-               return 0;
-
-       if (!mp->pg)
-               mp->pg = vector_alloc();
-
-       if (!mp->pg)
-               return 1;
-
        if (VECTOR_SIZE(mp->paths) > 0) {
                pgp = alloc_pathgroup();
 
@@ -297,6 +281,7 @@ int one_group(struct multipath *mp) /* aka multibus */
                        goto out1;
 
                pgp->paths = mp->paths;
+               /* Do this to avoid freeing vector in group_paths */
                mp->paths = NULL;
        }
 
@@ -317,12 +302,6 @@ int group_by_prio(struct multipath *mp)
        struct pathgroup * pgp;
        vector pathvec = NULL;
 
-       if (!mp->pg)
-               mp->pg = vector_alloc();
-
-       if (!mp->pg)
-               return 1;
-
        pathvec = vector_alloc();
        if (!pathvec)
                goto out;
@@ -387,8 +366,6 @@ int group_by_prio(struct multipath *mp)
                }
        }
        free_pathvec(pathvec, KEEP_PATHS);
-       free_pathvec(mp->paths, KEEP_PATHS);
-       mp->paths = NULL;
        return 0;
 out2:
        free_pathgroup(pgp, KEEP_PATHS);
diff --git a/libmultipath/pgpolicies.h b/libmultipath/pgpolicies.h
index c0eaa7f4..11834011 100644
--- a/libmultipath/pgpolicies.h
+++ b/libmultipath/pgpolicies.h
@@ -21,7 +21,7 @@ enum iopolicies {
 
 int get_pgpolicy_id(char *);
 int get_pgpolicy_name (char *, int, int);
-
+int group_paths(struct multipath *);
 /*
  * policies
  */
-- 
2.17.2

--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to