diff options
author | Darrick J. Wong <djwong@kernel.org> | 2021-01-05 17:45:04 -0800 |
---|---|---|
committer | Darrick J. Wong <djwong@kernel.org> | 2021-03-25 17:08:25 -0700 |
commit | e72bbdd14d419ff87df748662d204ba717805965 (patch) | |
tree | 1307028933c3bd11061973ea056e3c62bb1e65d2 | |
parent | 98ac76999bec5bc0bbd3181bcaabb128d4425d5f (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. REMAP callers are of course required to unmap full
rt extents, which implies log intents.
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 b5e1f326447e..edfc48535a9e 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5214,15 +5214,14 @@ xfs_bmap_del_extent_real( flags = XFS_ILOG_CORE; if (whichfork == XFS_DATA_FORK && XFS_IS_REALTIME_INODE(ip)) { - 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); @@ -5231,10 +5230,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; @@ -5571,7 +5572,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; @@ -5589,7 +5590,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 && |