@@ -520,6 +520,14 @@ merge_mpe(struct mpentry *dst, struct mpentry *src)
merge_num(mode);
}
+static int wwid_compar(const void *p1, const void *p2)
+{
+ const char *wwid1 = (*(struct mpentry * const *)p1)->wwid;
+ const char *wwid2 = (*(struct mpentry * const *)p2)->wwid;
+
+ return strcmp(wwid1, wwid2);
+}
+
void merge_mptable(vector mptable)
{
struct mpentry *mp1, *mp2;
@@ -533,10 +541,13 @@ void merge_mptable(vector mptable)
free_mpe(mp1);
continue;
}
+ }
+ vector_sort(mptable, wwid_compar);
+ vector_foreach_slot(mptable, mp1, i) {
j = i + 1;
vector_foreach_slot_after(mptable, mp2, j) {
- if (!mp2->wwid || strcmp(mp1->wwid, mp2->wwid))
- continue;
+ if (strcmp(mp1->wwid, mp2->wwid))
+ break;
condlog(1, "%s: duplicate multipath config section for %s",
__func__, mp1->wwid);
merge_mpe(mp2, mp1);
@@ -21,6 +21,7 @@
#include <stdlib.h>
#include "vector.h"
+#include "msort.h"
/*
* Initialize vector struct.
@@ -208,3 +209,11 @@ int vector_find_or_add_slot(vector v, void *value)
vector_set_slot(v, value);
return VECTOR_SIZE(v) - 1;
}
+
+void vector_sort(vector v, int (*compar)(const void *, const void *))
+{
+ if (!v || !v->slot || !v->allocated)
+ return;
+ return msort((void *)v->slot, v->allocated, sizeof(void *), compar);
+
+}
@@ -89,4 +89,5 @@ extern void vector_repack(vector v);
extern void vector_dump(vector v);
extern void dump_strvec(vector strvec);
extern int vector_move_up(vector v, int src, int dest);
+void vector_sort(vector v, int (*compar)(const void *, const void *));
#endif