From: Christoph Hellwig It's used by DM and MD and generally useful, so move the bio list helpers into bio.h. Signed-off-by: Christoph Hellwig Signed-off-by: Alasdair G Kergon --- drivers/md/dm-bio-list.h | 117 -------------------------------------------- drivers/md/dm-delay.c | 2 drivers/md/dm-mpath.c | 1 drivers/md/dm-raid1.c | 1 drivers/md/dm-region-hash.c | 1 drivers/md/dm-snap.c | 1 drivers/md/dm.c | 1 drivers/md/raid1.c | 1 drivers/md/raid10.c | 1 include/linux/bio.h | 109 ++++++++++++++++++++++++++++++++++++++++ 10 files changed, 109 insertions(+), 126 deletions(-) Index: linux-2.6.30-rc1/drivers/md/dm-bio-list.h =================================================================== --- linux-2.6.30-rc1.orig/drivers/md/dm-bio-list.h 2009-04-08 22:24:22.000000000 +0100 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,117 +0,0 @@ -/* - * 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 - -#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_add_head(struct bio_list *bl, struct bio *bio) -{ - bio->bi_next = bl->head; - - bl->head = bio; - - if (!bl->tail) - 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 Index: linux-2.6.30-rc1/drivers/md/dm-delay.c =================================================================== --- linux-2.6.30-rc1.orig/drivers/md/dm-delay.c 2009-04-08 22:24:22.000000000 +0100 +++ linux-2.6.30-rc1/drivers/md/dm-delay.c 2009-04-08 22:28:13.000000000 +0100 @@ -15,8 +15,6 @@ #include -#include "dm-bio-list.h" - #define DM_MSG_PREFIX "delay" struct delay_c { Index: linux-2.6.30-rc1/drivers/md/dm-mpath.c =================================================================== --- linux-2.6.30-rc1.orig/drivers/md/dm-mpath.c 2009-04-08 22:24:22.000000000 +0100 +++ linux-2.6.30-rc1/drivers/md/dm-mpath.c 2009-04-08 22:28:13.000000000 +0100 @@ -8,7 +8,6 @@ #include #include "dm-path-selector.h" -#include "dm-bio-list.h" #include "dm-bio-record.h" #include "dm-uevent.h" Index: linux-2.6.30-rc1/drivers/md/dm-raid1.c =================================================================== --- linux-2.6.30-rc1.orig/drivers/md/dm-raid1.c 2009-04-08 22:24:22.000000000 +0100 +++ linux-2.6.30-rc1/drivers/md/dm-raid1.c 2009-04-08 22:28:13.000000000 +0100 @@ -5,7 +5,6 @@ * This file is released under the GPL. */ -#include "dm-bio-list.h" #include "dm-bio-record.h" #include Index: linux-2.6.30-rc1/drivers/md/dm-region-hash.c =================================================================== --- linux-2.6.30-rc1.orig/drivers/md/dm-region-hash.c 2009-04-08 22:24:22.000000000 +0100 +++ linux-2.6.30-rc1/drivers/md/dm-region-hash.c 2009-04-08 22:28:13.000000000 +0100 @@ -14,7 +14,6 @@ #include #include "dm.h" -#include "dm-bio-list.h" #define DM_MSG_PREFIX "region hash" Index: linux-2.6.30-rc1/drivers/md/dm-snap.c =================================================================== --- linux-2.6.30-rc1.orig/drivers/md/dm-snap.c 2009-04-08 22:24:22.000000000 +0100 +++ linux-2.6.30-rc1/drivers/md/dm-snap.c 2009-04-08 22:28:13.000000000 +0100 @@ -22,7 +22,6 @@ #include #include "dm-exception-store.h" -#include "dm-bio-list.h" #define DM_MSG_PREFIX "snapshots" Index: linux-2.6.30-rc1/drivers/md/dm.c =================================================================== --- linux-2.6.30-rc1.orig/drivers/md/dm.c 2009-04-08 22:28:09.000000000 +0100 +++ linux-2.6.30-rc1/drivers/md/dm.c 2009-04-08 22:28:13.000000000 +0100 @@ -6,7 +6,6 @@ */ #include "dm.h" -#include "dm-bio-list.h" #include "dm-uevent.h" #include Index: linux-2.6.30-rc1/drivers/md/raid1.c =================================================================== --- linux-2.6.30-rc1.orig/drivers/md/raid1.c 2009-04-08 22:25:19.000000000 +0100 +++ linux-2.6.30-rc1/drivers/md/raid1.c 2009-04-08 22:28:13.000000000 +0100 @@ -35,7 +35,6 @@ #include #include #include "md.h" -#include "dm-bio-list.h" #include "raid1.h" #include "bitmap.h" Index: linux-2.6.30-rc1/drivers/md/raid10.c =================================================================== --- linux-2.6.30-rc1.orig/drivers/md/raid10.c 2009-04-08 22:24:22.000000000 +0100 +++ linux-2.6.30-rc1/drivers/md/raid10.c 2009-04-08 22:28:13.000000000 +0100 @@ -22,7 +22,6 @@ #include #include #include "md.h" -#include "dm-bio-list.h" #include "raid10.h" #include "bitmap.h" Index: linux-2.6.30-rc1/include/linux/bio.h =================================================================== --- linux-2.6.30-rc1.orig/include/linux/bio.h 2009-04-08 22:25:43.000000000 +0100 +++ linux-2.6.30-rc1/include/linux/bio.h 2009-04-08 22:28:13.000000000 +0100 @@ -504,6 +504,115 @@ static inline int bio_has_data(struct bi return bio && bio->bi_io_vec != NULL; } +/* + * BIO list managment for use by remapping drivers (e.g. DM or MD). + * + * A bio_list anchors a singly-linked list of bios chained through the bi_next + * member of the bio. The bio_list also caches the last list member to allow + * fast access to the tail. + */ +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_add_head(struct bio_list *bl, struct bio *bio) +{ + bio->bi_next = bl->head; + + bl->head = bio; + + if (!bl->tail) + 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; +} + #if defined(CONFIG_BLK_DEV_INTEGRITY) #define bip_vec_idx(bip, idx) (&(bip->bip_vec[(idx)]))