Message ID | 20210406115923.1738753-4-david@fromorbit.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | xfs: fix eager attr fork init regressions | expand |
On 4/6/21 4:59 AM, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > 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> > Reviewed-by: Darrick J. Wong <djwong@kernel.org> > Reviewed-by: Christoph Hellwig <hch@lst.de> Looks fine Reviewed-by: Allison Henderson <allison.henderson@oracle.com> > --- > fs/xfs/libxfs/xfs_bmap.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > index 5574d345d066..414882ebcc8e 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -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 > @@ -1036,16 +1039,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_d.di_forkoff = roundup(sizeof(xfs_dev_t), 8) >> 3; > + ip->i_d.di_forkoff = default_size; > break; > case XFS_DINODE_FMT_LOCAL: > case XFS_DINODE_FMT_EXTENTS: > case XFS_DINODE_FMT_BTREE: > ip->i_d.di_forkoff = xfs_attr_shortform_bytesfit(ip, size); > if (!ip->i_d.di_forkoff) > - ip->i_d.di_forkoff = xfs_default_attroffset(ip) >> 3; > + ip->i_d.di_forkoff = default_size; > else if ((ip->i_mount->m_flags & XFS_MOUNT_ATTR2) && version) > *version = 2; > break; >
diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 5574d345d066..414882ebcc8e 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -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 @@ -1036,16 +1039,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_d.di_forkoff = roundup(sizeof(xfs_dev_t), 8) >> 3; + ip->i_d.di_forkoff = default_size; break; case XFS_DINODE_FMT_LOCAL: case XFS_DINODE_FMT_EXTENTS: case XFS_DINODE_FMT_BTREE: ip->i_d.di_forkoff = xfs_attr_shortform_bytesfit(ip, size); if (!ip->i_d.di_forkoff) - ip->i_d.di_forkoff = xfs_default_attroffset(ip) >> 3; + ip->i_d.di_forkoff = default_size; else if ((ip->i_mount->m_flags & XFS_MOUNT_ATTR2) && version) *version = 2; break;