bmap.h 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * bmap.h - NILFS block mapping.
  4. *
  5. * Copyright (C) 2006-2008 Nippon Telegraph and Telephone Corporation.
  6. *
  7. * Written by Koji Sato.
  8. */
  9. #ifndef _NILFS_BMAP_H
  10. #define _NILFS_BMAP_H
  11. #include <linux/types.h>
  12. #include <linux/fs.h>
  13. #include <linux/buffer_head.h>
  14. #include <linux/nilfs2_ondisk.h> /* nilfs_binfo, nilfs_inode, etc */
  15. #include "alloc.h"
  16. #include "dat.h"
  17. #define NILFS_BMAP_INVALID_PTR 0
  18. #define nilfs_bmap_keydiff_abs(diff) ((diff) < 0 ? -(diff) : (diff))
  19. struct nilfs_bmap;
  20. /**
  21. * union nilfs_bmap_ptr_req - request for bmap ptr
  22. * @bpr_ptr: bmap pointer
  23. * @bpr_req: request for persistent allocator
  24. */
  25. union nilfs_bmap_ptr_req {
  26. __u64 bpr_ptr;
  27. struct nilfs_palloc_req bpr_req;
  28. };
  29. /**
  30. * struct nilfs_bmap_stats - bmap statistics
  31. * @bs_nblocks: number of blocks created or deleted
  32. */
  33. struct nilfs_bmap_stats {
  34. unsigned int bs_nblocks;
  35. };
  36. /**
  37. * struct nilfs_bmap_operations - bmap operation table
  38. */
  39. struct nilfs_bmap_operations {
  40. int (*bop_lookup)(const struct nilfs_bmap *, __u64, int, __u64 *);
  41. int (*bop_lookup_contig)(const struct nilfs_bmap *, __u64, __u64 *,
  42. unsigned int);
  43. int (*bop_insert)(struct nilfs_bmap *, __u64, __u64);
  44. int (*bop_delete)(struct nilfs_bmap *, __u64);
  45. void (*bop_clear)(struct nilfs_bmap *);
  46. int (*bop_propagate)(struct nilfs_bmap *, struct buffer_head *);
  47. void (*bop_lookup_dirty_buffers)(struct nilfs_bmap *,
  48. struct list_head *);
  49. int (*bop_assign)(struct nilfs_bmap *,
  50. struct buffer_head **,
  51. sector_t,
  52. union nilfs_binfo *);
  53. int (*bop_mark)(struct nilfs_bmap *, __u64, int);
  54. int (*bop_seek_key)(const struct nilfs_bmap *, __u64, __u64 *);
  55. int (*bop_last_key)(const struct nilfs_bmap *, __u64 *);
  56. /* The following functions are internal use only. */
  57. int (*bop_check_insert)(const struct nilfs_bmap *, __u64);
  58. int (*bop_check_delete)(struct nilfs_bmap *, __u64);
  59. int (*bop_gather_data)(struct nilfs_bmap *, __u64 *, __u64 *, int);
  60. };
  61. #define NILFS_BMAP_SIZE (NILFS_INODE_BMAP_SIZE * sizeof(__le64))
  62. #define NILFS_BMAP_KEY_BIT (sizeof(unsigned long) * 8 /* CHAR_BIT */)
  63. #define NILFS_BMAP_NEW_PTR_INIT \
  64. (1UL << (sizeof(unsigned long) * 8 /* CHAR_BIT */ - 1))
  65. static inline int nilfs_bmap_is_new_ptr(unsigned long ptr)
  66. {
  67. return !!(ptr & NILFS_BMAP_NEW_PTR_INIT);
  68. }
  69. /**
  70. * struct nilfs_bmap - bmap structure
  71. * @b_u: raw data
  72. * @b_sem: semaphore
  73. * @b_inode: owner of bmap
  74. * @b_ops: bmap operation table
  75. * @b_last_allocated_key: last allocated key for data block
  76. * @b_last_allocated_ptr: last allocated ptr for data block
  77. * @b_ptr_type: pointer type
  78. * @b_state: state
  79. * @b_nchildren_per_block: maximum number of child nodes for non-root nodes
  80. */
  81. struct nilfs_bmap {
  82. union {
  83. __u8 u_flags;
  84. __le64 u_data[NILFS_BMAP_SIZE / sizeof(__le64)];
  85. } b_u;
  86. struct rw_semaphore b_sem;
  87. struct inode *b_inode;
  88. const struct nilfs_bmap_operations *b_ops;
  89. __u64 b_last_allocated_key;
  90. __u64 b_last_allocated_ptr;
  91. int b_ptr_type;
  92. int b_state;
  93. __u16 b_nchildren_per_block;
  94. };
  95. /* pointer type */
  96. #define NILFS_BMAP_PTR_P 0 /* physical block number (i.e. LBN) */
  97. #define NILFS_BMAP_PTR_VS 1 /*
  98. * virtual block number (single
  99. * version)
  100. */
  101. #define NILFS_BMAP_PTR_VM 2 /*
  102. * virtual block number (has multiple
  103. * versions)
  104. */
  105. #define NILFS_BMAP_PTR_U (-1) /* never perform pointer operations */
  106. #define NILFS_BMAP_USE_VBN(bmap) ((bmap)->b_ptr_type > 0)
  107. /* state */
  108. #define NILFS_BMAP_DIRTY 0x00000001
  109. /**
  110. * struct nilfs_bmap_store - shadow copy of bmap state
  111. * @data: cached raw block mapping of on-disk inode
  112. * @last_allocated_key: cached value of last allocated key for data block
  113. * @last_allocated_ptr: cached value of last allocated ptr for data block
  114. * @state: cached value of state field of bmap structure
  115. */
  116. struct nilfs_bmap_store {
  117. __le64 data[NILFS_BMAP_SIZE / sizeof(__le64)];
  118. __u64 last_allocated_key;
  119. __u64 last_allocated_ptr;
  120. int state;
  121. };
  122. int nilfs_bmap_test_and_clear_dirty(struct nilfs_bmap *);
  123. int nilfs_bmap_read(struct nilfs_bmap *, struct nilfs_inode *);
  124. void nilfs_bmap_write(struct nilfs_bmap *, struct nilfs_inode *);
  125. int nilfs_bmap_lookup_contig(struct nilfs_bmap *, __u64, __u64 *, unsigned int);
  126. int nilfs_bmap_insert(struct nilfs_bmap *bmap, __u64 key, unsigned long rec);
  127. int nilfs_bmap_delete(struct nilfs_bmap *bmap, __u64 key);
  128. int nilfs_bmap_seek_key(struct nilfs_bmap *bmap, __u64 start, __u64 *keyp);
  129. int nilfs_bmap_last_key(struct nilfs_bmap *bmap, __u64 *keyp);
  130. int nilfs_bmap_truncate(struct nilfs_bmap *bmap, __u64 key);
  131. void nilfs_bmap_clear(struct nilfs_bmap *);
  132. int nilfs_bmap_propagate(struct nilfs_bmap *, struct buffer_head *);
  133. void nilfs_bmap_lookup_dirty_buffers(struct nilfs_bmap *, struct list_head *);
  134. int nilfs_bmap_assign(struct nilfs_bmap *, struct buffer_head **,
  135. unsigned long, union nilfs_binfo *);
  136. int nilfs_bmap_lookup_at_level(struct nilfs_bmap *, __u64, int, __u64 *);
  137. int nilfs_bmap_mark(struct nilfs_bmap *, __u64, int);
  138. void nilfs_bmap_init_gc(struct nilfs_bmap *);
  139. void nilfs_bmap_save(const struct nilfs_bmap *, struct nilfs_bmap_store *);
  140. void nilfs_bmap_restore(struct nilfs_bmap *, const struct nilfs_bmap_store *);
  141. static inline int nilfs_bmap_lookup(struct nilfs_bmap *bmap, __u64 key,
  142. __u64 *ptr)
  143. {
  144. return nilfs_bmap_lookup_at_level(bmap, key, 1, ptr);
  145. }
  146. /*
  147. * Internal use only
  148. */
  149. struct inode *nilfs_bmap_get_dat(const struct nilfs_bmap *);
  150. static inline int nilfs_bmap_prepare_alloc_ptr(struct nilfs_bmap *bmap,
  151. union nilfs_bmap_ptr_req *req,
  152. struct inode *dat)
  153. {
  154. if (dat)
  155. return nilfs_dat_prepare_alloc(dat, &req->bpr_req);
  156. /* ignore target ptr */
  157. req->bpr_ptr = bmap->b_last_allocated_ptr++;
  158. return 0;
  159. }
  160. static inline void nilfs_bmap_commit_alloc_ptr(struct nilfs_bmap *bmap,
  161. union nilfs_bmap_ptr_req *req,
  162. struct inode *dat)
  163. {
  164. if (dat)
  165. nilfs_dat_commit_alloc(dat, &req->bpr_req);
  166. }
  167. static inline void nilfs_bmap_abort_alloc_ptr(struct nilfs_bmap *bmap,
  168. union nilfs_bmap_ptr_req *req,
  169. struct inode *dat)
  170. {
  171. if (dat)
  172. nilfs_dat_abort_alloc(dat, &req->bpr_req);
  173. else
  174. bmap->b_last_allocated_ptr--;
  175. }
  176. static inline int nilfs_bmap_prepare_end_ptr(struct nilfs_bmap *bmap,
  177. union nilfs_bmap_ptr_req *req,
  178. struct inode *dat)
  179. {
  180. return dat ? nilfs_dat_prepare_end(dat, &req->bpr_req) : 0;
  181. }
  182. static inline void nilfs_bmap_commit_end_ptr(struct nilfs_bmap *bmap,
  183. union nilfs_bmap_ptr_req *req,
  184. struct inode *dat)
  185. {
  186. if (dat)
  187. nilfs_dat_commit_end(dat, &req->bpr_req,
  188. bmap->b_ptr_type == NILFS_BMAP_PTR_VS);
  189. }
  190. static inline void nilfs_bmap_abort_end_ptr(struct nilfs_bmap *bmap,
  191. union nilfs_bmap_ptr_req *req,
  192. struct inode *dat)
  193. {
  194. if (dat)
  195. nilfs_dat_abort_end(dat, &req->bpr_req);
  196. }
  197. static inline void nilfs_bmap_set_target_v(struct nilfs_bmap *bmap, __u64 key,
  198. __u64 ptr)
  199. {
  200. bmap->b_last_allocated_key = key;
  201. bmap->b_last_allocated_ptr = ptr;
  202. }
  203. __u64 nilfs_bmap_data_get_key(const struct nilfs_bmap *,
  204. const struct buffer_head *);
  205. __u64 nilfs_bmap_find_target_seq(const struct nilfs_bmap *, __u64);
  206. __u64 nilfs_bmap_find_target_in_group(const struct nilfs_bmap *);
  207. /* Assume that bmap semaphore is locked. */
  208. static inline int nilfs_bmap_dirty(const struct nilfs_bmap *bmap)
  209. {
  210. return !!(bmap->b_state & NILFS_BMAP_DIRTY);
  211. }
  212. /* Assume that bmap semaphore is locked. */
  213. static inline void nilfs_bmap_set_dirty(struct nilfs_bmap *bmap)
  214. {
  215. bmap->b_state |= NILFS_BMAP_DIRTY;
  216. }
  217. /* Assume that bmap semaphore is locked. */
  218. static inline void nilfs_bmap_clear_dirty(struct nilfs_bmap *bmap)
  219. {
  220. bmap->b_state &= ~NILFS_BMAP_DIRTY;
  221. }
  222. #define NILFS_BMAP_LARGE 0x1
  223. #define NILFS_BMAP_SMALL_LOW NILFS_DIRECT_KEY_MIN
  224. #define NILFS_BMAP_SMALL_HIGH NILFS_DIRECT_KEY_MAX
  225. #define NILFS_BMAP_LARGE_LOW NILFS_BTREE_ROOT_NCHILDREN_MAX
  226. #define NILFS_BMAP_LARGE_HIGH NILFS_BTREE_KEY_MAX
  227. #endif /* _NILFS_BMAP_H */