@@ -1757,6 +1757,44 @@ static int raid1_spare_active(struct mddev *mddev)
1757
1757
return count ;
1758
1758
}
1759
1759
1760
+ static bool raid1_add_conf (struct r1conf * conf , struct md_rdev * rdev , int disk ,
1761
+ bool replacement )
1762
+ {
1763
+ struct raid1_info * info = conf -> mirrors + disk ;
1764
+
1765
+ if (replacement )
1766
+ info += conf -> raid_disks ;
1767
+
1768
+ if (info -> rdev )
1769
+ return false;
1770
+
1771
+ rdev -> raid_disk = disk ;
1772
+ info -> head_position = 0 ;
1773
+ info -> seq_start = MaxSector ;
1774
+ WRITE_ONCE (info -> rdev , rdev );
1775
+
1776
+ return true;
1777
+ }
1778
+
1779
+ static bool raid1_remove_conf (struct r1conf * conf , int disk )
1780
+ {
1781
+ struct raid1_info * info = conf -> mirrors + disk ;
1782
+ struct md_rdev * rdev = info -> rdev ;
1783
+
1784
+ if (!rdev || test_bit (In_sync , & rdev -> flags ) ||
1785
+ atomic_read (& rdev -> nr_pending ))
1786
+ return false;
1787
+
1788
+ /* Only remove non-faulty devices if recovery is not possible. */
1789
+ if (!test_bit (Faulty , & rdev -> flags ) &&
1790
+ rdev -> mddev -> recovery_disabled != conf -> recovery_disabled &&
1791
+ rdev -> mddev -> degraded < conf -> raid_disks )
1792
+ return false;
1793
+
1794
+ WRITE_ONCE (info -> rdev , NULL );
1795
+ return true;
1796
+ }
1797
+
1760
1798
static int raid1_add_disk (struct mddev * mddev , struct md_rdev * rdev )
1761
1799
{
1762
1800
struct r1conf * conf = mddev -> private ;
@@ -1792,15 +1830,13 @@ static int raid1_add_disk(struct mddev *mddev, struct md_rdev *rdev)
1792
1830
disk_stack_limits (mddev -> gendisk , rdev -> bdev ,
1793
1831
rdev -> data_offset << 9 );
1794
1832
1795
- p -> head_position = 0 ;
1796
- rdev -> raid_disk = mirror ;
1833
+ raid1_add_conf (conf , rdev , mirror , false);
1797
1834
err = 0 ;
1798
1835
/* As all devices are equivalent, we don't need a full recovery
1799
1836
* if this was recently any drive of the array
1800
1837
*/
1801
1838
if (rdev -> saved_raid_disk < 0 )
1802
1839
conf -> fullsync = 1 ;
1803
- WRITE_ONCE (p -> rdev , rdev );
1804
1840
break ;
1805
1841
}
1806
1842
if (test_bit (WantReplacement , & p -> rdev -> flags ) &&
@@ -1810,13 +1846,11 @@ static int raid1_add_disk(struct mddev *mddev, struct md_rdev *rdev)
1810
1846
1811
1847
if (err && repl_slot >= 0 ) {
1812
1848
/* Add this device as a replacement */
1813
- p = conf -> mirrors + repl_slot ;
1814
1849
clear_bit (In_sync , & rdev -> flags );
1815
1850
set_bit (Replacement , & rdev -> flags );
1816
- rdev -> raid_disk = repl_slot ;
1851
+ raid1_add_conf ( conf , rdev , repl_slot , true) ;
1817
1852
err = 0 ;
1818
1853
conf -> fullsync = 1 ;
1819
- WRITE_ONCE (p [conf -> raid_disks ].rdev , rdev );
1820
1854
}
1821
1855
1822
1856
print_conf (conf );
@@ -1833,27 +1867,20 @@ static int raid1_remove_disk(struct mddev *mddev, struct md_rdev *rdev)
1833
1867
if (unlikely (number >= conf -> raid_disks ))
1834
1868
goto abort ;
1835
1869
1836
- if (rdev != p -> rdev )
1837
- p = conf -> mirrors + conf -> raid_disks + number ;
1870
+ if (rdev != p -> rdev ) {
1871
+ number += conf -> raid_disks ;
1872
+ p = conf -> mirrors + number ;
1873
+ }
1838
1874
1839
1875
print_conf (conf );
1840
1876
if (rdev == p -> rdev ) {
1841
- if (test_bit (In_sync , & rdev -> flags ) ||
1842
- atomic_read (& rdev -> nr_pending )) {
1843
- err = - EBUSY ;
1844
- goto abort ;
1845
- }
1846
- /* Only remove non-faulty devices if recovery
1847
- * is not possible.
1848
- */
1849
- if (!test_bit (Faulty , & rdev -> flags ) &&
1850
- mddev -> recovery_disabled != conf -> recovery_disabled &&
1851
- mddev -> degraded < conf -> raid_disks ) {
1877
+ if (!raid1_remove_conf (conf , number )) {
1852
1878
err = - EBUSY ;
1853
1879
goto abort ;
1854
1880
}
1855
- WRITE_ONCE (p -> rdev , NULL );
1856
- if (conf -> mirrors [conf -> raid_disks + number ].rdev ) {
1881
+
1882
+ if (number < conf -> raid_disks &&
1883
+ conf -> mirrors [conf -> raid_disks + number ].rdev ) {
1857
1884
/* We just removed a device that is being replaced.
1858
1885
* Move down the replacement. We drain all IO before
1859
1886
* doing this to avoid confusion.
@@ -2994,23 +3021,17 @@ static struct r1conf *setup_conf(struct mddev *mddev)
2994
3021
2995
3022
err = - EINVAL ;
2996
3023
spin_lock_init (& conf -> device_lock );
3024
+ conf -> raid_disks = mddev -> raid_disks ;
2997
3025
rdev_for_each (rdev , mddev ) {
2998
3026
int disk_idx = rdev -> raid_disk ;
2999
- if ( disk_idx >= mddev -> raid_disks
3000
- || disk_idx < 0 )
3027
+
3028
+ if ( disk_idx >= conf -> raid_disks || disk_idx < 0 )
3001
3029
continue ;
3002
- if (test_bit (Replacement , & rdev -> flags ))
3003
- disk = conf -> mirrors + mddev -> raid_disks + disk_idx ;
3004
- else
3005
- disk = conf -> mirrors + disk_idx ;
3006
3030
3007
- if (disk -> rdev )
3031
+ if (!raid1_add_conf (conf , rdev , disk_idx ,
3032
+ test_bit (Replacement , & rdev -> flags )))
3008
3033
goto abort ;
3009
- disk -> rdev = rdev ;
3010
- disk -> head_position = 0 ;
3011
- disk -> seq_start = MaxSector ;
3012
3034
}
3013
- conf -> raid_disks = mddev -> raid_disks ;
3014
3035
conf -> mddev = mddev ;
3015
3036
INIT_LIST_HEAD (& conf -> retry_list );
3016
3037
INIT_LIST_HEAD (& conf -> bio_end_io_list );
0 commit comments