]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
mount: (new) cleanup mount -a return codes
authorKarel Zak <kzak@redhat.com>
Fri, 24 Feb 2012 22:03:22 +0000 (23:03 +0100)
committerKarel Zak <kzak@redhat.com>
Fri, 24 Feb 2012 22:17:06 +0000 (23:17 +0100)
New return codes:

  0 : all mounted (or all ignored)
 64 : some mounted, some failed
 32 : all failed

Note that already mounted or ignored (filtered out by -t or -O)
filesystems don't affect the final return code.

The original mount(8) returns 0 instead of 64, so the situation
"some mounted, some failed" cannot be detected.

Signed-off-by: Karel Zak <kzak@redhat.com>
sys-utils/mount.8
sys-utils/mount.c

index f1cff7476f12596f5980bd2f2ffcbad0bd6256f7..d18881b2ce75751856923fa83ec5fe5e12957475 100644 (file)
@@ -2759,6 +2759,10 @@ mount failure
 .TP
 .BR 64
 some mount succeeded
+.RE
+
+The command mount -a returns 0 (all success), 32 (all failed) or 64 (some
+failed, some success).
 
 .SH NOTES
 The syntax of external mount helpers is:
index 17991b0fbf5da3dbd921ba9d99ba4c0441757650..3fbac04a1a15c67236e9b6e57633a7b84b555c44 100644 (file)
@@ -182,6 +182,8 @@ static int mount_all(struct libmnt_context *cxt)
        struct libmnt_fs *fs;
        int mntrc, ignored, rc = MOUNT_EX_SUCCESS;
 
+       int nsucc = 0, nerrs = 0;
+
        itr = mnt_new_iter(MNT_ITER_FORWARD);
        if (!itr) {
                warn(_("failed to initialize libmount iterator"));
@@ -197,31 +199,40 @@ static int mount_all(struct libmnt_context *cxt)
                                printf(ignored == 1 ? _("%-25s: ignored\n") :
                                                      _("%-25s: already mounted\n"),
                                                tgt);
-
                } else if (mnt_context_is_fork(cxt)) {
                        if (mnt_context_is_verbose(cxt))
                                printf("%-25s: mount successfully forked\n", tgt);
                } else {
-                       rc |= mk_exit_code(cxt, mntrc);
+                       mk_exit_code(cxt, mntrc);       /* to print warnings */
 
                        if (mnt_context_get_status(cxt)) {
-                               rc |= MOUNT_EX_SOMEOK;
+                               nsucc++;
 
                                if (mnt_context_is_verbose(cxt))
                                        printf("%-25s: successfully mounted\n", tgt);
-                       }
+                       } else
+                               nerrs++;
                }
        }
 
        if (mnt_context_is_parent(cxt)) {
                /* wait for mount --fork children */
-               int nerrs = 0, nchildren = 0;
+               int nchildren = 0;
+
+               nerrs = 0, nsucc = 0;
 
                rc = mnt_context_wait_for_children(cxt, &nchildren, &nerrs);
                if (!rc && nchildren)
-                       rc = nchildren == nerrs ? MOUNT_EX_FAIL : MOUNT_EX_SOMEOK;
+                       nsucc = nchildren - nerrs;
        }
 
+       if (nerrs == 0)
+               rc = MOUNT_EX_SUCCESS;          /* all success */
+       else if (nsucc == 0)
+               rc = MOUNT_EX_FAIL;             /* all failed */
+       else
+               rc = MOUNT_EX_SOMEOK;           /* some success, some failed */
+
        mnt_free_iter(itr);
        return rc;
 }