|
@@ -775,6 +775,7 @@ static int make_request(request_queue_t *q, struct bio * bio)
|
|
|
struct bio_list bl;
|
|
|
struct page **behind_pages = NULL;
|
|
|
const int rw = bio_data_dir(bio);
|
|
|
+ const int do_sync = bio_sync(bio);
|
|
|
int do_barriers;
|
|
|
|
|
|
/*
|
|
@@ -835,7 +836,7 @@ static int make_request(request_queue_t *q, struct bio * bio)
|
|
|
read_bio->bi_sector = r1_bio->sector + mirror->rdev->data_offset;
|
|
|
read_bio->bi_bdev = mirror->rdev->bdev;
|
|
|
read_bio->bi_end_io = raid1_end_read_request;
|
|
|
- read_bio->bi_rw = READ;
|
|
|
+ read_bio->bi_rw = READ | do_sync;
|
|
|
read_bio->bi_private = r1_bio;
|
|
|
|
|
|
generic_make_request(read_bio);
|
|
@@ -906,7 +907,7 @@ static int make_request(request_queue_t *q, struct bio * bio)
|
|
|
mbio->bi_sector = r1_bio->sector + conf->mirrors[i].rdev->data_offset;
|
|
|
mbio->bi_bdev = conf->mirrors[i].rdev->bdev;
|
|
|
mbio->bi_end_io = raid1_end_write_request;
|
|
|
- mbio->bi_rw = WRITE | do_barriers;
|
|
|
+ mbio->bi_rw = WRITE | do_barriers | do_sync;
|
|
|
mbio->bi_private = r1_bio;
|
|
|
|
|
|
if (behind_pages) {
|
|
@@ -941,6 +942,8 @@ static int make_request(request_queue_t *q, struct bio * bio)
|
|
|
blk_plug_device(mddev->queue);
|
|
|
spin_unlock_irqrestore(&conf->device_lock, flags);
|
|
|
|
|
|
+ if (do_sync)
|
|
|
+ md_wakeup_thread(mddev->thread);
|
|
|
#if 0
|
|
|
while ((bio = bio_list_pop(&bl)) != NULL)
|
|
|
generic_make_request(bio);
|
|
@@ -1541,6 +1544,7 @@ static void raid1d(mddev_t *mddev)
|
|
|
* We already have a nr_pending reference on these rdevs.
|
|
|
*/
|
|
|
int i;
|
|
|
+ const int do_sync = bio_sync(r1_bio->master_bio);
|
|
|
clear_bit(R1BIO_BarrierRetry, &r1_bio->state);
|
|
|
clear_bit(R1BIO_Barrier, &r1_bio->state);
|
|
|
for (i=0; i < conf->raid_disks; i++)
|
|
@@ -1561,7 +1565,7 @@ static void raid1d(mddev_t *mddev)
|
|
|
conf->mirrors[i].rdev->data_offset;
|
|
|
bio->bi_bdev = conf->mirrors[i].rdev->bdev;
|
|
|
bio->bi_end_io = raid1_end_write_request;
|
|
|
- bio->bi_rw = WRITE;
|
|
|
+ bio->bi_rw = WRITE | do_sync;
|
|
|
bio->bi_private = r1_bio;
|
|
|
r1_bio->bios[i] = bio;
|
|
|
generic_make_request(bio);
|
|
@@ -1593,6 +1597,7 @@ static void raid1d(mddev_t *mddev)
|
|
|
(unsigned long long)r1_bio->sector);
|
|
|
raid_end_bio_io(r1_bio);
|
|
|
} else {
|
|
|
+ const int do_sync = bio_sync(r1_bio->master_bio);
|
|
|
r1_bio->bios[r1_bio->read_disk] =
|
|
|
mddev->ro ? IO_BLOCKED : NULL;
|
|
|
r1_bio->read_disk = disk;
|
|
@@ -1608,7 +1613,7 @@ static void raid1d(mddev_t *mddev)
|
|
|
bio->bi_sector = r1_bio->sector + rdev->data_offset;
|
|
|
bio->bi_bdev = rdev->bdev;
|
|
|
bio->bi_end_io = raid1_end_read_request;
|
|
|
- bio->bi_rw = READ;
|
|
|
+ bio->bi_rw = READ | do_sync;
|
|
|
bio->bi_private = r1_bio;
|
|
|
unplug = 1;
|
|
|
generic_make_request(bio);
|