dm-bio-record.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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_vec_details {
  17. #if PAGE_SIZE < 65536
  18. __u16 bv_len;
  19. __u16 bv_offset;
  20. #else
  21. unsigned bv_len;
  22. unsigned bv_offset;
  23. #endif
  24. };
  25. struct dm_bio_details {
  26. sector_t bi_sector;
  27. struct block_device *bi_bdev;
  28. unsigned int bi_size;
  29. unsigned short bi_idx;
  30. unsigned long bi_flags;
  31. struct dm_bio_vec_details bi_io_vec[BIO_MAX_PAGES];
  32. };
  33. static inline void dm_bio_record(struct dm_bio_details *bd, struct bio *bio)
  34. {
  35. unsigned i;
  36. bd->bi_sector = bio->bi_sector;
  37. bd->bi_bdev = bio->bi_bdev;
  38. bd->bi_size = bio->bi_size;
  39. bd->bi_idx = bio->bi_idx;
  40. bd->bi_flags = bio->bi_flags;
  41. for (i = 0; i < bio->bi_vcnt; i++) {
  42. bd->bi_io_vec[i].bv_len = bio->bi_io_vec[i].bv_len;
  43. bd->bi_io_vec[i].bv_offset = bio->bi_io_vec[i].bv_offset;
  44. }
  45. }
  46. static inline void dm_bio_restore(struct dm_bio_details *bd, struct bio *bio)
  47. {
  48. unsigned i;
  49. bio->bi_sector = bd->bi_sector;
  50. bio->bi_bdev = bd->bi_bdev;
  51. bio->bi_size = bd->bi_size;
  52. bio->bi_idx = bd->bi_idx;
  53. bio->bi_flags = bd->bi_flags;
  54. for (i = 0; i < bio->bi_vcnt; i++) {
  55. bio->bi_io_vec[i].bv_len = bd->bi_io_vec[i].bv_len;
  56. bio->bi_io_vec[i].bv_offset = bd->bi_io_vec[i].bv_offset;
  57. }
  58. }
  59. #endif