Loading fs/bio.c +36 −0 Original line number Diff line number Diff line Loading @@ -1300,6 +1300,42 @@ struct bio_pair *bio_split(struct bio *bi, mempool_t *pool, int first_sectors) return bp; } /** * bio_sector_offset - Find hardware sector offset in bio * @bio: bio to inspect * @index: bio_vec index * @offset: offset in bv_page * * Return the number of hardware sectors between beginning of bio * and an end point indicated by a bio_vec index and an offset * within that vector's page. */ sector_t bio_sector_offset(struct bio *bio, unsigned short index, unsigned int offset) { unsigned int sector_sz = queue_hardsect_size(bio->bi_bdev->bd_disk->queue); struct bio_vec *bv; sector_t sectors; int i; sectors = 0; if (index >= bio->bi_idx) index = bio->bi_vcnt - 1; __bio_for_each_segment(bv, bio, i, 0) { if (i == index) { if (offset > bv->bv_offset) sectors += (offset - bv->bv_offset) / sector_sz; break; } sectors += bv->bv_len / sector_sz; } return sectors; } EXPORT_SYMBOL(bio_sector_offset); /* * create memory pools for biovec's in a bio_set. Loading include/linux/bio.h +1 −0 Original line number Diff line number Diff line Loading @@ -327,6 +327,7 @@ extern int bio_add_page(struct bio *, struct page *, unsigned int,unsigned int); extern int bio_add_pc_page(struct request_queue *, struct bio *, struct page *, unsigned int, unsigned int); extern int bio_get_nr_vecs(struct block_device *); extern sector_t bio_sector_offset(struct bio *, unsigned short, unsigned int); extern struct bio *bio_map_user(struct request_queue *, struct block_device *, unsigned long, unsigned int, int, gfp_t); struct sg_iovec; Loading Loading
fs/bio.c +36 −0 Original line number Diff line number Diff line Loading @@ -1300,6 +1300,42 @@ struct bio_pair *bio_split(struct bio *bi, mempool_t *pool, int first_sectors) return bp; } /** * bio_sector_offset - Find hardware sector offset in bio * @bio: bio to inspect * @index: bio_vec index * @offset: offset in bv_page * * Return the number of hardware sectors between beginning of bio * and an end point indicated by a bio_vec index and an offset * within that vector's page. */ sector_t bio_sector_offset(struct bio *bio, unsigned short index, unsigned int offset) { unsigned int sector_sz = queue_hardsect_size(bio->bi_bdev->bd_disk->queue); struct bio_vec *bv; sector_t sectors; int i; sectors = 0; if (index >= bio->bi_idx) index = bio->bi_vcnt - 1; __bio_for_each_segment(bv, bio, i, 0) { if (i == index) { if (offset > bv->bv_offset) sectors += (offset - bv->bv_offset) / sector_sz; break; } sectors += bv->bv_len / sector_sz; } return sectors; } EXPORT_SYMBOL(bio_sector_offset); /* * create memory pools for biovec's in a bio_set. Loading
include/linux/bio.h +1 −0 Original line number Diff line number Diff line Loading @@ -327,6 +327,7 @@ extern int bio_add_page(struct bio *, struct page *, unsigned int,unsigned int); extern int bio_add_pc_page(struct request_queue *, struct bio *, struct page *, unsigned int, unsigned int); extern int bio_get_nr_vecs(struct block_device *); extern sector_t bio_sector_offset(struct bio *, unsigned short, unsigned int); extern struct bio *bio_map_user(struct request_queue *, struct block_device *, unsigned long, unsigned int, int, gfp_t); struct sg_iovec; Loading