xref: /linux/drivers/md/dm-bio-record.h (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
1*3bd94003SHeinz Mauelshagen /* SPDX-License-Identifier: GPL-2.0-only */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved.
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * This file is released under the GPL.
61da177e4SLinus Torvalds  */
71da177e4SLinus Torvalds 
81da177e4SLinus Torvalds #ifndef DM_BIO_RECORD_H
91da177e4SLinus Torvalds #define DM_BIO_RECORD_H
101da177e4SLinus Torvalds 
111da177e4SLinus Torvalds #include <linux/bio.h>
12fe45e630SChristoph Hellwig #include <linux/blk-integrity.h>
131da177e4SLinus Torvalds 
141da177e4SLinus Torvalds /*
151da177e4SLinus Torvalds  * There are lots of mutable fields in the bio struct that get
161da177e4SLinus Torvalds  * changed by the lower levels of the block layer.  Some targets,
171da177e4SLinus Torvalds  * such as multipath, may wish to resubmit a bio on error.  The
181da177e4SLinus Torvalds  * functions in this file help the target record and restore the
191da177e4SLinus Torvalds  * original bio state.
201da177e4SLinus Torvalds  */
21a920f6b3SMikulas Patocka 
221da177e4SLinus Torvalds struct dm_bio_details {
23309dca30SChristoph Hellwig 	struct block_device *bi_bdev;
241b17159eSMike Snitzer 	int __bi_remaining;
251da177e4SLinus Torvalds 	unsigned long bi_flags;
2675d5d815SKent Overstreet 	struct bvec_iter bi_iter;
271b17159eSMike Snitzer 	bio_end_io_t *bi_end_io;
281b17159eSMike Snitzer #if defined(CONFIG_BLK_DEV_INTEGRITY)
291b17159eSMike Snitzer 	struct bio_integrity_payload *bi_integrity;
301b17159eSMike Snitzer #endif
311da177e4SLinus Torvalds };
321da177e4SLinus Torvalds 
dm_bio_record(struct dm_bio_details * bd,struct bio * bio)331da177e4SLinus Torvalds static inline void dm_bio_record(struct dm_bio_details *bd, struct bio *bio)
341da177e4SLinus Torvalds {
35309dca30SChristoph Hellwig 	bd->bi_bdev = bio->bi_bdev;
361da177e4SLinus Torvalds 	bd->bi_flags = bio->bi_flags;
3775d5d815SKent Overstreet 	bd->bi_iter = bio->bi_iter;
381b17159eSMike Snitzer 	bd->__bi_remaining = atomic_read(&bio->__bi_remaining);
391b17159eSMike Snitzer 	bd->bi_end_io = bio->bi_end_io;
401b17159eSMike Snitzer #if defined(CONFIG_BLK_DEV_INTEGRITY)
411b17159eSMike Snitzer 	bd->bi_integrity = bio_integrity(bio);
421b17159eSMike Snitzer #endif
431da177e4SLinus Torvalds }
441da177e4SLinus Torvalds 
dm_bio_restore(struct dm_bio_details * bd,struct bio * bio)451da177e4SLinus Torvalds static inline void dm_bio_restore(struct dm_bio_details *bd, struct bio *bio)
461da177e4SLinus Torvalds {
47309dca30SChristoph Hellwig 	bio->bi_bdev = bd->bi_bdev;
481da177e4SLinus Torvalds 	bio->bi_flags = bd->bi_flags;
4975d5d815SKent Overstreet 	bio->bi_iter = bd->bi_iter;
501b17159eSMike Snitzer 	atomic_set(&bio->__bi_remaining, bd->__bi_remaining);
511b17159eSMike Snitzer 	bio->bi_end_io = bd->bi_end_io;
521b17159eSMike Snitzer #if defined(CONFIG_BLK_DEV_INTEGRITY)
531b17159eSMike Snitzer 	bio->bi_integrity = bd->bi_integrity;
541b17159eSMike Snitzer #endif
551da177e4SLinus Torvalds }
561da177e4SLinus Torvalds 
571da177e4SLinus Torvalds #endif
58