]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
btrfs: only invalidate btree inode pages after all ebs are released
authorQu Wenruo <wqu@suse.com>
Mon, 30 Mar 2026 22:21:56 +0000 (08:51 +1030)
committerDavid Sterba <dsterba@suse.com>
Tue, 7 Apr 2026 16:56:08 +0000 (18:56 +0200)
commit48aa5c0e2bb85dae61a6cb405094eb135c711a04
tree7358760246a4f188172d014195c02329eacc7c3e
parent7ae37b2c94ed30bfefece2b68c727a4474206718
btrfs: only invalidate btree inode pages after all ebs are released

In close_ctree(), we call invalidate_inode_pages2() to invalidate all
pages from btree inode.

But the problem is, it never returns 0, but always -EBUSY.

The problem is that we are still holding all the essential tree root
nodes, thus pages holding those tree blocks can not be invalidated thus
invalidate_inode_pages2() always returns -EBUSY.

This is also against the error cleanup path of open_ctree(), which
properly frees all root pointers before calling invalidate_inode_pages().

So fix the order by delaying invalidate_inode_pages2() until we have
freed all root pointers.

Reviewed-by: Anand Jain <asj@kernel.org>
Reviewed-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/disk-io.c