On Wed, Apr 27, 2016 at 01:10:54PM +0200, Hannes Reinecke wrote: > Similar to the existing 'show map $map topology', but allowing > formatted content. This touches on a patch I've thought about writing, but never got around to. The issue is that with show_maps_topology() we call update_multipath() to make sure we sync our state with the kernel before returning it, but with show_maps(), we don't. Before we could change the format, there was no point in updating the state in show_maps (and now, in show_map). But now that we can get all that information, it might be worth it. On the other hand, update_multipath() might be more than we need. update_multipath_strings() might be enought. And unlike when we first wrote show_maps_topology(), we call update_multipath_strings() when we check a path now. I'm not sure what the best answer is, but I've considered adding (or replacing update_multipath with) update_multipath_strings in all the map showing functions, for consistency's sake. but besides that thought, the patch looks fine. -Ben > > Signed-off-by: Hannes Reinecke <hare@xxxxxxx> > --- > multipathd/cli.c | 2 ++ > multipathd/cli_handlers.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++ > multipathd/cli_handlers.h | 2 ++ > multipathd/main.c | 2 ++ > 4 files changed, 73 insertions(+) > > diff --git a/multipathd/cli.c b/multipathd/cli.c > index ab1365b..3c9cdbf 100644 > --- a/multipathd/cli.c > +++ b/multipathd/cli.c > @@ -497,6 +497,8 @@ cli_init (void) { > add_handler(LIST+MAPS+TOPOLOGY, NULL); > add_handler(LIST+TOPOLOGY, NULL); > add_handler(LIST+MAP+TOPOLOGY, NULL); > + add_handler(LIST+MAP+FMT, NULL); > + add_handler(LIST+MAP+RAW+FMT, NULL); > add_handler(LIST+CONFIG, NULL); > add_handler(LIST+BLACKLIST, NULL); > add_handler(LIST+DEVICES, NULL); > diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c > index 886a5fd..dbdcbc2 100644 > --- a/multipathd/cli_handlers.c > +++ b/multipathd/cli_handlers.c > @@ -349,6 +349,33 @@ show_daemon (char ** r, int *len) > } > > int > +show_map (char ** r, int *len, struct multipath * mpp, char * style, > + int pretty) > +{ > + char * c; > + char * reply; > + unsigned int maxlen = INITIAL_REPLY_LEN; > + int again = 1; > + > + reply = MALLOC(maxlen); > + while (again) { > + if (!reply) > + return 1; > + > + c = reply; > + c += snprint_multipath(c, reply + maxlen - c, style, > + mpp, pretty); > + > + again = ((c - reply) == (maxlen - 1)); > + > + REALLOC_REPLY(reply, again, maxlen); > + } > + *r = reply; > + *len = (int)(c - reply + 1); > + return 0; > +} > + > +int > show_maps (char ** r, int *len, struct vectors * vecs, char * style, > int pretty) > { > @@ -407,6 +434,46 @@ cli_list_maps_raw (void * v, char ** reply, int * len, void * data) > } > > int > +cli_list_map_fmt (void * v, char ** reply, int * len, void * data) > +{ > + struct multipath * mpp; > + struct vectors * vecs = (struct vectors *)data; > + char * param = get_keyparam(v, MAP); > + char * fmt = get_keyparam(v, FMT); > + > + param = convert_dev(param, 0); > + get_path_layout(vecs->pathvec, 0); > + get_multipath_layout(vecs->mpvec, 1); > + mpp = find_mp_by_str(vecs->mpvec, param); > + if (!mpp) > + return 1; > + > + condlog(3, "list map %s fmt %s (operator)", param, fmt); > + > + return show_map(reply, len, mpp, fmt, 1); > +} > + > +int > +cli_list_map_raw (void * v, char ** reply, int * len, void * data) > +{ > + struct multipath * mpp; > + struct vectors * vecs = (struct vectors *)data; > + char * param = get_keyparam(v, MAP); > + char * fmt = get_keyparam(v, FMT); > + > + param = convert_dev(param, 0); > + get_path_layout(vecs->pathvec, 0); > + get_multipath_layout(vecs->mpvec, 1); > + mpp = find_mp_by_str(vecs->mpvec, param); > + if (!mpp) > + return 1; > + > + condlog(3, "list map %s fmt %s (operator)", param, fmt); > + > + return show_map(reply, len, mpp, fmt, 0); > +} > + > +int > cli_list_maps (void * v, char ** reply, int * len, void * data) > { > struct vectors * vecs = (struct vectors *)data; > diff --git a/multipathd/cli_handlers.h b/multipathd/cli_handlers.h > index 799f8da..5d51018 100644 > --- a/multipathd/cli_handlers.h > +++ b/multipathd/cli_handlers.h > @@ -7,6 +7,8 @@ int cli_list_daemon (void * v, char ** reply, int * len, void * data); > int cli_list_maps (void * v, char ** reply, int * len, void * data); > int cli_list_maps_fmt (void * v, char ** reply, int * len, void * data); > int cli_list_maps_raw (void * v, char ** reply, int * len, void * data); > +int cli_list_map_fmt (void * v, char ** reply, int * len, void * data); > +int cli_list_map_raw (void * v, char ** reply, int * len, void * data); > int cli_list_maps_status (void * v, char ** reply, int * len, void * data); > int cli_list_maps_stats (void * v, char ** reply, int * len, void * data); > int cli_list_map_topology (void * v, char ** reply, int * len, void * data); > diff --git a/multipathd/main.c b/multipathd/main.c > index d8fa88f..a58dae5 100644 > --- a/multipathd/main.c > +++ b/multipathd/main.c > @@ -990,6 +990,8 @@ uxlsnrloop (void * ap) > set_handler_callback(LIST+MAPS+TOPOLOGY, cli_list_maps_topology); > set_handler_callback(LIST+TOPOLOGY, cli_list_maps_topology); > set_handler_callback(LIST+MAP+TOPOLOGY, cli_list_map_topology); > + set_handler_callback(LIST+MAP+FMT, cli_list_map_fmt); > + set_handler_callback(LIST+MAP+RAW+FMT, cli_list_map_fmt); > set_handler_callback(LIST+CONFIG, cli_list_config); > set_handler_callback(LIST+BLACKLIST, cli_list_blacklist); > set_handler_callback(LIST+DEVICES, cli_list_devices); > -- > 2.6.6 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel