Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

Recently Jens has changed bio_rw_flagged() logic by following
commit 1f98a13f623e0ef666690a18c1250335fc6d7ef1. 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: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: NeilBrown <neilb@suse.de>

authored by

Dmitry Monakhov and committed by
NeilBrown
1ef04fef f28f4e27

+9 -7
+6 -4
drivers/md/raid1.c
··· 854 854 read_bio->bi_sector = r1_bio->sector + mirror->rdev->data_offset; 855 855 read_bio->bi_bdev = mirror->rdev->bdev; 856 856 read_bio->bi_end_io = raid1_end_read_request; 857 - read_bio->bi_rw = READ | do_sync; 857 + read_bio->bi_rw = READ | (do_sync << BIO_RW_SYNCIO); 858 858 read_bio->bi_private = r1_bio; 859 859 860 860 generic_make_request(read_bio); ··· 946 946 mbio->bi_sector = r1_bio->sector + conf->mirrors[i].rdev->data_offset; 947 947 mbio->bi_bdev = conf->mirrors[i].rdev->bdev; 948 948 mbio->bi_end_io = raid1_end_write_request; 949 - mbio->bi_rw = WRITE | do_barriers | do_sync; 949 + mbio->bi_rw = WRITE | (do_barriers << BIO_RW_BARRIER) | 950 + (do_sync << BIO_RW_SYNCIO); 950 951 mbio->bi_private = r1_bio; 951 952 952 953 if (behind_pages) { ··· 1627 1626 conf->mirrors[i].rdev->data_offset; 1628 1627 bio->bi_bdev = conf->mirrors[i].rdev->bdev; 1629 1628 bio->bi_end_io = raid1_end_write_request; 1630 - bio->bi_rw = WRITE | do_sync; 1629 + bio->bi_rw = WRITE | 1630 + (do_sync << BIO_RW_SYNCIO); 1631 1631 bio->bi_private = r1_bio; 1632 1632 r1_bio->bios[i] = bio; 1633 1633 generic_make_request(bio); ··· 1677 1675 bio->bi_sector = r1_bio->sector + rdev->data_offset; 1678 1676 bio->bi_bdev = rdev->bdev; 1679 1677 bio->bi_end_io = raid1_end_read_request; 1680 - bio->bi_rw = READ | do_sync; 1678 + bio->bi_rw = READ | (do_sync << BIO_RW_SYNCIO); 1681 1679 bio->bi_private = r1_bio; 1682 1680 unplug = 1; 1683 1681 generic_make_request(bio);
+3 -3
drivers/md/raid10.c
··· 884 884 mirror->rdev->data_offset; 885 885 read_bio->bi_bdev = mirror->rdev->bdev; 886 886 read_bio->bi_end_io = raid10_end_read_request; 887 - read_bio->bi_rw = READ | do_sync; 887 + read_bio->bi_rw = READ | (do_sync << BIO_RW_SYNCIO); 888 888 read_bio->bi_private = r10_bio; 889 889 890 890 generic_make_request(read_bio); ··· 952 952 conf->mirrors[d].rdev->data_offset; 953 953 mbio->bi_bdev = conf->mirrors[d].rdev->bdev; 954 954 mbio->bi_end_io = raid10_end_write_request; 955 - mbio->bi_rw = WRITE | do_sync; 955 + mbio->bi_rw = WRITE | (do_sync << BIO_RW_SYNCIO); 956 956 mbio->bi_private = r10_bio; 957 957 958 958 atomic_inc(&r10_bio->remaining); ··· 1625 1625 bio->bi_sector = r10_bio->devs[r10_bio->read_slot].addr 1626 1626 + rdev->data_offset; 1627 1627 bio->bi_bdev = rdev->bdev; 1628 - bio->bi_rw = READ | do_sync; 1628 + bio->bi_rw = READ | (do_sync << BIO_RW_SYNCIO); 1629 1629 bio->bi_private = r10_bio; 1630 1630 bio->bi_end_io = raid10_end_read_request; 1631 1631 unplug = 1;