]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: cleanup xfs_vn_getattr
authorChristoph Hellwig <hch@lst.de>
Thu, 9 Jan 2025 08:31:03 +0000 (09:31 +0100)
committerChristian Brauner <brauner@kernel.org>
Thu, 9 Jan 2025 15:23:17 +0000 (16:23 +0100)
Split the two bits of optional statx reporting into their own helpers
so that they are self-contained instead of deeply indented in the main
getattr handler.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20250109083109.1441561-4-hch@lst.de
Reviewed-by: John Garry <john.g.garry@oracle.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/xfs/xfs_iops.c

index 207e0dadffc3c515d470bd48f0420305f04cd229..6b0228a216176ce578019d0df5738761a4eb9979 100644 (file)
@@ -573,17 +573,28 @@ xfs_stat_blksize(
 }
 
 static void
-xfs_get_atomic_write_attr(
+xfs_report_dioalign(
        struct xfs_inode        *ip,
-       unsigned int            *unit_min,
-       unsigned int            *unit_max)
+       struct kstat            *stat)
 {
-       if (!xfs_inode_can_atomicwrite(ip)) {
-               *unit_min = *unit_max = 0;
-               return;
-       }
+       struct xfs_buftarg      *target = xfs_inode_buftarg(ip);
+       struct block_device     *bdev = target->bt_bdev;
 
-       *unit_min = *unit_max = ip->i_mount->m_sb.sb_blocksize;
+       stat->result_mask |= STATX_DIOALIGN;
+       stat->dio_mem_align = bdev_dma_alignment(bdev) + 1;
+       stat->dio_offset_align = bdev_logical_block_size(bdev);
+}
+
+static void
+xfs_report_atomic_write(
+       struct xfs_inode        *ip,
+       struct kstat            *stat)
+{
+       unsigned int            unit_min = 0, unit_max = 0;
+
+       if (xfs_inode_can_atomicwrite(ip))
+               unit_min = unit_max = ip->i_mount->m_sb.sb_blocksize;
+       generic_fill_statx_atomic_writes(stat, unit_min, unit_max);
 }
 
 STATIC int
@@ -647,22 +658,10 @@ xfs_vn_getattr(
                stat->rdev = inode->i_rdev;
                break;
        case S_IFREG:
-               if (request_mask & STATX_DIOALIGN) {
-                       struct xfs_buftarg      *target = xfs_inode_buftarg(ip);
-                       struct block_device     *bdev = target->bt_bdev;
-
-                       stat->result_mask |= STATX_DIOALIGN;
-                       stat->dio_mem_align = bdev_dma_alignment(bdev) + 1;
-                       stat->dio_offset_align = bdev_logical_block_size(bdev);
-               }
-               if (request_mask & STATX_WRITE_ATOMIC) {
-                       unsigned int    unit_min, unit_max;
-
-                       xfs_get_atomic_write_attr(ip, &unit_min,
-                                       &unit_max);
-                       generic_fill_statx_atomic_writes(stat,
-                                       unit_min, unit_max);
-               }
+               if (request_mask & STATX_DIOALIGN)
+                       xfs_report_dioalign(ip, stat);
+               if (request_mask & STATX_WRITE_ATOMIC)
+                       xfs_report_atomic_write(ip, stat);
                fallthrough;
        default:
                stat->blksize = xfs_stat_blksize(ip);