11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved.
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This file is released under the GPL.
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef DM_BIO_RECORD_H
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DM_BIO_RECORD_H
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/bio.h>
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * There are lots of mutable fields in the bio struct that get
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * changed by the lower levels of the block layer.  Some targets,
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * such as multipath, may wish to resubmit a bio on error.  The
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * functions in this file help the target record and restore the
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * original bio state.
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
19a920f6b3accc77d9dddbc98a7426be23ee479625Mikulas Patocka
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct dm_bio_details {
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct block_device *bi_bdev;
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long bi_flags;
2375d5d8156500cd3833d66806889372e294af514dKent Overstreet	struct bvec_iter bi_iter;
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void dm_bio_record(struct dm_bio_details *bd, struct bio *bio)
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bd->bi_bdev = bio->bi_bdev;
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bd->bi_flags = bio->bi_flags;
3075d5d8156500cd3833d66806889372e294af514dKent Overstreet	bd->bi_iter = bio->bi_iter;
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void dm_bio_restore(struct dm_bio_details *bd, struct bio *bio)
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bio->bi_bdev = bd->bi_bdev;
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bio->bi_flags = bd->bi_flags;
3775d5d8156500cd3833d66806889372e294af514dKent Overstreet	bio->bi_iter = bd->bi_iter;
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
41