]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: report larger dio alignment for COW inodes
authorChristoph Hellwig <hch@lst.de>
Thu, 9 Jan 2025 08:31:05 +0000 (09:31 +0100)
committerChristian Brauner <brauner@kernel.org>
Thu, 9 Jan 2025 15:23:18 +0000 (16:23 +0100)
For I/O to reflinked blocks we always need to write an entire new file
system block, and the code enforces the file system block alignment for
the entire file if it has any reflinked blocks.  Mirror the larger
value reported in the statx in the dio_offset_align in the xfs-specific
XFS_IOC_DIOINFO ioctl for the same reason.

Don't bother adding a new field for the read alignment to this legacy
ioctl as all new users should use statx instead.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20250109083109.1441561-6-hch@lst.de
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/xfs/xfs_ioctl.c

index 0789c18aaa1871a6210a75cadec5a7c29322bef2..f951033253188f1ef070f7dce3d153fc84f84dd5 100644 (file)
@@ -1204,7 +1204,16 @@ xfs_file_ioctl(
                struct xfs_buftarg      *target = xfs_inode_buftarg(ip);
                struct dioattr          da;
 
-               da.d_mem =  da.d_miniosz = target->bt_logical_sectorsize;
+               da.d_mem = target->bt_logical_sectorsize;
+
+               /*
+                * See xfs_report_dioalign() for an explanation about why this
+                * reports a value larger than the sector size for COW inodes.
+                */
+               if (xfs_is_cow_inode(ip))
+                       da.d_miniosz = xfs_inode_alloc_unitsize(ip);
+               else
+                       da.d_miniosz = target->bt_logical_sectorsize;
                da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1);
 
                if (copy_to_user(arg, &da, sizeof(da)))