@@ -1138,9 +1138,12 @@ int btrfs_read_dev_super(int fd, struct btrfs_super_block *sb, u64 sb_bytenr,
if (btrfs_super_bytenr(&buf) != bytenr )
continue;
- /* if magic is NULL, the device was removed */
- if (buf.magic == 0 && i == 0)
- return -1;
+ /* if magic is NULL, either the device was removed
+ * OR user / application inflected the disk albeit
+ * with the most common zeros.
+ * so only this doesn't confirm that this disk
+ * isn't part of btrfs
+ */
if (buf.magic != cpu_to_le64(BTRFS_MAGIC))
continue;
If one of the copy of the superblock is zero it does not confirm to us that btrfs isn't there on that disk. When we are having more than one copy of superblock we should rather let the for loop to continue to check other copies. the following test case and results would justify the fix mkfs.btrfs /dev/sdb /dev/sdc -f mount /dev/sdb /btrfs dd if=/dev/zero bs=1 count=8 of=/dev/sdc seek=$((64*1024+64)) ~/before/btrfs-select-super -s 1 /dev/sdc using SB copy 1, bytenr 67108864 here btrfs-select-super just wrote superblock to a mounted btrfs with the fix: ./btrfs-select-super -s 1 /dev/sdc /dev/sdc is currently mounted. Aborting. Signed-off-by: Anand Jain <anand.jain@oracle.com> --- disk-io.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)