2 * Copyright (c) 2005 Christophe Varoqui
8 #include <structs_vec.h>
9 #include <libdevmapper.h>
10 #include <devmapper.h>
12 #include <configure.h>
13 #include <blacklist.h>
22 show_paths (char ** r, int * len, struct vectors * vecs, char * style)
28 unsigned int maxlen = INITIAL_REPLY_LEN;
31 get_path_layout(vecs->pathvec, 1);
32 reply = MALLOC(maxlen);
40 if (VECTOR_SIZE(vecs->pathvec) > 0)
41 c += snprint_path_header(c, reply + maxlen - c,
44 vector_foreach_slot(vecs->pathvec, pp, i)
45 c += snprint_path(c, reply + maxlen - c,
48 again = ((c - reply) == (maxlen - 1));
51 reply = REALLOC(reply, maxlen *= 2);
55 *len = (int)(c - reply + 1);
60 show_map_topology (char ** r, int * len, struct multipath * mpp)
64 unsigned int maxlen = INITIAL_REPLY_LEN;
67 reply = MALLOC(maxlen);
75 c += snprint_multipath_topology(c, reply + maxlen - c, mpp, 2);
76 again = ((c - reply) == (maxlen - 1));
79 reply = REALLOC(reply, maxlen *= 2);
83 *len = (int)(c - reply + 1);
88 show_maps_topology (char ** r, int * len, struct vectors * vecs)
91 struct multipath * mpp;
94 unsigned int maxlen = INITIAL_REPLY_LEN;
97 get_path_layout(vecs->pathvec, 0);
98 reply = MALLOC(maxlen);
106 vector_foreach_slot(vecs->mpvec, mpp, i)
107 c += snprint_multipath_topology(c, reply + maxlen - c,
110 again = ((c - reply) == (maxlen - 1));
113 reply = REALLOC(reply, maxlen *= 2);
117 *len = (int)(c - reply + 1);
122 show_config (char ** r, int * len)
126 unsigned int maxlen = INITIAL_REPLY_LEN;
129 reply = MALLOC(maxlen);
135 c += snprint_defaults(c, reply + maxlen - c);
136 again = ((c - reply) == maxlen);
138 reply = REALLOC(reply, maxlen *= 2);
141 c += snprint_blacklist(c, reply + maxlen - c);
142 again = ((c - reply) == maxlen);
144 reply = REALLOC(reply, maxlen *= 2);
147 c += snprint_blacklist_except(c, reply + maxlen - c);
148 again = ((c - reply) == maxlen);
150 reply = REALLOC(reply, maxlen *= 2);
153 c += snprint_hwtable(c, reply + maxlen - c, conf->hwtable);
154 again = ((c - reply) == maxlen);
156 reply = REALLOC(reply, maxlen *= 2);
159 c += snprint_mptable(c, reply + maxlen - c, conf->mptable);
160 again = ((c - reply) == maxlen);
162 reply = REALLOC(reply, maxlen *= 2);
165 *len = (int)(c - reply + 1);
170 cli_list_config (void * v, char ** reply, int * len, void * data)
172 condlog(3, "list config (operator)");
174 return show_config(reply, len);
178 cli_list_paths (void * v, char ** reply, int * len, void * data)
180 struct vectors * vecs = (struct vectors *)data;
182 condlog(3, "list paths (operator)");
184 return show_paths(reply, len, vecs, PRINT_PATH_CHECKER);
188 cli_list_paths_fmt (void * v, char ** reply, int * len, void * data)
190 struct vectors * vecs = (struct vectors *)data;
191 char * fmt = get_keyparam(v, FMT);
193 condlog(3, "list paths (operator)");
195 return show_paths(reply, len, vecs, fmt);
199 cli_list_map_topology (void * v, char ** reply, int * len, void * data)
201 struct multipath * mpp;
202 struct vectors * vecs = (struct vectors *)data;
203 char * param = get_keyparam(v, MAP);
205 get_path_layout(vecs->pathvec, 0);
206 mpp = find_mp_by_str(vecs->mpvec, param);
211 condlog(3, "list multipath %s (operator)", param);
213 return show_map_topology(reply, len, mpp);
217 cli_list_maps_topology (void * v, char ** reply, int * len, void * data)
219 struct vectors * vecs = (struct vectors *)data;
221 condlog(3, "list multipaths (operator)");
223 return show_maps_topology(reply, len, vecs);
227 cli_list_wildcards (void * v, char ** reply, int * len, void * data)
231 *reply = MALLOC(INITIAL_REPLY_LEN);
237 c += snprint_wildcards(c, INITIAL_REPLY_LEN);
239 *len = INITIAL_REPLY_LEN;
244 show_status (char ** r, int *len, struct vectors * vecs)
249 unsigned int maxlen = INITIAL_REPLY_LEN;
250 reply = MALLOC(maxlen);
256 c += snprint_status(c, reply + maxlen - c, vecs);
259 *len = (int)(c - reply + 1);
264 show_maps (char ** r, int *len, struct vectors * vecs, char * style)
267 struct multipath * mpp;
270 unsigned int maxlen = INITIAL_REPLY_LEN;
273 get_multipath_layout(vecs->mpvec, 1);
274 reply = MALLOC(maxlen);
281 if (VECTOR_SIZE(vecs->mpvec) > 0)
282 c += snprint_multipath_header(c, reply + maxlen - c,
285 vector_foreach_slot(vecs->mpvec, mpp, i)
286 c += snprint_multipath(c, reply + maxlen - c,
289 again = ((c - reply) == (maxlen - 1));
292 reply = REALLOC(reply, maxlen *= 2);
295 *len = (int)(c - reply + 1);
300 cli_list_maps (void * v, char ** reply, int * len, void * data)
302 struct vectors * vecs = (struct vectors *)data;
304 condlog(3, "list maps (operator)");
306 return show_maps(reply, len, vecs, PRINT_MAP_NAMES);
310 cli_list_status (void * v, char ** reply, int * len, void * data)
312 struct vectors * vecs = (struct vectors *)data;
314 condlog(3, "list status (operator)");
316 return show_status(reply, len, vecs);
320 cli_list_maps_status (void * v, char ** reply, int * len, void * data)
322 struct vectors * vecs = (struct vectors *)data;
324 condlog(3, "list maps status (operator)");
326 return show_maps(reply, len, vecs, PRINT_MAP_STATUS);
330 cli_list_maps_stats (void * v, char ** reply, int * len, void * data)
332 struct vectors * vecs = (struct vectors *)data;
334 condlog(3, "list maps stats (operator)");
336 return show_maps(reply, len, vecs, PRINT_MAP_STATS);
340 cli_add_path (void * v, char ** reply, int * len, void * data)
342 struct vectors * vecs = (struct vectors *)data;
343 char * param = get_keyparam(v, PATH);
346 condlog(2, "%s: add path (operator)", param);
348 if (filter_devnode(conf->blist_devnode, conf->elist_devnode,
349 param) > 0 || (r = ev_add_path(param, vecs)) == 2) {
350 *reply = strdup("blacklisted");
351 *len = strlen(*reply) + 1;
352 condlog(2, "%s: path blacklisted", param);
359 cli_del_path (void * v, char ** reply, int * len, void * data)
361 struct vectors * vecs = (struct vectors *)data;
362 char * param = get_keyparam(v, PATH);
364 condlog(2, "%s: remove path (operator)", param);
366 return ev_remove_path(param, vecs);
370 cli_add_map (void * v, char ** reply, int * len, void * data)
372 struct vectors * vecs = (struct vectors *)data;
373 char * param = get_keyparam(v, MAP);
375 char dev_path[PATH_SIZE];
376 struct sysfs_device *sysdev;
378 condlog(2, "%s: add map (operator)", param);
380 if (filter_wwid(conf->blist_wwid, conf->elist_wwid, param) > 0) {
381 *reply = strdup("blacklisted");
382 *len = strlen(*reply) + 1;
383 condlog(2, "%s: map blacklisted", param);
386 minor = dm_get_minor(param);
388 condlog(2, "%s: not a device mapper table", param);
391 sprintf(dev_path,"/block/dm-%d", minor);
392 sysdev = sysfs_device_get(dev_path);
394 condlog(2, "%s: not found in sysfs", param);
397 return ev_add_map(sysdev, vecs);
401 cli_del_map (void * v, char ** reply, int * len, void * data)
403 struct vectors * vecs = (struct vectors *)data;
404 char * param = get_keyparam(v, MAP);
406 condlog(2, "%s: remove map (operator)", param);
408 return ev_remove_map(param, vecs);
412 cli_switch_group(void * v, char ** reply, int * len, void * data)
414 char * mapname = get_keyparam(v, MAP);
415 int groupnum = atoi(get_keyparam(v, GROUP));
417 condlog(2, "%s: switch to path group #%i (operator)", mapname, groupnum);
419 return dm_switchgroup(mapname, groupnum);
423 cli_reconfigure(void * v, char ** reply, int * len, void * data)
425 struct vectors * vecs = (struct vectors *)data;
427 condlog(2, "reconfigure (operator)");
429 return reconfigure(vecs);
433 cli_suspend(void * v, char ** reply, int * len, void * data)
435 struct vectors * vecs = (struct vectors *)data;
436 char * param = get_keyparam(v, MAP);
437 int r = dm_simplecmd(DM_DEVICE_SUSPEND, param);
439 condlog(2, "%s: suspend (operator)", param);
444 struct multipath * mpp = find_mp_by_alias(vecs->mpvec, param);
449 dm_get_info(param, &mpp->dmi);
454 cli_resume(void * v, char ** reply, int * len, void * data)
456 struct vectors * vecs = (struct vectors *)data;
457 char * param = get_keyparam(v, MAP);
458 int r = dm_simplecmd(DM_DEVICE_RESUME, param);
460 condlog(2, "%s: resume (operator)", param);
465 struct multipath * mpp = find_mp_by_alias(vecs->mpvec, param);
470 dm_get_info(param, &mpp->dmi);
475 cli_reinstate(void * v, char ** reply, int * len, void * data)
477 struct vectors * vecs = (struct vectors *)data;
478 char * param = get_keyparam(v, PATH);
481 pp = find_path_by_dev(vecs->pathvec, param);
484 pp = find_path_by_devt(vecs->pathvec, param);
486 if (!pp || !pp->mpp || !pp->mpp->alias)
489 condlog(2, "%s: reinstate path %s (operator)",
490 pp->mpp->alias, pp->dev_t);
492 checker_enable(&pp->checker);
493 return dm_reinstate_path(pp->mpp->alias, pp->dev_t);
497 cli_fail(void * v, char ** reply, int * len, void * data)
499 struct vectors * vecs = (struct vectors *)data;
500 char * param = get_keyparam(v, PATH);
504 pp = find_path_by_dev(vecs->pathvec, param);
507 pp = find_path_by_devt(vecs->pathvec, param);
509 if (!pp || !pp->mpp || !pp->mpp->alias)
512 condlog(2, "%s: fail path %s (operator)",
513 pp->mpp->alias, pp->dev_t);
515 r = dm_fail_path(pp->mpp->alias, pp->dev_t);
517 * Suspend path checking to avoid auto-reinstating the path
520 checker_disable(&pp->checker);
525 show_blacklist (char ** r, int * len)
529 unsigned int maxlen = INITIAL_REPLY_LEN;
533 reply = MALLOC(maxlen);
538 c += snprint_blacklist_report(c, maxlen);
539 again = ((c - reply) == maxlen);
548 *len = (int)(c - reply + 1);
554 cli_list_blacklist (void * v, char ** reply, int * len, void * data)
556 condlog(3, "list blacklist (operator)");
558 return show_blacklist(reply, len);
562 show_devices (char ** r, int * len, struct vectors *vecs)
566 unsigned int maxlen = INITIAL_REPLY_LEN;
570 reply = MALLOC(maxlen);
575 c += snprint_devices(c, maxlen, vecs);
576 again = ((c - reply) == maxlen);
585 *len = (int)(c - reply + 1);
591 cli_list_devices (void * v, char ** reply, int * len, void * data)
593 struct vectors * vecs = (struct vectors *)data;
595 condlog(3, "list devices (operator)");
597 return show_devices(reply, len, vecs);