On Wed, 5 Dec 2018, Alan Somers wrote:

Log:
 stat(2): clarify which syscalls modify file timestamps

 The list of syscalls that modify st_atim, st_mtim, and st_ctim was quite out
 of date and probably not accurate to begin with.  Update it, and make it
 clear that the list is open-ended.

These fields shouldn't exist.  They are misimplemented compatibility cruft.
They didn't exist in FreeBSD-4.  They were correctly implemented
compatibility cruft then.  The POSIX fields are still only time_t's with
names st_atime, etc., but these fields are timespecs with necessarily
different names.  In FreeBSD-4, they were named st_atimespec, etc. unless
POSIX_SOURCE is defined, which before about 2007 POSIX required struct
timespec to not be defined, so the fields were declared as 2 scalars
st_atime and st_atimensec, etc.  Padding of the scalars caused ABI problems
which I fixed in FreeBSD-5 using bit-fields.  Now the support for POSIX
before about 2007 is broken by declaring struct timespec undonditionally
and using it for st_atim, etc.  API compatibility with old versions of
FreeBSD is broken by renaming st_atimespec to st_atim, etc.

All versions that use timespecs use macro hacks of dubious standard
conformance to convert from timespecs to POSIX time_t's.  All names starting
with st_ are reserved if <sys/stat.h> is included.  This is what makes it
conforming for the implementation to use st_atim, etc.  It is less clear
if the macros conform because it would be non-conforming for a an application
to #undef st_atim or depend on st_atim not being a macro.

Modified: head/lib/libc/sys/stat.2
==============================================================================
--- head/lib/libc/sys/stat.2    Wed Dec  5 17:13:33 2018        (r341597)
+++ head/lib/libc/sys/stat.2    Wed Dec  5 17:28:40 2018        (r341598)
...
@@ -193,45 +193,53 @@ are:
.Bl -tag -width ".Va st_birthtim"
.It Va st_atim
Time when file data was last accessed.
-Changed by the
-.Xr mknod 2 ,

Not changed by mknod, but set by it.  Still set by it.

-.Xr utimes 2 ,

Not really changed if the change is null, where a null change may be the
result of rounding to a representable value.  Permissions are still required
for making null changes.  Similarly for most operations.

+Changed implicitly by syscalls such as
.Xr read 2
and
-.Xr readv 2
-system calls.
+.Xr readv 2 ,

Not changed by reads if the file system is mounted -noatime and the file
system supports this (you can't tell if the file system supports this
by examining its MNT_NOATIME flag).  Not changed if granularity makes the
change null.

+and explicitly by
+.Xr utimes 2 .

The lists would be even longer if they mentioned utime, lutimes, futimes,
futimesat, futimens and futimnsat.

.It Va st_mtim
Time when file data was last modified.
-Changed by the
+Changed implicitly by syscalls such as
+.Xr truncate 2 ,
+.Xr write 2 ,
+and
+.Xr writev 2 ,
+and explicitly by
+.Xr utimes 2 .
+Also, any syscall which modifies directory content changes the
+.Va st_mtim
+for the affected directory.
+For instance,
+.Xr creat 2 ,

Usually spelled open with O_CREAT.

.Xr mkdir 2 ,

creat, open with O_CREAT, link, symlink, mkdir and all of the removed mk's
also set all times.

-.Xr mkfifo 2 ,
-.Xr mknod 2 ,
-.Xr utimes 2 ,
-.Xr write 2
+.Xr rename 2 ,
+.Xr link 2 ,

rename to a different directory changes 2 sets of directory times.

link is unsorted in this and another list.

...
+.Xr link 2 ,
and
-.Xr writev 2
-system calls.
+.Xr unlink 2 .
.It Va st_birthtim
Time when the inode was created.
.El

st_birthim should be named st_btime.

st_birthtim is set by all creation operations.  It is changed by changing
st_mtim to a value before the current st_birthtim.  This is done at the vfs
level, so it should work for all file systems that support birthtimes.

Changing st_birthtime forwards is not supported by any syscall.  There
are already about 10 times too many syscalls for setting times, but
none of them supports setting birthtimes or ctimes.  I use a sysctl
hack to set ctimes, as needed to back up and restore them, but don't
do anything special for birthtimes.

Bruce
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to