diff options
author | Dave Chinner <dchinner@redhat.com> | 2023-06-05 06:48:15 +0200 |
---|---|---|
committer | Dave Chinner <david@fromorbit.com> | 2023-06-05 06:48:15 +0200 |
commit | 7dfee17b13e5024c5c0ab1911859ded4182de3e5 (patch) | |
tree | 50a2ec77f1c5291f2d10d5f910c5eeeb7e348402 /fs/xfs/xfs_reflink.c | |
parent | xfs: validity check agbnos on the AGFL (diff) | |
download | linux-7dfee17b13e5024c5c0ab1911859ded4182de3e5.tar.xz linux-7dfee17b13e5024c5c0ab1911859ded4182de3e5.zip |
xfs: validate block number being freed before adding to xefi
Bad things happen in defered extent freeing operations if it is
passed a bad block number in the xefi. This can come from a bogus
agno/agbno pair from deferred agfl freeing, or just a bad fsbno
being passed to __xfs_free_extent_later(). Either way, it's very
difficult to diagnose where a null perag oops in EFI creation
is coming from when the operation that queued the xefi has already
been completed and there's no longer any trace of it around....
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Dave Chinner <david@fromorbit.com>
Diffstat (limited to 'fs/xfs/xfs_reflink.c')
-rw-r--r-- | fs/xfs/xfs_reflink.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index f5dc46ce9803..abcc559f3c64 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -616,8 +616,10 @@ xfs_reflink_cancel_cow_blocks( xfs_refcount_free_cow_extent(*tpp, del.br_startblock, del.br_blockcount); - xfs_free_extent_later(*tpp, del.br_startblock, + error = xfs_free_extent_later(*tpp, del.br_startblock, del.br_blockcount, NULL); + if (error) + break; /* Roll the transaction */ error = xfs_defer_finish(tpp); |