ctree.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #ifndef __CTREE__
  2. #define __CTREE__
  3. #define CTREE_BLOCKSIZE 256
  4. struct key {
  5. u64 objectid;
  6. u32 flags;
  7. u64 offset;
  8. } __attribute__ ((__packed__));
  9. struct header {
  10. u64 fsid[2]; /* FS specific uuid */
  11. u64 blocknr;
  12. u64 parentid;
  13. u32 csum;
  14. u32 ham;
  15. u16 nritems;
  16. u16 flags;
  17. } __attribute__ ((__packed__));
  18. #define NODEPTRS_PER_BLOCK ((CTREE_BLOCKSIZE - sizeof(struct header)) / \
  19. (sizeof(struct key) + sizeof(u64)))
  20. #define MAX_LEVEL 8
  21. #define node_level(f) ((f) & (MAX_LEVEL-1))
  22. #define is_leaf(f) (node_level(f) == 0)
  23. struct tree_buffer;
  24. struct ctree_root {
  25. struct tree_buffer *node;
  26. struct ctree_root *extent_root;
  27. struct key current_insert;
  28. int fp;
  29. struct radix_tree_root cache_radix;
  30. };
  31. struct ctree_root_info {
  32. u64 fsid[2]; /* FS specific uuid */
  33. u64 blocknr; /* blocknr of this block */
  34. u64 objectid; /* inode number of this root */
  35. u64 tree_root; /* the tree root */
  36. u32 csum;
  37. u32 ham;
  38. u64 snapuuid[2]; /* root specific uuid */
  39. } __attribute__ ((__packed__));
  40. struct ctree_super_block {
  41. struct ctree_root_info root_info;
  42. struct ctree_root_info extent_info;
  43. } __attribute__ ((__packed__));
  44. struct item {
  45. struct key key;
  46. u16 offset;
  47. u16 size;
  48. } __attribute__ ((__packed__));
  49. #define LEAF_DATA_SIZE (CTREE_BLOCKSIZE - sizeof(struct header))
  50. struct leaf {
  51. struct header header;
  52. union {
  53. struct item items[LEAF_DATA_SIZE/sizeof(struct item)];
  54. u8 data[CTREE_BLOCKSIZE-sizeof(struct header)];
  55. };
  56. } __attribute__ ((__packed__));
  57. struct node {
  58. struct header header;
  59. struct key keys[NODEPTRS_PER_BLOCK];
  60. u64 blockptrs[NODEPTRS_PER_BLOCK];
  61. } __attribute__ ((__packed__));
  62. struct extent_item {
  63. u32 refs;
  64. u64 owner;
  65. } __attribute__ ((__packed__));
  66. struct ctree_path {
  67. struct tree_buffer *nodes[MAX_LEVEL];
  68. int slots[MAX_LEVEL];
  69. };
  70. #endif