fs/utimes.c
Source file repositories/reference/linux-study-clean/fs/utimes.c
File Facts
- System
- Linux kernel
- Corpus path
fs/utimes.c- Extension
.c- Size
- 7863 bytes
- Lines
- 295
- Domain
- Core OS
- Bucket
- VFS And Filesystem Core
- Inferred role
- Core OS: syscall or user/kernel boundary
- Status
- core implementation candidate
Why This File Exists
Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Defines or participates in a user/kernel boundary; inspect argument validation, copy_from_user/copy_to_user, credentials, and dispatch target.
- Touches user memory; correctness depends on fault-safe copying and privilege boundary handling.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/file.hlinux/mount.hlinux/namei.hlinux/utime.hlinux/syscalls.hlinux/uaccess.hlinux/compat.hasm/unistd.hlinux/filelock.hinternal.h
Detected Declarations
syscall utimensatsyscall futimesatsyscall utimessyscall utimesyscall utime32syscall utimensat_time32syscall futimesat_time32syscall utimes_time32function nsec_validfunction vfs_utimesfunction do_utimes_pathfunction do_utimes_fdfunction do_utimesfunction futimesatfunction SYSCALL_DEFINE3function do_compat_futimesatexport vfs_utimes
Annotated Snippet
SYSCALL_DEFINE4(utimensat, int, dfd, const char __user *, filename,
struct __kernel_timespec __user *, utimes, int, flags)
{
struct timespec64 tstimes[2];
if (utimes) {
if ((get_timespec64(&tstimes[0], &utimes[0]) ||
get_timespec64(&tstimes[1], &utimes[1])))
return -EFAULT;
/* Nothing to do, we must not even check the path. */
if (tstimes[0].tv_nsec == UTIME_OMIT &&
tstimes[1].tv_nsec == UTIME_OMIT)
return 0;
}
return do_utimes(dfd, filename, utimes ? tstimes : NULL, flags);
}
#ifdef __ARCH_WANT_SYS_UTIME
/*
* futimesat(), utimes() and utime() are older versions of utimensat()
* that are provided for compatibility with traditional C libraries.
* On modern architectures, we always use libc wrappers around
* utimensat() instead.
*/
static long do_futimesat(int dfd, const char __user *filename,
struct __kernel_old_timeval __user *utimes)
{
struct __kernel_old_timeval times[2];
struct timespec64 tstimes[2];
if (utimes) {
if (copy_from_user(×, utimes, sizeof(times)))
return -EFAULT;
/* This test is needed to catch all invalid values. If we
would test only in do_utimes we would miss those invalid
values truncated by the multiplication with 1000. Note
that we also catch UTIME_{NOW,OMIT} here which are only
valid for utimensat. */
if (times[0].tv_usec >= 1000000 || times[0].tv_usec < 0 ||
times[1].tv_usec >= 1000000 || times[1].tv_usec < 0)
return -EINVAL;
tstimes[0].tv_sec = times[0].tv_sec;
tstimes[0].tv_nsec = 1000 * times[0].tv_usec;
tstimes[1].tv_sec = times[1].tv_sec;
tstimes[1].tv_nsec = 1000 * times[1].tv_usec;
}
return do_utimes(dfd, filename, utimes ? tstimes : NULL, 0);
}
SYSCALL_DEFINE3(futimesat, int, dfd, const char __user *, filename,
struct __kernel_old_timeval __user *, utimes)
{
return do_futimesat(dfd, filename, utimes);
}
SYSCALL_DEFINE2(utimes, char __user *, filename,
struct __kernel_old_timeval __user *, utimes)
{
return do_futimesat(AT_FDCWD, filename, utimes);
}
SYSCALL_DEFINE2(utime, char __user *, filename, struct utimbuf __user *, times)
{
struct timespec64 tv[2];
if (times) {
if (get_user(tv[0].tv_sec, ×->actime) ||
get_user(tv[1].tv_sec, ×->modtime))
return -EFAULT;
tv[0].tv_nsec = 0;
tv[1].tv_nsec = 0;
}
return do_utimes(AT_FDCWD, filename, times ? tv : NULL, 0);
}
#endif
#ifdef CONFIG_COMPAT_32BIT_TIME
/*
* Not all architectures have sys_utime, so implement this in terms
* of sys_utimes.
*/
#ifdef __ARCH_WANT_SYS_UTIME32
SYSCALL_DEFINE2(utime32, const char __user *, filename,
struct old_utimbuf32 __user *, t)
Annotation
- Immediate include surface: `linux/file.h`, `linux/mount.h`, `linux/namei.h`, `linux/utime.h`, `linux/syscalls.h`, `linux/uaccess.h`, `linux/compat.h`, `asm/unistd.h`.
- Detected declarations: `syscall utimensat`, `syscall futimesat`, `syscall utimes`, `syscall utime`, `syscall utime32`, `syscall utimensat_time32`, `syscall futimesat_time32`, `syscall utimes_time32`, `function nsec_valid`, `function vfs_utimes`.
- Atlas domain: Core OS / VFS And Filesystem Core.
- Implementation status: core implementation candidate.
- This snippet crosses the user/kernel memory boundary; validate fault handling and access checks before translating the pattern.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.