multipath: use symbolic return value and exit code
authorMartin Wilck <mwilck@suse.com>
Mon, 10 Dec 2018 09:49:59 +0000 (10:49 +0100)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Mon, 10 Dec 2018 23:41:14 +0000 (00:41 +0100)
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.

This patch doesn't introduce a change in behavior.

Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Martin Wilck <mwilck@suse.com>
multipath/main.c

index 1d34b87..f40c179 100644 (file)
@@ -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();