Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Qu Wenruo and committed by
David Sterba
48aa5c0e 7ae37b2c

+7 -7
+7 -7
fs/btrfs/disk-io.c
··· 4434 4434 4435 4435 btrfs_put_block_group_cache(fs_info); 4436 4436 4437 - /* 4438 - * we must make sure there is not any read request to 4439 - * submit after we stopping all workers. 4440 - */ 4441 - invalidate_inode_pages2(fs_info->btree_inode->i_mapping); 4442 - btrfs_stop_all_workers(fs_info); 4443 - 4444 4437 /* We shouldn't have any transaction open at this point */ 4445 4438 warn_about_uncommitted_trans(fs_info); 4446 4439 4447 4440 clear_bit(BTRFS_FS_OPEN, &fs_info->flags); 4448 4441 free_root_pointers(fs_info, true); 4449 4442 btrfs_free_fs_roots(fs_info); 4443 + 4444 + /* 4445 + * We must make sure there is not any read request to 4446 + * submit after we stop all workers. 4447 + */ 4448 + invalidate_inode_pages2(fs_info->btree_inode->i_mapping); 4449 + btrfs_stop_all_workers(fs_info); 4450 4450 4451 4451 /* 4452 4452 * We must free the block groups after dropping the fs_roots as we could