8d4916400c
0012-RH-update-on-show-topology.patch 0013-RH-manpage-update.patch 0014-RH-RHEL5-style-partitions.patch 0015-RH-add-followover.patch 0016-RH-dont-remove-map-on-enomem.patch 0017-RH-fix-shutdown-crash.patch 0018-RH-warn-on-bad-dev-loss-tmo.patch 0019-RH-deprecate-uid-gid-mode.patch 0020-RH-dont-remove-map-twice.patch 0021-RH-validate-guid-partitions.patch 0022-RH-adjust-messages.patch 0023-RH-manpage-update.patch
142 lines
4.8 KiB
Diff
142 lines
4.8 KiB
Diff
---
|
|
libmultipath/structs_vec.c | 18 ++++++++++--------
|
|
libmultipath/structs_vec.h | 6 ++++--
|
|
libmultipath/waiter.c | 2 +-
|
|
multipathd/cli_handlers.c | 14 +++++++++++---
|
|
4 files changed, 26 insertions(+), 14 deletions(-)
|
|
|
|
Index: multipath-tools-120123/multipathd/cli_handlers.c
|
|
===================================================================
|
|
--- multipath-tools-120123.orig/multipathd/cli_handlers.c
|
|
+++ multipath-tools-120123/multipathd/cli_handlers.c
|
|
@@ -68,13 +68,16 @@ show_paths (char ** r, int * len, struct
|
|
}
|
|
|
|
int
|
|
-show_map_topology (char ** r, int * len, struct multipath * mpp)
|
|
+show_map_topology (char ** r, int * len, struct multipath * mpp,
|
|
+ struct vectors * vecs)
|
|
{
|
|
char * c;
|
|
char * reply;
|
|
unsigned int maxlen = INITIAL_REPLY_LEN;
|
|
int again = 1;
|
|
|
|
+ if (update_multipath(vecs, mpp->alias, 0))
|
|
+ return 1;
|
|
reply = MALLOC(maxlen);
|
|
|
|
while (again) {
|
|
@@ -112,9 +115,14 @@ show_maps_topology (char ** r, int * len
|
|
|
|
c = reply;
|
|
|
|
- vector_foreach_slot(vecs->mpvec, mpp, i)
|
|
+ vector_foreach_slot(vecs->mpvec, mpp, i) {
|
|
+ if (update_multipath(vecs, mpp->alias, 0)) {
|
|
+ i--;
|
|
+ continue;
|
|
+ }
|
|
c += snprint_multipath_topology(c, reply + maxlen - c,
|
|
mpp, 2);
|
|
+ }
|
|
|
|
again = ((c - reply) == (maxlen - 1));
|
|
|
|
@@ -232,7 +240,7 @@ cli_list_map_topology (void * v, char **
|
|
|
|
condlog(3, "list multipath %s (operator)", param);
|
|
|
|
- return show_map_topology(reply, len, mpp);
|
|
+ return show_map_topology(reply, len, mpp, vecs);
|
|
}
|
|
|
|
int
|
|
Index: multipath-tools-120123/libmultipath/structs_vec.c
|
|
===================================================================
|
|
--- multipath-tools-120123.orig/libmultipath/structs_vec.c
|
|
+++ multipath-tools-120123/libmultipath/structs_vec.c
|
|
@@ -324,7 +324,7 @@ set_no_path_retry(struct multipath *mpp)
|
|
}
|
|
|
|
extern int
|
|
-setup_multipath (struct vectors * vecs, struct multipath * mpp)
|
|
+__setup_multipath (struct vectors * vecs, struct multipath * mpp, int reset)
|
|
{
|
|
if (dm_get_info(mpp->alias, &mpp->dmi)) {
|
|
/* Error accessing table */
|
|
@@ -353,11 +353,13 @@ setup_multipath (struct vectors * vecs,
|
|
condlog(3, "%s: no hardware entry found, using defaults",
|
|
mpp->alias);
|
|
}
|
|
- select_rr_weight(mpp);
|
|
- select_pgfailback(mpp);
|
|
- set_no_path_retry(mpp);
|
|
- select_pg_timeout(mpp);
|
|
- select_flush_on_last_del(mpp);
|
|
+ if (reset) {
|
|
+ select_rr_weight(mpp);
|
|
+ select_pgfailback(mpp);
|
|
+ set_no_path_retry(mpp);
|
|
+ select_pg_timeout(mpp);
|
|
+ select_flush_on_last_del(mpp);
|
|
+ }
|
|
|
|
return 0;
|
|
out:
|
|
@@ -479,7 +481,7 @@ verify_paths(struct multipath * mpp, str
|
|
return count;
|
|
}
|
|
|
|
-int update_multipath (struct vectors *vecs, char *mapname)
|
|
+int update_multipath (struct vectors *vecs, char *mapname, int reset)
|
|
{
|
|
struct multipath *mpp;
|
|
struct pathgroup *pgp;
|
|
@@ -496,7 +498,7 @@ int update_multipath (struct vectors *ve
|
|
free_pgvec(mpp->pg, KEEP_PATHS);
|
|
mpp->pg = NULL;
|
|
|
|
- if (setup_multipath(vecs, mpp))
|
|
+ if (__setup_multipath(vecs, mpp, reset))
|
|
return 1; /* mpp freed in setup_multipath */
|
|
|
|
adopt_paths(vecs->pathvec, mpp, 0);
|
|
Index: multipath-tools-120123/libmultipath/structs_vec.h
|
|
===================================================================
|
|
--- multipath-tools-120123.orig/libmultipath/structs_vec.h
|
|
+++ multipath-tools-120123/libmultipath/structs_vec.h
|
|
@@ -21,7 +21,9 @@ void orphan_path (struct path * pp);
|
|
|
|
int verify_paths(struct multipath * mpp, struct vectors * vecs, vector rpvec);
|
|
int update_mpp_paths(struct multipath * mpp, vector pathvec);
|
|
-int setup_multipath (struct vectors * vecs, struct multipath * mpp);
|
|
+int __setup_multipath (struct vectors * vecs, struct multipath * mpp,
|
|
+ int reset);
|
|
+#define setup_multipath(vecs, mpp) __setup_multipath(vecs, mpp, 1)
|
|
int update_multipath_strings (struct multipath *mpp, vector pathvec);
|
|
|
|
void remove_map (struct multipath * mpp, struct vectors * vecs, int purge_vec);
|
|
@@ -32,7 +34,7 @@ void remove_maps_and_stop_waiters (struc
|
|
struct multipath * add_map_without_path (struct vectors * vecs, char * alias);
|
|
struct multipath * add_map_with_path (struct vectors * vecs,
|
|
struct path * pp, int add_vec);
|
|
-int update_multipath (struct vectors *vecs, char *mapname);
|
|
+int update_multipath (struct vectors *vecs, char *mapname, int reset);
|
|
void update_queue_mode_del_path(struct multipath *mpp);
|
|
void update_queue_mode_add_path(struct multipath *mpp);
|
|
|
|
Index: multipath-tools-120123/libmultipath/waiter.c
|
|
===================================================================
|
|
--- multipath-tools-120123.orig/libmultipath/waiter.c
|
|
+++ multipath-tools-120123/libmultipath/waiter.c
|
|
@@ -157,7 +157,7 @@ int waiteventloop (struct event_thread *
|
|
*/
|
|
pthread_cleanup_push(cleanup_lock, &waiter->vecs->lock);
|
|
lock(waiter->vecs->lock);
|
|
- r = update_multipath(waiter->vecs, waiter->mapname);
|
|
+ r = update_multipath(waiter->vecs, waiter->mapname, 1);
|
|
lock_cleanup_pop(waiter->vecs->lock);
|
|
|
|
if (r) {
|