Message ID | 1492478187-24875-6-git-send-email-bo.li.liu@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Apr 17, 2017 at 06:16:26PM -0700, Liu Bo wrote: > Some check-integrity code depends on bio->bi_vcnt, this changes it to use > bio segments because some bios passing here may not have a reliable > bi_vcnt. > > Signed-off-by: Liu Bo <bo.li.liu@oracle.com> > --- > fs/btrfs/check-integrity.c | 27 +++++++++++++++------------ > 1 file changed, 15 insertions(+), 12 deletions(-) > > diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c > index ab14c2e..8e7ce48 100644 > --- a/fs/btrfs/check-integrity.c > +++ b/fs/btrfs/check-integrity.c > @@ -2822,44 +2822,47 @@ static void __btrfsic_submit_bio(struct bio *bio) > dev_state = btrfsic_dev_state_lookup(bio->bi_bdev); > if (NULL != dev_state && > (bio_op(bio) == REQ_OP_WRITE) && bio_has_data(bio)) { > - unsigned int i; > + unsigned int i = 0; > u64 dev_bytenr; > u64 cur_bytenr; > - struct bio_vec *bvec; > + struct bio_vec bvec; > + struct bvec_iter iter; > int bio_is_patched; > char **mapped_datav; > + int segs = bio_segments(bio); Type mismatch, bio_segments return unsigned. > > dev_bytenr = 512 * bio->bi_iter.bi_sector; > bio_is_patched = 0; > if (dev_state->state->print_mask & > BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) > pr_info("submit_bio(rw=%d,0x%x, bi_vcnt=%u, bi_sector=%llu (bytenr %llu), bi_bdev=%p)\n", > - bio_op(bio), bio->bi_opf, bio->bi_vcnt, > + bio_op(bio), bio->bi_opf, segs, > (unsigned long long)bio->bi_iter.bi_sector, > dev_bytenr, bio->bi_bdev); > > - mapped_datav = kmalloc_array(bio->bi_vcnt, > + mapped_datav = kmalloc_array(segs, > sizeof(*mapped_datav), GFP_NOFS); > if (!mapped_datav) > goto leave; > cur_bytenr = dev_bytenr; > > - bio_for_each_segment_all(bvec, bio, i) { > - BUG_ON(bvec->bv_len != PAGE_SIZE); > - mapped_datav[i] = kmap(bvec->bv_page); > + bio_for_each_segment(bvec, bio, iter) { > + BUG_ON(bvec.bv_len != PAGE_SIZE); > + mapped_datav[i] = kmap(bvec.bv_page); > + i++; > > if (dev_state->state->print_mask & > BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH_VERBOSE) > pr_info("#%u: bytenr=%llu, len=%u, offset=%u\n", > - i, cur_bytenr, bvec->bv_len, bvec->bv_offset); > - cur_bytenr += bvec->bv_len; > + i, cur_bytenr, bvec.bv_len, bvec.bv_offset); > + cur_bytenr += bvec.bv_len; > } > btrfsic_process_written_block(dev_state, dev_bytenr, > - mapped_datav, bio->bi_vcnt, > + mapped_datav, segs, > bio, &bio_is_patched, > NULL, bio->bi_opf); > - bio_for_each_segment_all(bvec, bio, i) > - kunmap(bvec->bv_page); > + bio_for_each_segment(bvec, bio, iter) > + kunmap(bvec.bv_page); > kfree(mapped_datav); > } else if (NULL != dev_state && (bio->bi_opf & REQ_PREFLUSH)) { > if (dev_state->state->print_mask & > -- > 2.5.5 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index ab14c2e..8e7ce48 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -2822,44 +2822,47 @@ static void __btrfsic_submit_bio(struct bio *bio) dev_state = btrfsic_dev_state_lookup(bio->bi_bdev); if (NULL != dev_state && (bio_op(bio) == REQ_OP_WRITE) && bio_has_data(bio)) { - unsigned int i; + unsigned int i = 0; u64 dev_bytenr; u64 cur_bytenr; - struct bio_vec *bvec; + struct bio_vec bvec; + struct bvec_iter iter; int bio_is_patched; char **mapped_datav; + int segs = bio_segments(bio); dev_bytenr = 512 * bio->bi_iter.bi_sector; bio_is_patched = 0; if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) pr_info("submit_bio(rw=%d,0x%x, bi_vcnt=%u, bi_sector=%llu (bytenr %llu), bi_bdev=%p)\n", - bio_op(bio), bio->bi_opf, bio->bi_vcnt, + bio_op(bio), bio->bi_opf, segs, (unsigned long long)bio->bi_iter.bi_sector, dev_bytenr, bio->bi_bdev); - mapped_datav = kmalloc_array(bio->bi_vcnt, + mapped_datav = kmalloc_array(segs, sizeof(*mapped_datav), GFP_NOFS); if (!mapped_datav) goto leave; cur_bytenr = dev_bytenr; - bio_for_each_segment_all(bvec, bio, i) { - BUG_ON(bvec->bv_len != PAGE_SIZE); - mapped_datav[i] = kmap(bvec->bv_page); + bio_for_each_segment(bvec, bio, iter) { + BUG_ON(bvec.bv_len != PAGE_SIZE); + mapped_datav[i] = kmap(bvec.bv_page); + i++; if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH_VERBOSE) pr_info("#%u: bytenr=%llu, len=%u, offset=%u\n", - i, cur_bytenr, bvec->bv_len, bvec->bv_offset); - cur_bytenr += bvec->bv_len; + i, cur_bytenr, bvec.bv_len, bvec.bv_offset); + cur_bytenr += bvec.bv_len; } btrfsic_process_written_block(dev_state, dev_bytenr, - mapped_datav, bio->bi_vcnt, + mapped_datav, segs, bio, &bio_is_patched, NULL, bio->bi_opf); - bio_for_each_segment_all(bvec, bio, i) - kunmap(bvec->bv_page); + bio_for_each_segment(bvec, bio, iter) + kunmap(bvec.bv_page); kfree(mapped_datav); } else if (NULL != dev_state && (bio->bi_opf & REQ_PREFLUSH)) { if (dev_state->state->print_mask &
Some check-integrity code depends on bio->bi_vcnt, this changes it to use bio segments because some bios passing here may not have a reliable bi_vcnt. Signed-off-by: Liu Bo <bo.li.liu@oracle.com> --- fs/btrfs/check-integrity.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-)