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();
}
How could this value be >= 16384 initially? Would it be from pre-configured
FS alignment, like XFS RT extsize? Or is this from some special CoW-based
atomic write support? Or FS block size of 16384?
Sorry, this check should not be here at all, we should only check it
later.
Incidentally, for consistency only setting FS_XFLAG_WRITE_ATOMIC will lead
to FMODE_CAN_ATOMIC_WRITE being set. So until FS_XFLAG_WRITE_ATOMIC is set
would it make sense to have statx return 0 for STATX_WRITE_ATOMIC.
True. We might need to report the limits even without that, though.
Could we just error the SETXATTR ioctl when FS_XFLAG_FORCEALIGN is not
set (and it is required)? The problem is that ioctl reports -EINVAL for
any such errors, so hard for the user to know the issue...
Thanks,
John