forked from Minki/linux
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:
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
|
@ -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…
Reference in New Issue
Block a user