dm-exception-store.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /*
  2. * Copyright (C) 2001-2002 Sistina Software (UK) Limited.
  3. * Copyright (C) 2008 Red Hat, Inc. All rights reserved.
  4. *
  5. * Device-mapper snapshot exception store.
  6. *
  7. * This file is released under the GPL.
  8. */
  9. #ifndef _LINUX_DM_EXCEPTION_STORE
  10. #define _LINUX_DM_EXCEPTION_STORE
  11. #include <linux/blkdev.h>
  12. #include <linux/device-mapper.h>
  13. /*
  14. * The snapshot code deals with largish chunks of the disk at a
  15. * time. Typically 32k - 512k.
  16. */
  17. typedef sector_t chunk_t;
  18. /*
  19. * An exception is used where an old chunk of data has been
  20. * replaced by a new one.
  21. * If chunk_t is 64 bits in size, the top 8 bits of new_chunk hold the number
  22. * of chunks that follow contiguously. Remaining bits hold the number of the
  23. * chunk within the device.
  24. */
  25. struct dm_snap_exception {
  26. struct list_head hash_list;
  27. chunk_t old_chunk;
  28. chunk_t new_chunk;
  29. };
  30. /*
  31. * Abstraction to handle the meta/layout of exception stores (the
  32. * COW device).
  33. */
  34. struct dm_exception_store {
  35. /*
  36. * Destroys this object when you've finished with it.
  37. */
  38. void (*destroy) (struct dm_exception_store *store);
  39. /*
  40. * The target shouldn't read the COW device until this is
  41. * called. As exceptions are read from the COW, they are
  42. * reported back via the callback.
  43. */
  44. int (*read_metadata) (struct dm_exception_store *store,
  45. int (*callback)(void *callback_context,
  46. chunk_t old, chunk_t new),
  47. void *callback_context);
  48. /*
  49. * Find somewhere to store the next exception.
  50. */
  51. int (*prepare_exception) (struct dm_exception_store *store,
  52. struct dm_snap_exception *e);
  53. /*
  54. * Update the metadata with this exception.
  55. */
  56. void (*commit_exception) (struct dm_exception_store *store,
  57. struct dm_snap_exception *e,
  58. void (*callback) (void *, int success),
  59. void *callback_context);
  60. /*
  61. * The snapshot is invalid, note this in the metadata.
  62. */
  63. void (*drop_snapshot) (struct dm_exception_store *store);
  64. int (*status) (struct dm_exception_store *store, status_type_t status,
  65. char *result, unsigned int maxlen);
  66. /*
  67. * Return how full the snapshot is.
  68. */
  69. void (*fraction_full) (struct dm_exception_store *store,
  70. sector_t *numerator,
  71. sector_t *denominator);
  72. struct dm_snapshot *snap;
  73. void *context;
  74. };
  75. /*
  76. * Funtions to manipulate consecutive chunks
  77. */
  78. # if defined(CONFIG_LBD) || (BITS_PER_LONG == 64)
  79. # define DM_CHUNK_CONSECUTIVE_BITS 8
  80. # define DM_CHUNK_NUMBER_BITS 56
  81. static inline chunk_t dm_chunk_number(chunk_t chunk)
  82. {
  83. return chunk & (chunk_t)((1ULL << DM_CHUNK_NUMBER_BITS) - 1ULL);
  84. }
  85. static inline unsigned dm_consecutive_chunk_count(struct dm_snap_exception *e)
  86. {
  87. return e->new_chunk >> DM_CHUNK_NUMBER_BITS;
  88. }
  89. static inline void dm_consecutive_chunk_count_inc(struct dm_snap_exception *e)
  90. {
  91. e->new_chunk += (1ULL << DM_CHUNK_NUMBER_BITS);
  92. BUG_ON(!dm_consecutive_chunk_count(e));
  93. }
  94. # else
  95. # define DM_CHUNK_CONSECUTIVE_BITS 0
  96. static inline chunk_t dm_chunk_number(chunk_t chunk)
  97. {
  98. return chunk;
  99. }
  100. static inline unsigned dm_consecutive_chunk_count(struct dm_snap_exception *e)
  101. {
  102. return 0;
  103. }
  104. static inline void dm_consecutive_chunk_count_inc(struct dm_snap_exception *e)
  105. {
  106. }
  107. # endif
  108. int dm_exception_store_init(void);
  109. void dm_exception_store_exit(void);
  110. /*
  111. * Two exception store implementations.
  112. */
  113. int dm_persistent_snapshot_init(void);
  114. void dm_persistent_snapshot_exit(void);
  115. int dm_transient_snapshot_init(void);
  116. void dm_transient_snapshot_exit(void);
  117. int dm_create_persistent(struct dm_exception_store *store);
  118. int dm_create_transient(struct dm_exception_store *store);
  119. #endif /* _LINUX_DM_EXCEPTION_STORE */