| /* |
| * Copyright (C) 2004 Red Hat UK Ltd. |
| * |
| * This file is released under the GPL. |
| */ |
| |
| #ifndef DM_BIO_LIST_H |
| #define DM_BIO_LIST_H |
| |
| #include <linux/bio.h> |
| |
| #ifdef CONFIG_BLOCK |
| |
| struct bio_list { |
| struct bio *head; |
| struct bio *tail; |
| }; |
| |
| static inline int bio_list_empty(const struct bio_list *bl) |
| { |
| return bl->head == NULL; |
| } |
| |
| static inline void bio_list_init(struct bio_list *bl) |
| { |
| bl->head = bl->tail = NULL; |
| } |
| |
| #define bio_list_for_each(bio, bl) \ |
| for (bio = (bl)->head; bio; 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) |
| { |
| bio->bi_next = NULL; |
| |
| if (bl->tail) |
| bl->tail->bi_next = bio; |
| else |
| bl->head = bio; |
| |
| bl->tail = bio; |
| } |
| |
| static inline void bio_list_merge(struct bio_list *bl, struct bio_list *bl2) |
| { |
| if (!bl2->head) |
| return; |
| |
| if (bl->tail) |
| bl->tail->bi_next = bl2->head; |
| else |
| bl->head = bl2->head; |
| |
| bl->tail = bl2->tail; |
| } |
| |
| static inline void bio_list_merge_head(struct bio_list *bl, |
| struct bio_list *bl2) |
| { |
| if (!bl2->head) |
| return; |
| |
| if (bl->head) |
| bl2->tail->bi_next = bl->head; |
| else |
| bl->tail = bl2->tail; |
| |
| bl->head = bl2->head; |
| } |
| |
| static inline struct bio *bio_list_pop(struct bio_list *bl) |
| { |
| struct bio *bio = bl->head; |
| |
| if (bio) { |
| bl->head = bl->head->bi_next; |
| if (!bl->head) |
| bl->tail = NULL; |
| |
| bio->bi_next = NULL; |
| } |
| |
| return bio; |
| } |
| |
| static inline struct bio *bio_list_get(struct bio_list *bl) |
| { |
| struct bio *bio = bl->head; |
| |
| bl->head = bl->tail = NULL; |
| |
| return bio; |
| } |
| |
| #endif /* CONFIG_BLOCK */ |
| #endif |