@@ -1863,6 +1863,20 @@ static void end_sync_read(struct bio *bio)
1863
1863
reschedule_retry (r1_bio );
1864
1864
}
1865
1865
1866
+ static void abort_sync_write (struct mddev * mddev , struct r1bio * r1_bio )
1867
+ {
1868
+ sector_t sync_blocks = 0 ;
1869
+ sector_t s = r1_bio -> sector ;
1870
+ long sectors_to_go = r1_bio -> sectors ;
1871
+
1872
+ /* make sure these bits don't get cleared. */
1873
+ do {
1874
+ md_bitmap_end_sync (mddev -> bitmap , s , & sync_blocks , 1 );
1875
+ s += sync_blocks ;
1876
+ sectors_to_go -= sync_blocks ;
1877
+ } while (sectors_to_go > 0 );
1878
+ }
1879
+
1866
1880
static void end_sync_write (struct bio * bio )
1867
1881
{
1868
1882
int uptodate = !bio -> bi_status ;
@@ -1874,15 +1888,7 @@ static void end_sync_write(struct bio *bio)
1874
1888
struct md_rdev * rdev = conf -> mirrors [find_bio_disk (r1_bio , bio )].rdev ;
1875
1889
1876
1890
if (!uptodate ) {
1877
- sector_t sync_blocks = 0 ;
1878
- sector_t s = r1_bio -> sector ;
1879
- long sectors_to_go = r1_bio -> sectors ;
1880
- /* make sure these bits doesn't get cleared. */
1881
- do {
1882
- md_bitmap_end_sync (mddev -> bitmap , s , & sync_blocks , 1 );
1883
- s += sync_blocks ;
1884
- sectors_to_go -= sync_blocks ;
1885
- } while (sectors_to_go > 0 );
1891
+ abort_sync_write (mddev , r1_bio );
1886
1892
set_bit (WriteErrorSeen , & rdev -> flags );
1887
1893
if (!test_and_set_bit (WantReplacement , & rdev -> flags ))
1888
1894
set_bit (MD_RECOVERY_NEEDED , &
@@ -2172,8 +2178,10 @@ static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio)
2172
2178
(i == r1_bio -> read_disk ||
2173
2179
!test_bit (MD_RECOVERY_SYNC , & mddev -> recovery ))))
2174
2180
continue ;
2175
- if (test_bit (Faulty , & conf -> mirrors [i ].rdev -> flags ))
2181
+ if (test_bit (Faulty , & conf -> mirrors [i ].rdev -> flags )) {
2182
+ abort_sync_write (mddev , r1_bio );
2176
2183
continue ;
2184
+ }
2177
2185
2178
2186
bio_set_op_attrs (wbio , REQ_OP_WRITE , 0 );
2179
2187
if (test_bit (FailFast , & conf -> mirrors [i ].rdev -> flags ))
0 commit comments