extent-io.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Crossported from btrfs-progs/extent_io.h
  4. *
  5. * Modification includes:
  6. * - extent_buffer:data
  7. * Use pointer to provide better alignment.
  8. * - Remove max_cache_size related interfaces
  9. * Includes free_extent_buffer_nocache()
  10. * As we don't cache eb in U-boot.
  11. * - Include headers
  12. *
  13. * Write related functions are kept as we still need to modify dummy extent
  14. * buffers even in RO environment.
  15. */
  16. #ifndef __BTRFS_EXTENT_IO_H__
  17. #define __BTRFS_EXTENT_IO_H__
  18. #include <linux/types.h>
  19. #include <linux/list.h>
  20. #include <linux/err.h>
  21. #include <linux/bitops.h>
  22. #include <fs_internal.h>
  23. #include "extent-cache.h"
  24. #define EXTENT_DIRTY (1U << 0)
  25. #define EXTENT_WRITEBACK (1U << 1)
  26. #define EXTENT_UPTODATE (1U << 2)
  27. #define EXTENT_LOCKED (1U << 3)
  28. #define EXTENT_NEW (1U << 4)
  29. #define EXTENT_DELALLOC (1U << 5)
  30. #define EXTENT_DEFRAG (1U << 6)
  31. #define EXTENT_DEFRAG_DONE (1U << 7)
  32. #define EXTENT_BUFFER_FILLED (1U << 8)
  33. #define EXTENT_CSUM (1U << 9)
  34. #define EXTENT_BAD_TRANSID (1U << 10)
  35. #define EXTENT_BUFFER_DUMMY (1U << 11)
  36. #define EXTENT_IOBITS (EXTENT_LOCKED | EXTENT_WRITEBACK)
  37. #define BLOCK_GROUP_DATA (1U << 1)
  38. #define BLOCK_GROUP_METADATA (1U << 2)
  39. #define BLOCK_GROUP_SYSTEM (1U << 4)
  40. /*
  41. * The extent buffer bitmap operations are done with byte granularity instead of
  42. * word granularity for two reasons:
  43. * 1. The bitmaps must be little-endian on disk.
  44. * 2. Bitmap items are not guaranteed to be aligned to a word and therefore a
  45. * single word in a bitmap may straddle two pages in the extent buffer.
  46. */
  47. #define BIT_BYTE(nr) ((nr) / BITS_PER_BYTE)
  48. #define BYTE_MASK ((1 << BITS_PER_BYTE) - 1)
  49. #define BITMAP_FIRST_BYTE_MASK(start) \
  50. ((BYTE_MASK << ((start) & (BITS_PER_BYTE - 1))) & BYTE_MASK)
  51. #define BITMAP_LAST_BYTE_MASK(nbits) \
  52. (BYTE_MASK >> (-(nbits) & (BITS_PER_BYTE - 1)))
  53. static inline int le_test_bit(int nr, const u8 *addr)
  54. {
  55. return 1U & (addr[BIT_BYTE(nr)] >> (nr & (BITS_PER_BYTE-1)));
  56. }
  57. struct btrfs_fs_info;
  58. struct extent_io_tree {
  59. struct cache_tree state;
  60. struct cache_tree cache;
  61. u64 cache_size;
  62. };
  63. struct extent_state {
  64. struct cache_extent cache_node;
  65. u64 start;
  66. u64 end;
  67. int refs;
  68. unsigned long state;
  69. u64 xprivate;
  70. };
  71. struct extent_buffer {
  72. struct cache_extent cache_node;
  73. u64 start;
  74. u32 len;
  75. int refs;
  76. u32 flags;
  77. struct btrfs_fs_info *fs_info;
  78. char *data;
  79. };
  80. static inline void extent_buffer_get(struct extent_buffer *eb)
  81. {
  82. eb->refs++;
  83. }
  84. void extent_io_tree_init(struct extent_io_tree *tree);
  85. void extent_io_tree_cleanup(struct extent_io_tree *tree);
  86. int set_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, int bits);
  87. int clear_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, int bits);
  88. int find_first_extent_bit(struct extent_io_tree *tree, u64 start,
  89. u64 *start_ret, u64 *end_ret, int bits);
  90. int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end,
  91. int bits, int filled);
  92. int set_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end);
  93. int clear_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end);
  94. static inline int set_extent_buffer_uptodate(struct extent_buffer *eb)
  95. {
  96. eb->flags |= EXTENT_UPTODATE;
  97. return 0;
  98. }
  99. static inline int clear_extent_buffer_uptodate(struct extent_buffer *eb)
  100. {
  101. eb->flags &= ~EXTENT_UPTODATE;
  102. return 0;
  103. }
  104. static inline int extent_buffer_uptodate(struct extent_buffer *eb)
  105. {
  106. if (!eb || IS_ERR(eb))
  107. return 0;
  108. if (eb->flags & EXTENT_UPTODATE)
  109. return 1;
  110. return 0;
  111. }
  112. int set_state_private(struct extent_io_tree *tree, u64 start, u64 xprivate);
  113. int get_state_private(struct extent_io_tree *tree, u64 start, u64 *xprivate);
  114. struct extent_buffer *find_extent_buffer(struct extent_io_tree *tree,
  115. u64 bytenr, u32 blocksize);
  116. struct extent_buffer *find_first_extent_buffer(struct extent_io_tree *tree,
  117. u64 start);
  118. struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
  119. u64 bytenr, u32 blocksize);
  120. struct extent_buffer *btrfs_clone_extent_buffer(struct extent_buffer *src);
  121. struct extent_buffer *alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info,
  122. u64 bytenr, u32 blocksize);
  123. void free_extent_buffer(struct extent_buffer *eb);
  124. int read_extent_from_disk(struct blk_desc *desc, struct disk_partition *part,
  125. u64 physical, struct extent_buffer *eb,
  126. unsigned long offset, unsigned long len);
  127. int memcmp_extent_buffer(const struct extent_buffer *eb, const void *ptrv,
  128. unsigned long start, unsigned long len);
  129. void read_extent_buffer(const struct extent_buffer *eb, void *dst,
  130. unsigned long start, unsigned long len);
  131. void write_extent_buffer(struct extent_buffer *eb, const void *src,
  132. unsigned long start, unsigned long len);
  133. void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src,
  134. unsigned long dst_offset, unsigned long src_offset,
  135. unsigned long len);
  136. void memmove_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset,
  137. unsigned long src_offset, unsigned long len);
  138. void memset_extent_buffer(struct extent_buffer *eb, char c,
  139. unsigned long start, unsigned long len);
  140. int extent_buffer_test_bit(struct extent_buffer *eb, unsigned long start,
  141. unsigned long nr);
  142. int set_extent_buffer_dirty(struct extent_buffer *eb);
  143. int clear_extent_buffer_dirty(struct extent_buffer *eb);
  144. void extent_buffer_bitmap_clear(struct extent_buffer *eb, unsigned long start,
  145. unsigned long pos, unsigned long len);
  146. void extent_buffer_bitmap_set(struct extent_buffer *eb, unsigned long start,
  147. unsigned long pos, unsigned long len);
  148. #endif