|  | /* | 
|  | * 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> | 
|  |  | 
|  | struct bio_list { | 
|  | struct bio *head; | 
|  | struct bio *tail; | 
|  | }; | 
|  |  | 
|  | static inline void bio_list_init(struct bio_list *bl) | 
|  | { | 
|  | bl->head = bl->tail = NULL; | 
|  | } | 
|  |  | 
|  | 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 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 |