Message ID | e2bd469a65fc93477240ebe9dd53b2ae7d591f46.1734033142.git.beckerlee3@gmail.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | None | expand |
在 2024/12/13 06:59, Roger L. Beckermeyer III 写道: > update fs/btrfs/block-group.c to use rb_find_add_cached() > implement btrfs_bg_start_cmp() for use with rb_find_add_cached(). > > Suggested-by: Josef Bacik <josef@toxicpanda.com> > Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com> > --- > fs/btrfs/block-group.c | 40 +++++++++++++++++----------------------- > 1 file changed, 17 insertions(+), 23 deletions(-) > > diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c > index 5be029734cfa..6001b78e9ea9 100644 > --- a/fs/btrfs/block-group.c > +++ b/fs/btrfs/block-group.c > @@ -173,40 +173,34 @@ void btrfs_put_block_group(struct btrfs_block_group *cache) > } > } > > +static int btrfs_bg_start_cmp(struct rb_node *new, const struct rb_node *exist) > +{ > + struct btrfs_block_group *cmp1 = rb_entry(new, struct btrfs_block_group, cache_node); > + const struct btrfs_block_group *cmp2 = rb_entry(exist, struct btrfs_block_group, cache_node); > + > + if (cmp1->start < cmp2->start) > + return -1; > + if (cmp1->start > cmp2->start) > + return 1; > + return 0; > +} > + > /* > * This adds the block group to the fs_info rb tree for the block group cache > */ > static int btrfs_add_block_group_cache(struct btrfs_fs_info *info, > struct btrfs_block_group *block_group) > { > - struct rb_node **p; > - struct rb_node *parent = NULL; > - struct btrfs_block_group *cache; > - bool leftmost = true; > + struct rb_node *exist; > > ASSERT(block_group->length != 0); > > write_lock(&info->block_group_cache_lock); > - p = &info->block_group_cache_tree.rb_root.rb_node; > - > - while (*p) { > - parent = *p; > - cache = rb_entry(parent, struct btrfs_block_group, cache_node); > - if (block_group->start < cache->start) { > - p = &(*p)->rb_left; > - } else if (block_group->start > cache->start) { > - p = &(*p)->rb_right; > - leftmost = false; > - } else { > - write_unlock(&info->block_group_cache_lock); > - return -EEXIST; > - } > - } > - > - rb_link_node(&block_group->cache_node, parent, p); > - rb_insert_color_cached(&block_group->cache_node, > - &info->block_group_cache_tree, leftmost); > > + exist = rb_find_add_cached(&block_group->cache_node, > + &info->block_group_cache_tree, btrfs_bg_start_cmp); > + if (exist != NULL) > + return -EEXIST; If we hit -EEXIST, the block_group_cache_lock is never unlocked. > write_unlock(&info->block_group_cache_lock); > > return 0;
diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index 5be029734cfa..6001b78e9ea9 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -173,40 +173,34 @@ void btrfs_put_block_group(struct btrfs_block_group *cache) } } +static int btrfs_bg_start_cmp(struct rb_node *new, const struct rb_node *exist) +{ + struct btrfs_block_group *cmp1 = rb_entry(new, struct btrfs_block_group, cache_node); + const struct btrfs_block_group *cmp2 = rb_entry(exist, struct btrfs_block_group, cache_node); + + if (cmp1->start < cmp2->start) + return -1; + if (cmp1->start > cmp2->start) + return 1; + return 0; +} + /* * This adds the block group to the fs_info rb tree for the block group cache */ static int btrfs_add_block_group_cache(struct btrfs_fs_info *info, struct btrfs_block_group *block_group) { - struct rb_node **p; - struct rb_node *parent = NULL; - struct btrfs_block_group *cache; - bool leftmost = true; + struct rb_node *exist; ASSERT(block_group->length != 0); write_lock(&info->block_group_cache_lock); - p = &info->block_group_cache_tree.rb_root.rb_node; - - while (*p) { - parent = *p; - cache = rb_entry(parent, struct btrfs_block_group, cache_node); - if (block_group->start < cache->start) { - p = &(*p)->rb_left; - } else if (block_group->start > cache->start) { - p = &(*p)->rb_right; - leftmost = false; - } else { - write_unlock(&info->block_group_cache_lock); - return -EEXIST; - } - } - - rb_link_node(&block_group->cache_node, parent, p); - rb_insert_color_cached(&block_group->cache_node, - &info->block_group_cache_tree, leftmost); + exist = rb_find_add_cached(&block_group->cache_node, + &info->block_group_cache_tree, btrfs_bg_start_cmp); + if (exist != NULL) + return -EEXIST; write_unlock(&info->block_group_cache_lock); return 0;
update fs/btrfs/block-group.c to use rb_find_add_cached() implement btrfs_bg_start_cmp() for use with rb_find_add_cached(). Suggested-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com> --- fs/btrfs/block-group.c | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-)