mirror of
https://github.com/kdave/btrfs-progs
synced 2025-04-21 06:25:22 +00:00
btrfs-progs: volume: Fix a bug causing btrfs-find-root to skip first chunk
There is a small bug from 2011, where btrfs_next_bg (formally btrfs_next_metadata) function will always skip the first chunk. That's OK for that time, as there is always 3 empty temporary chunks. But now, we may ended up with only one metadata or system chunk, with empty chunk auto-remove from kernel or new mkfs.btrfs. So fix it by checking the initial value so btrfs_next_bg() will return the first chunk if its *logical parameter is 0. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
bfc2cb7cfb
commit
e2e0dae926
17
volumes.c
17
volumes.c
@ -1170,14 +1170,23 @@ int btrfs_next_bg(struct btrfs_mapping_tree *map_tree, u64 *logical,
|
|||||||
{
|
{
|
||||||
struct cache_extent *ce;
|
struct cache_extent *ce;
|
||||||
struct map_lookup *map;
|
struct map_lookup *map;
|
||||||
|
u64 cur = *logical;
|
||||||
|
|
||||||
ce = search_cache_extent(&map_tree->cache_tree, *logical);
|
ce = search_cache_extent(&map_tree->cache_tree, cur);
|
||||||
|
|
||||||
while (ce) {
|
while (ce) {
|
||||||
ce = next_cache_extent(ce);
|
/*
|
||||||
if (!ce)
|
* only jump to next bg if our cur is not 0
|
||||||
return -ENOENT;
|
* As the initial logical for btrfs_next_bg() is 0, and
|
||||||
|
* if we jump to next bg, we skipped a valid bg.
|
||||||
|
*/
|
||||||
|
if (cur) {
|
||||||
|
ce = next_cache_extent(ce);
|
||||||
|
if (!ce)
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
cur = ce->start;
|
||||||
map = container_of(ce, struct map_lookup, ce);
|
map = container_of(ce, struct map_lookup, ce);
|
||||||
if (map->type & type) {
|
if (map->type & type) {
|
||||||
*logical = ce->start;
|
*logical = ce->start;
|
||||||
|
Loading…
Reference in New Issue
Block a user