1 /* 2 * Copyright (C) 2004 Red Hat UK Ltd. 3 * 4 * This file is released under the GPL. 5 */ 6 7 #ifndef DM_BIO_LIST_H 8 #define DM_BIO_LIST_H 9 10 #include <linux/bio.h> 11 12 #ifdef CONFIG_BLOCK 13 14 struct bio_list { 15 struct bio *head; 16 struct bio *tail; 17 }; 18 bio_list_empty(const struct bio_list * bl)19static inline int bio_list_empty(const struct bio_list *bl) 20 { 21 return bl->head == NULL; 22 } 23 bio_list_init(struct bio_list * bl)24static inline void bio_list_init(struct bio_list *bl) 25 { 26 bl->head = bl->tail = NULL; 27 } 28 29 #define bio_list_for_each(bio, bl) \ 30 for (bio = (bl)->head; bio; bio = bio->bi_next) 31 bio_list_size(const struct bio_list * bl)32static inline unsigned bio_list_size(const struct bio_list *bl) 33 { 34 unsigned sz = 0; 35 struct bio *bio; 36 37 bio_list_for_each(bio, bl) 38 sz++; 39 40 return sz; 41 } 42 bio_list_add(struct bio_list * bl,struct bio * bio)43static inline void bio_list_add(struct bio_list *bl, struct bio *bio) 44 { 45 bio->bi_next = NULL; 46 47 if (bl->tail) 48 bl->tail->bi_next = bio; 49 else 50 bl->head = bio; 51 52 bl->tail = bio; 53 } 54 bio_list_merge(struct bio_list * bl,struct bio_list * bl2)55static inline void bio_list_merge(struct bio_list *bl, struct bio_list *bl2) 56 { 57 if (!bl2->head) 58 return; 59 60 if (bl->tail) 61 bl->tail->bi_next = bl2->head; 62 else 63 bl->head = bl2->head; 64 65 bl->tail = bl2->tail; 66 } 67 bio_list_merge_head(struct bio_list * bl,struct bio_list * bl2)68static inline void bio_list_merge_head(struct bio_list *bl, 69 struct bio_list *bl2) 70 { 71 if (!bl2->head) 72 return; 73 74 if (bl->head) 75 bl2->tail->bi_next = bl->head; 76 else 77 bl->tail = bl2->tail; 78 79 bl->head = bl2->head; 80 } 81 bio_list_pop(struct bio_list * bl)82static inline struct bio *bio_list_pop(struct bio_list *bl) 83 { 84 struct bio *bio = bl->head; 85 86 if (bio) { 87 bl->head = bl->head->bi_next; 88 if (!bl->head) 89 bl->tail = NULL; 90 91 bio->bi_next = NULL; 92 } 93 94 return bio; 95 } 96 bio_list_get(struct bio_list * bl)97static inline struct bio *bio_list_get(struct bio_list *bl) 98 { 99 struct bio *bio = bl->head; 100 101 bl->head = bl->tail = NULL; 102 103 return bio; 104 } 105 106 #endif /* CONFIG_BLOCK */ 107 #endif 108