diff options
Diffstat (limited to 'drivers/md')
| -rw-r--r-- | drivers/md/dm-stripe.c | 8 | ||||
| -rw-r--r-- | drivers/md/raid1.c | 13 |
2 files changed, 15 insertions, 6 deletions
diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c index ab89278a56bf..697aacafb02a 100644 --- a/drivers/md/dm-stripe.c +++ b/drivers/md/dm-stripe.c | |||
| @@ -103,9 +103,15 @@ static int stripe_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
| 103 | return -EINVAL; | 103 | return -EINVAL; |
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | if (((uint32_t)ti->len) & (chunk_size - 1)) { | ||
| 107 | ti->error = "dm-stripe: Target length not divisible by " | ||
| 108 | "chunk size"; | ||
| 109 | return -EINVAL; | ||
| 110 | } | ||
| 111 | |||
| 106 | width = ti->len; | 112 | width = ti->len; |
| 107 | if (sector_div(width, stripes)) { | 113 | if (sector_div(width, stripes)) { |
| 108 | ti->error = "dm-stripe: Target length not divisable by " | 114 | ti->error = "dm-stripe: Target length not divisible by " |
| 109 | "number of stripes"; | 115 | "number of stripes"; |
| 110 | return -EINVAL; | 116 | return -EINVAL; |
| 111 | } | 117 | } |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index d39f584cd8b3..5d88329e3c7a 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
| @@ -306,6 +306,7 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int | |||
| 306 | r1bio_t * r1_bio = (r1bio_t *)(bio->bi_private); | 306 | r1bio_t * r1_bio = (r1bio_t *)(bio->bi_private); |
| 307 | int mirror, behind = test_bit(R1BIO_BehindIO, &r1_bio->state); | 307 | int mirror, behind = test_bit(R1BIO_BehindIO, &r1_bio->state); |
| 308 | conf_t *conf = mddev_to_conf(r1_bio->mddev); | 308 | conf_t *conf = mddev_to_conf(r1_bio->mddev); |
| 309 | struct bio *to_put = NULL; | ||
| 309 | 310 | ||
| 310 | if (bio->bi_size) | 311 | if (bio->bi_size) |
| 311 | return 1; | 312 | return 1; |
| @@ -323,6 +324,7 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int | |||
| 323 | * this branch is our 'one mirror IO has finished' event handler: | 324 | * this branch is our 'one mirror IO has finished' event handler: |
| 324 | */ | 325 | */ |
| 325 | r1_bio->bios[mirror] = NULL; | 326 | r1_bio->bios[mirror] = NULL; |
| 327 | to_put = bio; | ||
| 326 | if (!uptodate) { | 328 | if (!uptodate) { |
| 327 | md_error(r1_bio->mddev, conf->mirrors[mirror].rdev); | 329 | md_error(r1_bio->mddev, conf->mirrors[mirror].rdev); |
| 328 | /* an I/O failed, we can't clear the bitmap */ | 330 | /* an I/O failed, we can't clear the bitmap */ |
| @@ -375,7 +377,7 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int | |||
| 375 | /* Don't dec_pending yet, we want to hold | 377 | /* Don't dec_pending yet, we want to hold |
| 376 | * the reference over the retry | 378 | * the reference over the retry |
| 377 | */ | 379 | */ |
| 378 | return 0; | 380 | goto out; |
| 379 | } | 381 | } |
| 380 | if (test_bit(R1BIO_BehindIO, &r1_bio->state)) { | 382 | if (test_bit(R1BIO_BehindIO, &r1_bio->state)) { |
| 381 | /* free extra copy of the data pages */ | 383 | /* free extra copy of the data pages */ |
| @@ -392,10 +394,11 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int | |||
| 392 | raid_end_bio_io(r1_bio); | 394 | raid_end_bio_io(r1_bio); |
| 393 | } | 395 | } |
| 394 | 396 | ||
| 395 | if (r1_bio->bios[mirror]==NULL) | ||
| 396 | bio_put(bio); | ||
| 397 | |||
| 398 | rdev_dec_pending(conf->mirrors[mirror].rdev, conf->mddev); | 397 | rdev_dec_pending(conf->mirrors[mirror].rdev, conf->mddev); |
| 398 | out: | ||
| 399 | if (to_put) | ||
| 400 | bio_put(to_put); | ||
| 401 | |||
| 399 | return 0; | 402 | return 0; |
| 400 | } | 403 | } |
| 401 | 404 | ||
| @@ -857,7 +860,7 @@ static int make_request(request_queue_t *q, struct bio * bio) | |||
| 857 | atomic_set(&r1_bio->remaining, 0); | 860 | atomic_set(&r1_bio->remaining, 0); |
| 858 | atomic_set(&r1_bio->behind_remaining, 0); | 861 | atomic_set(&r1_bio->behind_remaining, 0); |
| 859 | 862 | ||
| 860 | do_barriers = bio->bi_rw & BIO_RW_BARRIER; | 863 | do_barriers = bio_barrier(bio); |
| 861 | if (do_barriers) | 864 | if (do_barriers) |
| 862 | set_bit(R1BIO_Barrier, &r1_bio->state); | 865 | set_bit(R1BIO_Barrier, &r1_bio->state); |
| 863 | 866 | ||
