|
@@ -1924,7 +1924,8 @@ void btrfs_rm_dev_replace_remove_srcdev(struct btrfs_fs_info *fs_info,
|
|
|
if (srcdev->writeable) {
|
|
|
fs_devices->rw_devices--;
|
|
|
/* zero out the old super if it is writable */
|
|
|
- btrfs_scratch_superblock(srcdev);
|
|
|
+ btrfs_scratch_superblocks(srcdev->bdev,
|
|
|
+ rcu_str_deref(srcdev->name));
|
|
|
}
|
|
|
|
|
|
if (srcdev->bdev)
|
|
@@ -1974,7 +1975,8 @@ void btrfs_destroy_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,
|
|
|
btrfs_sysfs_rm_device_link(fs_info->fs_devices, tgtdev);
|
|
|
|
|
|
if (tgtdev->bdev) {
|
|
|
- btrfs_scratch_superblock(tgtdev);
|
|
|
+ btrfs_scratch_superblocks(tgtdev->bdev,
|
|
|
+ rcu_str_deref(tgtdev->name));
|
|
|
fs_info->fs_devices->open_devices--;
|
|
|
}
|
|
|
fs_info->fs_devices->num_devices--;
|
|
@@ -6738,22 +6740,34 @@ int btrfs_get_dev_stats(struct btrfs_root *root,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int btrfs_scratch_superblock(struct btrfs_device *device)
|
|
|
+void btrfs_scratch_superblocks(struct block_device *bdev, char *device_path)
|
|
|
{
|
|
|
struct buffer_head *bh;
|
|
|
struct btrfs_super_block *disk_super;
|
|
|
+ int copy_num;
|
|
|
|
|
|
- bh = btrfs_read_dev_super(device->bdev);
|
|
|
- if (IS_ERR(bh))
|
|
|
- return PTR_ERR(bh);
|
|
|
- disk_super = (struct btrfs_super_block *)bh->b_data;
|
|
|
+ if (!bdev)
|
|
|
+ return;
|
|
|
|
|
|
- memset(&disk_super->magic, 0, sizeof(disk_super->magic));
|
|
|
- set_buffer_dirty(bh);
|
|
|
- sync_dirty_buffer(bh);
|
|
|
- brelse(bh);
|
|
|
+ for (copy_num = 0; copy_num < BTRFS_SUPER_MIRROR_MAX;
|
|
|
+ copy_num++) {
|
|
|
|
|
|
- return 0;
|
|
|
+ if (btrfs_read_dev_one_super(bdev, copy_num, &bh))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ disk_super = (struct btrfs_super_block *)bh->b_data;
|
|
|
+
|
|
|
+ memset(&disk_super->magic, 0, sizeof(disk_super->magic));
|
|
|
+ set_buffer_dirty(bh);
|
|
|
+ sync_dirty_buffer(bh);
|
|
|
+ brelse(bh);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Notify udev that device has changed */
|
|
|
+ btrfs_kobject_uevent(bdev, KOBJ_CHANGE);
|
|
|
+
|
|
|
+ /* Update ctime/mtime for device path for libblkid */
|
|
|
+ update_dev_time(device_path);
|
|
|
}
|
|
|
|
|
|
/*
|