mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-13 14:14:37 +00:00
xfs: fix endianness issue in xfs_ag_shrink_space
The AGI buffer is in big-endian format, so we must convert the
endianness to CPU format to do any comparisons.
Fixes: 46141dc891
("xfs: introduce xfs_ag_shrink_space()")
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
This commit is contained in:
parent
e53d3aa0b6
commit
a8f3522c9a
1 changed files with 4 additions and 3 deletions
|
@ -779,6 +779,7 @@ xfs_ag_shrink_space(
|
||||||
struct xfs_buf *agibp, *agfbp;
|
struct xfs_buf *agibp, *agfbp;
|
||||||
struct xfs_agi *agi;
|
struct xfs_agi *agi;
|
||||||
struct xfs_agf *agf;
|
struct xfs_agf *agf;
|
||||||
|
xfs_agblock_t aglen;
|
||||||
int error, err2;
|
int error, err2;
|
||||||
|
|
||||||
ASSERT(agno == mp->m_sb.sb_agcount - 1);
|
ASSERT(agno == mp->m_sb.sb_agcount - 1);
|
||||||
|
@ -793,14 +794,14 @@ xfs_ag_shrink_space(
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
agf = agfbp->b_addr;
|
agf = agfbp->b_addr;
|
||||||
|
aglen = be32_to_cpu(agi->agi_length);
|
||||||
/* some extra paranoid checks before we shrink the ag */
|
/* some extra paranoid checks before we shrink the ag */
|
||||||
if (XFS_IS_CORRUPT(mp, agf->agf_length != agi->agi_length))
|
if (XFS_IS_CORRUPT(mp, agf->agf_length != agi->agi_length))
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
if (delta >= agi->agi_length)
|
if (delta >= aglen)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
args.fsbno = XFS_AGB_TO_FSB(mp, agno,
|
args.fsbno = XFS_AGB_TO_FSB(mp, agno, aglen - delta);
|
||||||
be32_to_cpu(agi->agi_length) - delta);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Disable perag reservations so it doesn't cause the allocation request
|
* Disable perag reservations so it doesn't cause the allocation request
|
||||||
|
|
Loading…
Reference in a new issue