block: Find bio sector offset given idx and offset
Helper function to find the sector offset in a bio given bvec index and page offset. Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
committed by
Jens Axboe
parent
b02739b01c
commit
ad3316bf4e
36
fs/bio.c
36
fs/bio.c
@@ -1300,6 +1300,42 @@ struct bio_pair *bio_split(struct bio *bi, mempool_t *pool, int first_sectors)
|
|||||||
return bp;
|
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.
|
* create memory pools for biovec's in a bio_set.
|
||||||
|
@@ -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 *,
|
extern int bio_add_pc_page(struct request_queue *, struct bio *, struct page *,
|
||||||
unsigned int, unsigned int);
|
unsigned int, unsigned int);
|
||||||
extern int bio_get_nr_vecs(struct block_device *);
|
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 *,
|
extern struct bio *bio_map_user(struct request_queue *, struct block_device *,
|
||||||
unsigned long, unsigned int, int, gfp_t);
|
unsigned long, unsigned int, int, gfp_t);
|
||||||
struct sg_iovec;
|
struct sg_iovec;
|
||||||
|
Reference in New Issue
Block a user