ctree.h 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * From linux/fs/btrfs/ctree.h
  4. * Copyright (C) 2007,2008 Oracle. All rights reserved.
  5. *
  6. * Modified in 2017 by Marek Behun, CZ.NIC, marek.behun@nic.cz
  7. */
  8. #ifndef __BTRFS_CTREE_H__
  9. #define __BTRFS_CTREE_H__
  10. #include <common.h>
  11. #include <compiler.h>
  12. #include <linux/rbtree.h>
  13. #include <linux/bug.h>
  14. #include <linux/unaligned/le_byteshift.h>
  15. #include <u-boot/crc.h>
  16. #include "kernel-shared/btrfs_tree.h"
  17. #include "crypto/hash.h"
  18. #include "compat.h"
  19. #include "extent-io.h"
  20. #define BTRFS_MAX_MIRRORS 3
  21. /*
  22. * the max metadata block size. This limit is somewhat artificial,
  23. * but the memmove costs go through the roof for larger blocks.
  24. */
  25. #define BTRFS_MAX_METADATA_BLOCKSIZE 65536
  26. /*
  27. * Theoretical limit is larger, but we keep this down to a sane
  28. * value. That should limit greatly the possibility of collisions on
  29. * inode ref items.
  30. */
  31. #define BTRFS_LINK_MAX 65535U
  32. /* four bytes for CRC32 */
  33. #define BTRFS_EMPTY_DIR_SIZE 0
  34. struct btrfs_mapping_tree {
  35. struct cache_tree cache_tree;
  36. };
  37. static inline unsigned long btrfs_chunk_item_size(int num_stripes)
  38. {
  39. BUG_ON(num_stripes == 0);
  40. return sizeof(struct btrfs_chunk) +
  41. sizeof(struct btrfs_stripe) * (num_stripes - 1);
  42. }
  43. #define __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct btrfs_header))
  44. #define BTRFS_LEAF_DATA_SIZE(fs_info) \
  45. (__BTRFS_LEAF_DATA_SIZE(fs_info->nodesize))
  46. struct btrfs_path {
  47. struct extent_buffer *nodes[BTRFS_MAX_LEVEL];
  48. int slots[BTRFS_MAX_LEVEL];
  49. /* keep some upper locks as we walk down */
  50. u8 lowest_level;
  51. };
  52. /* ioprio of readahead is set to idle */
  53. #define BTRFS_IOPRIO_READA (IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, 0))
  54. #define BTRFS_DIRTY_METADATA_THRESH SZ_32M
  55. #define BTRFS_MAX_EXTENT_SIZE SZ_128M
  56. enum btrfs_tree_block_status {
  57. BTRFS_TREE_BLOCK_CLEAN,
  58. BTRFS_TREE_BLOCK_INVALID_NRITEMS,
  59. BTRFS_TREE_BLOCK_INVALID_PARENT_KEY,
  60. BTRFS_TREE_BLOCK_BAD_KEY_ORDER,
  61. BTRFS_TREE_BLOCK_INVALID_LEVEL,
  62. BTRFS_TREE_BLOCK_INVALID_FREE_SPACE,
  63. BTRFS_TREE_BLOCK_INVALID_OFFSETS,
  64. };
  65. struct btrfs_root {
  66. struct extent_buffer *node;
  67. struct btrfs_root_item root_item;
  68. struct btrfs_key root_key;
  69. struct btrfs_fs_info *fs_info;
  70. u64 objectid;
  71. u64 last_trans;
  72. int ref_cows;
  73. int track_dirty;
  74. u32 type;
  75. u64 last_inode_alloc;
  76. struct rb_node rb_node;
  77. };
  78. struct btrfs_trans_handle;
  79. struct btrfs_device;
  80. struct btrfs_fs_devices;
  81. struct btrfs_fs_info {
  82. u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
  83. u8 *new_chunk_tree_uuid;
  84. struct btrfs_root *fs_root;
  85. struct btrfs_root *tree_root;
  86. struct btrfs_root *chunk_root;
  87. struct btrfs_root *csum_root;
  88. struct rb_root fs_root_tree;
  89. struct extent_io_tree extent_cache;
  90. /* logical->physical extent mapping */
  91. struct btrfs_mapping_tree mapping_tree;
  92. u64 last_trans_committed;
  93. struct btrfs_super_block *super_copy;
  94. struct btrfs_fs_devices *fs_devices;
  95. /* Cached block sizes */
  96. u32 nodesize;
  97. u32 sectorsize;
  98. u32 stripesize;
  99. };
  100. static inline u32 BTRFS_MAX_ITEM_SIZE(const struct btrfs_fs_info *info)
  101. {
  102. return BTRFS_LEAF_DATA_SIZE(info) - sizeof(struct btrfs_item);
  103. }
  104. static inline u32 BTRFS_NODEPTRS_PER_BLOCK(const struct btrfs_fs_info *info)
  105. {
  106. return BTRFS_LEAF_DATA_SIZE(info) / sizeof(struct btrfs_key_ptr);
  107. }
  108. static inline u32 BTRFS_NODEPTRS_PER_EXTENT_BUFFER(const struct extent_buffer *eb)
  109. {
  110. BUG_ON(eb->fs_info && eb->fs_info->nodesize != eb->len);
  111. return __BTRFS_LEAF_DATA_SIZE(eb->len) / sizeof(struct btrfs_key_ptr);
  112. }
  113. #define BTRFS_FILE_EXTENT_INLINE_DATA_START \
  114. (offsetof(struct btrfs_file_extent_item, disk_bytenr))
  115. static inline u32 BTRFS_MAX_INLINE_DATA_SIZE(const struct btrfs_fs_info *info)
  116. {
  117. return BTRFS_MAX_ITEM_SIZE(info) -
  118. BTRFS_FILE_EXTENT_INLINE_DATA_START;
  119. }
  120. static inline u32 BTRFS_MAX_XATTR_SIZE(const struct btrfs_fs_info *info)
  121. {
  122. return BTRFS_MAX_ITEM_SIZE(info) - sizeof(struct btrfs_dir_item);
  123. }
  124. /*
  125. * File system states
  126. */
  127. #define BTRFS_FS_STATE_ERROR 0
  128. #define BTRFS_FS_STATE_REMOUNTING 1
  129. #define BTRFS_FS_STATE_TRANS_ABORTED 2
  130. #define BTRFS_FS_STATE_DEV_REPLACING 3
  131. #define BTRFS_FS_STATE_DUMMY_FS_INFO 4
  132. #define read_eb_member(eb, ptr, type, member, result) ( \
  133. read_extent_buffer(eb, (char *)(result), \
  134. ((unsigned long)(ptr)) + \
  135. offsetof(type, member), \
  136. sizeof(((type *)0)->member)))
  137. #define write_eb_member(eb, ptr, type, member, result) ( \
  138. write_extent_buffer(eb, (char *)(result), \
  139. ((unsigned long)(ptr)) + \
  140. offsetof(type, member), \
  141. sizeof(((type *)0)->member)))
  142. #define BTRFS_SETGET_HEADER_FUNCS(name, type, member, bits) \
  143. static inline u##bits btrfs_##name(const struct extent_buffer *eb) \
  144. { \
  145. const struct btrfs_header *h = (struct btrfs_header *)eb->data; \
  146. return le##bits##_to_cpu(h->member); \
  147. } \
  148. static inline void btrfs_set_##name(struct extent_buffer *eb, \
  149. u##bits val) \
  150. { \
  151. struct btrfs_header *h = (struct btrfs_header *)eb->data; \
  152. h->member = cpu_to_le##bits(val); \
  153. }
  154. #define BTRFS_SETGET_FUNCS(name, type, member, bits) \
  155. static inline u##bits btrfs_##name(const struct extent_buffer *eb, \
  156. const type *s) \
  157. { \
  158. unsigned long offset = (unsigned long)s; \
  159. const type *p = (type *) (eb->data + offset); \
  160. return get_unaligned_le##bits(&p->member); \
  161. } \
  162. static inline void btrfs_set_##name(struct extent_buffer *eb, \
  163. type *s, u##bits val) \
  164. { \
  165. unsigned long offset = (unsigned long)s; \
  166. type *p = (type *) (eb->data + offset); \
  167. put_unaligned_le##bits(val, &p->member); \
  168. }
  169. #define BTRFS_SETGET_STACK_FUNCS(name, type, member, bits) \
  170. static inline u##bits btrfs_##name(const type *s) \
  171. { \
  172. return le##bits##_to_cpu(s->member); \
  173. } \
  174. static inline void btrfs_set_##name(type *s, u##bits val) \
  175. { \
  176. s->member = cpu_to_le##bits(val); \
  177. }
  178. BTRFS_SETGET_FUNCS(device_type, struct btrfs_dev_item, type, 64);
  179. BTRFS_SETGET_FUNCS(device_total_bytes, struct btrfs_dev_item, total_bytes, 64);
  180. BTRFS_SETGET_FUNCS(device_bytes_used, struct btrfs_dev_item, bytes_used, 64);
  181. BTRFS_SETGET_FUNCS(device_io_align, struct btrfs_dev_item, io_align, 32);
  182. BTRFS_SETGET_FUNCS(device_io_width, struct btrfs_dev_item, io_width, 32);
  183. BTRFS_SETGET_FUNCS(device_start_offset, struct btrfs_dev_item,
  184. start_offset, 64);
  185. BTRFS_SETGET_FUNCS(device_sector_size, struct btrfs_dev_item, sector_size, 32);
  186. BTRFS_SETGET_FUNCS(device_id, struct btrfs_dev_item, devid, 64);
  187. BTRFS_SETGET_FUNCS(device_group, struct btrfs_dev_item, dev_group, 32);
  188. BTRFS_SETGET_FUNCS(device_seek_speed, struct btrfs_dev_item, seek_speed, 8);
  189. BTRFS_SETGET_FUNCS(device_bandwidth, struct btrfs_dev_item, bandwidth, 8);
  190. BTRFS_SETGET_FUNCS(device_generation, struct btrfs_dev_item, generation, 64);
  191. BTRFS_SETGET_STACK_FUNCS(stack_device_type, struct btrfs_dev_item, type, 64);
  192. BTRFS_SETGET_STACK_FUNCS(stack_device_total_bytes, struct btrfs_dev_item,
  193. total_bytes, 64);
  194. BTRFS_SETGET_STACK_FUNCS(stack_device_bytes_used, struct btrfs_dev_item,
  195. bytes_used, 64);
  196. BTRFS_SETGET_STACK_FUNCS(stack_device_io_align, struct btrfs_dev_item,
  197. io_align, 32);
  198. BTRFS_SETGET_STACK_FUNCS(stack_device_io_width, struct btrfs_dev_item,
  199. io_width, 32);
  200. BTRFS_SETGET_STACK_FUNCS(stack_device_sector_size, struct btrfs_dev_item,
  201. sector_size, 32);
  202. BTRFS_SETGET_STACK_FUNCS(stack_device_id, struct btrfs_dev_item, devid, 64);
  203. BTRFS_SETGET_STACK_FUNCS(stack_device_group, struct btrfs_dev_item,
  204. dev_group, 32);
  205. BTRFS_SETGET_STACK_FUNCS(stack_device_seek_speed, struct btrfs_dev_item,
  206. seek_speed, 8);
  207. BTRFS_SETGET_STACK_FUNCS(stack_device_bandwidth, struct btrfs_dev_item,
  208. bandwidth, 8);
  209. BTRFS_SETGET_STACK_FUNCS(stack_device_generation, struct btrfs_dev_item,
  210. generation, 64);
  211. static inline char *btrfs_device_uuid(struct btrfs_dev_item *d)
  212. {
  213. return (char *)d + offsetof(struct btrfs_dev_item, uuid);
  214. }
  215. static inline char *btrfs_device_fsid(struct btrfs_dev_item *d)
  216. {
  217. return (char *)d + offsetof(struct btrfs_dev_item, fsid);
  218. }
  219. BTRFS_SETGET_FUNCS(chunk_length, struct btrfs_chunk, length, 64);
  220. BTRFS_SETGET_FUNCS(chunk_owner, struct btrfs_chunk, owner, 64);
  221. BTRFS_SETGET_FUNCS(chunk_stripe_len, struct btrfs_chunk, stripe_len, 64);
  222. BTRFS_SETGET_FUNCS(chunk_io_align, struct btrfs_chunk, io_align, 32);
  223. BTRFS_SETGET_FUNCS(chunk_io_width, struct btrfs_chunk, io_width, 32);
  224. BTRFS_SETGET_FUNCS(chunk_sector_size, struct btrfs_chunk, sector_size, 32);
  225. BTRFS_SETGET_FUNCS(chunk_type, struct btrfs_chunk, type, 64);
  226. BTRFS_SETGET_FUNCS(chunk_num_stripes, struct btrfs_chunk, num_stripes, 16);
  227. BTRFS_SETGET_FUNCS(chunk_sub_stripes, struct btrfs_chunk, sub_stripes, 16);
  228. BTRFS_SETGET_FUNCS(stripe_devid, struct btrfs_stripe, devid, 64);
  229. BTRFS_SETGET_FUNCS(stripe_offset, struct btrfs_stripe, offset, 64);
  230. static inline char *btrfs_stripe_dev_uuid(struct btrfs_stripe *s)
  231. {
  232. return (char *)s + offsetof(struct btrfs_stripe, dev_uuid);
  233. }
  234. BTRFS_SETGET_STACK_FUNCS(stack_chunk_length, struct btrfs_chunk, length, 64);
  235. BTRFS_SETGET_STACK_FUNCS(stack_chunk_owner, struct btrfs_chunk, owner, 64);
  236. BTRFS_SETGET_STACK_FUNCS(stack_chunk_stripe_len, struct btrfs_chunk,
  237. stripe_len, 64);
  238. BTRFS_SETGET_STACK_FUNCS(stack_chunk_io_align, struct btrfs_chunk,
  239. io_align, 32);
  240. BTRFS_SETGET_STACK_FUNCS(stack_chunk_io_width, struct btrfs_chunk,
  241. io_width, 32);
  242. BTRFS_SETGET_STACK_FUNCS(stack_chunk_sector_size, struct btrfs_chunk,
  243. sector_size, 32);
  244. BTRFS_SETGET_STACK_FUNCS(stack_chunk_type, struct btrfs_chunk, type, 64);
  245. BTRFS_SETGET_STACK_FUNCS(stack_chunk_num_stripes, struct btrfs_chunk,
  246. num_stripes, 16);
  247. BTRFS_SETGET_STACK_FUNCS(stack_chunk_sub_stripes, struct btrfs_chunk,
  248. sub_stripes, 16);
  249. BTRFS_SETGET_STACK_FUNCS(stack_stripe_devid, struct btrfs_stripe, devid, 64);
  250. BTRFS_SETGET_STACK_FUNCS(stack_stripe_offset, struct btrfs_stripe, offset, 64);
  251. static inline struct btrfs_stripe *btrfs_stripe_nr(struct btrfs_chunk *c,
  252. int nr)
  253. {
  254. unsigned long offset = (unsigned long)c;
  255. offset += offsetof(struct btrfs_chunk, stripe);
  256. offset += nr * sizeof(struct btrfs_stripe);
  257. return (struct btrfs_stripe *)offset;
  258. }
  259. static inline char *btrfs_stripe_dev_uuid_nr(struct btrfs_chunk *c, int nr)
  260. {
  261. return btrfs_stripe_dev_uuid(btrfs_stripe_nr(c, nr));
  262. }
  263. static inline u64 btrfs_stripe_offset_nr(struct extent_buffer *eb,
  264. struct btrfs_chunk *c, int nr)
  265. {
  266. return btrfs_stripe_offset(eb, btrfs_stripe_nr(c, nr));
  267. }
  268. static inline void btrfs_set_stripe_offset_nr(struct extent_buffer *eb,
  269. struct btrfs_chunk *c, int nr,
  270. u64 val)
  271. {
  272. btrfs_set_stripe_offset(eb, btrfs_stripe_nr(c, nr), val);
  273. }
  274. static inline u64 btrfs_stripe_devid_nr(struct extent_buffer *eb,
  275. struct btrfs_chunk *c, int nr)
  276. {
  277. return btrfs_stripe_devid(eb, btrfs_stripe_nr(c, nr));
  278. }
  279. static inline void btrfs_set_stripe_devid_nr(struct extent_buffer *eb,
  280. struct btrfs_chunk *c, int nr,
  281. u64 val)
  282. {
  283. btrfs_set_stripe_devid(eb, btrfs_stripe_nr(c, nr), val);
  284. }
  285. /* struct btrfs_block_group_item */
  286. BTRFS_SETGET_STACK_FUNCS(block_group_used, struct btrfs_block_group_item,
  287. used, 64);
  288. BTRFS_SETGET_FUNCS(disk_block_group_used, struct btrfs_block_group_item,
  289. used, 64);
  290. BTRFS_SETGET_STACK_FUNCS(block_group_chunk_objectid,
  291. struct btrfs_block_group_item, chunk_objectid, 64);
  292. BTRFS_SETGET_FUNCS(disk_block_group_chunk_objectid,
  293. struct btrfs_block_group_item, chunk_objectid, 64);
  294. BTRFS_SETGET_FUNCS(disk_block_group_flags,
  295. struct btrfs_block_group_item, flags, 64);
  296. BTRFS_SETGET_STACK_FUNCS(block_group_flags,
  297. struct btrfs_block_group_item, flags, 64);
  298. /* struct btrfs_free_space_info */
  299. BTRFS_SETGET_FUNCS(free_space_extent_count, struct btrfs_free_space_info,
  300. extent_count, 32);
  301. BTRFS_SETGET_FUNCS(free_space_flags, struct btrfs_free_space_info, flags, 32);
  302. /* struct btrfs_inode_ref */
  303. BTRFS_SETGET_FUNCS(inode_ref_name_len, struct btrfs_inode_ref, name_len, 16);
  304. BTRFS_SETGET_STACK_FUNCS(stack_inode_ref_name_len, struct btrfs_inode_ref, name_len, 16);
  305. BTRFS_SETGET_FUNCS(inode_ref_index, struct btrfs_inode_ref, index, 64);
  306. /* struct btrfs_inode_extref */
  307. BTRFS_SETGET_FUNCS(inode_extref_parent, struct btrfs_inode_extref,
  308. parent_objectid, 64);
  309. BTRFS_SETGET_FUNCS(inode_extref_name_len, struct btrfs_inode_extref,
  310. name_len, 16);
  311. BTRFS_SETGET_FUNCS(inode_extref_index, struct btrfs_inode_extref, index, 64);
  312. /* struct btrfs_inode_item */
  313. BTRFS_SETGET_FUNCS(inode_generation, struct btrfs_inode_item, generation, 64);
  314. BTRFS_SETGET_FUNCS(inode_sequence, struct btrfs_inode_item, sequence, 64);
  315. BTRFS_SETGET_FUNCS(inode_transid, struct btrfs_inode_item, transid, 64);
  316. BTRFS_SETGET_FUNCS(inode_size, struct btrfs_inode_item, size, 64);
  317. BTRFS_SETGET_FUNCS(inode_nbytes, struct btrfs_inode_item, nbytes, 64);
  318. BTRFS_SETGET_FUNCS(inode_block_group, struct btrfs_inode_item, block_group, 64);
  319. BTRFS_SETGET_FUNCS(inode_nlink, struct btrfs_inode_item, nlink, 32);
  320. BTRFS_SETGET_FUNCS(inode_uid, struct btrfs_inode_item, uid, 32);
  321. BTRFS_SETGET_FUNCS(inode_gid, struct btrfs_inode_item, gid, 32);
  322. BTRFS_SETGET_FUNCS(inode_mode, struct btrfs_inode_item, mode, 32);
  323. BTRFS_SETGET_FUNCS(inode_rdev, struct btrfs_inode_item, rdev, 64);
  324. BTRFS_SETGET_FUNCS(inode_flags, struct btrfs_inode_item, flags, 64);
  325. BTRFS_SETGET_STACK_FUNCS(stack_inode_generation,
  326. struct btrfs_inode_item, generation, 64);
  327. BTRFS_SETGET_STACK_FUNCS(stack_inode_sequence,
  328. struct btrfs_inode_item, sequence, 64);
  329. BTRFS_SETGET_STACK_FUNCS(stack_inode_transid,
  330. struct btrfs_inode_item, transid, 64);
  331. BTRFS_SETGET_STACK_FUNCS(stack_inode_size,
  332. struct btrfs_inode_item, size, 64);
  333. BTRFS_SETGET_STACK_FUNCS(stack_inode_nbytes,
  334. struct btrfs_inode_item, nbytes, 64);
  335. BTRFS_SETGET_STACK_FUNCS(stack_inode_block_group,
  336. struct btrfs_inode_item, block_group, 64);
  337. BTRFS_SETGET_STACK_FUNCS(stack_inode_nlink,
  338. struct btrfs_inode_item, nlink, 32);
  339. BTRFS_SETGET_STACK_FUNCS(stack_inode_uid,
  340. struct btrfs_inode_item, uid, 32);
  341. BTRFS_SETGET_STACK_FUNCS(stack_inode_gid,
  342. struct btrfs_inode_item, gid, 32);
  343. BTRFS_SETGET_STACK_FUNCS(stack_inode_mode,
  344. struct btrfs_inode_item, mode, 32);
  345. BTRFS_SETGET_STACK_FUNCS(stack_inode_rdev,
  346. struct btrfs_inode_item, rdev, 64);
  347. BTRFS_SETGET_STACK_FUNCS(stack_inode_flags,
  348. struct btrfs_inode_item, flags, 64);
  349. static inline struct btrfs_timespec *
  350. btrfs_inode_atime(struct btrfs_inode_item *inode_item)
  351. {
  352. unsigned long ptr = (unsigned long)inode_item;
  353. ptr += offsetof(struct btrfs_inode_item, atime);
  354. return (struct btrfs_timespec *)ptr;
  355. }
  356. static inline struct btrfs_timespec *
  357. btrfs_inode_mtime(struct btrfs_inode_item *inode_item)
  358. {
  359. unsigned long ptr = (unsigned long)inode_item;
  360. ptr += offsetof(struct btrfs_inode_item, mtime);
  361. return (struct btrfs_timespec *)ptr;
  362. }
  363. static inline struct btrfs_timespec *
  364. btrfs_inode_ctime(struct btrfs_inode_item *inode_item)
  365. {
  366. unsigned long ptr = (unsigned long)inode_item;
  367. ptr += offsetof(struct btrfs_inode_item, ctime);
  368. return (struct btrfs_timespec *)ptr;
  369. }
  370. static inline struct btrfs_timespec *
  371. btrfs_inode_otime(struct btrfs_inode_item *inode_item)
  372. {
  373. unsigned long ptr = (unsigned long)inode_item;
  374. ptr += offsetof(struct btrfs_inode_item, otime);
  375. return (struct btrfs_timespec *)ptr;
  376. }
  377. BTRFS_SETGET_FUNCS(timespec_sec, struct btrfs_timespec, sec, 64);
  378. BTRFS_SETGET_FUNCS(timespec_nsec, struct btrfs_timespec, nsec, 32);
  379. BTRFS_SETGET_STACK_FUNCS(stack_timespec_sec, struct btrfs_timespec,
  380. sec, 64);
  381. BTRFS_SETGET_STACK_FUNCS(stack_timespec_nsec, struct btrfs_timespec,
  382. nsec, 32);
  383. /* struct btrfs_dev_extent */
  384. BTRFS_SETGET_FUNCS(dev_extent_chunk_tree, struct btrfs_dev_extent,
  385. chunk_tree, 64);
  386. BTRFS_SETGET_FUNCS(dev_extent_chunk_objectid, struct btrfs_dev_extent,
  387. chunk_objectid, 64);
  388. BTRFS_SETGET_FUNCS(dev_extent_chunk_offset, struct btrfs_dev_extent,
  389. chunk_offset, 64);
  390. BTRFS_SETGET_FUNCS(dev_extent_length, struct btrfs_dev_extent, length, 64);
  391. BTRFS_SETGET_STACK_FUNCS(stack_dev_extent_length, struct btrfs_dev_extent,
  392. length, 64);
  393. static inline u8 *btrfs_dev_extent_chunk_tree_uuid(struct btrfs_dev_extent *dev)
  394. {
  395. unsigned long ptr = offsetof(struct btrfs_dev_extent, chunk_tree_uuid);
  396. return (u8 *)((unsigned long)dev + ptr);
  397. }
  398. /* struct btrfs_extent_item */
  399. BTRFS_SETGET_FUNCS(extent_refs, struct btrfs_extent_item, refs, 64);
  400. BTRFS_SETGET_STACK_FUNCS(stack_extent_refs, struct btrfs_extent_item, refs, 64);
  401. BTRFS_SETGET_FUNCS(extent_generation, struct btrfs_extent_item,
  402. generation, 64);
  403. BTRFS_SETGET_FUNCS(extent_flags, struct btrfs_extent_item, flags, 64);
  404. BTRFS_SETGET_STACK_FUNCS(stack_extent_flags, struct btrfs_extent_item, flags, 64);
  405. BTRFS_SETGET_FUNCS(extent_refs_v0, struct btrfs_extent_item_v0, refs, 32);
  406. BTRFS_SETGET_FUNCS(tree_block_level, struct btrfs_tree_block_info, level, 8);
  407. static inline void btrfs_tree_block_key(struct extent_buffer *eb,
  408. struct btrfs_tree_block_info *item,
  409. struct btrfs_disk_key *key)
  410. {
  411. read_eb_member(eb, item, struct btrfs_tree_block_info, key, key);
  412. }
  413. static inline void btrfs_set_tree_block_key(struct extent_buffer *eb,
  414. struct btrfs_tree_block_info *item,
  415. struct btrfs_disk_key *key)
  416. {
  417. write_eb_member(eb, item, struct btrfs_tree_block_info, key, key);
  418. }
  419. BTRFS_SETGET_FUNCS(extent_data_ref_root, struct btrfs_extent_data_ref,
  420. root, 64);
  421. BTRFS_SETGET_FUNCS(extent_data_ref_objectid, struct btrfs_extent_data_ref,
  422. objectid, 64);
  423. BTRFS_SETGET_FUNCS(extent_data_ref_offset, struct btrfs_extent_data_ref,
  424. offset, 64);
  425. BTRFS_SETGET_FUNCS(extent_data_ref_count, struct btrfs_extent_data_ref,
  426. count, 32);
  427. BTRFS_SETGET_FUNCS(shared_data_ref_count, struct btrfs_shared_data_ref,
  428. count, 32);
  429. BTRFS_SETGET_FUNCS(extent_inline_ref_type, struct btrfs_extent_inline_ref,
  430. type, 8);
  431. BTRFS_SETGET_FUNCS(extent_inline_ref_offset, struct btrfs_extent_inline_ref,
  432. offset, 64);
  433. BTRFS_SETGET_STACK_FUNCS(stack_extent_inline_ref_type,
  434. struct btrfs_extent_inline_ref, type, 8);
  435. BTRFS_SETGET_STACK_FUNCS(stack_extent_inline_ref_offset,
  436. struct btrfs_extent_inline_ref, offset, 64);
  437. static inline u32 btrfs_extent_inline_ref_size(int type)
  438. {
  439. if (type == BTRFS_TREE_BLOCK_REF_KEY ||
  440. type == BTRFS_SHARED_BLOCK_REF_KEY)
  441. return sizeof(struct btrfs_extent_inline_ref);
  442. if (type == BTRFS_SHARED_DATA_REF_KEY)
  443. return sizeof(struct btrfs_shared_data_ref) +
  444. sizeof(struct btrfs_extent_inline_ref);
  445. if (type == BTRFS_EXTENT_DATA_REF_KEY)
  446. return sizeof(struct btrfs_extent_data_ref) +
  447. offsetof(struct btrfs_extent_inline_ref, offset);
  448. BUG();
  449. return 0;
  450. }
  451. BTRFS_SETGET_FUNCS(ref_root_v0, struct btrfs_extent_ref_v0, root, 64);
  452. BTRFS_SETGET_FUNCS(ref_generation_v0, struct btrfs_extent_ref_v0,
  453. generation, 64);
  454. BTRFS_SETGET_FUNCS(ref_objectid_v0, struct btrfs_extent_ref_v0, objectid, 64);
  455. BTRFS_SETGET_FUNCS(ref_count_v0, struct btrfs_extent_ref_v0, count, 32);
  456. /* struct btrfs_node */
  457. BTRFS_SETGET_FUNCS(key_blockptr, struct btrfs_key_ptr, blockptr, 64);
  458. BTRFS_SETGET_FUNCS(key_generation, struct btrfs_key_ptr, generation, 64);
  459. static inline u64 btrfs_node_blockptr(struct extent_buffer *eb, int nr)
  460. {
  461. unsigned long ptr;
  462. ptr = offsetof(struct btrfs_node, ptrs) +
  463. sizeof(struct btrfs_key_ptr) * nr;
  464. return btrfs_key_blockptr(eb, (struct btrfs_key_ptr *)ptr);
  465. }
  466. static inline void btrfs_set_node_blockptr(struct extent_buffer *eb,
  467. int nr, u64 val)
  468. {
  469. unsigned long ptr;
  470. ptr = offsetof(struct btrfs_node, ptrs) +
  471. sizeof(struct btrfs_key_ptr) * nr;
  472. btrfs_set_key_blockptr(eb, (struct btrfs_key_ptr *)ptr, val);
  473. }
  474. static inline u64 btrfs_node_ptr_generation(struct extent_buffer *eb, int nr)
  475. {
  476. unsigned long ptr;
  477. ptr = offsetof(struct btrfs_node, ptrs) +
  478. sizeof(struct btrfs_key_ptr) * nr;
  479. return btrfs_key_generation(eb, (struct btrfs_key_ptr *)ptr);
  480. }
  481. static inline void btrfs_set_node_ptr_generation(struct extent_buffer *eb,
  482. int nr, u64 val)
  483. {
  484. unsigned long ptr;
  485. ptr = offsetof(struct btrfs_node, ptrs) +
  486. sizeof(struct btrfs_key_ptr) * nr;
  487. btrfs_set_key_generation(eb, (struct btrfs_key_ptr *)ptr, val);
  488. }
  489. static inline unsigned long btrfs_node_key_ptr_offset(int nr)
  490. {
  491. return offsetof(struct btrfs_node, ptrs) +
  492. sizeof(struct btrfs_key_ptr) * nr;
  493. }
  494. static inline void btrfs_node_key(struct extent_buffer *eb,
  495. struct btrfs_disk_key *disk_key, int nr)
  496. {
  497. unsigned long ptr;
  498. ptr = btrfs_node_key_ptr_offset(nr);
  499. read_eb_member(eb, (struct btrfs_key_ptr *)ptr,
  500. struct btrfs_key_ptr, key, disk_key);
  501. }
  502. static inline void btrfs_set_node_key(struct extent_buffer *eb,
  503. struct btrfs_disk_key *disk_key, int nr)
  504. {
  505. unsigned long ptr;
  506. ptr = btrfs_node_key_ptr_offset(nr);
  507. write_eb_member(eb, (struct btrfs_key_ptr *)ptr,
  508. struct btrfs_key_ptr, key, disk_key);
  509. }
  510. /* struct btrfs_item */
  511. BTRFS_SETGET_FUNCS(item_offset, struct btrfs_item, offset, 32);
  512. BTRFS_SETGET_FUNCS(item_size, struct btrfs_item, size, 32);
  513. static inline unsigned long btrfs_item_nr_offset(int nr)
  514. {
  515. return offsetof(struct btrfs_leaf, items) +
  516. sizeof(struct btrfs_item) * nr;
  517. }
  518. static inline struct btrfs_item *btrfs_item_nr(int nr)
  519. {
  520. return (struct btrfs_item *)btrfs_item_nr_offset(nr);
  521. }
  522. static inline u32 btrfs_item_end(struct extent_buffer *eb,
  523. struct btrfs_item *item)
  524. {
  525. return btrfs_item_offset(eb, item) + btrfs_item_size(eb, item);
  526. }
  527. static inline u32 btrfs_item_end_nr(struct extent_buffer *eb, int nr)
  528. {
  529. return btrfs_item_end(eb, btrfs_item_nr(nr));
  530. }
  531. static inline u32 btrfs_item_offset_nr(const struct extent_buffer *eb, int nr)
  532. {
  533. return btrfs_item_offset(eb, btrfs_item_nr(nr));
  534. }
  535. static inline u32 btrfs_item_size_nr(struct extent_buffer *eb, int nr)
  536. {
  537. return btrfs_item_size(eb, btrfs_item_nr(nr));
  538. }
  539. static inline void btrfs_item_key(struct extent_buffer *eb,
  540. struct btrfs_disk_key *disk_key, int nr)
  541. {
  542. struct btrfs_item *item = btrfs_item_nr(nr);
  543. read_eb_member(eb, item, struct btrfs_item, key, disk_key);
  544. }
  545. static inline void btrfs_set_item_key(struct extent_buffer *eb,
  546. struct btrfs_disk_key *disk_key, int nr)
  547. {
  548. struct btrfs_item *item = btrfs_item_nr(nr);
  549. write_eb_member(eb, item, struct btrfs_item, key, disk_key);
  550. }
  551. BTRFS_SETGET_FUNCS(dir_log_end, struct btrfs_dir_log_item, end, 64);
  552. /*
  553. * struct btrfs_root_ref
  554. */
  555. BTRFS_SETGET_FUNCS(root_ref_dirid, struct btrfs_root_ref, dirid, 64);
  556. BTRFS_SETGET_FUNCS(root_ref_sequence, struct btrfs_root_ref, sequence, 64);
  557. BTRFS_SETGET_FUNCS(root_ref_name_len, struct btrfs_root_ref, name_len, 16);
  558. BTRFS_SETGET_STACK_FUNCS(stack_root_ref_dirid, struct btrfs_root_ref, dirid, 64);
  559. BTRFS_SETGET_STACK_FUNCS(stack_root_ref_sequence, struct btrfs_root_ref, sequence, 64);
  560. BTRFS_SETGET_STACK_FUNCS(stack_root_ref_name_len, struct btrfs_root_ref, name_len, 16);
  561. /* struct btrfs_dir_item */
  562. BTRFS_SETGET_FUNCS(dir_data_len, struct btrfs_dir_item, data_len, 16);
  563. BTRFS_SETGET_FUNCS(dir_type, struct btrfs_dir_item, type, 8);
  564. BTRFS_SETGET_FUNCS(dir_name_len, struct btrfs_dir_item, name_len, 16);
  565. BTRFS_SETGET_FUNCS(dir_transid, struct btrfs_dir_item, transid, 64);
  566. BTRFS_SETGET_STACK_FUNCS(stack_dir_data_len, struct btrfs_dir_item, data_len, 16);
  567. BTRFS_SETGET_STACK_FUNCS(stack_dir_type, struct btrfs_dir_item, type, 8);
  568. BTRFS_SETGET_STACK_FUNCS(stack_dir_name_len, struct btrfs_dir_item, name_len, 16);
  569. BTRFS_SETGET_STACK_FUNCS(stack_dir_transid, struct btrfs_dir_item, transid, 64);
  570. static inline void btrfs_dir_item_key(struct extent_buffer *eb,
  571. struct btrfs_dir_item *item,
  572. struct btrfs_disk_key *key)
  573. {
  574. read_eb_member(eb, item, struct btrfs_dir_item, location, key);
  575. }
  576. static inline void btrfs_set_dir_item_key(struct extent_buffer *eb,
  577. struct btrfs_dir_item *item,
  578. struct btrfs_disk_key *key)
  579. {
  580. write_eb_member(eb, item, struct btrfs_dir_item, location, key);
  581. }
  582. /* struct btrfs_free_space_header */
  583. BTRFS_SETGET_FUNCS(free_space_entries, struct btrfs_free_space_header,
  584. num_entries, 64);
  585. BTRFS_SETGET_FUNCS(free_space_bitmaps, struct btrfs_free_space_header,
  586. num_bitmaps, 64);
  587. BTRFS_SETGET_FUNCS(free_space_generation, struct btrfs_free_space_header,
  588. generation, 64);
  589. static inline void btrfs_free_space_key(struct extent_buffer *eb,
  590. struct btrfs_free_space_header *h,
  591. struct btrfs_disk_key *key)
  592. {
  593. read_eb_member(eb, h, struct btrfs_free_space_header, location, key);
  594. }
  595. static inline void btrfs_set_free_space_key(struct extent_buffer *eb,
  596. struct btrfs_free_space_header *h,
  597. struct btrfs_disk_key *key)
  598. {
  599. write_eb_member(eb, h, struct btrfs_free_space_header, location, key);
  600. }
  601. /* struct btrfs_disk_key */
  602. BTRFS_SETGET_STACK_FUNCS(disk_key_objectid, struct btrfs_disk_key,
  603. objectid, 64);
  604. BTRFS_SETGET_STACK_FUNCS(disk_key_offset, struct btrfs_disk_key, offset, 64);
  605. BTRFS_SETGET_STACK_FUNCS(disk_key_type, struct btrfs_disk_key, type, 8);
  606. static inline void btrfs_disk_key_to_cpu(struct btrfs_key *cpu,
  607. struct btrfs_disk_key *disk)
  608. {
  609. cpu->offset = le64_to_cpu(disk->offset);
  610. cpu->type = disk->type;
  611. cpu->objectid = le64_to_cpu(disk->objectid);
  612. }
  613. static inline void btrfs_cpu_key_to_disk(struct btrfs_disk_key *disk,
  614. const struct btrfs_key *cpu)
  615. {
  616. disk->offset = cpu_to_le64(cpu->offset);
  617. disk->type = cpu->type;
  618. disk->objectid = cpu_to_le64(cpu->objectid);
  619. }
  620. static inline void btrfs_node_key_to_cpu(struct extent_buffer *eb,
  621. struct btrfs_key *key, int nr)
  622. {
  623. struct btrfs_disk_key disk_key;
  624. btrfs_node_key(eb, &disk_key, nr);
  625. btrfs_disk_key_to_cpu(key, &disk_key);
  626. }
  627. static inline void btrfs_item_key_to_cpu(struct extent_buffer *eb,
  628. struct btrfs_key *key, int nr)
  629. {
  630. struct btrfs_disk_key disk_key;
  631. btrfs_item_key(eb, &disk_key, nr);
  632. btrfs_disk_key_to_cpu(key, &disk_key);
  633. }
  634. static inline void btrfs_dir_item_key_to_cpu(struct extent_buffer *eb,
  635. struct btrfs_dir_item *item,
  636. struct btrfs_key *key)
  637. {
  638. struct btrfs_disk_key disk_key;
  639. btrfs_dir_item_key(eb, item, &disk_key);
  640. btrfs_disk_key_to_cpu(key, &disk_key);
  641. }
  642. /* struct btrfs_header */
  643. BTRFS_SETGET_HEADER_FUNCS(header_bytenr, struct btrfs_header, bytenr, 64);
  644. BTRFS_SETGET_HEADER_FUNCS(header_generation, struct btrfs_header,
  645. generation, 64);
  646. BTRFS_SETGET_HEADER_FUNCS(header_owner, struct btrfs_header, owner, 64);
  647. BTRFS_SETGET_HEADER_FUNCS(header_nritems, struct btrfs_header, nritems, 32);
  648. BTRFS_SETGET_HEADER_FUNCS(header_flags, struct btrfs_header, flags, 64);
  649. BTRFS_SETGET_HEADER_FUNCS(header_level, struct btrfs_header, level, 8);
  650. BTRFS_SETGET_STACK_FUNCS(stack_header_bytenr, struct btrfs_header, bytenr, 64);
  651. BTRFS_SETGET_STACK_FUNCS(stack_header_nritems, struct btrfs_header, nritems,
  652. 32);
  653. BTRFS_SETGET_STACK_FUNCS(stack_header_owner, struct btrfs_header, owner, 64);
  654. BTRFS_SETGET_STACK_FUNCS(stack_header_generation, struct btrfs_header,
  655. generation, 64);
  656. static inline int btrfs_header_flag(struct extent_buffer *eb, u64 flag)
  657. {
  658. return (btrfs_header_flags(eb) & flag) == flag;
  659. }
  660. static inline int btrfs_set_header_flag(struct extent_buffer *eb, u64 flag)
  661. {
  662. u64 flags = btrfs_header_flags(eb);
  663. btrfs_set_header_flags(eb, flags | flag);
  664. return (flags & flag) == flag;
  665. }
  666. static inline int btrfs_clear_header_flag(struct extent_buffer *eb, u64 flag)
  667. {
  668. u64 flags = btrfs_header_flags(eb);
  669. btrfs_set_header_flags(eb, flags & ~flag);
  670. return (flags & flag) == flag;
  671. }
  672. static inline int btrfs_header_backref_rev(struct extent_buffer *eb)
  673. {
  674. u64 flags = btrfs_header_flags(eb);
  675. return flags >> BTRFS_BACKREF_REV_SHIFT;
  676. }
  677. static inline void btrfs_set_header_backref_rev(struct extent_buffer *eb,
  678. int rev)
  679. {
  680. u64 flags = btrfs_header_flags(eb);
  681. flags &= ~BTRFS_BACKREF_REV_MASK;
  682. flags |= (u64)rev << BTRFS_BACKREF_REV_SHIFT;
  683. btrfs_set_header_flags(eb, flags);
  684. }
  685. static inline unsigned long btrfs_header_fsid(void)
  686. {
  687. return offsetof(struct btrfs_header, fsid);
  688. }
  689. static inline unsigned long btrfs_header_chunk_tree_uuid(struct extent_buffer *eb)
  690. {
  691. return offsetof(struct btrfs_header, chunk_tree_uuid);
  692. }
  693. static inline u8 *btrfs_header_csum(struct extent_buffer *eb)
  694. {
  695. unsigned long ptr = offsetof(struct btrfs_header, csum);
  696. return (u8 *)ptr;
  697. }
  698. static inline int btrfs_is_leaf(struct extent_buffer *eb)
  699. {
  700. return (btrfs_header_level(eb) == 0);
  701. }
  702. /* struct btrfs_root_item */
  703. BTRFS_SETGET_FUNCS(disk_root_generation, struct btrfs_root_item,
  704. generation, 64);
  705. BTRFS_SETGET_FUNCS(disk_root_refs, struct btrfs_root_item, refs, 32);
  706. BTRFS_SETGET_FUNCS(disk_root_bytenr, struct btrfs_root_item, bytenr, 64);
  707. BTRFS_SETGET_FUNCS(disk_root_level, struct btrfs_root_item, level, 8);
  708. BTRFS_SETGET_STACK_FUNCS(root_generation, struct btrfs_root_item,
  709. generation, 64);
  710. BTRFS_SETGET_STACK_FUNCS(root_bytenr, struct btrfs_root_item, bytenr, 64);
  711. BTRFS_SETGET_STACK_FUNCS(root_level, struct btrfs_root_item, level, 8);
  712. BTRFS_SETGET_STACK_FUNCS(root_dirid, struct btrfs_root_item, root_dirid, 64);
  713. BTRFS_SETGET_STACK_FUNCS(root_refs, struct btrfs_root_item, refs, 32);
  714. BTRFS_SETGET_STACK_FUNCS(root_flags, struct btrfs_root_item, flags, 64);
  715. BTRFS_SETGET_STACK_FUNCS(root_used, struct btrfs_root_item, bytes_used, 64);
  716. BTRFS_SETGET_STACK_FUNCS(root_limit, struct btrfs_root_item, byte_limit, 64);
  717. BTRFS_SETGET_STACK_FUNCS(root_last_snapshot, struct btrfs_root_item,
  718. last_snapshot, 64);
  719. BTRFS_SETGET_STACK_FUNCS(root_generation_v2, struct btrfs_root_item,
  720. generation_v2, 64);
  721. BTRFS_SETGET_STACK_FUNCS(root_ctransid, struct btrfs_root_item,
  722. ctransid, 64);
  723. BTRFS_SETGET_STACK_FUNCS(root_otransid, struct btrfs_root_item,
  724. otransid, 64);
  725. BTRFS_SETGET_STACK_FUNCS(root_stransid, struct btrfs_root_item,
  726. stransid, 64);
  727. BTRFS_SETGET_STACK_FUNCS(root_rtransid, struct btrfs_root_item,
  728. rtransid, 64);
  729. static inline struct btrfs_timespec* btrfs_root_ctime(
  730. struct btrfs_root_item *root_item)
  731. {
  732. unsigned long ptr = (unsigned long)root_item;
  733. ptr += offsetof(struct btrfs_root_item, ctime);
  734. return (struct btrfs_timespec *)ptr;
  735. }
  736. static inline struct btrfs_timespec* btrfs_root_otime(
  737. struct btrfs_root_item *root_item)
  738. {
  739. unsigned long ptr = (unsigned long)root_item;
  740. ptr += offsetof(struct btrfs_root_item, otime);
  741. return (struct btrfs_timespec *)ptr;
  742. }
  743. static inline struct btrfs_timespec* btrfs_root_stime(
  744. struct btrfs_root_item *root_item)
  745. {
  746. unsigned long ptr = (unsigned long)root_item;
  747. ptr += offsetof(struct btrfs_root_item, stime);
  748. return (struct btrfs_timespec *)ptr;
  749. }
  750. static inline struct btrfs_timespec* btrfs_root_rtime(
  751. struct btrfs_root_item *root_item)
  752. {
  753. unsigned long ptr = (unsigned long)root_item;
  754. ptr += offsetof(struct btrfs_root_item, rtime);
  755. return (struct btrfs_timespec *)ptr;
  756. }
  757. /* struct btrfs_root_backup */
  758. BTRFS_SETGET_STACK_FUNCS(backup_tree_root, struct btrfs_root_backup,
  759. tree_root, 64);
  760. BTRFS_SETGET_STACK_FUNCS(backup_tree_root_gen, struct btrfs_root_backup,
  761. tree_root_gen, 64);
  762. BTRFS_SETGET_STACK_FUNCS(backup_tree_root_level, struct btrfs_root_backup,
  763. tree_root_level, 8);
  764. BTRFS_SETGET_STACK_FUNCS(backup_chunk_root, struct btrfs_root_backup,
  765. chunk_root, 64);
  766. BTRFS_SETGET_STACK_FUNCS(backup_chunk_root_gen, struct btrfs_root_backup,
  767. chunk_root_gen, 64);
  768. BTRFS_SETGET_STACK_FUNCS(backup_chunk_root_level, struct btrfs_root_backup,
  769. chunk_root_level, 8);
  770. BTRFS_SETGET_STACK_FUNCS(backup_extent_root, struct btrfs_root_backup,
  771. extent_root, 64);
  772. BTRFS_SETGET_STACK_FUNCS(backup_extent_root_gen, struct btrfs_root_backup,
  773. extent_root_gen, 64);
  774. BTRFS_SETGET_STACK_FUNCS(backup_extent_root_level, struct btrfs_root_backup,
  775. extent_root_level, 8);
  776. BTRFS_SETGET_STACK_FUNCS(backup_fs_root, struct btrfs_root_backup,
  777. fs_root, 64);
  778. BTRFS_SETGET_STACK_FUNCS(backup_fs_root_gen, struct btrfs_root_backup,
  779. fs_root_gen, 64);
  780. BTRFS_SETGET_STACK_FUNCS(backup_fs_root_level, struct btrfs_root_backup,
  781. fs_root_level, 8);
  782. BTRFS_SETGET_STACK_FUNCS(backup_dev_root, struct btrfs_root_backup,
  783. dev_root, 64);
  784. BTRFS_SETGET_STACK_FUNCS(backup_dev_root_gen, struct btrfs_root_backup,
  785. dev_root_gen, 64);
  786. BTRFS_SETGET_STACK_FUNCS(backup_dev_root_level, struct btrfs_root_backup,
  787. dev_root_level, 8);
  788. BTRFS_SETGET_STACK_FUNCS(backup_csum_root, struct btrfs_root_backup,
  789. csum_root, 64);
  790. BTRFS_SETGET_STACK_FUNCS(backup_csum_root_gen, struct btrfs_root_backup,
  791. csum_root_gen, 64);
  792. BTRFS_SETGET_STACK_FUNCS(backup_csum_root_level, struct btrfs_root_backup,
  793. csum_root_level, 8);
  794. BTRFS_SETGET_STACK_FUNCS(backup_total_bytes, struct btrfs_root_backup,
  795. total_bytes, 64);
  796. BTRFS_SETGET_STACK_FUNCS(backup_bytes_used, struct btrfs_root_backup,
  797. bytes_used, 64);
  798. BTRFS_SETGET_STACK_FUNCS(backup_num_devices, struct btrfs_root_backup,
  799. num_devices, 64);
  800. /* struct btrfs_super_block */
  801. BTRFS_SETGET_STACK_FUNCS(super_bytenr, struct btrfs_super_block, bytenr, 64);
  802. BTRFS_SETGET_STACK_FUNCS(super_flags, struct btrfs_super_block, flags, 64);
  803. BTRFS_SETGET_STACK_FUNCS(super_generation, struct btrfs_super_block,
  804. generation, 64);
  805. BTRFS_SETGET_STACK_FUNCS(super_root, struct btrfs_super_block, root, 64);
  806. BTRFS_SETGET_STACK_FUNCS(super_sys_array_size,
  807. struct btrfs_super_block, sys_chunk_array_size, 32);
  808. BTRFS_SETGET_STACK_FUNCS(super_chunk_root_generation,
  809. struct btrfs_super_block, chunk_root_generation, 64);
  810. BTRFS_SETGET_STACK_FUNCS(super_root_level, struct btrfs_super_block,
  811. root_level, 8);
  812. BTRFS_SETGET_STACK_FUNCS(super_chunk_root, struct btrfs_super_block,
  813. chunk_root, 64);
  814. BTRFS_SETGET_STACK_FUNCS(super_chunk_root_level, struct btrfs_super_block,
  815. chunk_root_level, 8);
  816. BTRFS_SETGET_STACK_FUNCS(super_log_root, struct btrfs_super_block,
  817. log_root, 64);
  818. BTRFS_SETGET_STACK_FUNCS(super_log_root_transid, struct btrfs_super_block,
  819. log_root_transid, 64);
  820. BTRFS_SETGET_STACK_FUNCS(super_log_root_level, struct btrfs_super_block,
  821. log_root_level, 8);
  822. BTRFS_SETGET_STACK_FUNCS(super_total_bytes, struct btrfs_super_block,
  823. total_bytes, 64);
  824. BTRFS_SETGET_STACK_FUNCS(super_bytes_used, struct btrfs_super_block,
  825. bytes_used, 64);
  826. BTRFS_SETGET_STACK_FUNCS(super_sectorsize, struct btrfs_super_block,
  827. sectorsize, 32);
  828. BTRFS_SETGET_STACK_FUNCS(super_nodesize, struct btrfs_super_block,
  829. nodesize, 32);
  830. BTRFS_SETGET_STACK_FUNCS(super_stripesize, struct btrfs_super_block,
  831. stripesize, 32);
  832. BTRFS_SETGET_STACK_FUNCS(super_root_dir, struct btrfs_super_block,
  833. root_dir_objectid, 64);
  834. BTRFS_SETGET_STACK_FUNCS(super_num_devices, struct btrfs_super_block,
  835. num_devices, 64);
  836. BTRFS_SETGET_STACK_FUNCS(super_compat_flags, struct btrfs_super_block,
  837. compat_flags, 64);
  838. BTRFS_SETGET_STACK_FUNCS(super_compat_ro_flags, struct btrfs_super_block,
  839. compat_ro_flags, 64);
  840. BTRFS_SETGET_STACK_FUNCS(super_incompat_flags, struct btrfs_super_block,
  841. incompat_flags, 64);
  842. BTRFS_SETGET_STACK_FUNCS(super_csum_type, struct btrfs_super_block,
  843. csum_type, 16);
  844. BTRFS_SETGET_STACK_FUNCS(super_cache_generation, struct btrfs_super_block,
  845. cache_generation, 64);
  846. BTRFS_SETGET_STACK_FUNCS(super_uuid_tree_generation, struct btrfs_super_block,
  847. uuid_tree_generation, 64);
  848. BTRFS_SETGET_STACK_FUNCS(super_magic, struct btrfs_super_block, magic, 64);
  849. static inline unsigned long btrfs_leaf_data(struct extent_buffer *l)
  850. {
  851. return offsetof(struct btrfs_leaf, items);
  852. }
  853. /* struct btrfs_file_extent_item */
  854. BTRFS_SETGET_FUNCS(file_extent_type, struct btrfs_file_extent_item, type, 8);
  855. BTRFS_SETGET_STACK_FUNCS(stack_file_extent_type, struct btrfs_file_extent_item, type, 8);
  856. static inline unsigned long btrfs_file_extent_inline_start(struct
  857. btrfs_file_extent_item *e)
  858. {
  859. unsigned long offset = (unsigned long)e;
  860. offset += offsetof(struct btrfs_file_extent_item, disk_bytenr);
  861. return offset;
  862. }
  863. static inline u32 btrfs_file_extent_calc_inline_size(u32 datasize)
  864. {
  865. return offsetof(struct btrfs_file_extent_item, disk_bytenr) + datasize;
  866. }
  867. BTRFS_SETGET_FUNCS(file_extent_disk_bytenr, struct btrfs_file_extent_item,
  868. disk_bytenr, 64);
  869. BTRFS_SETGET_STACK_FUNCS(stack_file_extent_disk_bytenr, struct btrfs_file_extent_item,
  870. disk_bytenr, 64);
  871. BTRFS_SETGET_FUNCS(file_extent_generation, struct btrfs_file_extent_item,
  872. generation, 64);
  873. BTRFS_SETGET_STACK_FUNCS(stack_file_extent_generation, struct btrfs_file_extent_item,
  874. generation, 64);
  875. BTRFS_SETGET_FUNCS(file_extent_disk_num_bytes, struct btrfs_file_extent_item,
  876. disk_num_bytes, 64);
  877. BTRFS_SETGET_FUNCS(file_extent_offset, struct btrfs_file_extent_item,
  878. offset, 64);
  879. BTRFS_SETGET_STACK_FUNCS(stack_file_extent_offset, struct btrfs_file_extent_item,
  880. offset, 64);
  881. BTRFS_SETGET_FUNCS(file_extent_num_bytes, struct btrfs_file_extent_item,
  882. num_bytes, 64);
  883. BTRFS_SETGET_STACK_FUNCS(stack_file_extent_num_bytes, struct btrfs_file_extent_item,
  884. num_bytes, 64);
  885. BTRFS_SETGET_FUNCS(file_extent_ram_bytes, struct btrfs_file_extent_item,
  886. ram_bytes, 64);
  887. BTRFS_SETGET_STACK_FUNCS(stack_file_extent_ram_bytes, struct btrfs_file_extent_item,
  888. ram_bytes, 64);
  889. BTRFS_SETGET_FUNCS(file_extent_compression, struct btrfs_file_extent_item,
  890. compression, 8);
  891. BTRFS_SETGET_STACK_FUNCS(stack_file_extent_compression, struct btrfs_file_extent_item,
  892. compression, 8);
  893. BTRFS_SETGET_FUNCS(file_extent_encryption, struct btrfs_file_extent_item,
  894. encryption, 8);
  895. BTRFS_SETGET_FUNCS(file_extent_other_encoding, struct btrfs_file_extent_item,
  896. other_encoding, 16);
  897. /* btrfs_qgroup_status_item */
  898. BTRFS_SETGET_FUNCS(qgroup_status_version, struct btrfs_qgroup_status_item,
  899. version, 64);
  900. BTRFS_SETGET_FUNCS(qgroup_status_generation, struct btrfs_qgroup_status_item,
  901. generation, 64);
  902. BTRFS_SETGET_FUNCS(qgroup_status_flags, struct btrfs_qgroup_status_item,
  903. flags, 64);
  904. BTRFS_SETGET_FUNCS(qgroup_status_rescan, struct btrfs_qgroup_status_item,
  905. rescan, 64);
  906. BTRFS_SETGET_STACK_FUNCS(stack_qgroup_status_version,
  907. struct btrfs_qgroup_status_item, version, 64);
  908. BTRFS_SETGET_STACK_FUNCS(stack_qgroup_status_generation,
  909. struct btrfs_qgroup_status_item, generation, 64);
  910. BTRFS_SETGET_STACK_FUNCS(stack_qgroup_status_flags,
  911. struct btrfs_qgroup_status_item, flags, 64);
  912. BTRFS_SETGET_STACK_FUNCS(stack_qgroup_status_rescan,
  913. struct btrfs_qgroup_status_item, rescan, 64);
  914. /* btrfs_qgroup_info_item */
  915. BTRFS_SETGET_FUNCS(qgroup_info_generation, struct btrfs_qgroup_info_item,
  916. generation, 64);
  917. BTRFS_SETGET_FUNCS(qgroup_info_referenced, struct btrfs_qgroup_info_item,
  918. rfer, 64);
  919. BTRFS_SETGET_FUNCS(qgroup_info_referenced_compressed,
  920. struct btrfs_qgroup_info_item, rfer_cmpr, 64);
  921. BTRFS_SETGET_FUNCS(qgroup_info_exclusive, struct btrfs_qgroup_info_item,
  922. excl, 64);
  923. BTRFS_SETGET_FUNCS(qgroup_info_exclusive_compressed,
  924. struct btrfs_qgroup_info_item, excl_cmpr, 64);
  925. BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_generation,
  926. struct btrfs_qgroup_info_item, generation, 64);
  927. BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_referenced,
  928. struct btrfs_qgroup_info_item, rfer, 64);
  929. BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_referenced_compressed,
  930. struct btrfs_qgroup_info_item, rfer_cmpr, 64);
  931. BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_exclusive,
  932. struct btrfs_qgroup_info_item, excl, 64);
  933. BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_exclusive_compressed,
  934. struct btrfs_qgroup_info_item, excl_cmpr, 64);
  935. /* btrfs_qgroup_limit_item */
  936. BTRFS_SETGET_FUNCS(qgroup_limit_flags, struct btrfs_qgroup_limit_item,
  937. flags, 64);
  938. BTRFS_SETGET_FUNCS(qgroup_limit_max_referenced, struct btrfs_qgroup_limit_item,
  939. max_rfer, 64);
  940. BTRFS_SETGET_FUNCS(qgroup_limit_max_exclusive, struct btrfs_qgroup_limit_item,
  941. max_excl, 64);
  942. BTRFS_SETGET_FUNCS(qgroup_limit_rsv_referenced, struct btrfs_qgroup_limit_item,
  943. rsv_rfer, 64);
  944. BTRFS_SETGET_FUNCS(qgroup_limit_rsv_exclusive, struct btrfs_qgroup_limit_item,
  945. rsv_excl, 64);
  946. BTRFS_SETGET_STACK_FUNCS(stack_qgroup_limit_flags,
  947. struct btrfs_qgroup_limit_item, flags, 64);
  948. BTRFS_SETGET_STACK_FUNCS(stack_qgroup_limit_max_referenced,
  949. struct btrfs_qgroup_limit_item, max_rfer, 64);
  950. BTRFS_SETGET_STACK_FUNCS(stack_qgroup_limit_max_exclusive,
  951. struct btrfs_qgroup_limit_item, max_excl, 64);
  952. BTRFS_SETGET_STACK_FUNCS(stack_qgroup_limit_rsv_referenced,
  953. struct btrfs_qgroup_limit_item, rsv_rfer, 64);
  954. BTRFS_SETGET_STACK_FUNCS(stack_qgroup_limit_rsv_exclusive,
  955. struct btrfs_qgroup_limit_item, rsv_excl, 64);
  956. /* btrfs_balance_item */
  957. BTRFS_SETGET_FUNCS(balance_item_flags, struct btrfs_balance_item, flags, 64);
  958. static inline struct btrfs_disk_balance_args* btrfs_balance_item_data(
  959. struct extent_buffer *eb, struct btrfs_balance_item *bi)
  960. {
  961. unsigned long offset = (unsigned long)bi;
  962. struct btrfs_balance_item *p;
  963. p = (struct btrfs_balance_item *)(eb->data + offset);
  964. return &p->data;
  965. }
  966. static inline struct btrfs_disk_balance_args* btrfs_balance_item_meta(
  967. struct extent_buffer *eb, struct btrfs_balance_item *bi)
  968. {
  969. unsigned long offset = (unsigned long)bi;
  970. struct btrfs_balance_item *p;
  971. p = (struct btrfs_balance_item *)(eb->data + offset);
  972. return &p->meta;
  973. }
  974. static inline struct btrfs_disk_balance_args* btrfs_balance_item_sys(
  975. struct extent_buffer *eb, struct btrfs_balance_item *bi)
  976. {
  977. unsigned long offset = (unsigned long)bi;
  978. struct btrfs_balance_item *p;
  979. p = (struct btrfs_balance_item *)(eb->data + offset);
  980. return &p->sys;
  981. }
  982. static inline u64 btrfs_dev_stats_value(const struct extent_buffer *eb,
  983. const struct btrfs_dev_stats_item *ptr,
  984. int index)
  985. {
  986. u64 val;
  987. read_extent_buffer(eb, &val,
  988. offsetof(struct btrfs_dev_stats_item, values) +
  989. ((unsigned long)ptr) + (index * sizeof(u64)),
  990. sizeof(val));
  991. return val;
  992. }
  993. /*
  994. * this returns the number of bytes used by the item on disk, minus the
  995. * size of any extent headers. If a file is compressed on disk, this is
  996. * the compressed size
  997. */
  998. static inline u32 btrfs_file_extent_inline_item_len(struct extent_buffer *eb,
  999. struct btrfs_item *e)
  1000. {
  1001. unsigned long offset;
  1002. offset = offsetof(struct btrfs_file_extent_item, disk_bytenr);
  1003. return btrfs_item_size(eb, e) - offset;
  1004. }
  1005. #define btrfs_fs_incompat(fs_info, opt) \
  1006. __btrfs_fs_incompat((fs_info), BTRFS_FEATURE_INCOMPAT_##opt)
  1007. static inline bool __btrfs_fs_incompat(struct btrfs_fs_info *fs_info, u64 flag)
  1008. {
  1009. struct btrfs_super_block *disk_super;
  1010. disk_super = fs_info->super_copy;
  1011. return !!(btrfs_super_incompat_flags(disk_super) & flag);
  1012. }
  1013. #define btrfs_fs_compat_ro(fs_info, opt) \
  1014. __btrfs_fs_compat_ro((fs_info), BTRFS_FEATURE_COMPAT_RO_##opt)
  1015. static inline int __btrfs_fs_compat_ro(struct btrfs_fs_info *fs_info, u64 flag)
  1016. {
  1017. struct btrfs_super_block *disk_super;
  1018. disk_super = fs_info->super_copy;
  1019. return !!(btrfs_super_compat_ro_flags(disk_super) & flag);
  1020. }
  1021. /* helper function to cast into the data area of the leaf. */
  1022. #define btrfs_item_ptr(leaf, slot, type) \
  1023. ((type *)(btrfs_leaf_data(leaf) + \
  1024. btrfs_item_offset_nr(leaf, slot)))
  1025. #define btrfs_item_ptr_offset(leaf, slot) \
  1026. ((unsigned long)(btrfs_leaf_data(leaf) + \
  1027. btrfs_item_offset_nr(leaf, slot)))
  1028. static inline u64 btrfs_name_hash(const char *name, int len)
  1029. {
  1030. return (u64)crc32c((u32)~1, (u8 *)name, len);
  1031. }
  1032. /*
  1033. * Figure the key offset of an extended inode ref
  1034. */
  1035. static inline u64 btrfs_extref_hash(u64 parent_objectid, const char *name,
  1036. int len)
  1037. {
  1038. return crc32(parent_objectid, (u8 *)name, len);
  1039. }
  1040. union btrfs_tree_node {
  1041. struct btrfs_header header;
  1042. struct btrfs_leaf leaf;
  1043. struct btrfs_node node;
  1044. };
  1045. #define btrfs_path_item_ptr(p,t) \
  1046. ((t *) btrfs_path_leaf_data((p)))
  1047. u16 btrfs_super_csum_size(const struct btrfs_super_block *s);
  1048. const char *btrfs_super_csum_name(u16 csum_type);
  1049. u16 btrfs_csum_type_size(u16 csum_type);
  1050. size_t btrfs_super_num_csums(void);
  1051. /* root-tree.c */
  1052. int btrfs_find_last_root(struct btrfs_root *root, u64 objectid,
  1053. struct btrfs_root_item *item, struct btrfs_key *key);
  1054. /* dir-item.c */
  1055. struct btrfs_dir_item *btrfs_lookup_dir_item(struct btrfs_trans_handle *trans,
  1056. struct btrfs_root *root,
  1057. struct btrfs_path *path, u64 dir,
  1058. const char *name, int name_len,
  1059. int mod);
  1060. typedef int (*btrfs_iter_dir_callback_t)(struct btrfs_root *root,
  1061. struct extent_buffer *eb,
  1062. struct btrfs_dir_item *di);
  1063. int btrfs_iter_dir(struct btrfs_root *root, u64 ino,
  1064. btrfs_iter_dir_callback_t callback);
  1065. /* inode.c */
  1066. int btrfs_lookup_path(struct btrfs_root *root, u64 ino, const char *filename,
  1067. struct btrfs_root **root_ret, u64 *ino_ret,
  1068. u8 *type_ret, int symlink_limit);
  1069. int btrfs_read_extent_inline(struct btrfs_path *path,
  1070. struct btrfs_file_extent_item *fi, char *dest);
  1071. int btrfs_read_extent_reg(struct btrfs_path *path,
  1072. struct btrfs_file_extent_item *fi, u64 offset,
  1073. int len, char *dest);
  1074. /* ctree.c */
  1075. int btrfs_comp_cpu_keys(const struct btrfs_key *k1, const struct btrfs_key *k2);
  1076. enum btrfs_tree_block_status
  1077. btrfs_check_node(struct btrfs_fs_info *fs_info,
  1078. struct btrfs_disk_key *parent_key, struct extent_buffer *buf);
  1079. enum btrfs_tree_block_status
  1080. btrfs_check_leaf(struct btrfs_fs_info *fs_info,
  1081. struct btrfs_disk_key *parent_key, struct extent_buffer *buf);
  1082. struct extent_buffer *read_node_slot(struct btrfs_fs_info *fs_info,
  1083. struct extent_buffer *parent, int slot);
  1084. int btrfs_previous_item(struct btrfs_root *root,
  1085. struct btrfs_path *path, u64 min_objectid,
  1086. int type);
  1087. int btrfs_next_sibling_tree_block(struct btrfs_fs_info *fs_info,
  1088. struct btrfs_path *path);
  1089. /*
  1090. * Walk up the tree as far as necessary to find the next leaf.
  1091. *
  1092. * returns 0 if it found something or 1 if there are no greater leaves.
  1093. * returns < 0 on io errors.
  1094. */
  1095. static inline int btrfs_next_leaf(struct btrfs_root *root,
  1096. struct btrfs_path *path)
  1097. {
  1098. path->lowest_level = 0;
  1099. return btrfs_next_sibling_tree_block(root->fs_info, path);
  1100. }
  1101. static inline int btrfs_next_item(struct btrfs_root *root,
  1102. struct btrfs_path *p)
  1103. {
  1104. ++p->slots[0];
  1105. if (p->slots[0] >= btrfs_header_nritems(p->nodes[0]))
  1106. return btrfs_next_leaf(root, p);
  1107. return 0;
  1108. }
  1109. int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path);
  1110. int btrfs_leaf_free_space(struct extent_buffer *leaf);
  1111. int btrfs_search_slot(struct btrfs_trans_handle *trans,
  1112. struct btrfs_root *root, const struct btrfs_key *key,
  1113. struct btrfs_path *p, int ins_len, int cow);
  1114. int btrfs_search_slot_for_read(struct btrfs_root *root,
  1115. const struct btrfs_key *key,
  1116. struct btrfs_path *p, int find_higher,
  1117. int return_any);
  1118. void btrfs_release_path(struct btrfs_path *p);
  1119. struct btrfs_path *btrfs_alloc_path(void);
  1120. void btrfs_free_path(struct btrfs_path *p);
  1121. static inline void btrfs_init_path(struct btrfs_path *p)
  1122. {
  1123. memset(p, 0, sizeof(*p));
  1124. }
  1125. int btrfs_bin_search(struct extent_buffer *eb, const struct btrfs_key *key,
  1126. int *slot);
  1127. int btrfs_find_item(struct btrfs_root *fs_root, struct btrfs_path *found_path,
  1128. u64 iobjectid, u64 ioff, u8 key_type,
  1129. struct btrfs_key *found_key);
  1130. #endif /* __BTRFS_CTREE_H__ */