dm-bio-record.h 1.4 KB

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