From da5b44eaf131c748caeedf59b3dc9e42b94c82f0 Mon Sep 17 00:00:00 2001 From: Ryan Jeffrey Date: Wed, 30 Sep 2020 21:19:52 +0200 Subject: libdiskfs: Add relatime support * doc/hurd.texi (diskfs_set_node_atime): Document relatime behavior. * libdiskfs/diskfs.h (diskfs_set_node_atime): Likewise. * libdiskfs/init-init.c (_diskfs_relatime): Add variable. * libdiskfs/file-statfs.c (ST_RELATIME): Define if not defined already. (diskfs_S_file_statfs): Report ST_RELATIME when _diskfs_relatime is set. * libdiskfs/node-times.c (atime_should_update): New function. (diskfs_set_node_atime): Document relatime behavior. Call atime_should_update instead of reading _diskfs_noatime. * libdiskfs/opts-common.c (diskfs_common_options): Add --strictatime and -R/--relatime options. * libdiskfs/opts-std-runtime.c (struct parse_hook): Add relatime field. (set_opts): Set _diskfs_relatime from relatime field. (parse_opt): Parse -R option. * libdiskfs/opts-std-startup.c (parse_startup_opt): Parse -R option. * libdiskfs/priv.h (_diskfs_relatime): Declare variable. (atime_should_update): Declare function. * libdiskfs/opts-append-std.c (diskfs_append_std_options): Add reporting --relatime option. * libdiskfs/conch-fetch.c (iohelp_fetch_shared_data): Call atime_should_update instead of reading _diskfs_noatime. * libdiskfs/rdwr-internal.c (_diskfs_rdwr_internal): Likewise. --- libdiskfs/opts-std-runtime.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'libdiskfs/opts-std-runtime.c') diff --git a/libdiskfs/opts-std-runtime.c b/libdiskfs/opts-std-runtime.c index 177dfaf6..48acbaaf 100644 --- a/libdiskfs/opts-std-runtime.c +++ b/libdiskfs/opts-std-runtime.c @@ -33,7 +33,7 @@ std_runtime_options[] = struct parse_hook { int readonly, sync, sync_interval, remount, nosuid, noexec, noatime, - noinheritdirgroup; + noinheritdirgroup, relatime; }; /* Implement the options in H, and free H. */ @@ -80,6 +80,8 @@ set_opts (struct parse_hook *h) _diskfs_noexec = h->noexec; if (h->noatime != -1) _diskfs_noatime = h->noatime; + else if (h->relatime != -1) + _diskfs_relatime = h->relatime; if (h->noinheritdirgroup != -1) _diskfs_no_inherit_dir_group = h->noinheritdirgroup; @@ -100,10 +102,16 @@ parse_opt (int opt, char *arg, struct argp_state *state) case 'u': h->remount = 1; break; case 'S': h->nosuid = 1; break; case 'E': h->noexec = 1; break; - case 'A': h->noatime = 1; break; + case 'A': + { + h->relatime = -1; + h->noatime = 1; + break; + } + case 'R': h->relatime = 1; break; case OPT_SUID_OK: h->nosuid = 0; break; case OPT_EXEC_OK: h->noexec = 0; break; - case OPT_ATIME: h->noatime = 0; break; + case OPT_ATIME: h->noatime = h->relatime = 0; break; case OPT_NO_INHERIT_DIR_GROUP: h->noinheritdirgroup = 1; break; case OPT_INHERIT_DIR_GROUP: h->noinheritdirgroup = 0; break; case 'n': h->sync_interval = 0; h->sync = 0; break; @@ -129,7 +137,7 @@ parse_opt (int opt, char *arg, struct argp_state *state) h->sync = diskfs_synchronous; h->sync_interval = -1; h->remount = 0; - h->nosuid = h->noexec = h->noatime = h->noinheritdirgroup = -1; + h->nosuid = h->noexec = h->noatime = h->noinheritdirgroup = h->relatime = -1; /* We know that we have one child, with which we share our hook. */ state->child_inputs[0] = h; -- cgit v1.2.3