From: Arkadiusz Miśkiewicz Date: Fri, 5 Dec 2025 14:31:48 +0000 (+0100) Subject: libfrog: fix incorrect FS_IOC_FSSETXATTR argument to ioctl() X-Git-Tag: v6.18.0~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3147d1d643c8278f1b75dedf3a64037bece7da53;p=thirdparty%2Fxfsprogs-dev.git libfrog: fix incorrect FS_IOC_FSSETXATTR argument to ioctl() xfsprogs 6.17.0 has broken project quota due to incorrect argument passed to FS_IOC_FSSETXATTR ioctl(). Instead of passing struct fsxattr, struct file_attr was passed. # LC_ALL=C /usr/sbin/xfs_quota -x -c "project -s -p /home/xxx 389701" /home Setting up project 389701 (path /home/xxx)... xfs_quota: cannot set project on /home/xxx: Invalid argument Processed 1 (/etc/projects and cmdline) paths for project 389701 with recursion depth infinite (-1). ioctl(5, FS_IOC_FSSETXATTR, {fsx_xflags=FS_XFLAG_PROJINHERIT|FS_XFLAG_HASATTR, fsx_extsize=0, fsx_projid=0, fsx_cowextsize=389701}) = -1 EINVAL (Invalid argument) There seems to be a double mistake which hides the original ioctl() argument bug on old kernel with xfsprogs built against it. The size of fa_xflags was also wrong in xfsprogs's linux.h header. This way when xfsprogs is compiled on newer kernel but used with older kernel this bug uncovers. Reviewed-by: Darrick J. Wong Reviewed-by: Christoph Hellwig Signed-off-by: Arkadiusz Miśkiewicz Signed-off-by: Andrey Albershteyn --- diff --git a/include/linux.h b/include/linux.h index cea468d2..3ea90162 100644 --- a/include/linux.h +++ b/include/linux.h @@ -214,7 +214,7 @@ struct fsxattr { * fsxattr */ struct file_attr { - __u32 fa_xflags; + __u64 fa_xflags; __u32 fa_extsize; __u32 fa_nextents; __u32 fa_projid; diff --git a/libfrog/file_attr.c b/libfrog/file_attr.c index c2cbcb4e..6801c545 100644 --- a/libfrog/file_attr.c +++ b/libfrog/file_attr.c @@ -114,7 +114,7 @@ xfrog_file_setattr( file_attr_to_fsxattr(fa, &fsxa); - error = ioctl(fd, FS_IOC_FSSETXATTR, fa); + error = ioctl(fd, FS_IOC_FSSETXATTR, &fsxa); close(fd); return error;