[PATCH v2 00/89] fs: new accessor methods for inode atime and mtime

Jeff Layton
2023-10-04T18:52:45Z

v2:
- bugfix in mtime handling
- incorporate _sec and _nsec accessor functions (Chuck Lever)
- move i_generation to plug hole after changing timestamps (Amir Goldstein)

While working on the multigrain timestamp changes, Linus suggested
adding some similar wrappers for accessing the atime and mtime that we
have for the ctime. With that, we could then move to using discrete
integers instead of struct timespec64 in struct inode and shrink it.

This patch implements this. Linus suggested using macros for the new
accessors, but the existing ctime wrappers were static inlines and since
there are only 3 different timestamps, I didn't see that trying to
fiddle with macros would gain us anything (other than less verbosity in
fs.h).

The second to last patch makes the conversion to discrete integers,
which shaves 8 bytes off of struct inode on my x86_64 kernel. The last
patch reshuffles things a little to keep the i_lock in the same
cacheline as the fields it protects.

About 75% of this conversion was done with coccinelle, with the rest
done by hand.

I think we probably ought to try to get everything but the last two
patches into v6.7 (though we could consider those too if we're feeling
lucky).

Jeff Layton (89):
fs: new accessor methods for atime and mtime
fs: convert core infrastructure to new timestamp accessors
spufs: convert to new timestamp accessors
hypfs: convert to new timestamp accessors
android: convert to new timestamp accessors
char: convert to new timestamp accessors
qib: convert to new timestamp accessors
ibmasm: convert to new timestamp accessors
misc: convert to new timestamp accessors
x86: convert to new timestamp accessors
tty: convert to new timestamp accessors
function: convert to new timestamp accessors
legacy: convert to new timestamp accessors
usb: convert to new timestamp accessors
9p: convert to new timestamp accessors
adfs: convert to new timestamp accessors
affs: convert to new timestamp accessors
afs: convert to new timestamp accessors
autofs: convert to new timestamp accessors
bcachefs: convert to new timestamp accessors
befs: convert to new timestamp accessors
bfs: convert to new timestamp accessors
btrfs: convert to new timestamp accessors
ceph: convert to new timestamp accessors
coda: convert to new timestamp accessors
configfs: convert to new timestamp accessors
cramfs: convert to new timestamp accessors
debugfs: convert to new timestamp accessors
devpts: convert to new timestamp accessors
efivarfs: convert to new timestamp accessors
efs: convert to new timestamp accessors
erofs: convert to new timestamp accessors
exfat: convert to new timestamp accessors
ext2: convert to new timestamp accessors
ext4: convert to new timestamp accessors
f2fs: convert to new timestamp accessors
fat: convert to new timestamp accessors
freevxfs: convert to new timestamp accessors
fuse: convert to new timestamp accessors
gfs2: convert to new timestamp accessors
hfs: convert to new timestamp accessors
hfsplus: convert to new timestamp accessors
hostfs: convert to new timestamp accessors
hpfs: convert to new timestamp accessors
hugetlbfs: convert to new timestamp accessors
isofs: convert to new timestamp accessors
jffs2: convert to new timestamp accessors
jfs: convert to new timestamp accessors
kernfs: convert to new timestamp accessors
minix: convert to new timestamp accessors
nfs: convert to new timestamp accessors
nfsd: convert to new timestamp accessors
nilfs2: convert to new timestamp accessors
ntfs: convert to new timestamp accessors
ntfs3: convert to new timestamp accessors
ocfs2: convert to new timestamp accessors
omfs: convert to new timestamp accessors
openpromfs: convert to new timestamp accessors
orangefs: convert to new timestamp accessors
overlayfs: convert to new timestamp accessors
proc: convert to new timestamp accessors
pstore: convert to new timestamp accessors
qnx4: convert to new timestamp accessors
qnx6: convert to new timestamp accessors
ramfs: convert to new timestamp accessors
reiserfs: convert to new timestamp accessors
romfs: convert to new timestamp accessors
client: convert to new timestamp accessors
server: convert to new timestamp accessors
squashfs: convert to new timestamp accessors
sysv: convert to new timestamp accessors
tracefs: convert to new timestamp accessors
ubifs: convert to new timestamp accessors
udf: convert to new timestamp accessors
ufs: convert to new timestamp accessors
vboxsf: convert to new timestamp accessors
xfs: convert to new timestamp accessors
zonefs: convert to new timestamp accessors
linux: convert to new timestamp accessors
ipc: convert to new timestamp accessors
bpf: convert to new timestamp accessors
mm: convert to new timestamp accessors
sunrpc: convert to new timestamp accessors
apparmor: convert to new timestamp accessors
selinux: convert to new timestamp accessors
security: convert to new timestamp accessors
fs: rename inode i_atime and i_mtime fields
fs: switch timespec64 fields in inode to discrete integers
fs: move i_generation into new hole created after timestamp conversion

arch/powerpc/platforms/cell/spufs/inode.c | 2 +-
arch/s390/hypfs/inode.c | 4 +-
drivers/android/binderfs.c | 8 +-
drivers/char/sonypi.c | 2 +-
drivers/infiniband/hw/qib/qib_fs.c | 4 +-
drivers/misc/ibmasm/ibmasmfs.c | 2 +-
drivers/misc/ibmvmc.c | 2 +-
drivers/platform/x86/sony-laptop.c | 2 +-
drivers/tty/tty_io.c | 10 +-
drivers/usb/core/devio.c | 26 +++--
drivers/usb/gadget/function/f_fs.c | 4 +-
drivers/usb/gadget/legacy/inode.c | 2 +-
fs/9p/vfs_inode.c | 6 +-
fs/9p/vfs_inode_dotl.c | 16 +--
fs/adfs/inode.c | 13 ++-
fs/affs/amigaffs.c | 4 +-
fs/affs/inode.c | 17 ++-
fs/afs/dynroot.c | 2 +-
fs/afs/inode.c | 8 +-
fs/afs/write.c | 2 +-
fs/attr.c | 4 +-
fs/autofs/inode.c | 2 +-
fs/autofs/root.c | 6 +-
fs/bad_inode.c | 2 +-
fs/bcachefs/fs.c | 12 +--
fs/befs/linuxvfs.c | 10 +-
fs/bfs/dir.c | 9 +-
fs/bfs/inode.c | 12 +--
fs/binfmt_misc.c | 2 +-
fs/btrfs/delayed-inode.c | 20 ++--
fs/btrfs/file.c | 18 ++--
fs/btrfs/inode.c | 43 ++++----
fs/btrfs/reflink.c | 2 +-
fs/btrfs/transaction.c | 3 +-
fs/btrfs/tree-log.c | 12 +--
fs/ceph/addr.c | 10 +-
fs/ceph/caps.c | 4 +-
fs/ceph/file.c | 2 +-
fs/ceph/inode.c | 64 ++++++------
fs/ceph/mds_client.c | 8 +-
fs/ceph/snap.c | 4 +-
fs/coda/coda_linux.c | 6 +-
fs/coda/dir.c | 2 +-
fs/coda/file.c | 2 +-
fs/configfs/inode.c | 8 +-
fs/cramfs/inode.c | 4 +-
fs/debugfs/inode.c | 2 +-
fs/devpts/inode.c | 6 +-
fs/efivarfs/file.c | 2 +-
fs/efivarfs/inode.c | 2 +-
fs/efs/inode.c | 5 +-
fs/erofs/inode.c | 3 +-
fs/exfat/exfat_fs.h | 1 +
fs/exfat/file.c | 7 +-
fs/exfat/inode.c | 31 +++---
fs/exfat/misc.c | 8 ++
fs/exfat/namei.c | 31 +++---
fs/exfat/super.c | 4 +-
fs/ext2/dir.c | 6 +-
fs/ext2/ialloc.c | 2 +-
fs/ext2/inode.c | 13 ++-
fs/ext2/super.c | 2 +-
fs/ext4/ext4.h | 20 +++-
fs/ext4/extents.c | 11 +-
fs/ext4/ialloc.c | 4 +-
fs/ext4/inline.c | 4 +-
fs/ext4/inode.c | 19 ++--
fs/ext4/ioctl.c | 13 ++-
fs/ext4/namei.c | 10 +-
fs/ext4/super.c | 2 +-
fs/ext4/xattr.c | 8 +-
fs/f2fs/dir.c | 6 +-
fs/f2fs/f2fs.h | 10 +-
fs/f2fs/file.c | 14 +--
fs/f2fs/inline.c | 2 +-
fs/f2fs/inode.c | 24 ++---
fs/f2fs/namei.c | 4 +-
fs/f2fs/recovery.c | 8 +-
fs/f2fs/super.c | 2 +-
fs/fat/inode.c | 25 +++--
fs/fat/misc.c | 6 +-
fs/freevxfs/vxfs_inode.c | 6 +-
fs/fuse/control.c | 2 +-
fs/fuse/dir.c | 10 +-
fs/fuse/inode.c | 29 +++---
fs/fuse/readdir.c | 6 +-
fs/gfs2/bmap.c | 10 +-
fs/gfs2/dir.c | 10 +-
fs/gfs2/glops.c | 11 +-
fs/gfs2/inode.c | 7 +-
fs/gfs2/quota.c | 2 +-
fs/gfs2/super.c | 12 +--
fs/hfs/catalog.c | 8 +-
fs/hfs/inode.c | 16 +--
fs/hfs/sysdep.c | 10 +-
fs/hfsplus/catalog.c | 8 +-
fs/hfsplus/inode.c | 22 ++--
fs/hostfs/hostfs_kern.c | 12 ++-
fs/hpfs/dir.c | 12 ++-
fs/hpfs/inode.c | 16 +--
fs/hpfs/namei.c | 22 ++--
fs/hpfs/super.c | 10 +-
fs/hugetlbfs/inode.c | 10 +-
fs/inode.c | 35 ++++---
fs/isofs/inode.c | 4 +-
fs/isofs/rock.c | 18 ++--
fs/jffs2/dir.c | 35 ++++---
fs/jffs2/file.c | 4 +-
fs/jffs2/fs.c | 20 ++--
fs/jffs2/os-linux.h | 4 +-
fs/jfs/inode.c | 2 +-
fs/jfs/jfs_imap.c | 20 ++--
fs/jfs/jfs_inode.c | 4 +-
fs/jfs/namei.c | 20 ++--
fs/jfs/super.c | 2 +-
fs/kernfs/inode.c | 6 +-
fs/libfs.c | 41 ++++++--
fs/minix/bitmap.c | 2 +-
fs/minix/dir.c | 6 +-
fs/minix/inode.c | 17 ++-
fs/minix/itree_common.c | 2 +-
fs/nfs/callback_proc.c | 2 +-
fs/nfs/fscache.h | 4 +-
fs/nfs/inode.c | 30 +++---
fs/nfsd/blocklayout.c | 3 +-
fs/nfsd/nfs3proc.c | 4 +-
fs/nfsd/nfs4proc.c | 8 +-
fs/nfsd/nfsctl.c | 2 +-
fs/nfsd/vfs.c | 2 +-
fs/nilfs2/dir.c | 6 +-
fs/nilfs2/inode.c | 20 ++--
fs/nsfs.c | 2 +-
fs/ntfs/inode.c | 25 ++---
fs/ntfs/mft.c | 2 +-
fs/ntfs3/file.c | 6 +-
fs/ntfs3/frecord.c | 11 +-
fs/ntfs3/inode.c | 25 +++--
fs/ntfs3/namei.c | 4 +-
fs/ocfs2/acl.c | 4 +-
fs/ocfs2/alloc.c | 6 +-
fs/ocfs2/aops.c | 6 +-
fs/ocfs2/dir.c | 9 +-
fs/ocfs2/dlmfs/dlmfs.c | 4 +-
fs/ocfs2/dlmglue.c | 29 +++---
fs/ocfs2/file.c | 30 +++---
fs/ocfs2/inode.c | 28 ++---
fs/ocfs2/move_extents.c | 4 +-
fs/ocfs2/namei.c | 16 +--
fs/ocfs2/refcounttree.c | 12 +--
fs/ocfs2/xattr.c | 4 +-
fs/omfs/inode.c | 12 +--
fs/openpromfs/inode.c | 4 +-
fs/orangefs/orangefs-utils.c | 16 +--
fs/overlayfs/file.c | 9 +-
fs/overlayfs/inode.c | 3 +-
fs/overlayfs/util.c | 4 +-
fs/pipe.c | 2 +-
fs/proc/base.c | 2 +-
fs/proc/inode.c | 2 +-
fs/proc/proc_sysctl.c | 2 +-
fs/proc/self.c | 2 +-
fs/proc/thread_self.c | 2 +-
fs/pstore/inode.c | 5 +-
fs/qnx4/inode.c | 6 +-
fs/qnx6/inode.c | 6 +-
fs/ramfs/inode.c | 7 +-
fs/reiserfs/inode.c | 26 ++---
fs/reiserfs/namei.c | 8 +-
fs/reiserfs/stree.c | 5 +-
fs/reiserfs/super.c | 2 +-
fs/romfs/super.c | 3 +-
fs/smb/client/file.c | 18 ++--
fs/smb/client/fscache.h | 6 +-
fs/smb/client/inode.c | 17 ++-
fs/smb/client/smb2ops.c | 6 +-
fs/smb/server/smb2pdu.c | 8 +-
fs/squashfs/inode.c | 6 +-
fs/stack.c | 4 +-
fs/stat.c | 4 +-
fs/sysv/dir.c | 6 +-
fs/sysv/ialloc.c | 2 +-
fs/sysv/inode.c | 12 +--
fs/sysv/itree.c | 2 +-
fs/tracefs/inode.c | 2 +-
fs/ubifs/debug.c | 12 +--
fs/ubifs/dir.c | 23 +++--
fs/ubifs/file.c | 16 +--
fs/ubifs/journal.c | 12 +--
fs/ubifs/super.c | 8 +-
fs/udf/ialloc.c | 4 +-
fs/udf/inode.c | 38 ++++---
fs/udf/namei.c | 16 +--
fs/ufs/dir.c | 6 +-
fs/ufs/ialloc.c | 2 +-
fs/ufs/inode.c | 42 ++++----
fs/vboxsf/utils.c | 15 +--
fs/xfs/libxfs/xfs_inode_buf.c | 10 +-
fs/xfs/libxfs/xfs_rtbitmap.c | 6 +-
fs/xfs/libxfs/xfs_trans_inode.c | 2 +-
fs/xfs/xfs_bmap_util.c | 7 +-
fs/xfs/xfs_inode.c | 4 +-
fs/xfs/xfs_inode_item.c | 4 +-
fs/xfs/xfs_iops.c | 8 +-
fs/xfs/xfs_itable.c | 12 +--
fs/xfs/xfs_rtalloc.c | 30 +++---
fs/zonefs/super.c | 10 +-
include/linux/fs.h | 120 +++++++++++++++++-----
include/linux/fs_stack.h | 6 +-
ipc/mqueue.c | 19 ++--
kernel/bpf/inode.c | 5 +-
mm/shmem.c | 20 ++--
net/sunrpc/rpc_pipe.c | 2 +-
security/apparmor/apparmorfs.c | 7 +-
security/apparmor/policy_unpack.c | 4 +-
security/inode.c | 2 +-
security/selinux/selinuxfs.c | 2 +-
216 files changed, 1220 insertions(+), 1000 deletions(-)

--
2.41.0