Samuel Thibault <[email protected]> writes:
> Also, > > Ryan Jeffrey, le jeu. 10 sept. 2020 14:01:58 -0700, a ecrit: >> diff -ruN a/hurd/libdiskfs/file-statfs.c b/hurd/libdiskfs/file-statfs.c >> --- a/hurd/libdiskfs/file-statfs.c 2020-07-18 12:08:35.000000000 -0700 >> +++ b/hurd/libdiskfs/file-statfs.c 2020-09-08 02:21:25.000000000 -0700 >> @@ -43,6 +43,8 @@ >> statbuf->f_flag |= ST_SYNCHRONOUS; >> if (_diskfs_noatime) >> statbuf->f_flag |= ST_NOATIME; >> + else if (_diskfs_relatime) >> + statbuf->f_flag |= ST_RELATIME; >> >> diskfs_set_statfs (statbuf); >> > > Since ST_RELATIME comes from glibc, which is not released yet with that > macro, please but these two lines inside #ifdef ST_RELATIME so the hurd > can be built with an older glibc. > > Samuel Speaking of libc, I submitted a request-assign.future to [email protected] for a small patch containing the "ST_RELATIME" enum and macro, but they never got back to me on it. Should I email them? Anyway, here is a patch to the previous patch: diff -x '.*' -x 'README*' -ruN a/hurd/doc/hurd.texi b/hurd/doc/hurd.texi --- a/hurd/doc/hurd.texi 2020-09-27 16:26:08.000000000 -0700 +++ b/hurd/doc/hurd.texi 2020-09-27 16:57:08.000000000 -0700 @@ -3973,7 +3973,9 @@ @deftypefun void diskfs_set_node_atime (@w{struct node *@var{np}}) If disk is not readonly and the noatime option is not enabled, set -@code{@var{np}->dn_set_atime}. +@code{@var{np}->dn_set_atime}. If relatime is enabled, only set +@code{@var{np}->dn_set_atime} if the atime has not been updated today, +or if ctime or mtime are more recent than atime. @end deftypefun @deftypefun void diskfs_set_node_times (@w{struct node *@var{np}}) diff -x '.*' -x 'README*' -ruN a/hurd/libdiskfs/file-statfs.c b/hurd/libdiskfs/file-statfs.c --- a/hurd/libdiskfs/file-statfs.c 2020-09-27 16:28:11.000000000 -0700 +++ b/hurd/libdiskfs/file-statfs.c 2020-09-27 16:57:07.000000000 -0700 @@ -21,6 +21,10 @@ #include "priv.h" #include "fs_S.h" +#ifndef ST_RELATIME +# define ST_RELATIME 4096 +#endif /* ST_RELATIME */ + /* Implement file_getcontrol as described in <hurd/fs.defs>. */ kern_return_t diskfs_S_file_statfs (struct protid *file, diff -x '.*' -x 'README*' -ruN a/hurd/libdiskfs/node-times.c b/hurd/libdiskfs/node-times.c --- a/hurd/libdiskfs/node-times.c 2020-09-27 16:28:11.000000000 -0700 +++ b/hurd/libdiskfs/node-times.c 2020-09-27 16:57:07.000000000 -0700 @@ -26,12 +26,14 @@ /* If the disk is not readonly and noatime is not set, then check relatime conditions: if either `np->dn_stat.st_mtim.tv_sec' or - `np->dn_stat.st_ctim.tv_sec' is less than `np->dn_stat.st_atim.tv_sec', + `np->dn_stat.st_ctim.tv_sec' is greater than `np->dn_stat.st_atim.tv_sec', or if the atime is greater than 24 hours old, return true. */ int atime_should_update (struct node *np) { + struct timeval t; + if (_diskfs_noatime) return 0; @@ -41,16 +43,12 @@ if (np->dn_stat.st_mtim.tv_sec > np->dn_stat.st_atim.tv_sec) return 1; /* Update atime if ctime is younger than atime. */ - else if (np->dn_stat.st_ctim.tv_sec > np->dn_stat.st_atim.tv_sec) + if (np->dn_stat.st_ctim.tv_sec > np->dn_stat.st_atim.tv_sec) return 1; /* Update atime if current atime is more than 24 hours old. */ - else - { - struct timeval t; - maptime_read (diskfs_mtime, &t); - if ((long)(t.tv_sec - np->dn_stat.st_atim.tv_sec) >= 24 * 60 * 60) - return 1; - } + maptime_read (diskfs_mtime, &t); + if ((long)(t.tv_sec - np->dn_stat.st_atim.tv_sec) >= 24 * 60 * 60) + return 1; return 0; } diff -x '.*' -x 'README*' -ruN a/hurd/libdiskfs/priv.h b/hurd/libdiskfs/priv.h --- a/hurd/libdiskfs/priv.h 2020-09-27 16:28:11.000000000 -0700 +++ b/hurd/libdiskfs/priv.h 2020-09-27 16:57:07.000000000 -0700 @@ -104,7 +104,7 @@ /* If the disk is not readonly and noatime is not set, then check relatime conditions: if either `np->dn_stat.st_mtim.tv_sec' or - `np->dn_stat.st_ctim.tv_sec' is less than `np->dn_stat.st_atim.tv_sec', + `np->dn_stat.st_ctim.tv_sec' is greater than `np->dn_stat.st_atim.tv_sec', or if the atime is greater than 24 hours old, return true. */ int atime_should_update (struct node *np);
