xfs: reinstate RT support in xfs_bmapi_reserve_delalloc
authorChristoph Hellwig <hch@lst.de>
Mon, 22 Apr 2024 11:20:13 +0000 (13:20 +0200)
committerChandan Babu R <chandanbabu@kernel.org>
Mon, 22 Apr 2024 12:30:48 +0000 (18:00 +0530)
Allocate data blocks for RT inodes using xfs_dec_frextents.  While at
it optimize the data device case by doing only a single xfs_dec_fdblocks
call for the extent itself and the indirect blocks.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
fs/xfs/libxfs/xfs_bmap.c

index 0311a98df1c59d044a2645a6b633e7ee6b440eef..f14224ff4d561d2e24a22e7df88ef0e3aeb615e9 100644 (file)
@@ -4069,6 +4069,7 @@ xfs_bmapi_reserve_delalloc(
        struct xfs_ifork        *ifp = xfs_ifork_ptr(ip, whichfork);
        xfs_extlen_t            alen;
        xfs_extlen_t            indlen;
+       uint64_t                fdblocks;
        int                     error;
        xfs_fileoff_t           aoff = off;
 
@@ -4111,14 +4112,18 @@ xfs_bmapi_reserve_delalloc(
        indlen = (xfs_extlen_t)xfs_bmap_worst_indlen(ip, alen);
        ASSERT(indlen > 0);
 
-       error = xfs_dec_fdblocks(mp, alen, false);
-       if (error)
-               goto out_unreserve_quota;
+       fdblocks = indlen;
+       if (XFS_IS_REALTIME_INODE(ip)) {
+               error = xfs_dec_frextents(mp, xfs_rtb_to_rtx(mp, alen));
+               if (error)
+                       goto out_unreserve_quota;
+       } else {
+               fdblocks += alen;
+       }
 
-       error = xfs_dec_fdblocks(mp, indlen, false);
+       error = xfs_dec_fdblocks(mp, fdblocks, false);
        if (error)
-               goto out_unreserve_blocks;
-
+               goto out_unreserve_frextents;
 
        ip->i_delayed_blks += alen;
        xfs_mod_delalloc(ip->i_mount, alen + indlen);
@@ -4142,8 +4147,9 @@ xfs_bmapi_reserve_delalloc(
 
        return 0;
 
-out_unreserve_blocks:
-       xfs_add_fdblocks(mp, alen);
+out_unreserve_frextents:
+       if (XFS_IS_REALTIME_INODE(ip))
+               xfs_add_frextents(mp, xfs_rtb_to_rtx(mp, alen));
 out_unreserve_quota:
        if (XFS_IS_QUOTA_ON(mp))
                xfs_quota_unreserve_blkres(ip, alen);