|
@@ -310,6 +310,43 @@ static inline void bio_clear_flag(struct bio *bio, unsigned int bit)
|
|
|
bio->bi_flags &= ~(1U << bit);
|
|
|
}
|
|
|
|
|
|
+static inline void bio_get_first_bvec(struct bio *bio, struct bio_vec *bv)
|
|
|
+{
|
|
|
+ *bv = bio_iovec(bio);
|
|
|
+}
|
|
|
+
|
|
|
+static inline void bio_get_last_bvec(struct bio *bio, struct bio_vec *bv)
|
|
|
+{
|
|
|
+ struct bvec_iter iter = bio->bi_iter;
|
|
|
+ int idx;
|
|
|
+
|
|
|
+ if (!bio_flagged(bio, BIO_CLONED)) {
|
|
|
+ *bv = bio->bi_io_vec[bio->bi_vcnt - 1];
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (unlikely(!bio_multiple_segments(bio))) {
|
|
|
+ *bv = bio_iovec(bio);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ bio_advance_iter(bio, &iter, iter.bi_size);
|
|
|
+
|
|
|
+ if (!iter.bi_bvec_done)
|
|
|
+ idx = iter.bi_idx - 1;
|
|
|
+ else /* in the middle of bvec */
|
|
|
+ idx = iter.bi_idx;
|
|
|
+
|
|
|
+ *bv = bio->bi_io_vec[idx];
|
|
|
+
|
|
|
+ /*
|
|
|
+ * iter.bi_bvec_done records actual length of the last bvec
|
|
|
+ * if this bio ends in the middle of one io vector
|
|
|
+ */
|
|
|
+ if (iter.bi_bvec_done)
|
|
|
+ bv->bv_len = iter.bi_bvec_done;
|
|
|
+}
|
|
|
+
|
|
|
enum bip_flags {
|
|
|
BIP_BLOCK_INTEGRITY = 1 << 0, /* block layer owns integrity data */
|
|
|
BIP_MAPPED_INTEGRITY = 1 << 1, /* ref tag has been remapped */
|