Re: [PATCH v2 2/2] xfs: add static size checks for ioctl UABI

From: Wilfred Mallawa

Date: Tue Feb 10 2026 - 01:06:57 EST


On Tue, 2026-02-10 at 15:59 +1000, Wilfred Mallawa wrote:
> From: Wilfred Mallawa <wilfred.mallawa@xxxxxxx>
>
> The ioctl structures in libxfs/xfs_fs.h are missing static size
> checks.
> It is useful to have static size checks for these structures as
> adding
> new fields to them could cause issues (e.g. extra padding that may be
> inserted by the compiler). So add these checks to xfs/xfs_ondisk.h.
>
> Due to different padding/alignment requirements across different
> architectures, to avoid build failures, some structures are ommited
> from
> the size checks. For example, structures with "compat_" definitions
> in
> xfs/xfs_ioctl32.h are ommited.
>
> Signed-off-by: Wilfred Mallawa <wilfred.mallawa@xxxxxxx>
> ---
> V1 -> V2:
> - Added inline comment to describe why some ioctl structs
>   are not addded.
>
> - Keep the new size check coupled under "ioctl UABI".
>
> - Drop size checks for structures that are in
> xfs/xfs_ioctl32.h
>   (i.e compat__X) to avoid build failures across different
>   architectures.
> ---
>  fs/xfs/libxfs/xfs_ondisk.h | 40 +++++++++++++++++++++++++++++++++---
> --
>  1 file changed, 35 insertions(+), 5 deletions(-)
>
> diff --git a/fs/xfs/libxfs/xfs_ondisk.h b/fs/xfs/libxfs/xfs_ondisk.h
> index 601a8367ced6..dced91d281fa 100644
> --- a/fs/xfs/libxfs/xfs_ondisk.h
> +++ b/fs/xfs/libxfs/xfs_ondisk.h
> @@ -208,11 +208,6 @@ xfs_check_ondisk_structs(void)
>   XFS_CHECK_OFFSET(struct xfs_dir3_free, hdr.hdr.magic, 0);
>   XFS_CHECK_OFFSET(struct xfs_attr3_leafblock, hdr.info.hdr,
> 0);
>  
> - XFS_CHECK_STRUCT_SIZE(struct
> xfs_bulkstat, 192);
> - XFS_CHECK_STRUCT_SIZE(struct xfs_inumbers, 24);
> - XFS_CHECK_STRUCT_SIZE(struct xfs_bulkstat_req, 64);
> - XFS_CHECK_STRUCT_SIZE(struct xfs_inumbers_req, 64);
> -
>   /*
>   * Make sure the incore inode timestamp range corresponds to
> hand
>   * converted values based on the ondisk format
> specification.
> @@ -292,6 +287,41 @@ xfs_check_ondisk_structs(void)
>   XFS_CHECK_SB_OFFSET(sb_pad, 281);
>   XFS_CHECK_SB_OFFSET(sb_rtstart, 288)
> ;
>   XFS_CHECK_SB_OFFSET(sb_rtreserved, 296);
> +
> + /*
> + * ioctl UABI
> + *
> + * Due to different padding/alignment requirements across
> + * different architectures, some structures are ommited from
> + * the size checks. In addition, structures with
> architecture
> + * dependent size fields are also ommited (e.g.
> __kernel_long_t).
> + */
> + XFS_CHECK_STRUCT_SIZE(struct
> xfs_bulkstat, 192);
> + XFS_CHECK_STRUCT_SIZE(struct xfs_inumbers, 24);
> + XFS_CHECK_STRUCT_SIZE(struct xfs_bulkstat_req, 64);
> + XFS_CHECK_STRUCT_SIZE(struct xfs_inumbers_req, 64);
> + XFS_CHECK_STRUCT_SIZE(struct dioattr, 12);
> + XFS_CHECK_STRUCT_SIZE(struct getbmap, 32);
> + XFS_CHECK_STRUCT_SIZE(struct getbmapx, 48);
> + XFS_CHECK_STRUCT_SIZE(struct xfs_attrlist_cursor, 16);
> + XFS_CHECK_STRUCT_SIZE(struct xfs_attrlist, 8);
> + XFS_CHECK_STRUCT_SIZE(struct xfs_attrlist, 8);
> + XFS_CHECK_STRUCT_SIZE(struct xfs_attrlist_ent, 4);
> + XFS_CHECK_STRUCT_SIZE(struct
> xfs_ag_geometry, 128);
> + XFS_CHECK_STRUCT_SIZE(struct
> xfs_rtgroup_geometry, 128);
> + XFS_CHECK_STRUCT_SIZE(struct xfs_error_injection, 8);
> + XFS_CHECK_STRUCT_SIZE(struct
> xfs_fsop_geom, 256);
> + XFS_CHECK_STRUCT_SIZE(struct
> xfs_fsop_geom_v4, 112);
> + XFS_CHECK_STRUCT_SIZE(struct xfs_fsop_counts, 32);
> + XFS_CHECK_STRUCT_SIZE(struct xfs_fsop_resblks, 16);
> + XFS_CHECK_STRUCT_SIZE(struct xfs_growfs_log, 8);
> + XFS_CHECK_STRUCT_SIZE(struct xfs_bulk_ireq, 64);
> + XFS_CHECK_STRUCT_SIZE(struct
> xfs_fs_eofblocks, 128);
> + XFS_CHECK_STRUCT_SIZE(struct xfs_fsid, 8);
> + XFS_CHECK_STRUCT_SIZE(struct xfs_scrub_metadata, 64);
> + XFS_CHECK_STRUCT_SIZE(struct xfs_scrub_vec, 16);
> + XFS_CHECK_STRUCT_SIZE(struct xfs_scrub_vec_head, 40);
> +

Extra white-space here, my bad! Will fixup for V3.

>  }
>  
>  #endif /* __XFS_ONDISK_H */