diff options
Diffstat (limited to 'drivers/md/raid10.c')
| -rw-r--r-- | drivers/md/raid10.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index f0141910bb8d..a9401c017e35 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
| @@ -782,6 +782,7 @@ static int make_request(request_queue_t *q, struct bio * bio) | |||
| 782 | int i; | 782 | int i; |
| 783 | int chunk_sects = conf->chunk_mask + 1; | 783 | int chunk_sects = conf->chunk_mask + 1; |
| 784 | const int rw = bio_data_dir(bio); | 784 | const int rw = bio_data_dir(bio); |
| 785 | const int do_sync = bio_sync(bio); | ||
| 785 | struct bio_list bl; | 786 | struct bio_list bl; |
| 786 | unsigned long flags; | 787 | unsigned long flags; |
| 787 | 788 | ||
| @@ -863,7 +864,7 @@ static int make_request(request_queue_t *q, struct bio * bio) | |||
| 863 | mirror->rdev->data_offset; | 864 | mirror->rdev->data_offset; |
| 864 | read_bio->bi_bdev = mirror->rdev->bdev; | 865 | read_bio->bi_bdev = mirror->rdev->bdev; |
| 865 | read_bio->bi_end_io = raid10_end_read_request; | 866 | read_bio->bi_end_io = raid10_end_read_request; |
| 866 | read_bio->bi_rw = READ; | 867 | read_bio->bi_rw = READ | do_sync; |
| 867 | read_bio->bi_private = r10_bio; | 868 | read_bio->bi_private = r10_bio; |
| 868 | 869 | ||
| 869 | generic_make_request(read_bio); | 870 | generic_make_request(read_bio); |
| @@ -909,7 +910,7 @@ static int make_request(request_queue_t *q, struct bio * bio) | |||
| 909 | conf->mirrors[d].rdev->data_offset; | 910 | conf->mirrors[d].rdev->data_offset; |
| 910 | mbio->bi_bdev = conf->mirrors[d].rdev->bdev; | 911 | mbio->bi_bdev = conf->mirrors[d].rdev->bdev; |
| 911 | mbio->bi_end_io = raid10_end_write_request; | 912 | mbio->bi_end_io = raid10_end_write_request; |
| 912 | mbio->bi_rw = WRITE; | 913 | mbio->bi_rw = WRITE | do_sync; |
| 913 | mbio->bi_private = r10_bio; | 914 | mbio->bi_private = r10_bio; |
| 914 | 915 | ||
| 915 | atomic_inc(&r10_bio->remaining); | 916 | atomic_inc(&r10_bio->remaining); |
| @@ -922,6 +923,9 @@ static int make_request(request_queue_t *q, struct bio * bio) | |||
| 922 | blk_plug_device(mddev->queue); | 923 | blk_plug_device(mddev->queue); |
| 923 | spin_unlock_irqrestore(&conf->device_lock, flags); | 924 | spin_unlock_irqrestore(&conf->device_lock, flags); |
| 924 | 925 | ||
| 926 | if (do_sync) | ||
| 927 | md_wakeup_thread(mddev->thread); | ||
| 928 | |||
| 925 | return 0; | 929 | return 0; |
| 926 | } | 930 | } |
| 927 | 931 | ||
| @@ -1563,6 +1567,7 @@ static void raid10d(mddev_t *mddev) | |||
| 1563 | (unsigned long long)r10_bio->sector); | 1567 | (unsigned long long)r10_bio->sector); |
| 1564 | raid_end_bio_io(r10_bio); | 1568 | raid_end_bio_io(r10_bio); |
| 1565 | } else { | 1569 | } else { |
| 1570 | const int do_sync = bio_sync(r10_bio->master_bio); | ||
| 1566 | rdev = conf->mirrors[mirror].rdev; | 1571 | rdev = conf->mirrors[mirror].rdev; |
| 1567 | if (printk_ratelimit()) | 1572 | if (printk_ratelimit()) |
| 1568 | printk(KERN_ERR "raid10: %s: redirecting sector %llu to" | 1573 | printk(KERN_ERR "raid10: %s: redirecting sector %llu to" |
| @@ -1574,7 +1579,7 @@ static void raid10d(mddev_t *mddev) | |||
| 1574 | bio->bi_sector = r10_bio->devs[r10_bio->read_slot].addr | 1579 | bio->bi_sector = r10_bio->devs[r10_bio->read_slot].addr |
| 1575 | + rdev->data_offset; | 1580 | + rdev->data_offset; |
| 1576 | bio->bi_bdev = rdev->bdev; | 1581 | bio->bi_bdev = rdev->bdev; |
| 1577 | bio->bi_rw = READ; | 1582 | bio->bi_rw = READ | do_sync; |
| 1578 | bio->bi_private = r10_bio; | 1583 | bio->bi_private = r10_bio; |
| 1579 | bio->bi_end_io = raid10_end_read_request; | 1584 | bio->bi_end_io = raid10_end_read_request; |
| 1580 | unplug = 1; | 1585 | unplug = 1; |
