| From 16b172d053828ced1ac37b32dcb94f25ab9c1d5b Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 21 Sep 2020 09:15:08 -0700 |
| Subject: xfs: don't free rt blocks when we're doing a REMAP bunmapi call |
| |
| From: Darrick J. Wong <darrick.wong@oracle.com> |
| |
| [ Upstream commit 8df0fa39bdd86ca81a8d706a6ed9d33cc65ca625 ] |
| |
| When callers pass XFS_BMAPI_REMAP into xfs_bunmapi, they want the extent |
| to be unmapped from the given file fork without the extent being freed. |
| We do this for non-rt files, but we forgot to do this for realtime |
| files. So far this isn't a big deal since nobody makes a bunmapi call |
| to a rt file with the REMAP flag set, but don't leave a logic bomb. |
| |
| Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> |
| Reviewed-by: Christoph Hellwig <hch@lst.de> |
| Reviewed-by: Dave Chinner <dchinner@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/xfs/libxfs/xfs_bmap.c | 19 ++++++++++++------- |
| 1 file changed, 12 insertions(+), 7 deletions(-) |
| |
| diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c |
| index 1b0a01b06a05d..d9a692484eaed 100644 |
| --- a/fs/xfs/libxfs/xfs_bmap.c |
| +++ b/fs/xfs/libxfs/xfs_bmap.c |
| @@ -5046,20 +5046,25 @@ xfs_bmap_del_extent_real( |
| |
| flags = XFS_ILOG_CORE; |
| if (whichfork == XFS_DATA_FORK && XFS_IS_REALTIME_INODE(ip)) { |
| - xfs_fsblock_t bno; |
| xfs_filblks_t len; |
| xfs_extlen_t mod; |
| |
| - bno = div_u64_rem(del->br_startblock, mp->m_sb.sb_rextsize, |
| - &mod); |
| - ASSERT(mod == 0); |
| len = div_u64_rem(del->br_blockcount, mp->m_sb.sb_rextsize, |
| &mod); |
| ASSERT(mod == 0); |
| |
| - error = xfs_rtfree_extent(tp, bno, (xfs_extlen_t)len); |
| - if (error) |
| - goto done; |
| + if (!(bflags & XFS_BMAPI_REMAP)) { |
| + xfs_fsblock_t bno; |
| + |
| + bno = div_u64_rem(del->br_startblock, |
| + mp->m_sb.sb_rextsize, &mod); |
| + ASSERT(mod == 0); |
| + |
| + error = xfs_rtfree_extent(tp, bno, (xfs_extlen_t)len); |
| + if (error) |
| + goto done; |
| + } |
| + |
| do_fx = 0; |
| nblks = len * mp->m_sb.sb_rextsize; |
| qfield = XFS_TRANS_DQ_RTBCOUNT; |
| -- |
| 2.27.0 |
| |