mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
xfs: fix reflink quota reservation accounting error
[ Upstream commit 83895227aba1ade33e81f586aa7b6b1e143096a5 ] Quota reservations are supposed to account for the blocks that might be allocated due to a bmap btree split. Reflink doesn't do this, so fix this to make the quota accounting more accurate before we start rearranging things. Fixes: 862bb360ef56 ("xfs: reflink extents from one file to another") Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
2d74cda0cd
commit
c37f37c5b1
@ -1076,6 +1076,7 @@ xfs_reflink_remap_extent(
|
||||
xfs_filblks_t rlen;
|
||||
xfs_filblks_t unmap_len;
|
||||
xfs_off_t newlen;
|
||||
int64_t qres;
|
||||
int error;
|
||||
|
||||
unmap_len = irec->br_startoff + irec->br_blockcount - destoff;
|
||||
@ -1098,13 +1099,19 @@ xfs_reflink_remap_extent(
|
||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
||||
xfs_trans_ijoin(tp, ip, 0);
|
||||
|
||||
/* If we're not just clearing space, then do we have enough quota? */
|
||||
if (real_extent) {
|
||||
error = xfs_trans_reserve_quota_nblks(tp, ip,
|
||||
irec->br_blockcount, 0, XFS_QMOPT_RES_REGBLKS);
|
||||
if (error)
|
||||
goto out_cancel;
|
||||
}
|
||||
/*
|
||||
* Reserve quota for this operation. We don't know if the first unmap
|
||||
* in the dest file will cause a bmap btree split, so we always reserve
|
||||
* at least enough blocks for that split. If the extent being mapped
|
||||
* in is written, we need to reserve quota for that too.
|
||||
*/
|
||||
qres = XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK);
|
||||
if (real_extent)
|
||||
qres += irec->br_blockcount;
|
||||
error = xfs_trans_reserve_quota_nblks(tp, ip, qres, 0,
|
||||
XFS_QMOPT_RES_REGBLKS);
|
||||
if (error)
|
||||
goto out_cancel;
|
||||
|
||||
trace_xfs_reflink_remap(ip, irec->br_startoff,
|
||||
irec->br_blockcount, irec->br_startblock);
|
||||
|
Loading…
x
Reference in New Issue
Block a user