The statx()
system call was added to Linux kernel and now it is possible to get the creation (birth) time of the file from statx.stx_btime
stucture field on supported filesystems. But I can’t find any support in utimensat()
of similar system calls.
Is it possible to change file’s creation timestamp in C/C++ and how?
Advertisement
Answer
statx.stx_btime
is filesystem-specific. Linux has only three standardized timestamps – ctime, atime, and mtime – which are filled by the filesystem-agnostic generic_fillattr function.
Creation time on the other hand is filled by filesystem-specific functions, for instance with ext4 you can see the relevant code here:
int ext4_getattr(struct user_namespace *mnt_userns, const struct path *path, struct kstat *stat, u32 request_mask, unsigned int query_flags) { struct inode *inode = d_inode(path->dentry); struct ext4_inode *raw_inode; struct ext4_inode_info *ei = EXT4_I(inode); unsigned int flags; if ((request_mask & STATX_BTIME) && EXT4_FITS_IN_INODE(raw_inode, ei, i_crtime)) { stat->result_mask |= STATX_BTIME; stat->btime.tv_sec = ei->i_crtime.tv_sec; stat->btime.tv_nsec = ei->i_crtime.tv_nsec; } ...
There seems to be no easy way to access the creation time – a quick search reveals that ext4’s i_crtime
is not directly modifiable.
A possible solution is to write a filesystem-specific driver to modify e.g. i_crtime
directly – but this carries its own risks in modifying internal filesystem data.