aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/md.c40
-rw-r--r--drivers/md/md.h1
-rw-r--r--drivers/md/raid1.c10
-rw-r--r--drivers/md/raid10.c18
4 files changed, 13 insertions, 56 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 561a65f82e26..752119068d66 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -183,46 +183,6 @@ struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask,
183} 183}
184EXPORT_SYMBOL_GPL(bio_clone_mddev); 184EXPORT_SYMBOL_GPL(bio_clone_mddev);
185 185
186void md_trim_bio(struct bio *bio, int offset, int size)
187{
188 /* 'bio' is a cloned bio which we need to trim to match
189 * the given offset and size.
190 * This requires adjusting bi_sector, bi_size, and bi_io_vec
191 */
192 int i;
193 struct bio_vec *bvec;
194 int sofar = 0;
195
196 size <<= 9;
197 if (offset == 0 && size == bio->bi_size)
198 return;
199
200 clear_bit(BIO_SEG_VALID, &bio->bi_flags);
201
202 bio_advance(bio, offset << 9);
203
204 bio->bi_size = size;
205
206 /* avoid any complications with bi_idx being non-zero*/
207 if (bio->bi_idx) {
208 memmove(bio->bi_io_vec, bio->bi_io_vec+bio->bi_idx,
209 (bio->bi_vcnt - bio->bi_idx) * sizeof(struct bio_vec));
210 bio->bi_vcnt -= bio->bi_idx;
211 bio->bi_idx = 0;
212 }
213 /* Make sure vcnt and last bv are not too big */
214 bio_for_each_segment(bvec, bio, i) {
215 if (sofar + bvec->bv_len > size)
216 bvec->bv_len = size - sofar;
217 if (bvec->bv_len == 0) {
218 bio->bi_vcnt = i;
219 break;
220 }
221 sofar += bvec->bv_len;
222 }
223}
224EXPORT_SYMBOL_GPL(md_trim_bio);
225
226/* 186/*
227 * We have a system wide 'event count' that is incremented 187 * We have a system wide 'event count' that is incremented
228 * on any 'interesting' event, and readers of /proc/mdstat 188 * on any 'interesting' event, and readers of /proc/mdstat
diff --git a/drivers/md/md.h b/drivers/md/md.h
index 608050c43f17..c96456c16700 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -617,7 +617,6 @@ extern struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask,
617 struct mddev *mddev); 617 struct mddev *mddev);
618extern struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs, 618extern struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
619 struct mddev *mddev); 619 struct mddev *mddev);
620extern void md_trim_bio(struct bio *bio, int offset, int size);
621 620
622extern void md_unplug(struct blk_plug_cb *cb, bool from_schedule); 621extern void md_unplug(struct blk_plug_cb *cb, bool from_schedule);
623static inline int mddev_check_plugged(struct mddev *mddev) 622static inline int mddev_check_plugged(struct mddev *mddev)
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index aacf6bf352d8..af6681b19776 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -1097,8 +1097,8 @@ read_again:
1097 r1_bio->read_disk = rdisk; 1097 r1_bio->read_disk = rdisk;
1098 1098
1099 read_bio = bio_clone_mddev(bio, GFP_NOIO, mddev); 1099 read_bio = bio_clone_mddev(bio, GFP_NOIO, mddev);
1100 md_trim_bio(read_bio, r1_bio->sector - bio->bi_sector, 1100 bio_trim(read_bio, r1_bio->sector - bio->bi_sector,
1101 max_sectors); 1101 max_sectors);
1102 1102
1103 r1_bio->bios[rdisk] = read_bio; 1103 r1_bio->bios[rdisk] = read_bio;
1104 1104
@@ -1266,7 +1266,7 @@ read_again:
1266 continue; 1266 continue;
1267 1267
1268 mbio = bio_clone_mddev(bio, GFP_NOIO, mddev); 1268 mbio = bio_clone_mddev(bio, GFP_NOIO, mddev);
1269 md_trim_bio(mbio, r1_bio->sector - bio->bi_sector, max_sectors); 1269 bio_trim(mbio, r1_bio->sector - bio->bi_sector, max_sectors);
1270 1270
1271 if (first_clone) { 1271 if (first_clone) {
1272 /* do behind I/O ? 1272 /* do behind I/O ?
@@ -2126,7 +2126,7 @@ static int narrow_write_error(struct r1bio *r1_bio, int i)
2126 wbio->bi_sector = r1_bio->sector; 2126 wbio->bi_sector = r1_bio->sector;
2127 wbio->bi_size = r1_bio->sectors << 9; 2127 wbio->bi_size = r1_bio->sectors << 9;
2128 2128
2129 md_trim_bio(wbio, sector - r1_bio->sector, sectors); 2129 bio_trim(wbio, sector - r1_bio->sector, sectors);
2130 wbio->bi_sector += rdev->data_offset; 2130 wbio->bi_sector += rdev->data_offset;
2131 wbio->bi_bdev = rdev->bdev; 2131 wbio->bi_bdev = rdev->bdev;
2132 if (submit_bio_wait(WRITE, wbio) == 0) 2132 if (submit_bio_wait(WRITE, wbio) == 0)
@@ -2241,7 +2241,7 @@ read_more:
2241 } 2241 }
2242 r1_bio->read_disk = disk; 2242 r1_bio->read_disk = disk;
2243 bio = bio_clone_mddev(r1_bio->master_bio, GFP_NOIO, mddev); 2243 bio = bio_clone_mddev(r1_bio->master_bio, GFP_NOIO, mddev);
2244 md_trim_bio(bio, r1_bio->sector - bio->bi_sector, max_sectors); 2244 bio_trim(bio, r1_bio->sector - bio->bi_sector, max_sectors);
2245 r1_bio->bios[r1_bio->read_disk] = bio; 2245 r1_bio->bios[r1_bio->read_disk] = bio;
2246 rdev = conf->mirrors[disk].rdev; 2246 rdev = conf->mirrors[disk].rdev;
2247 printk_ratelimited(KERN_ERR 2247 printk_ratelimited(KERN_ERR
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 73dc8a377522..7c3508abb5e1 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -1302,8 +1302,8 @@ read_again:
1302 slot = r10_bio->read_slot; 1302 slot = r10_bio->read_slot;
1303 1303
1304 read_bio = bio_clone_mddev(bio, GFP_NOIO, mddev); 1304 read_bio = bio_clone_mddev(bio, GFP_NOIO, mddev);
1305 md_trim_bio(read_bio, r10_bio->sector - bio->bi_sector, 1305 bio_trim(read_bio, r10_bio->sector - bio->bi_sector,
1306 max_sectors); 1306 max_sectors);
1307 1307
1308 r10_bio->devs[slot].bio = read_bio; 1308 r10_bio->devs[slot].bio = read_bio;
1309 r10_bio->devs[slot].rdev = rdev; 1309 r10_bio->devs[slot].rdev = rdev;
@@ -1510,8 +1510,8 @@ retry_write:
1510 if (r10_bio->devs[i].bio) { 1510 if (r10_bio->devs[i].bio) {
1511 struct md_rdev *rdev = conf->mirrors[d].rdev; 1511 struct md_rdev *rdev = conf->mirrors[d].rdev;
1512 mbio = bio_clone_mddev(bio, GFP_NOIO, mddev); 1512 mbio = bio_clone_mddev(bio, GFP_NOIO, mddev);
1513 md_trim_bio(mbio, r10_bio->sector - bio->bi_sector, 1513 bio_trim(mbio, r10_bio->sector - bio->bi_sector,
1514 max_sectors); 1514 max_sectors);
1515 r10_bio->devs[i].bio = mbio; 1515 r10_bio->devs[i].bio = mbio;
1516 1516
1517 mbio->bi_sector = (r10_bio->devs[i].addr+ 1517 mbio->bi_sector = (r10_bio->devs[i].addr+
@@ -1553,8 +1553,8 @@ retry_write:
1553 rdev = conf->mirrors[d].rdev; 1553 rdev = conf->mirrors[d].rdev;
1554 } 1554 }
1555 mbio = bio_clone_mddev(bio, GFP_NOIO, mddev); 1555 mbio = bio_clone_mddev(bio, GFP_NOIO, mddev);
1556 md_trim_bio(mbio, r10_bio->sector - bio->bi_sector, 1556 bio_trim(mbio, r10_bio->sector - bio->bi_sector,
1557 max_sectors); 1557 max_sectors);
1558 r10_bio->devs[i].repl_bio = mbio; 1558 r10_bio->devs[i].repl_bio = mbio;
1559 1559
1560 mbio->bi_sector = (r10_bio->devs[i].addr + 1560 mbio->bi_sector = (r10_bio->devs[i].addr +
@@ -2614,7 +2614,7 @@ static int narrow_write_error(struct r10bio *r10_bio, int i)
2614 sectors = sect_to_write; 2614 sectors = sect_to_write;
2615 /* Write at 'sector' for 'sectors' */ 2615 /* Write at 'sector' for 'sectors' */
2616 wbio = bio_clone_mddev(bio, GFP_NOIO, mddev); 2616 wbio = bio_clone_mddev(bio, GFP_NOIO, mddev);
2617 md_trim_bio(wbio, sector - bio->bi_sector, sectors); 2617 bio_trim(wbio, sector - bio->bi_sector, sectors);
2618 wbio->bi_sector = (r10_bio->devs[i].addr+ 2618 wbio->bi_sector = (r10_bio->devs[i].addr+
2619 choose_data_offset(r10_bio, rdev) + 2619 choose_data_offset(r10_bio, rdev) +
2620 (sector - r10_bio->sector)); 2620 (sector - r10_bio->sector));
@@ -2687,9 +2687,7 @@ read_more:
2687 (unsigned long long)r10_bio->sector); 2687 (unsigned long long)r10_bio->sector);
2688 bio = bio_clone_mddev(r10_bio->master_bio, 2688 bio = bio_clone_mddev(r10_bio->master_bio,
2689 GFP_NOIO, mddev); 2689 GFP_NOIO, mddev);
2690 md_trim_bio(bio, 2690 bio_trim(bio, r10_bio->sector - bio->bi_sector, max_sectors);
2691 r10_bio->sector - bio->bi_sector,
2692 max_sectors);
2693 r10_bio->devs[slot].bio = bio; 2691 r10_bio->devs[slot].bio = bio;
2694 r10_bio->devs[slot].rdev = rdev; 2692 r10_bio->devs[slot].rdev = rdev;
2695 bio->bi_sector = r10_bio->devs[slot].addr 2693 bio->bi_sector = r10_bio->devs[slot].addr