diff options
author | Josef Bacik <josef@toxicpanda.com> | 2020-08-20 11:46:01 -0400 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2020-10-07 12:12:16 +0200 |
commit | 51899412dd95b2d9f50297c527b22ada3da0000c (patch) | |
tree | 8f5b2c4d45f492cb6b7c917e4af30043314c9690 /fs/btrfs/ctree.c | |
parent | 329ced799be881feab445b68163cd3869340cc08 (diff) | |
download | linux-51899412dd95b2d9f50297c527b22ada3da0000c.tar.bz2 |
btrfs: introduce btrfs_path::recurse
Our current tree locking stuff allows us to recurse with read locks if
we're already holding the write lock. This is necessary for the space
cache inode, as we could be holding a lock on the root_tree root when we
need to cache a block group, and thus need to be able to read down the
root_tree to read in the inode cache.
We can get away with this in our current locking, but we won't be able
to with a rwsem. Handle this by purposefully annotating the places
where we require recursion, so that in the future we can maybe come up
with a way to avoid the recursion. In the case of the free space inode,
this will be superseded by the free space tree.
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs/ctree.c')
-rw-r--r-- | fs/btrfs/ctree.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index be7d01055118..7c99bf112960 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c @@ -2601,7 +2601,7 @@ static struct extent_buffer *btrfs_search_slot_get_root(struct btrfs_root *root, * We don't know the level of the root node until we actually * have it read locked */ - b = btrfs_read_lock_root_node(root); + b = __btrfs_read_lock_root_node(root, p->recurse); level = btrfs_header_level(b); if (level > write_lock_level) goto out; @@ -2875,7 +2875,7 @@ cow_done: } else { if (!btrfs_tree_read_lock_atomic(b)) { btrfs_set_path_blocking(p); - btrfs_tree_read_lock(b); + __btrfs_tree_read_lock(b, p->recurse); } p->locks[level] = BTRFS_READ_LOCK; } @@ -5453,7 +5453,7 @@ again: } if (!ret) { btrfs_set_path_blocking(path); - btrfs_tree_read_lock(next); + __btrfs_tree_read_lock(next, path->recurse); } next_rw_lock = BTRFS_READ_LOCK; } @@ -5488,7 +5488,7 @@ again: ret = btrfs_try_tree_read_lock(next); if (!ret) { btrfs_set_path_blocking(path); - btrfs_tree_read_lock(next); + __btrfs_tree_read_lock(next, path->recurse); } next_rw_lock = BTRFS_READ_LOCK; } |