On Wed, Jan 10, 2024 at 05:40:56PM -0800, Darrick J. Wong wrote: > struct statx statx; > struct fsxattr fsxattr; > int fd = open('/foofile', O_RDWR | O_DIRECT); > > ioctl(fd, FS_IOC_GETXATTR, &fsxattr); > > fsxattr.fsx_xflags |= FS_XFLAG_FORCEALIGN | FS_XFLAG_WRITE_ATOMIC; > fsxattr.fsx_extsize = 16384; /* only for hardware no-tears writes */ > > ioctl(fd, FS_IOC_SETXATTR, &fsxattr); > > statx(fd, "", AT_EMPTY_PATH, STATX_ALL | STATX_WRITE_ATOMIC, &statx); > > if (statx.stx_atomic_write_unit_max >= 16384) { > pwrite(fd, &iov, 1, 0, RWF_SYNC | RWF_ATOMIC); > printf("HAPPY DANCE\n"); > } I think this still needs a check if the fs needs alignment for atomic writes at all. i.e. struct statx statx; struct fsxattr fsxattr; int fd = open('/foofile', O_RDWR | O_DIRECT); ioctl(fd, FS_IOC_GETXATTR, &fsxattr); statx(fd, "", AT_EMPTY_PATH, STATX_ALL | STATX_WRITE_ATOMIC, &statx); if (statx.stx_atomic_write_unit_max < 16384) { bailout(); } fsxattr.fsx_xflags |= FS_XFLAG_WRITE_ATOMIC; if (statx.stx_atomic_write_alignment) { fsxattr.fsx_xflags |= FS_XFLAG_FORCEALIGN; fsxattr.fsx_extsize = 16384; /* only for hardware no-tears writes */ } if (ioctl(fd, FS_IOC_SETXATTR, &fsxattr) < 1) { bailout(); } pwrite(fd, &iov, 1, 0, RWF_SYNC | RWF_ATOMIC); printf("HAPPY DANCE\n");