diff options
author | Mark Brown <broonie@kernel.org> | 2016-03-21 17:08:52 +0000 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2016-03-21 17:08:52 +0000 |
commit | 5c1af2f870ab94f94f9dff231c6f18845e5a800a (patch) | |
tree | 9cebefa529103691eab8561449c00d43d6420b34 /include/linux/bio.h | |
parent | c35983d487b56c023b70d6727ad002b19f935827 (diff) | |
parent | 917a9133a6b3c6cc2b6b5649d28c617a4ccac3e6 (diff) |
Merge branch 'linux-linaro-lsk-v4.4' into linux-linaro-lsk-v4.4-rtlsk-v4.4-16.03-rt
Diffstat (limited to 'include/linux/bio.h')
-rw-r--r-- | include/linux/bio.h | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/include/linux/bio.h b/include/linux/bio.h index b9b6e046b52e..fbe47bc700bd 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -310,6 +310,38 @@ 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 (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 */ |