This series expands atomic write support to filesystems, specifically XFS. Flag FS_XFLAG_ATOMICWRITES is added as an enabling flag for atomic writes. XFS can be formatted for atomic writes as follows: mkfs.xfs -i atomicwrites=1 -b size=16384 /dev/sda Support can be enabled through xfs_io command: $xfs_io -c "chattr +W" filename $xfs_io -c "lsattr -v" filename [atomic-writes] filename $xfs_io -c statx filename ... stat.stx_atomic_write_unit_min = 16384 stat.stx_atomic_write_unit_max = 16384 stat.stx_atomic_write_segments_max = 1 ... Dependence on forcealign is gone for the moment. This means that we can only write a single FS block atomically. Since we can now have FS block size > PAGE_SIZE for XFS, we can write atomically write > 4K blocks on x86. Using the large FS block size has downsides, so we still want the forcealign feature. Baseline is v6.12-rc1 Basic xfsprogs support at: https://github.com/johnpgarry/xfsprogs-dev/tree/atomic-writes-v6 Patches for this series can be found at: https://github.com/johnpgarry/linux/tree/atomic-writes-v6.12-fs-v6 Changes since v5: - Drop forcealign dependency - Can support atomically writing a single FS block - XFS_DIFLAG2_ATOMICWRITES is inherited from parent directories - Add RB tags from Darrick (thanks!) Changes since v4: - Drop iomap extent-based zeroing and use single bio to cover multiple extents - Move forcealign to another series - Various change in ioctl, sb, inode validation - Add patch to tweak generic_atomic_write_valid() API John Garry (7): block/fs: Pass an iocb to generic_atomic_write_valid() fs: Export generic_atomic_write_valid() fs: iomap: Atomic write support xfs: Support FS_XFLAG_ATOMICWRITES xfs: Support atomic write for statx xfs: Validate atomic writes xfs: Support setting FMODE_CAN_ATOMIC_WRITE block/fops.c | 8 +++---- fs/iomap/direct-io.c | 26 ++++++++++++++++++++--- fs/iomap/trace.h | 3 ++- fs/read_write.c | 5 +++-- fs/xfs/libxfs/xfs_format.h | 11 ++++++++-- fs/xfs/libxfs/xfs_inode_buf.c | 38 ++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_inode_util.c | 6 ++++++ fs/xfs/libxfs/xfs_sb.c | 2 ++ fs/xfs/xfs_buf.c | 15 +++++++++++++- fs/xfs/xfs_buf.h | 5 ++++- fs/xfs/xfs_buf_mem.c | 2 +- fs/xfs/xfs_file.c | 19 +++++++++++++++++ fs/xfs/xfs_inode.h | 22 ++++++++++++++++++++ fs/xfs/xfs_ioctl.c | 37 +++++++++++++++++++++++++++++++++ fs/xfs/xfs_iops.c | 24 +++++++++++++++++++++ fs/xfs/xfs_mount.h | 2 ++ fs/xfs/xfs_reflink.c | 4 ++++ fs/xfs/xfs_super.c | 4 ++++ include/linux/fs.h | 2 +- include/linux/iomap.h | 1 + include/uapi/linux/fs.h | 1 + 21 files changed, 221 insertions(+), 16 deletions(-) -- 2.31.1