|
@@ -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.
|