mirror of https://gitee.com/openkylin/linux.git
xfs: default attr fork size does not handle device inodes
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: e6a688c332
("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>
This commit is contained in:
parent
8de1cb0038
commit
683ec9ba88
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue