Branch data Line data Source code
1 : : /* 2 : : * Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved. 3 : : * 4 : : * This file is released under the GPL. 5 : : */ 6 : : 7 : : #ifndef DM_BIO_RECORD_H 8 : : #define DM_BIO_RECORD_H 9 : : 10 : : #include <linux/bio.h> 11 : : 12 : : /* 13 : : * There are lots of mutable fields in the bio struct that get 14 : : * changed by the lower levels of the block layer. Some targets, 15 : : * such as multipath, may wish to resubmit a bio on error. The 16 : : * functions in this file help the target record and restore the 17 : : * original bio state. 18 : : */ 19 : : 20 : : struct dm_bio_details { 21 : : struct gendisk *bi_disk; 22 : : u8 bi_partno; 23 : : int __bi_remaining; 24 : : unsigned long bi_flags; 25 : : struct bvec_iter bi_iter; 26 : : bio_end_io_t *bi_end_io; 27 : : #if defined(CONFIG_BLK_DEV_INTEGRITY) 28 : : struct bio_integrity_payload *bi_integrity; 29 : : #endif 30 : : }; 31 : : 32 : 0 : static inline void dm_bio_record(struct dm_bio_details *bd, struct bio *bio) 33 : : { 34 : 0 : bd->bi_disk = bio->bi_disk; 35 : 0 : bd->bi_partno = bio->bi_partno; 36 : 0 : bd->bi_flags = bio->bi_flags; 37 : 0 : bd->bi_iter = bio->bi_iter; 38 : 0 : bd->__bi_remaining = atomic_read(&bio->__bi_remaining); 39 : 0 : bd->bi_end_io = bio->bi_end_io; 40 : : #if defined(CONFIG_BLK_DEV_INTEGRITY) 41 : : bd->bi_integrity = bio_integrity(bio); 42 : : #endif 43 : 0 : } 44 : : 45 : 0 : static inline void dm_bio_restore(struct dm_bio_details *bd, struct bio *bio) 46 : : { 47 : 0 : bio->bi_disk = bd->bi_disk; 48 : 0 : bio->bi_partno = bd->bi_partno; 49 : 0 : bio->bi_flags = bd->bi_flags; 50 : 0 : bio->bi_iter = bd->bi_iter; 51 : 0 : atomic_set(&bio->__bi_remaining, bd->__bi_remaining); 52 : 0 : bio->bi_end_io = bd->bi_end_io; 53 : : #if defined(CONFIG_BLK_DEV_INTEGRITY) 54 : : bio->bi_integrity = bd->bi_integrity; 55 : : #endif 56 : 0 : } 57 : : 58 : : #endif