diff options
Diffstat (limited to 'drivers/md/raid10.c')
-rw-r--r-- | drivers/md/raid10.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index c504e8389e69..06eeb99ea6fc 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -1319,7 +1319,7 @@ read_again: | |||
1319 | /* Could not read all from this device, so we will | 1319 | /* Could not read all from this device, so we will |
1320 | * need another r10_bio. | 1320 | * need another r10_bio. |
1321 | */ | 1321 | */ |
1322 | sectors_handled = (r10_bio->sectors + max_sectors | 1322 | sectors_handled = (r10_bio->sector + max_sectors |
1323 | - bio->bi_sector); | 1323 | - bio->bi_sector); |
1324 | r10_bio->sectors = max_sectors; | 1324 | r10_bio->sectors = max_sectors; |
1325 | spin_lock_irq(&conf->device_lock); | 1325 | spin_lock_irq(&conf->device_lock); |
@@ -1327,7 +1327,7 @@ read_again: | |||
1327 | bio->bi_phys_segments = 2; | 1327 | bio->bi_phys_segments = 2; |
1328 | else | 1328 | else |
1329 | bio->bi_phys_segments++; | 1329 | bio->bi_phys_segments++; |
1330 | spin_unlock(&conf->device_lock); | 1330 | spin_unlock_irq(&conf->device_lock); |
1331 | /* Cannot call generic_make_request directly | 1331 | /* Cannot call generic_make_request directly |
1332 | * as that will be queued in __generic_make_request | 1332 | * as that will be queued in __generic_make_request |
1333 | * and subsequent mempool_alloc might block | 1333 | * and subsequent mempool_alloc might block |
@@ -3218,10 +3218,6 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, | |||
3218 | if (j == conf->copies) { | 3218 | if (j == conf->copies) { |
3219 | /* Cannot recover, so abort the recovery or | 3219 | /* Cannot recover, so abort the recovery or |
3220 | * record a bad block */ | 3220 | * record a bad block */ |
3221 | put_buf(r10_bio); | ||
3222 | if (rb2) | ||
3223 | atomic_dec(&rb2->remaining); | ||
3224 | r10_bio = rb2; | ||
3225 | if (any_working) { | 3221 | if (any_working) { |
3226 | /* problem is that there are bad blocks | 3222 | /* problem is that there are bad blocks |
3227 | * on other device(s) | 3223 | * on other device(s) |
@@ -3253,6 +3249,10 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, | |||
3253 | mirror->recovery_disabled | 3249 | mirror->recovery_disabled |
3254 | = mddev->recovery_disabled; | 3250 | = mddev->recovery_disabled; |
3255 | } | 3251 | } |
3252 | put_buf(r10_bio); | ||
3253 | if (rb2) | ||
3254 | atomic_dec(&rb2->remaining); | ||
3255 | r10_bio = rb2; | ||
3256 | break; | 3256 | break; |
3257 | } | 3257 | } |
3258 | } | 3258 | } |