]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: fix and cleanup relatime use
authorKarel Zak <kzak@redhat.com>
Thu, 23 Mar 2023 13:22:37 +0000 (14:22 +0100)
committerKarel Zak <kzak@redhat.com>
Thu, 23 Mar 2023 13:22:37 +0000 (14:22 +0100)
* move atime logic to optlist

* MOUNT_ATTR_RELATIME is zero, so we cannot use use "if (!attr)" to skip mount_setattr()

Signed-off-by: Karel Zak <kzak@redhat.com>
libmount/src/hook_mount.c
libmount/src/optlist.c

index fe744d0d5b77768a6017a8e96f8b10f815780b06..b535382b4da8960b0f74c7dbfb1d98cbf5b4e653 100644 (file)
@@ -329,9 +329,6 @@ static int set_vfsflags(struct libmnt_context *cxt,
        if (recursive)
                callflags |= AT_RECURSIVE;
 
-       if (set & (MOUNT_ATTR_RELATIME | MOUNT_ATTR_NOATIME | MOUNT_ATTR_STRICTATIME))
-               clr |= MOUNT_ATTR__ATIME;
-
        DBG(HOOK, ul_debugobj(hs,
                        "mount_setattr(set=0x%08" PRIx64" clr=0x%08" PRIx64")", set, clr));
        attr.attr_set = set;
index 0fe74be5ce6be102f889f15d0e079a68ec61fb3a..e3b824e3bca6332ead40aefa2b255781a0715fb2 100644 (file)
@@ -362,28 +362,44 @@ int mnt_optlist_merge_opts(struct libmnt_optlist *ls)
 }
 
 #ifdef USE_LIBMOUNT_MOUNTFD_SUPPORT
-static inline uint64_t flag_to_attr(unsigned long flag)
+static inline int flag_to_attr(unsigned long flag, uint64_t *attr)
 {
+       uint64_t a = 0;
+
        switch (flag) {
        case MS_RDONLY:
-               return MOUNT_ATTR_RDONLY;
+               a = MOUNT_ATTR_RDONLY;
+               break;
        case MS_NOSUID:
-               return MOUNT_ATTR_NOSUID;
+               a = MOUNT_ATTR_NOSUID;
+               break;
        case MS_NODEV:
-               return MOUNT_ATTR_NODEV;
+               a = MOUNT_ATTR_NODEV;
+               break;
        case MS_NOEXEC:
-               return MOUNT_ATTR_NOEXEC;
+               a = MOUNT_ATTR_NOEXEC;
+               break;
        case MS_NODIRATIME:
-               return MOUNT_ATTR_NODIRATIME;
+               a = MOUNT_ATTR_NODIRATIME;
+               break;
        case MS_RELATIME:
-               return MOUNT_ATTR_RELATIME;
+               a = MOUNT_ATTR_RELATIME;
+               break;
        case MS_NOATIME:
-               return MOUNT_ATTR_NOATIME;
+               a =  MOUNT_ATTR_NOATIME;
+               break;
        case MS_STRICTATIME:
-               return MOUNT_ATTR_STRICTATIME;
+               a = MOUNT_ATTR_STRICTATIME;
+               break;
        case MS_NOSYMFOLLOW:
-               return MOUNT_ATTR_NOSYMFOLLOW;
+               a = MOUNT_ATTR_NOSYMFOLLOW;
+               break;
+       default:
+               return -1;
        }
+
+       if (attr)
+               *attr = a;
        return 0;
 }
 
@@ -395,7 +411,7 @@ static inline int is_vfs_opt(struct libmnt_opt *opt)
        if (!opt->map || !opt->ent || !opt->ent->id || !opt->is_linux)
                return 0;
 
-       return flag_to_attr(opt->ent->id) == 0 ? 0 : 1;
+       return flag_to_attr(opt->ent->id, NULL) < 0 ? 0 : 1;
 }
 #endif
 
@@ -805,6 +821,12 @@ int mnt_optlist_get_flags(struct libmnt_optlist *ls, unsigned long *flags,
  * new MOUNT_ATTR_*
  */
 #ifdef USE_LIBMOUNT_MOUNTFD_SUPPORT
+
+#define MNT_RESETABLE_ATTRS    (MOUNT_ATTR_RDONLY| MOUNT_ATTR_NOSUID| \
+                                MOUNT_ATTR_NODEV | MOUNT_ATTR_NOEXEC| \
+                                MOUNT_ATTR_NOATIME|  MOUNT_ATTR_NODIRATIME | \
+                                MOUNT_ATTR_NOSYMFOLLOW)
+
 int mnt_optlist_get_attrs(struct libmnt_optlist *ls, uint64_t *set, uint64_t *clr, int rec)
 {
        struct libmnt_iter itr;
@@ -817,7 +839,7 @@ int mnt_optlist_get_attrs(struct libmnt_optlist *ls, uint64_t *set, uint64_t *cl
        mnt_reset_iter(&itr, MNT_ITER_FORWARD);
 
        while (mnt_optlist_next_opt(ls, &itr, &opt) == 0) {
-               uint64_t x;
+               uint64_t x = 0;
 
                if (ls->linux_map != opt->map)
                        continue;
@@ -831,8 +853,7 @@ int mnt_optlist_get_attrs(struct libmnt_optlist *ls, uint64_t *set, uint64_t *cl
 
                if (!is_wanted_opt(opt, ls->linux_map, MNT_OL_FLTR_DFLT))
                        continue;
-               x = flag_to_attr( opt->ent->id );
-               if (!x)
+               if (flag_to_attr( opt->ent->id, &x) < 0)
                        continue;
 
                if (opt->ent->mask & MNT_INVERT) {
@@ -841,6 +862,10 @@ int mnt_optlist_get_attrs(struct libmnt_optlist *ls, uint64_t *set, uint64_t *cl
                } else {
                        DBG(OPTLIST, ul_debugobj(ls, " set: %s", opt->ent->name));
                        *set |= x;
+
+                       if (x == MOUNT_ATTR_RELATIME || x == MOUNT_ATTR_NOATIME ||
+                           x == MOUNT_ATTR_STRICTATIME)
+                               *clr |= MOUNT_ATTR__ATIME;
                }
        }