|
@@ -1710,12 +1710,43 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path)
|
|
|
* remove it from the devices list and zero out the old super
|
|
|
*/
|
|
|
if (clear_super && disk_super) {
|
|
|
+ u64 bytenr;
|
|
|
+ int i;
|
|
|
+
|
|
|
/* make sure this device isn't detected as part of
|
|
|
* the FS anymore
|
|
|
*/
|
|
|
memset(&disk_super->magic, 0, sizeof(disk_super->magic));
|
|
|
set_buffer_dirty(bh);
|
|
|
sync_dirty_buffer(bh);
|
|
|
+
|
|
|
+ /* clear the mirror copies of super block on the disk
|
|
|
+ * being removed, 0th copy is been taken care above and
|
|
|
+ * the below would take of the rest
|
|
|
+ */
|
|
|
+ for (i = 1; i < BTRFS_SUPER_MIRROR_MAX; i++) {
|
|
|
+ bytenr = btrfs_sb_offset(i);
|
|
|
+ if (bytenr + BTRFS_SUPER_INFO_SIZE >=
|
|
|
+ i_size_read(bdev->bd_inode))
|
|
|
+ break;
|
|
|
+
|
|
|
+ brelse(bh);
|
|
|
+ bh = __bread(bdev, bytenr / 4096,
|
|
|
+ BTRFS_SUPER_INFO_SIZE);
|
|
|
+ if (!bh)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ disk_super = (struct btrfs_super_block *)bh->b_data;
|
|
|
+
|
|
|
+ if (btrfs_super_bytenr(disk_super) != bytenr ||
|
|
|
+ btrfs_super_magic(disk_super) != BTRFS_MAGIC) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ memset(&disk_super->magic, 0,
|
|
|
+ sizeof(disk_super->magic));
|
|
|
+ set_buffer_dirty(bh);
|
|
|
+ sync_dirty_buffer(bh);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
ret = 0;
|