Skip to content

Commit

Permalink
block: move bio list helpers into bio.h
Browse files Browse the repository at this point in the history
It's used by DM and MD and generally useful, so move the bio list
helpers into bio.h.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Alasdair G Kergon <agk@redhat.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
  • Loading branch information
Christoph Hellwig authored and Jens Axboe committed Apr 15, 2009
1 parent 0882e8d commit 8f3d8ba
Show file tree
Hide file tree
Showing 10 changed files with 109 additions and 126 deletions.
117 changes: 0 additions & 117 deletions drivers/md/dm-bio-list.h

This file was deleted.

2 changes: 0 additions & 2 deletions drivers/md/dm-delay.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@

#include <linux/device-mapper.h>

#include "dm-bio-list.h"

#define DM_MSG_PREFIX "delay"

struct delay_c {
Expand Down
1 change: 0 additions & 1 deletion drivers/md/dm-mpath.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
#include <linux/device-mapper.h>

#include "dm-path-selector.h"
#include "dm-bio-list.h"
#include "dm-bio-record.h"
#include "dm-uevent.h"

Expand Down
1 change: 0 additions & 1 deletion drivers/md/dm-raid1.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
* This file is released under the GPL.
*/

#include "dm-bio-list.h"
#include "dm-bio-record.h"

#include <linux/init.h>
Expand Down
1 change: 0 additions & 1 deletion drivers/md/dm-region-hash.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
#include <linux/vmalloc.h>

#include "dm.h"
#include "dm-bio-list.h"

#define DM_MSG_PREFIX "region hash"

Expand Down
1 change: 0 additions & 1 deletion drivers/md/dm-snap.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
#include <linux/workqueue.h>

#include "dm-exception-store.h"
#include "dm-bio-list.h"

#define DM_MSG_PREFIX "snapshots"

Expand Down
1 change: 0 additions & 1 deletion drivers/md/dm.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
*/

#include "dm.h"
#include "dm-bio-list.h"
#include "dm-uevent.h"

#include <linux/init.h>
Expand Down
1 change: 0 additions & 1 deletion drivers/md/raid1.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
#include <linux/blkdev.h>
#include <linux/seq_file.h>
#include "md.h"
#include "dm-bio-list.h"
#include "raid1.h"
#include "bitmap.h"

Expand Down
1 change: 0 additions & 1 deletion drivers/md/raid10.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
#include <linux/blkdev.h>
#include <linux/seq_file.h>
#include "md.h"
#include "dm-bio-list.h"
#include "raid10.h"
#include "bitmap.h"

Expand Down
109 changes: 109 additions & 0 deletions include/linux/bio.h
Original file line number Diff line number Diff line change
Expand Up @@ -504,6 +504,115 @@ static inline int bio_has_data(struct bio *bio)
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)]))
Expand Down

0 comments on commit 8f3d8ba

Please sign in to comment.