xref: /linux/drivers/md/dm-bio-record.h (revision 1b17159e52bb31f982f82a6278acd7fab1d3f67b)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved.
31da177e4SLinus Torvalds  *
41da177e4SLinus Torvalds  * This file is released under the GPL.
51da177e4SLinus Torvalds  */
61da177e4SLinus Torvalds 
71da177e4SLinus Torvalds #ifndef DM_BIO_RECORD_H
81da177e4SLinus Torvalds #define DM_BIO_RECORD_H
91da177e4SLinus Torvalds 
101da177e4SLinus Torvalds #include <linux/bio.h>
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds /*
131da177e4SLinus Torvalds  * There are lots of mutable fields in the bio struct that get
141da177e4SLinus Torvalds  * changed by the lower levels of the block layer.  Some targets,
151da177e4SLinus Torvalds  * such as multipath, may wish to resubmit a bio on error.  The
161da177e4SLinus Torvalds  * functions in this file help the target record and restore the
171da177e4SLinus Torvalds  * original bio state.
181da177e4SLinus Torvalds  */
19a920f6b3SMikulas Patocka 
201da177e4SLinus Torvalds struct dm_bio_details {
2174d46992SChristoph Hellwig 	struct gendisk *bi_disk;
2274d46992SChristoph Hellwig 	u8 bi_partno;
23*1b17159eSMike Snitzer 	int __bi_remaining;
241da177e4SLinus Torvalds 	unsigned long bi_flags;
2575d5d815SKent Overstreet 	struct bvec_iter bi_iter;
26*1b17159eSMike Snitzer 	bio_end_io_t *bi_end_io;
27*1b17159eSMike Snitzer #if defined(CONFIG_BLK_DEV_INTEGRITY)
28*1b17159eSMike Snitzer 	struct bio_integrity_payload *bi_integrity;
29*1b17159eSMike Snitzer #endif
301da177e4SLinus Torvalds };
311da177e4SLinus Torvalds 
321da177e4SLinus Torvalds static inline void dm_bio_record(struct dm_bio_details *bd, struct bio *bio)
331da177e4SLinus Torvalds {
3474d46992SChristoph Hellwig 	bd->bi_disk = bio->bi_disk;
3574d46992SChristoph Hellwig 	bd->bi_partno = bio->bi_partno;
361da177e4SLinus Torvalds 	bd->bi_flags = bio->bi_flags;
3775d5d815SKent Overstreet 	bd->bi_iter = bio->bi_iter;
38*1b17159eSMike Snitzer 	bd->__bi_remaining = atomic_read(&bio->__bi_remaining);
39*1b17159eSMike Snitzer 	bd->bi_end_io = bio->bi_end_io;
40*1b17159eSMike Snitzer #if defined(CONFIG_BLK_DEV_INTEGRITY)
41*1b17159eSMike Snitzer 	bd->bi_integrity = bio_integrity(bio);
42*1b17159eSMike Snitzer #endif
431da177e4SLinus Torvalds }
441da177e4SLinus Torvalds 
451da177e4SLinus Torvalds static inline void dm_bio_restore(struct dm_bio_details *bd, struct bio *bio)
461da177e4SLinus Torvalds {
4774d46992SChristoph Hellwig 	bio->bi_disk = bd->bi_disk;
4874d46992SChristoph Hellwig 	bio->bi_partno = bd->bi_partno;
491da177e4SLinus Torvalds 	bio->bi_flags = bd->bi_flags;
5075d5d815SKent Overstreet 	bio->bi_iter = bd->bi_iter;
51*1b17159eSMike Snitzer 	atomic_set(&bio->__bi_remaining, bd->__bi_remaining);
52*1b17159eSMike Snitzer 	bio->bi_end_io = bd->bi_end_io;
53*1b17159eSMike Snitzer #if defined(CONFIG_BLK_DEV_INTEGRITY)
54*1b17159eSMike Snitzer 	bio->bi_integrity = bd->bi_integrity;
55*1b17159eSMike Snitzer #endif
561da177e4SLinus Torvalds }
571da177e4SLinus Torvalds 
581da177e4SLinus Torvalds #endif
59