diff mbox series

[3/7] btrfs: record delayed inode root in transaction

Message ID cadc31b0278e4e362f71f7c57ebccb0c94af693b.1711488980.git.boris@bur.io (mailing list archive)
State New, archived
Headers show
Series btrfs: various qg meta rsv leak fixes | expand

Commit Message

Boris Burkov March 26, 2024, 9:39 p.m. UTC
When running delayed inode updates, we do not record the inode's root in
the transaction, but we do allocate PREALLOC and thus converted PERTRANS
space for it. To be sure we free that PERTRANS meta rsv, we must ensure
that we record the root in the transaction.

Fixes: 4f5427ccce5d ("btrfs: delayed-inode: Use new qgroup meta rsv for delayed inode and item")
Signed-off-by: Boris Burkov <boris@bur.io>
---
 fs/btrfs/delayed-inode.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Qu Wenruo March 26, 2024, 10:08 p.m. UTC | #1
在 2024/3/27 08:09, Boris Burkov 写道:
> When running delayed inode updates, we do not record the inode's root in
> the transaction, but we do allocate PREALLOC and thus converted PERTRANS
> space for it. To be sure we free that PERTRANS meta rsv, we must ensure
> that we record the root in the transaction.
> 
> Fixes: 4f5427ccce5d ("btrfs: delayed-inode: Use new qgroup meta rsv for delayed inode and item")

Reviewed-by: Qu Wenruo <wqu@suse.com>

Just curious, do you have a case that hits this particular bug only?

Thanks,
Qu
> Signed-off-by: Boris Burkov <boris@bur.io>
> ---
>   fs/btrfs/delayed-inode.c | 3 +++
>   1 file changed, 3 insertions(+)
> 
> diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
> index dd6f566a383f..121ab890bd05 100644
> --- a/fs/btrfs/delayed-inode.c
> +++ b/fs/btrfs/delayed-inode.c
> @@ -1133,6 +1133,9 @@ __btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans,
>   	if (ret)
>   		return ret;
>   
> +	ret = btrfs_record_root_in_trans(trans, node->root);
> +	if (ret)
> +		return ret;
>   	ret = btrfs_update_delayed_inode(trans, node->root, path, node);
>   	return ret;
>   }
Boris Burkov March 27, 2024, 5:21 p.m. UTC | #2
On Wed, Mar 27, 2024 at 08:38:53AM +1030, Qu Wenruo wrote:
> 
> 
> 在 2024/3/27 08:09, Boris Burkov 写道:
> > When running delayed inode updates, we do not record the inode's root in
> > the transaction, but we do allocate PREALLOC and thus converted PERTRANS
> > space for it. To be sure we free that PERTRANS meta rsv, we must ensure
> > that we record the root in the transaction.
> > 
> > Fixes: 4f5427ccce5d ("btrfs: delayed-inode: Use new qgroup meta rsv for delayed inode and item")
> 
> Reviewed-by: Qu Wenruo <wqu@suse.com>
> 
> Just curious, do you have a case that hits this particular bug only?

I tested all of these fixes just by running generic/269 and generic/475
in a loop and driving the meta rsv failures down to 0. I *believe* all
of them are necessary to get to fully 0.

> 
> Thanks,
> Qu
> > Signed-off-by: Boris Burkov <boris@bur.io>
> > ---
> >   fs/btrfs/delayed-inode.c | 3 +++
> >   1 file changed, 3 insertions(+)
> > 
> > diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
> > index dd6f566a383f..121ab890bd05 100644
> > --- a/fs/btrfs/delayed-inode.c
> > +++ b/fs/btrfs/delayed-inode.c
> > @@ -1133,6 +1133,9 @@ __btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans,
> >   	if (ret)
> >   		return ret;
> > +	ret = btrfs_record_root_in_trans(trans, node->root);
> > +	if (ret)
> > +		return ret;
> >   	ret = btrfs_update_delayed_inode(trans, node->root, path, node);
> >   	return ret;
> >   }
diff mbox series

Patch

diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
index dd6f566a383f..121ab890bd05 100644
--- a/fs/btrfs/delayed-inode.c
+++ b/fs/btrfs/delayed-inode.c
@@ -1133,6 +1133,9 @@  __btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans,
 	if (ret)
 		return ret;
 
+	ret = btrfs_record_root_in_trans(trans, node->root);
+	if (ret)
+		return ret;
 	ret = btrfs_update_delayed_inode(trans, node->root, path, node);
 	return ret;
 }