@@ -1752,13 +1752,11 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path)
1752
1752
{
1753
1753
struct btrfs_device * device ;
1754
1754
struct btrfs_device * next_device ;
1755
- struct block_device * bdev = NULL ;
1756
- struct buffer_head * bh = NULL ;
1757
- struct btrfs_super_block * disk_super = NULL ;
1758
1755
struct btrfs_fs_devices * cur_devices ;
1759
1756
u64 num_devices ;
1760
1757
int ret = 0 ;
1761
1758
bool clear_super = false;
1759
+ char * dev_name = NULL ;
1762
1760
1763
1761
mutex_lock (& uuid_mutex );
1764
1762
@@ -1786,6 +1784,11 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path)
1786
1784
list_del_init (& device -> dev_alloc_list );
1787
1785
device -> fs_devices -> rw_devices -- ;
1788
1786
unlock_chunks (root );
1787
+ dev_name = kstrdup (device -> name -> str , GFP_KERNEL );
1788
+ if (!dev_name ) {
1789
+ ret = - ENOMEM ;
1790
+ goto error_undo ;
1791
+ }
1789
1792
clear_super = true;
1790
1793
}
1791
1794
@@ -1869,73 +1872,19 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path)
1869
1872
* remove it from the devices list and zero out the old super
1870
1873
*/
1871
1874
if (clear_super ) {
1872
- u64 bytenr ;
1873
- int i ;
1874
-
1875
- if (!disk_super ) {
1876
- ret = btrfs_get_bdev_and_sb (device_path ,
1877
- FMODE_WRITE | FMODE_EXCL ,
1878
- root -> fs_info -> bdev_holder , 0 ,
1879
- & bdev , & bh );
1880
- if (ret ) {
1881
- /*
1882
- * It could be a failed device ok for clear_super
1883
- * to fail. So return success
1884
- */
1885
- ret = 0 ;
1886
- goto out ;
1887
- }
1888
-
1889
- disk_super = (struct btrfs_super_block * )bh -> b_data ;
1890
- }
1891
- /* make sure this device isn't detected as part of
1892
- * the FS anymore
1893
- */
1894
- memset (& disk_super -> magic , 0 , sizeof (disk_super -> magic ));
1895
- set_buffer_dirty (bh );
1896
- sync_dirty_buffer (bh );
1897
- brelse (bh );
1898
-
1899
- /* clear the mirror copies of super block on the disk
1900
- * being removed, 0th copy is been taken care above and
1901
- * the below would take of the rest
1902
- */
1903
- for (i = 1 ; i < BTRFS_SUPER_MIRROR_MAX ; i ++ ) {
1904
- bytenr = btrfs_sb_offset (i );
1905
- if (bytenr + BTRFS_SUPER_INFO_SIZE >=
1906
- i_size_read (bdev -> bd_inode ))
1907
- break ;
1908
-
1909
- bh = __bread (bdev , bytenr / 4096 ,
1910
- BTRFS_SUPER_INFO_SIZE );
1911
- if (!bh )
1912
- continue ;
1875
+ struct block_device * bdev ;
1913
1876
1914
- disk_super = (struct btrfs_super_block * )bh -> b_data ;
1915
-
1916
- if (btrfs_super_bytenr (disk_super ) != bytenr ||
1917
- btrfs_super_magic (disk_super ) != BTRFS_MAGIC ) {
1918
- brelse (bh );
1919
- continue ;
1920
- }
1921
- memset (& disk_super -> magic , 0 ,
1922
- sizeof (disk_super -> magic ));
1923
- set_buffer_dirty (bh );
1924
- sync_dirty_buffer (bh );
1925
- brelse (bh );
1926
- }
1927
-
1928
- if (bdev ) {
1929
- /* Notify udev that device has changed */
1930
- btrfs_kobject_uevent (bdev , KOBJ_CHANGE );
1931
-
1932
- /* Update ctime/mtime for device path for libblkid */
1933
- update_dev_time (device_path );
1877
+ bdev = blkdev_get_by_path (dev_name , FMODE_READ | FMODE_EXCL ,
1878
+ root -> fs_info -> bdev_holder );
1879
+ if (!IS_ERR (bdev )) {
1880
+ btrfs_scratch_superblocks (bdev , dev_name );
1934
1881
blkdev_put (bdev , FMODE_READ | FMODE_EXCL );
1935
1882
}
1936
1883
}
1937
1884
1938
1885
out :
1886
+ kfree (dev_name );
1887
+
1939
1888
mutex_unlock (& uuid_mutex );
1940
1889
return ret ;
1941
1890
0 commit comments