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 Torvaldsstatic 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 Torvaldsstatic 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