vfs: utimensat(): ignore tv_sec if tv_nsec == UTIME_OMIT or UTIME_NOW
PATCH v2 1/4 vfs: utimensat(): ignore tv_sec if tv_nsec == UTIME_OMIT or UTIME_NOW
The POSIX.1 draft spec for utimensat() says that if a times[n].tv_nsec field is UTIME_OMIT or UTIME_NOW, then the value in the corresponding tv_sec field is ignored. See the last sentence of this para, from the spec:
If the tv_nsec field of a timespec structure has the special value UTIME_NOW, the file's relevant timestamp shall be set to the greatest value supported by the file system that is not greater than the current time. If the tv_nsec field has the special value UTIME_OMIT, the file's relevant timestamp shall not be changed. In either case, the tv_sec field shall be ignored.
However the current Linux implementation requires the tv_sec value to be zero (or the EINVAL error results). This requirement should be removed.
fs/utimes.c +0 -8
@@ -169,14 +169,6 @@if (utimes) {if (copy_from_user (&tstimes, utimes,sizeof (tstimes)))return -EFAULT ; -if ((tstimes[0 ].tv_nsec ==UTIME_OMIT || - tstimes[0 ].tv_nsec ==UTIME_NOW ) && - tstimes[0 ].tv_sec !=0 ) -return -EINVAL ; -if ((tstimes[1 ].tv_nsec ==UTIME_OMIT || - tstimes[1 ].tv_nsec ==UTIME_NOW ) && - tstimes[1 ].tv_sec !=0 ) -return -EINVAL ;/* Nothing to do, we must not even check the path. */ if (tstimes[0].tv_nsec == UTIME_OMIT &&