|
@@ -8,17 +8,43 @@
|
|
#define DM_BIO_LIST_H
|
|
#define DM_BIO_LIST_H
|
|
|
|
|
|
#include <linux/bio.h>
|
|
#include <linux/bio.h>
|
|
|
|
+#include <linux/prefetch.h>
|
|
|
|
|
|
struct bio_list {
|
|
struct bio_list {
|
|
struct bio *head;
|
|
struct bio *head;
|
|
struct bio *tail;
|
|
struct bio *tail;
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static inline int bio_list_empty(const struct bio_list *bl)
|
|
|
|
+{
|
|
|
|
+ return bl->head == NULL;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#define BIO_LIST_INIT { .head = NULL, .tail = NULL }
|
|
|
|
+
|
|
|
|
+#define BIO_LIST(bl) \
|
|
|
|
+ struct bio_list bl = BIO_LIST_INIT
|
|
|
|
+
|
|
static inline void bio_list_init(struct bio_list *bl)
|
|
static inline void bio_list_init(struct bio_list *bl)
|
|
{
|
|
{
|
|
bl->head = bl->tail = NULL;
|
|
bl->head = bl->tail = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#define bio_list_for_each(bio, bl) \
|
|
|
|
+ for (bio = (bl)->head; bio && ({ prefetch(bio->bi_next); 1; }); \
|
|
|
|
+ bio = bio->bi_next)
|
|
|
|
+
|
|
|
|
+static inline unsigned bio_list_size(const struct bio_list *bl)
|
|
|
|
+{
|
|
|
|
+ unsigned sz = 0;
|
|
|
|
+ struct bio *bio;
|
|
|
|
+
|
|
|
|
+ bio_list_for_each(bio, bl)
|
|
|
|
+ sz++;
|
|
|
|
+
|
|
|
|
+ return sz;
|
|
|
|
+}
|
|
|
|
+
|
|
static inline void bio_list_add(struct bio_list *bl, struct bio *bio)
|
|
static inline void bio_list_add(struct bio_list *bl, struct bio *bio)
|
|
{
|
|
{
|
|
bio->bi_next = NULL;
|
|
bio->bi_next = NULL;
|