Message ID | 20200810154242.782802-7-josef@toxicpanda.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Convert to an rwsem for our tree locking | expand |
On Mon, Aug 10, 2020 at 4:44 PM Josef Bacik <josef@toxicpanda.com> wrote: > > These are special extent buffers that get rewound in order to lookup > the state of the tree at a specific point in time. As such they do not > go through the normal initialization paths that set their lockdep class, > so handle them appropriately when they are created and before they are > locked. > > Signed-off-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: Filipe Manana <fdmanana@suse.com> Looks good, thanks. > --- > fs/btrfs/ctree.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c > index 70e49d8d4f6c..cbacf700b68b 100644 > --- a/fs/btrfs/ctree.c > +++ b/fs/btrfs/ctree.c > @@ -1297,6 +1297,8 @@ tree_mod_log_rewind(struct btrfs_fs_info *fs_info, struct btrfs_path *path, > btrfs_tree_read_unlock_blocking(eb); > free_extent_buffer(eb); > > + btrfs_set_buffer_lockdep_class(btrfs_header_owner(eb_rewin), > + eb_rewin, btrfs_header_level(eb_rewin)); > btrfs_tree_read_lock(eb_rewin); > __tree_mod_log_rewind(fs_info, eb_rewin, time_seq, tm); > WARN_ON(btrfs_header_nritems(eb_rewin) > > @@ -1370,7 +1372,6 @@ get_old_root(struct btrfs_root *root, u64 time_seq) > > if (!eb) > return NULL; > - btrfs_tree_read_lock(eb); > if (old_root) { > btrfs_set_header_bytenr(eb, eb->start); > btrfs_set_header_backref_rev(eb, BTRFS_MIXED_BACKREF_REV); > @@ -1378,6 +1379,9 @@ get_old_root(struct btrfs_root *root, u64 time_seq) > btrfs_set_header_level(eb, old_root->level); > btrfs_set_header_generation(eb, old_generation); > } > + btrfs_set_buffer_lockdep_class(btrfs_header_owner(eb), eb, > + btrfs_header_level(eb)); > + btrfs_tree_read_lock(eb); > if (tm) > __tree_mod_log_rewind(fs_info, eb, time_seq, tm); > else > -- > 2.24.1 >
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 70e49d8d4f6c..cbacf700b68b 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c @@ -1297,6 +1297,8 @@ tree_mod_log_rewind(struct btrfs_fs_info *fs_info, struct btrfs_path *path, btrfs_tree_read_unlock_blocking(eb); free_extent_buffer(eb); + btrfs_set_buffer_lockdep_class(btrfs_header_owner(eb_rewin), + eb_rewin, btrfs_header_level(eb_rewin)); btrfs_tree_read_lock(eb_rewin); __tree_mod_log_rewind(fs_info, eb_rewin, time_seq, tm); WARN_ON(btrfs_header_nritems(eb_rewin) > @@ -1370,7 +1372,6 @@ get_old_root(struct btrfs_root *root, u64 time_seq) if (!eb) return NULL; - btrfs_tree_read_lock(eb); if (old_root) { btrfs_set_header_bytenr(eb, eb->start); btrfs_set_header_backref_rev(eb, BTRFS_MIXED_BACKREF_REV); @@ -1378,6 +1379,9 @@ get_old_root(struct btrfs_root *root, u64 time_seq) btrfs_set_header_level(eb, old_root->level); btrfs_set_header_generation(eb, old_generation); } + btrfs_set_buffer_lockdep_class(btrfs_header_owner(eb), eb, + btrfs_header_level(eb)); + btrfs_tree_read_lock(eb); if (tm) __tree_mod_log_rewind(fs_info, eb, time_seq, tm); else
These are special extent buffers that get rewound in order to lookup the state of the tree at a specific point in time. As such they do not go through the normal initialization paths that set their lockdep class, so handle them appropriately when they are created and before they are locked. Signed-off-by: Josef Bacik <josef@toxicpanda.com> --- fs/btrfs/ctree.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)