]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: export locking errors as MNT_EX_FILEIO
authorKarel Zak <kzak@redhat.com>
Fri, 15 Sep 2017 12:30:06 +0000 (14:30 +0200)
committerKarel Zak <kzak@redhat.com>
Fri, 15 Sep 2017 12:30:06 +0000 (14:30 +0200)
The mount man page assumes locking errors mapped to MNT_EX_FILEIO (16)
return code. Unfortunately, this is internally not exported as a
special error code, so it's returned as a generic (errno based)
stuff. This patch fixes this issue.

Note that we still use locking for example for utab or when enabled
/etc/mtab (disabled by default).

Signed-off-by: Karel Zak <kzak@redhat.com>
libmount/src/context_mount.c
libmount/src/context_umount.c
libmount/src/libmount.h.in
libmount/src/tab_update.c

index 65f7dbfd028697bf736e890357246743b719b5f7..e84947f00a3360be79c7192e5c32bade0f8208e1 100644 (file)
@@ -1379,6 +1379,10 @@ int mnt_context_get_mount_excode(
                        if (buf)
                                snprintf(buf, bufsz, _("overlapping loop device exists for %s"), src);
                        return MNT_EX_FAIL;
+               case -MNT_ERR_LOCK:
+                       if (buf)
+                               snprintf(buf, bufsz, _("locking failed"));
+                       return MNT_EX_FILEIO;
                default:
                        return mnt_context_get_generic_excode(rc, buf, bufsz, _("mount failed: %m"));
                }
@@ -1388,7 +1392,12 @@ int mnt_context_get_mount_excode(
                 * mount(2) syscall success, but something else failed
                 * (probably error in mtab processing).
                 */
-               if (rc < 0)
+               if (rc == -MNT_ERR_LOCK) {
+                       if (buf)
+                               snprintf(buf, bufsz, _("filesystem was mounted, but failed to update userspace mount table"));
+                       return MNT_EX_FILEIO;
+
+               } else if (rc < 0)
                        return mnt_context_get_generic_excode(rc, buf, bufsz,
                                _("filesystem was mounted, but any subsequent operation failed: %m"));
 
index f2c304f4a6cb84245af3fc031ebe1cc4486261ea..a8124629f38cb07aa76d042eab638ccb1cd207c2 100644 (file)
@@ -1063,6 +1063,10 @@ int mnt_context_get_umount_excode(
                        if (buf)
                                snprintf(buf, bufsz, _("not mounted"));
                        return MNT_EX_USAGE;
+               } else if (rc == -MNT_ERR_LOCK) {
+                       if (buf)
+                               snprintf(buf, bufsz, _("locking failed"));
+                       return MNT_EX_FILEIO;
                }
                return mnt_context_get_generic_excode(rc, buf, bufsz,
                                        _("umount failed: %m"));
@@ -1072,7 +1076,12 @@ int mnt_context_get_umount_excode(
                 * umount(2) syscall success, but something else failed
                 * (probably error in mtab processing).
                 */
-               if (rc < 0)
+               if (rc == -MNT_ERR_LOCK) {
+                       if (buf)
+                               snprintf(buf, bufsz, _("filesystem was unmounted, but failed to update userspace mount table"));
+                       return MNT_EX_FILEIO;
+
+               } else if (rc < 0)
                        return mnt_context_get_generic_excode(rc, buf, bufsz,
                                _("filesystem was unmounted, but any subsequent operation failed: %m"));
 
index 123145fc49a91148b692ca33081b1902b4a6bcb5..463b8ddcc73596fb8d031e4010336bb4f9e70b57 100644 (file)
@@ -184,6 +184,12 @@ enum {
  * detected overlapping loop device that cannot be re-used
  */
 #define MNT_ERR_LOOPOVERLAP 5007
+/**
+ * MNT_ERR_LOCK:
+ *
+ * failed to lock mtab/utab or so.
+ */
+#define MNT_ERR_LOCK         5008
 
 
 /*
@@ -230,7 +236,7 @@ enum {
 /**
  * MNT_EX_FILEIO:
  *
- * [u]mount(8) exit code: problems writing, locking, ... mtab/fstab
+ * [u]mount(8) exit code: problems writing, locking, ... mtab/utab
  */
 #define MNT_EX_FILEIO  16
 
index 52e1dd4443460251a2163bdf0d25d4d8a06134f7..e957133014b2a7f0a0c4268c655b1e5650b916e7 100644 (file)
@@ -696,7 +696,7 @@ static int update_add_entry(struct libmnt_update *upd, struct libmnt_lock *lc)
        if (lc)
                rc = mnt_lock_file(lc);
        if (rc)
-               return rc;
+               return -MNT_ERR_LOCK;
 
        tb = __mnt_new_table_from_file(upd->filename,
                        upd->userspace_only ? MNT_FMT_UTAB : MNT_FMT_MTAB);
@@ -722,7 +722,7 @@ static int update_remove_entry(struct libmnt_update *upd, struct libmnt_lock *lc
        if (lc)
                rc = mnt_lock_file(lc);
        if (rc)
-               return rc;
+               return -MNT_ERR_LOCK;
 
        tb = __mnt_new_table_from_file(upd->filename,
                        upd->userspace_only ? MNT_FMT_UTAB : MNT_FMT_MTAB);
@@ -751,7 +751,7 @@ static int update_modify_target(struct libmnt_update *upd, struct libmnt_lock *l
        if (lc)
                rc = mnt_lock_file(lc);
        if (rc)
-               return rc;
+               return -MNT_ERR_LOCK;
 
        tb = __mnt_new_table_from_file(upd->filename,
                        upd->userspace_only ? MNT_FMT_UTAB : MNT_FMT_MTAB);
@@ -788,7 +788,7 @@ static int update_modify_options(struct libmnt_update *upd, struct libmnt_lock *
        if (lc)
                rc = mnt_lock_file(lc);
        if (rc)
-               return rc;
+               return -MNT_ERR_LOCK;
 
        tb = __mnt_new_table_from_file(upd->filename,
                        upd->userspace_only ? MNT_FMT_UTAB : MNT_FMT_MTAB);
@@ -885,10 +885,13 @@ int mnt_update_already_done(struct libmnt_update *upd, struct libmnt_lock *lc)
        }
        if (lc && upd->userspace_only)
                mnt_lock_use_simplelock(lc, TRUE);      /* use flock */
-       if (lc)
+       if (lc) {
                rc = mnt_lock_file(lc);
-       if (rc)
-               goto done;
+               if (rc) {
+                       rc = -MNT_ERR_LOCK;
+                       goto done;
+               }
+       }
 
        tb = __mnt_new_table_from_file(upd->filename,
                        upd->userspace_only ? MNT_FMT_UTAB : MNT_FMT_MTAB);