diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/volumes.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 8113f4567084..ee71622088f9 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -1710,12 +1710,43 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path) | |||
1710 | * remove it from the devices list and zero out the old super | 1710 | * remove it from the devices list and zero out the old super |
1711 | */ | 1711 | */ |
1712 | if (clear_super && disk_super) { | 1712 | if (clear_super && disk_super) { |
1713 | u64 bytenr; | ||
1714 | int i; | ||
1715 | |||
1713 | /* make sure this device isn't detected as part of | 1716 | /* make sure this device isn't detected as part of |
1714 | * the FS anymore | 1717 | * the FS anymore |
1715 | */ | 1718 | */ |
1716 | memset(&disk_super->magic, 0, sizeof(disk_super->magic)); | 1719 | memset(&disk_super->magic, 0, sizeof(disk_super->magic)); |
1717 | set_buffer_dirty(bh); | 1720 | set_buffer_dirty(bh); |
1718 | sync_dirty_buffer(bh); | 1721 | sync_dirty_buffer(bh); |
1722 | |||
1723 | /* clear the mirror copies of super block on the disk | ||
1724 | * being removed, 0th copy is been taken care above and | ||
1725 | * the below would take of the rest | ||
1726 | */ | ||
1727 | for (i = 1; i < BTRFS_SUPER_MIRROR_MAX; i++) { | ||
1728 | bytenr = btrfs_sb_offset(i); | ||
1729 | if (bytenr + BTRFS_SUPER_INFO_SIZE >= | ||
1730 | i_size_read(bdev->bd_inode)) | ||
1731 | break; | ||
1732 | |||
1733 | brelse(bh); | ||
1734 | bh = __bread(bdev, bytenr / 4096, | ||
1735 | BTRFS_SUPER_INFO_SIZE); | ||
1736 | if (!bh) | ||
1737 | continue; | ||
1738 | |||
1739 | disk_super = (struct btrfs_super_block *)bh->b_data; | ||
1740 | |||
1741 | if (btrfs_super_bytenr(disk_super) != bytenr || | ||
1742 | btrfs_super_magic(disk_super) != BTRFS_MAGIC) { | ||
1743 | continue; | ||
1744 | } | ||
1745 | memset(&disk_super->magic, 0, | ||
1746 | sizeof(disk_super->magic)); | ||
1747 | set_buffer_dirty(bh); | ||
1748 | sync_dirty_buffer(bh); | ||
1749 | } | ||
1719 | } | 1750 | } |
1720 | 1751 | ||
1721 | ret = 0; | 1752 | ret = 0; |