[dm-devel] [PATCH v2 24/24] multipath: use symbolic return value and exit code
Benjamin Marzinski
bmarzins at redhat.com
Mon Dec 3 23:48:21 UTC 2018
On Mon, Dec 03, 2018 at 08:36:24PM +0100, Martin Wilck wrote:
> Use an enum to represent the return code and exit status of
> multipath and its most important subroutine, configure().
> This clarifies the confusing use of booleans and status
> codes a bit, hopefully.
Thanks for this. print_cmd_valid() especially is much more readable.
ACK.
-Ben
>
> This patch doesn't introduce a change in behavior.
>
> Signed-off-by: Martin Wilck <mwilck at suse.com>
> ---
> multipath/main.c | 120 ++++++++++++++++++++++++++---------------------
> 1 file changed, 66 insertions(+), 54 deletions(-)
>
> diff --git a/multipath/main.c b/multipath/main.c
> index eb087482..e437746d 100644
> --- a/multipath/main.c
> +++ b/multipath/main.c
> @@ -68,6 +68,19 @@ int logsink;
> struct udev *udev;
> struct config *multipath_conf;
>
> +/*
> + * Return values of configure(), print_cmd_valid(), and main().
> + * RTVL_{YES,NO} are synonyms for RTVL_{OK,FAIL} for the CMD_VALID_PATH case.
> + */
> +enum {
> + RTVL_OK = 0,
> + RTVL_YES = RTVL_OK,
> + RTVL_FAIL = 1,
> + RTVL_NO = RTVL_FAIL,
> + RTVL_MAYBE, /* only used internally, never returned */
> + RTVL_RETRY, /* returned by configure(), not by main() */
> +};
> +
> struct config *get_multipath_config(void)
> {
> return multipath_conf;
> @@ -475,15 +488,14 @@ retry:
> static int print_cmd_valid(int k, const vector pathvec,
> struct config *conf)
> {
> - static const int vals[] = { 1, 0, 2 };
> int wait = FIND_MULTIPATHS_NEVER;
> struct timespec until;
> struct path *pp;
>
> - if (k < 0 || k >= (sizeof(vals) / sizeof(int)))
> - return 1;
> + if (k != RTVL_YES && k != RTVL_NO && k != RTVL_MAYBE)
> + return RTVL_NO;
>
> - if (k == 2) {
> + if (k == RTVL_MAYBE) {
> /*
> * Caller ensures that pathvec[0] is the path to
> * examine.
> @@ -493,7 +505,7 @@ static int print_cmd_valid(int k, const vector pathvec,
> wait = find_multipaths_check_timeout(
> pp, pp->find_multipaths_timeout, &until);
> if (wait != FIND_MULTIPATHS_WAITING)
> - k = 1;
> + k = RTVL_NO;
> } else if (pathvec != NULL && (pp = VECTOR_SLOT(pathvec, 0)))
> wait = find_multipaths_check_timeout(pp, 0, &until);
> if (wait == FIND_MULTIPATHS_WAITING)
> @@ -501,8 +513,10 @@ static int print_cmd_valid(int k, const vector pathvec,
> until.tv_sec, until.tv_nsec/1000);
> else if (wait == FIND_MULTIPATHS_WAIT_DONE)
> printf("FIND_MULTIPATHS_WAIT_UNTIL=\"0\"\n");
> - printf("DM_MULTIPATH_DEVICE_PATH=\"%d\"\n", vals[k]);
> - return k == 1;
> + printf("DM_MULTIPATH_DEVICE_PATH=\"%d\"\n",
> + k == RTVL_MAYBE ? 2 : k == RTVL_YES ? 1 : 0);
> + /* Never return RTVL_MAYBE */
> + return k == RTVL_NO ? RTVL_NO : RTVL_YES;
> }
>
> /*
> @@ -524,12 +538,6 @@ static bool released_to_systemd(void)
> return ret;
> }
>
> -/*
> - * Return value:
> - * -1: Retry
> - * 0: Success
> - * 1: Failure
> - */
> static int
> configure (struct config *conf, enum mpath_cmds cmd,
> enum devtypes dev_type, char *devpath)
> @@ -537,7 +545,7 @@ configure (struct config *conf, enum mpath_cmds cmd,
> vector curmp = NULL;
> vector pathvec = NULL;
> struct vectors vecs;
> - int r = 1, rc;
> + int r = RTVL_FAIL, rc;
> int di_flag = 0;
> char * refwwid = NULL;
> char * dev = NULL;
> @@ -585,21 +593,23 @@ configure (struct config *conf, enum mpath_cmds cmd,
> goto out;
> }
> if (cmd == CMD_REMOVE_WWID) {
> - r = remove_wwid(refwwid);
> - if (r == 0)
> + rc = remove_wwid(refwwid);
> + if (rc == 0) {
> printf("wwid '%s' removed\n", refwwid);
> - else if (r == 1) {
> + r = RTVL_OK;
> + } else if (rc == 1) {
> printf("wwid '%s' not in wwids file\n",
> refwwid);
> - r = 0;
> + r = RTVL_OK;
> }
> goto out;
> }
> if (cmd == CMD_ADD_WWID) {
> - r = remember_wwid(refwwid);
> - if (r >= 0)
> + rc = remember_wwid(refwwid);
> + if (rc >= 0) {
> printf("wwid '%s' added\n", refwwid);
> - else
> + r = RTVL_OK;
> + } else
> printf("failed adding '%s' to wwids file\n",
> refwwid);
> goto out;
> @@ -614,13 +624,13 @@ configure (struct config *conf, enum mpath_cmds cmd,
> */
> if (cmd == CMD_VALID_PATH) {
> if (is_failed_wwid(refwwid) == WWID_IS_FAILED) {
> - r = 1;
> + r = RTVL_NO;
> goto print_valid;
> }
> if ((!find_multipaths_on(conf) &&
> ignore_wwids_on(conf)) ||
> check_wwids_file(refwwid, 0) == 0)
> - r = 0;
> + r = RTVL_YES;
> if (!ignore_wwids_on(conf))
> goto print_valid;
> /* At this point, either r==0 or find_multipaths_on. */
> @@ -630,7 +640,7 @@ configure (struct config *conf, enum mpath_cmds cmd,
> * Quick check if path is already multipathed.
> */
> if (sysfs_is_multipathed(VECTOR_SLOT(pathvec, 0))) {
> - r = 0;
> + r = RTVL_YES;
> goto print_valid;
> }
>
> @@ -644,10 +654,10 @@ configure (struct config *conf, enum mpath_cmds cmd,
> * Leave DM_MULTIPATH_DEVICE_PATH="0".
> */
> if (released) {
> - r = 1;
> + r = RTVL_NO;
> goto print_valid;
> }
> - if (r == 0)
> + if (r == RTVL_YES)
> goto print_valid;
> /* find_multipaths_on: Fall through to path detection */
> }
> @@ -703,13 +713,12 @@ configure (struct config *conf, enum mpath_cmds cmd,
> * the refwwid, or there is more than one path matching
> * the refwwid, then the path is valid */
> if (VECTOR_SIZE(curmp) != 0) {
> - r = 0;
> + r = RTVL_YES;
> goto print_valid;
> } else if (VECTOR_SIZE(pathvec) > 1)
> - r = 0;
> + r = RTVL_YES;
> else
> - /* Use r=2 as an indication for "maybe" */
> - r = 2;
> + r = RTVL_MAYBE;
>
> /*
> * If opening the path with O_EXCL fails, the path
> @@ -739,13 +748,14 @@ configure (struct config *conf, enum mpath_cmds cmd,
> /*
> * Check if we raced with multipathd
> */
> - r = !sysfs_is_multipathed(VECTOR_SLOT(pathvec, 0));
> + r = sysfs_is_multipathed(VECTOR_SLOT(pathvec, 0)) ?
> + RTVL_YES : RTVL_NO;
> }
> goto print_valid;
> }
>
> if (cmd != CMD_CREATE && cmd != CMD_DRY_RUN) {
> - r = 0;
> + r = RTVL_OK;
> goto out;
> }
>
> @@ -754,7 +764,7 @@ configure (struct config *conf, enum mpath_cmds cmd,
> */
> rc = coalesce_paths(&vecs, NULL, refwwid,
> conf->force_reload, cmd);
> - r = rc == CP_RETRY ? -1 : rc == CP_OK ? 0 : 1;
> + r = rc == CP_RETRY ? RTVL_RETRY : rc == CP_OK ? RTVL_OK : RTVL_FAIL;
>
> print_valid:
> if (cmd == CMD_VALID_PATH)
> @@ -855,7 +865,7 @@ main (int argc, char *argv[])
> int arg;
> extern char *optarg;
> extern int optind;
> - int r = 1;
> + int r = RTVL_FAIL;
> enum mpath_cmds cmd = CMD_CREATE;
> enum devtypes dev_type = DEV_NONE;
> char *dev = NULL;
> @@ -866,7 +876,7 @@ main (int argc, char *argv[])
> logsink = 0;
> conf = load_config(DEFAULT_CONFIGFILE);
> if (!conf)
> - exit(1);
> + exit(RTVL_FAIL);
> multipath_conf = conf;
> conf->retrigger_tries = 0;
> while ((arg = getopt(argc, argv, ":adcChl::FfM:v:p:b:BrR:itTquUwW")) != EOF ) {
> @@ -877,7 +887,7 @@ main (int argc, char *argv[])
> if (sizeof(optarg) > sizeof(char *) ||
> !isdigit(optarg[0])) {
> usage (argv[0]);
> - exit(1);
> + exit(RTVL_FAIL);
> }
>
> conf->verbosity = atoi(optarg);
> @@ -924,7 +934,7 @@ main (int argc, char *argv[])
> if (conf->pgpolicy_flag == IOPOLICY_UNDEF) {
> printf("'%s' is not a valid policy\n", optarg);
> usage(argv[0]);
> - exit(1);
> + exit(RTVL_FAIL);
> }
> break;
> case 'r':
> @@ -934,14 +944,14 @@ main (int argc, char *argv[])
> conf->find_multipaths |= _FIND_MULTIPATHS_I;
> break;
> case 't':
> - r = dump_config(conf, NULL, NULL);
> + r = dump_config(conf, NULL, NULL) ? RTVL_FAIL : RTVL_OK;
> goto out_free_config;
> case 'T':
> cmd = CMD_DUMP_CONFIG;
> break;
> case 'h':
> usage(argv[0]);
> - exit(0);
> + exit(RTVL_OK);
> case 'u':
> cmd = CMD_VALID_PATH;
> dev_type = DEV_UEVENT;
> @@ -965,20 +975,20 @@ main (int argc, char *argv[])
> case ':':
> fprintf(stderr, "Missing option argument\n");
> usage(argv[0]);
> - exit(1);
> + exit(RTVL_FAIL);
> case '?':
> fprintf(stderr, "Unknown switch: %s\n", optarg);
> usage(argv[0]);
> - exit(1);
> + exit(RTVL_FAIL);
> default:
> usage(argv[0]);
> - exit(1);
> + exit(RTVL_FAIL);
> }
> }
>
> if (getuid() != 0) {
> fprintf(stderr, "need to be root\n");
> - exit(1);
> + exit(RTVL_FAIL);
> }
>
> if (optind < argc) {
> @@ -1016,7 +1026,8 @@ main (int argc, char *argv[])
> /* Failing here is non-fatal */
> init_foreign(conf->multipath_dir);
> if (cmd == CMD_USABLE_PATHS) {
> - r = check_usable_paths(conf, dev, dev_type);
> + r = check_usable_paths(conf, dev, dev_type) ?
> + RTVL_FAIL : RTVL_OK;
> goto out;
> }
> if (cmd == CMD_VALID_PATH &&
> @@ -1032,7 +1043,7 @@ main (int argc, char *argv[])
> if (fd == -1) {
> condlog(3, "%s: daemon is not running", dev);
> if (!systemd_service_enabled(dev)) {
> - r = print_cmd_valid(1, NULL, conf);
> + r = print_cmd_valid(RTVL_NO, NULL, conf);
> goto out;
> }
> } else
> @@ -1046,9 +1057,9 @@ main (int argc, char *argv[])
>
> switch(delegate_to_multipathd(cmd, dev, dev_type, conf)) {
> case DELEGATE_OK:
> - exit(0);
> + exit(RTVL_OK);
> case DELEGATE_ERROR:
> - exit(1);
> + exit(RTVL_FAIL);
> case NOT_DELEGATED:
> break;
> }
> @@ -1064,8 +1075,8 @@ main (int argc, char *argv[])
> goto out;
> }
> if (dm_get_maps(curmp) == 0)
> - r = replace_wwids(curmp);
> - if (r == 0)
> + r = replace_wwids(curmp) ? RTVL_FAIL : RTVL_OK;
> + if (r == RTVL_OK)
> printf("successfully reset wwids\n");
> vector_foreach_slot_backwards(curmp, mpp, i) {
> vector_del_slot(curmp, i);
> @@ -1078,17 +1089,18 @@ main (int argc, char *argv[])
> retries = conf->remove_retries;
> if (conf->remove == FLUSH_ONE) {
> if (dev_type == DEV_DEVMAP) {
> - r = dm_suspend_and_flush_map(dev, retries);
> + r = dm_suspend_and_flush_map(dev, retries) ?
> + RTVL_FAIL : RTVL_OK;
> } else
> condlog(0, "must provide a map name to remove");
>
> goto out;
> }
> else if (conf->remove == FLUSH_ALL) {
> - r = dm_flush_maps(retries);
> + r = dm_flush_maps(retries) ? RTVL_FAIL : RTVL_OK;
> goto out;
> }
> - while ((r = configure(conf, cmd, dev_type, dev)) < 0)
> + while ((r = configure(conf, cmd, dev_type, dev)) == RTVL_RETRY)
> condlog(3, "restart multipath configuration process");
>
> out:
> @@ -1103,8 +1115,8 @@ out:
> * multipath -u must exit with status 0, otherwise udev won't
> * import its output.
> */
> - if (cmd == CMD_VALID_PATH && dev_type == DEV_UEVENT && r == 1)
> - r = 0;
> + if (cmd == CMD_VALID_PATH && dev_type == DEV_UEVENT && r == RTVL_NO)
> + r = RTVL_OK;
>
> if (dev_type == DEV_UEVENT)
> closelog();
> --
> 2.19.1
More information about the dm-devel
mailing list