diff options
author | Darrick J. Wong <djwong@kernel.org> | 2022-07-14 11:06:36 -0700 |
---|---|---|
committer | Darrick J. Wong <djwong@kernel.org> | 2022-10-14 14:16:48 -0700 |
commit | f09ef411e7ba85f391b7acfd4f8a70a4cc888726 (patch) | |
tree | 00ad2b49d0bdd680f4a510f24f76dbe4f9ef4f53 | |
parent | 7bff0dd838ec72b5ef5cdda187cc9a864e315734 (diff) |
xfs: fix xfs_bunmapi to allow unmapping of partial rt extents
When XFS_BMAPI_REMAP is passed to bunmapi, that means that we want to
remove part of a block mapping without touching the allocator. For
realtime files with rtextsize > 1, that also means that we should skip
all the code that changes a partial remove request into an unwritten
extent conversion. IOWs, bunmapi in this mode should handle removing
the mapping from the rt file and nothing else.
Note that XFS_BMAPI_REMAP callers are required to decrement the
reference count and/or free the space manually.
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
-rw-r--r-- | fs/xfs/libxfs/xfs_bmap.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 4f31a9cde794..79e06c57febd 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5122,15 +5122,14 @@ xfs_bmap_del_extent_real( flags = XFS_ILOG_CORE; if (xfs_ifork_is_realtime(ip, whichfork)) { - xfs_filblks_t len; - xfs_extlen_t mod; - - len = div_u64_rem(del->br_blockcount, mp->m_sb.sb_rextsize, - &mod); - ASSERT(mod == 0); - if (!(bflags & XFS_BMAPI_REMAP)) { xfs_fsblock_t bno; + xfs_filblks_t len; + xfs_extlen_t mod; + + len = div_u64_rem(del->br_blockcount, + mp->m_sb.sb_rextsize, &mod); + ASSERT(mod == 0); bno = div_u64_rem(del->br_startblock, mp->m_sb.sb_rextsize, &mod); @@ -5139,10 +5138,12 @@ xfs_bmap_del_extent_real( error = xfs_rtfree_extent(tp, bno, (xfs_extlen_t)len); if (error) goto done; + nblks = len * mp->m_sb.sb_rextsize; + } else { + nblks = del->br_blockcount; } do_fx = 0; - nblks = len * mp->m_sb.sb_rextsize; qfield = XFS_TRANS_DQ_RTBCOUNT; } else { do_fx = 1; @@ -5449,7 +5450,7 @@ __xfs_bunmapi( if (del.br_startoff + del.br_blockcount > end + 1) del.br_blockcount = end + 1 - del.br_startoff; - if (!isrt) + if (!isrt || (flags & XFS_BMAPI_REMAP)) goto delete; sum = del.br_startblock + del.br_blockcount; @@ -5467,7 +5468,7 @@ __xfs_bunmapi( * This piece is unwritten, or we're not * using unwritten extents. Skip over it. */ - ASSERT(end >= mod); + ASSERT((flags & XFS_BMAPI_REMAP) || end >= mod); end -= mod > del.br_blockcount ? del.br_blockcount : mod; if (end < got.br_startoff && |