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