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: do not reject a valid running dev-replace

[BUG]
There is a bug report that a btrfs with running dev-replace got rejected
with the following messages:

BTRFS error (device sdk1): devid 0 path /dev/sdk1 is registered but not found in chunk tree
BTRFS error (device sdk1): remove the above devices or use 'btrfs device scan --forget <dev>' to unregister them before mount
BTRFS error (device sdk1): open_ctree failed: -117

[CAUSE]
The tree and super block dumps show the fs is completely sane, except
one thing, there is no dev item for devid 0 in chunk tree.

However this is not a bug, as we do not insert dev item for devid 0 in
the first place.
Since the devid 0 is only there temporarily we do not really need to
insert a dev item for it and then later remove it again.

It is the commit 34308187395f ("btrfs: add extra device item checks at
mount") adding a overly strict check that triggers a false alert and
rejected the valid filesystem.

[FIX]
Add a special handling for devid 0, and doesn't require devid 0 to
have a device item in chunk tree.

Reported-by: Jaron Viëtor <jaron@vietors.com>
Link: https://lore.kernel.org/linux-btrfs/CAF1bhLVYLZvD=j2XyuxXDKD-NWNJAwDnpVN+UYeQW-HbzNRn1A@mail.gmail.com/
Fixes: 34308187395f ("btrfs: add extra device item checks at mount")
Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>

authored by

Qu Wenruo and committed by
David Sterba
3c0c45a4 48aa5c0e

+6 -1
+6 -1
fs/btrfs/volumes.c
··· 8667 8667 8668 8668 mutex_lock(&uuid_mutex); 8669 8669 list_for_each_entry(dev, &fs_info->fs_devices->devices, dev_list) { 8670 - if (!test_bit(BTRFS_DEV_STATE_ITEM_FOUND, &dev->dev_state)) { 8670 + /* 8671 + * Replace target dev item (devid 0) is not inserted into chunk tree. 8672 + * So skip the DEV_STATE_ITEM check. 8673 + */ 8674 + if (dev->devid != BTRFS_DEV_REPLACE_DEVID && 8675 + !test_bit(BTRFS_DEV_STATE_ITEM_FOUND, &dev->dev_state)) { 8671 8676 btrfs_err(fs_info, 8672 8677 "devid %llu path %s is registered but not found in chunk tree", 8673 8678 dev->devid, btrfs_dev_name(dev));