Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1ef04fef authored by Dmitry Monakhov's avatar Dmitry Monakhov Committed by NeilBrown
Browse files

md: raid-1/10: fix RW bits manipulation



Recently Jens has changed bio_rw_flagged() logic by following
commit 1f98a13f. Now it returns
bool instead of int. This broke raid1/raid10 RW bits manipulation logic.
One of visible result is BUG_ON triggering due to empty barrier
here scsi_lib.c:1108 scsi_setup_fs_cmnd()

Signed-off-by: default avatarDmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent f28f4e27
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -854,7 +854,7 @@ static int make_request(struct request_queue *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 | do_sync;
		read_bio->bi_rw = READ | (do_sync << BIO_RW_SYNCIO);
		read_bio->bi_private = r1_bio;

		generic_make_request(read_bio);
@@ -946,7 +946,8 @@ static int make_request(struct request_queue *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 | do_sync;
		mbio->bi_rw = WRITE | (do_barriers << BIO_RW_BARRIER) |
			(do_sync << BIO_RW_SYNCIO);
		mbio->bi_private = r1_bio;

		if (behind_pages) {
@@ -1626,7 +1627,8 @@ 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 | do_sync;
					bio->bi_rw = WRITE |
						(do_sync << BIO_RW_SYNCIO);
					bio->bi_private = r1_bio;
					r1_bio->bios[i] = bio;
					generic_make_request(bio);
@@ -1675,7 +1677,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 | do_sync;
				bio->bi_rw = READ | (do_sync << BIO_RW_SYNCIO);
				bio->bi_private = r1_bio;
				unplug = 1;
				generic_make_request(bio);
+3 −3
Original line number Diff line number Diff line
@@ -884,7 +884,7 @@ static int make_request(struct request_queue *q, struct bio * bio)
			mirror->rdev->data_offset;
		read_bio->bi_bdev = mirror->rdev->bdev;
		read_bio->bi_end_io = raid10_end_read_request;
		read_bio->bi_rw = READ | do_sync;
		read_bio->bi_rw = READ | (do_sync << BIO_RW_SYNCIO);
		read_bio->bi_private = r10_bio;

		generic_make_request(read_bio);
@@ -952,7 +952,7 @@ static int make_request(struct request_queue *q, struct bio * bio)
			conf->mirrors[d].rdev->data_offset;
		mbio->bi_bdev = conf->mirrors[d].rdev->bdev;
		mbio->bi_end_io	= raid10_end_write_request;
		mbio->bi_rw = WRITE | do_sync;
		mbio->bi_rw = WRITE | (do_sync << BIO_RW_SYNCIO);
		mbio->bi_private = r10_bio;

		atomic_inc(&r10_bio->remaining);
@@ -1625,7 +1625,7 @@ static void raid10d(mddev_t *mddev)
				bio->bi_sector = r10_bio->devs[r10_bio->read_slot].addr
					+ rdev->data_offset;
				bio->bi_bdev = rdev->bdev;
				bio->bi_rw = READ | do_sync;
				bio->bi_rw = READ | (do_sync << BIO_RW_SYNCIO);
				bio->bi_private = r10_bio;
				bio->bi_end_io = raid10_end_read_request;
				unplug = 1;