dm-bio-record.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. /*
  10. * There are lots of mutable fields in the bio struct that get
  11. * changed by the lower levels of the block layer. Some targets,
  12. * such as multipath, may wish to resubmit a bio on error. The
  13. * functions in this file help the target record and restore the
  14. * original bio state.
  15. */
  16. struct dm_bio_details {
  17. struct gendisk *bi_disk;
  18. u8 bi_partno;
  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_disk = bio->bi_disk;
  30. bd->bi_partno = bio->bi_partno;
  31. bd->bi_flags = bio->bi_flags;
  32. bd->bi_iter = bio->bi_iter;
  33. bd->__bi_remaining = atomic_read(&bio->__bi_remaining);
  34. bd->bi_end_io = bio->bi_end_io;
  35. #if defined(CONFIG_BLK_DEV_INTEGRITY)
  36. bd->bi_integrity = bio_integrity(bio);
  37. #endif
  38. }
  39. static inline void dm_bio_restore(struct dm_bio_details *bd, struct bio *bio)
  40. {
  41. bio->bi_disk = bd->bi_disk;
  42. bio->bi_partno = bd->bi_partno;
  43. bio->bi_flags = bd->bi_flags;
  44. bio->bi_iter = bd->bi_iter;
  45. atomic_set(&bio->__bi_remaining, bd->__bi_remaining);
  46. bio->bi_end_io = bd->bi_end_io;
  47. #if defined(CONFIG_BLK_DEV_INTEGRITY)
  48. bio->bi_integrity = bd->bi_integrity;
  49. #endif
  50. }
  51. #endif