diff options
-rw-r--r-- | drivers/md/raid1.c | 53 |
1 files changed, 30 insertions, 23 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 6e17f8181c4b..6f4824426e86 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -1848,6 +1848,36 @@ static int process_checks(struct r1bio *r1_bio) | |||
1848 | int i; | 1848 | int i; |
1849 | int vcnt; | 1849 | int vcnt; |
1850 | 1850 | ||
1851 | /* Fix variable parts of all bios */ | ||
1852 | vcnt = (r1_bio->sectors + PAGE_SIZE / 512 - 1) >> (PAGE_SHIFT - 9); | ||
1853 | for (i = 0; i < conf->raid_disks * 2; i++) { | ||
1854 | int j; | ||
1855 | int size; | ||
1856 | struct bio *b = r1_bio->bios[i]; | ||
1857 | if (b->bi_end_io != end_sync_read) | ||
1858 | continue; | ||
1859 | /* fixup the bio for reuse */ | ||
1860 | bio_reset(b); | ||
1861 | b->bi_vcnt = vcnt; | ||
1862 | b->bi_size = r1_bio->sectors << 9; | ||
1863 | b->bi_sector = r1_bio->sector + | ||
1864 | conf->mirrors[i].rdev->data_offset; | ||
1865 | b->bi_bdev = conf->mirrors[i].rdev->bdev; | ||
1866 | b->bi_end_io = end_sync_read; | ||
1867 | b->bi_private = r1_bio; | ||
1868 | |||
1869 | size = b->bi_size; | ||
1870 | for (j = 0; j < vcnt ; j++) { | ||
1871 | struct bio_vec *bi; | ||
1872 | bi = &b->bi_io_vec[j]; | ||
1873 | bi->bv_offset = 0; | ||
1874 | if (size > PAGE_SIZE) | ||
1875 | bi->bv_len = PAGE_SIZE; | ||
1876 | else | ||
1877 | bi->bv_len = size; | ||
1878 | size -= PAGE_SIZE; | ||
1879 | } | ||
1880 | } | ||
1851 | for (primary = 0; primary < conf->raid_disks * 2; primary++) | 1881 | for (primary = 0; primary < conf->raid_disks * 2; primary++) |
1852 | if (r1_bio->bios[primary]->bi_end_io == end_sync_read && | 1882 | if (r1_bio->bios[primary]->bi_end_io == end_sync_read && |
1853 | test_bit(BIO_UPTODATE, &r1_bio->bios[primary]->bi_flags)) { | 1883 | test_bit(BIO_UPTODATE, &r1_bio->bios[primary]->bi_flags)) { |
@@ -1856,12 +1886,10 @@ static int process_checks(struct r1bio *r1_bio) | |||
1856 | break; | 1886 | break; |
1857 | } | 1887 | } |
1858 | r1_bio->read_disk = primary; | 1888 | r1_bio->read_disk = primary; |
1859 | vcnt = (r1_bio->sectors + PAGE_SIZE / 512 - 1) >> (PAGE_SHIFT - 9); | ||
1860 | for (i = 0; i < conf->raid_disks * 2; i++) { | 1889 | for (i = 0; i < conf->raid_disks * 2; i++) { |
1861 | int j; | 1890 | int j; |
1862 | struct bio *pbio = r1_bio->bios[primary]; | 1891 | struct bio *pbio = r1_bio->bios[primary]; |
1863 | struct bio *sbio = r1_bio->bios[i]; | 1892 | struct bio *sbio = r1_bio->bios[i]; |
1864 | int size; | ||
1865 | 1893 | ||
1866 | if (sbio->bi_end_io != end_sync_read) | 1894 | if (sbio->bi_end_io != end_sync_read) |
1867 | continue; | 1895 | continue; |
@@ -1887,27 +1915,6 @@ static int process_checks(struct r1bio *r1_bio) | |||
1887 | rdev_dec_pending(conf->mirrors[i].rdev, mddev); | 1915 | rdev_dec_pending(conf->mirrors[i].rdev, mddev); |
1888 | continue; | 1916 | continue; |
1889 | } | 1917 | } |
1890 | /* fixup the bio for reuse */ | ||
1891 | bio_reset(sbio); | ||
1892 | sbio->bi_vcnt = vcnt; | ||
1893 | sbio->bi_size = r1_bio->sectors << 9; | ||
1894 | sbio->bi_sector = r1_bio->sector + | ||
1895 | conf->mirrors[i].rdev->data_offset; | ||
1896 | sbio->bi_bdev = conf->mirrors[i].rdev->bdev; | ||
1897 | sbio->bi_end_io = end_sync_read; | ||
1898 | sbio->bi_private = r1_bio; | ||
1899 | |||
1900 | size = sbio->bi_size; | ||
1901 | for (j = 0; j < vcnt ; j++) { | ||
1902 | struct bio_vec *bi; | ||
1903 | bi = &sbio->bi_io_vec[j]; | ||
1904 | bi->bv_offset = 0; | ||
1905 | if (size > PAGE_SIZE) | ||
1906 | bi->bv_len = PAGE_SIZE; | ||
1907 | else | ||
1908 | bi->bv_len = size; | ||
1909 | size -= PAGE_SIZE; | ||
1910 | } | ||
1911 | 1918 | ||
1912 | bio_copy_data(sbio, pbio); | 1919 | bio_copy_data(sbio, pbio); |
1913 | } | 1920 | } |