xfs: default attr fork size does not handle device inodes
authorDave Chinner <dchinner@redhat.com>
Tue, 6 Apr 2021 14:02:04 +0000 (07:02 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 7 Apr 2021 21:37:07 +0000 (14:37 -0700)
Device inodes have a non-default data fork size of 8 bytes
as checked/enforced by xfs_repair. xfs_default_attroffset() doesn't
handle this, so lets do a minor refactor so it does.

Fixes: e6a688c33238 ("xfs: initialise attr fork on inode create")
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Tested-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
fs/xfs/libxfs/xfs_bmap.c

index d405845ca42e23a295ecc1c5b31b76d6b8d5e058..61bd20ecdda1c1bb2c006f3e4d4afe84d677f046 100644 (file)
@@ -195,6 +195,9 @@ xfs_default_attroffset(
        struct xfs_mount        *mp = ip->i_mount;
        uint                    offset;
 
+       if (ip->i_df.if_format == XFS_DINODE_FMT_DEV)
+               return roundup(sizeof(xfs_dev_t), 8);
+
        if (mp->m_sb.sb_inodesize == 256)
                offset = XFS_LITINO(mp) - XFS_BMDR_SPACE_CALC(MINABTPTRS);
        else
@@ -1038,16 +1041,18 @@ xfs_bmap_set_attrforkoff(
        int                     size,
        int                     *version)
 {
+       int                     default_size = xfs_default_attroffset(ip) >> 3;
+
        switch (ip->i_df.if_format) {
        case XFS_DINODE_FMT_DEV:
-               ip->i_forkoff = roundup(sizeof(xfs_dev_t), 8) >> 3;
+               ip->i_forkoff = default_size;
                break;
        case XFS_DINODE_FMT_LOCAL:
        case XFS_DINODE_FMT_EXTENTS:
        case XFS_DINODE_FMT_BTREE:
                ip->i_forkoff = xfs_attr_shortform_bytesfit(ip, size);
                if (!ip->i_forkoff)
-                       ip->i_forkoff = xfs_default_attroffset(ip) >> 3;
+                       ip->i_forkoff = default_size;
                else if ((ip->i_mount->m_flags & XFS_MOUNT_ATTR2) && version)
                        *version = 2;
                break;