Re: [PATCH 12/13] xfs: stop the steal (of data blocks for RT indirect blocks)

Darrick J. Wong
2024-03-27T15:18:51Z

On Wed, Mar 27, 2024 at 12:03:17PM +0100, Christoph Hellwig wrote:
> When xfs_bmap_del_extent_delay has to split an indirect block it tries
> to steal blocks from the the part that gets unmapped to increase the
> indirect block reservation that now needs to cover for two extents
> instead of one.
>
> This works perfectly fine on the data device, where the data and
> indirect blocks come from the same pool. It has no chance of working
> when the inode sits on the RT device. To support re-enabling delalloc
> for inodes on the RT device, make this behavior conditional on not
> beeing for rt extents.

being

> Note that split of delalloc extents should only happen on writeback
> failure, as for other kinds of hole punching we first write back all
> data and thus convert the delalloc reservations covering the hole to
> a real allocation.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>

With that one spelling fix,
Reviewed-by: Darrick J. Wong <djwong@kernel.org>

--D

> ---
> fs/xfs/libxfs/xfs_bmap.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
> index 9d0b7caa9a036c..ef34738fb0fedd 100644
> --- a/fs/xfs/libxfs/xfs_bmap.c
> +++ b/fs/xfs/libxfs/xfs_bmap.c
> @@ -4981,9 +4981,14 @@ xfs_bmap_del_extent_delay(
> /*
> * Steal as many blocks as we can to try and satisfy the worst
> * case indlen for both new extents.
> + *
> + * However, we can't just steal reservations from the data
> + * blocks if this is an RT inodes as the data and metadata
> + * blocks come from different pools. We'll have to live with
> + * under-filled indirect reservation in this case.
> */
> da_new = got_indlen + new_indlen;
> - if (da_new > da_old) {
> + if (da_new > da_old && !isrt) {
> stolen = XFS_FILBLKS_MIN(da_new - da_old,
> del->br_blockcount);
> da_old += stolen;
> --
> 2.39.2
>
>