|
@@ -97,13 +97,46 @@
|
|
#define bio_offset(bio) bio_iter_offset((bio), (bio)->bi_iter)
|
|
#define bio_offset(bio) bio_iter_offset((bio), (bio)->bi_iter)
|
|
#define bio_iovec(bio) bio_iter_iovec((bio), (bio)->bi_iter)
|
|
#define bio_iovec(bio) bio_iter_iovec((bio), (bio)->bi_iter)
|
|
|
|
|
|
-#define bio_segments(bio) ((bio)->bi_vcnt - (bio)->bi_iter.bi_idx)
|
|
|
|
|
|
+#define bio_multiple_segments(bio) \
|
|
|
|
+ ((bio)->bi_iter.bi_size != bio_iovec(bio).bv_len)
|
|
#define bio_sectors(bio) ((bio)->bi_iter.bi_size >> 9)
|
|
#define bio_sectors(bio) ((bio)->bi_iter.bi_size >> 9)
|
|
#define bio_end_sector(bio) ((bio)->bi_iter.bi_sector + bio_sectors((bio)))
|
|
#define bio_end_sector(bio) ((bio)->bi_iter.bi_sector + bio_sectors((bio)))
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Check whether this bio carries any data or not. A NULL bio is allowed.
|
|
|
|
+ */
|
|
|
|
+static inline bool bio_has_data(struct bio *bio)
|
|
|
|
+{
|
|
|
|
+ if (bio &&
|
|
|
|
+ bio->bi_iter.bi_size &&
|
|
|
|
+ !(bio->bi_rw & REQ_DISCARD))
|
|
|
|
+ return true;
|
|
|
|
+
|
|
|
|
+ return false;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline bool bio_is_rw(struct bio *bio)
|
|
|
|
+{
|
|
|
|
+ if (!bio_has_data(bio))
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ if (bio->bi_rw & BIO_NO_ADVANCE_ITER_MASK)
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline bool bio_mergeable(struct bio *bio)
|
|
|
|
+{
|
|
|
|
+ if (bio->bi_rw & REQ_NOMERGE_FLAGS)
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
static inline unsigned int bio_cur_bytes(struct bio *bio)
|
|
static inline unsigned int bio_cur_bytes(struct bio *bio)
|
|
{
|
|
{
|
|
- if (bio->bi_vcnt)
|
|
|
|
|
|
+ if (bio_has_data(bio))
|
|
return bio_iovec(bio).bv_len;
|
|
return bio_iovec(bio).bv_len;
|
|
else /* dataless requests such as discard */
|
|
else /* dataless requests such as discard */
|
|
return bio->bi_iter.bi_size;
|
|
return bio->bi_iter.bi_size;
|
|
@@ -111,7 +144,7 @@ static inline unsigned int bio_cur_bytes(struct bio *bio)
|
|
|
|
|
|
static inline void *bio_data(struct bio *bio)
|
|
static inline void *bio_data(struct bio *bio)
|
|
{
|
|
{
|
|
- if (bio->bi_vcnt)
|
|
|
|
|
|
+ if (bio_has_data(bio))
|
|
return page_address(bio_page(bio)) + bio_offset(bio);
|
|
return page_address(bio_page(bio)) + bio_offset(bio);
|
|
|
|
|
|
return NULL;
|
|
return NULL;
|
|
@@ -221,6 +254,18 @@ static inline void bio_advance_iter(struct bio *bio, struct bvec_iter *iter,
|
|
|
|
|
|
#define bio_iter_last(bvec, iter) ((iter).bi_size == (bvec).bv_len)
|
|
#define bio_iter_last(bvec, iter) ((iter).bi_size == (bvec).bv_len)
|
|
|
|
|
|
|
|
+static inline unsigned bio_segments(struct bio *bio)
|
|
|
|
+{
|
|
|
|
+ unsigned segs = 0;
|
|
|
|
+ struct bio_vec bv;
|
|
|
|
+ struct bvec_iter iter;
|
|
|
|
+
|
|
|
|
+ bio_for_each_segment(bv, bio, iter)
|
|
|
|
+ segs++;
|
|
|
|
+
|
|
|
|
+ return segs;
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* get a reference to a bio, so it won't disappear. the intended use is
|
|
* get a reference to a bio, so it won't disappear. the intended use is
|
|
* something like:
|
|
* something like:
|
|
@@ -434,36 +479,6 @@ static inline char *__bio_kmap_irq(struct bio *bio, unsigned short idx,
|
|
__bio_kmap_irq((bio), (bio)->bi_iter.bi_idx, (flags))
|
|
__bio_kmap_irq((bio), (bio)->bi_iter.bi_idx, (flags))
|
|
#define bio_kunmap_irq(buf,flags) __bio_kunmap_irq(buf, flags)
|
|
#define bio_kunmap_irq(buf,flags) __bio_kunmap_irq(buf, flags)
|
|
|
|
|
|
-/*
|
|
|
|
- * Check whether this bio carries any data or not. A NULL bio is allowed.
|
|
|
|
- */
|
|
|
|
-static inline bool bio_has_data(struct bio *bio)
|
|
|
|
-{
|
|
|
|
- if (bio && bio->bi_vcnt)
|
|
|
|
- return true;
|
|
|
|
-
|
|
|
|
- return false;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static inline bool bio_is_rw(struct bio *bio)
|
|
|
|
-{
|
|
|
|
- if (!bio_has_data(bio))
|
|
|
|
- return false;
|
|
|
|
-
|
|
|
|
- if (bio->bi_rw & REQ_WRITE_SAME)
|
|
|
|
- return false;
|
|
|
|
-
|
|
|
|
- return true;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static inline bool bio_mergeable(struct bio *bio)
|
|
|
|
-{
|
|
|
|
- if (bio->bi_rw & REQ_NOMERGE_FLAGS)
|
|
|
|
- return false;
|
|
|
|
-
|
|
|
|
- return true;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* BIO list management for use by remapping drivers (e.g. DM or MD) and loop.
|
|
* BIO list management for use by remapping drivers (e.g. DM or MD) and loop.
|
|
*
|
|
*
|