ctree.c 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421
  1. #include <linux/module.h>
  2. #include "ctree.h"
  3. #include "disk-io.h"
  4. static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root
  5. *root, struct btrfs_path *path, int level);
  6. static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root
  7. *root, struct btrfs_path *path, int data_size);
  8. static int push_node_left(struct btrfs_trans_handle *trans, struct btrfs_root
  9. *root, struct buffer_head *dst, struct buffer_head
  10. *src);
  11. static int balance_node_right(struct btrfs_trans_handle *trans, struct
  12. btrfs_root *root, struct buffer_head *dst_buf,
  13. struct buffer_head *src_buf);
  14. static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root,
  15. struct btrfs_path *path, int level, int slot);
  16. inline void btrfs_init_path(struct btrfs_path *p)
  17. {
  18. memset(p, 0, sizeof(*p));
  19. }
  20. void btrfs_release_path(struct btrfs_root *root, struct btrfs_path *p)
  21. {
  22. int i;
  23. for (i = 0; i < BTRFS_MAX_LEVEL; i++) {
  24. if (!p->nodes[i])
  25. break;
  26. btrfs_block_release(root, p->nodes[i]);
  27. }
  28. memset(p, 0, sizeof(*p));
  29. }
  30. static int btrfs_cow_block(struct btrfs_trans_handle *trans, struct btrfs_root
  31. *root, struct buffer_head *buf, struct buffer_head
  32. *parent, int parent_slot, struct buffer_head
  33. **cow_ret)
  34. {
  35. struct buffer_head *cow;
  36. struct btrfs_node *cow_node;
  37. if (!buffer_dirty(buf)) {
  38. *cow_ret = buf;
  39. return 0;
  40. }
  41. cow = btrfs_alloc_free_block(trans, root);
  42. cow_node = btrfs_buffer_node(cow);
  43. memcpy(cow_node, btrfs_buffer_node(buf), root->blocksize);
  44. btrfs_set_header_blocknr(&cow_node->header, cow->b_blocknr);
  45. *cow_ret = cow;
  46. btrfs_inc_ref(trans, root, buf);
  47. if (buf == root->node) {
  48. root->node = cow;
  49. get_bh(cow);
  50. if (buf != root->commit_root)
  51. btrfs_free_extent(trans, root, buf->b_blocknr, 1, 1);
  52. btrfs_block_release(root, buf);
  53. } else {
  54. btrfs_set_node_blockptr(btrfs_buffer_node(parent), parent_slot,
  55. cow->b_blocknr);
  56. BUG_ON(!buffer_dirty(parent));
  57. btrfs_free_extent(trans, root, buf->b_blocknr, 1, 1);
  58. }
  59. btrfs_block_release(root, buf);
  60. return 0;
  61. }
  62. /*
  63. * The leaf data grows from end-to-front in the node.
  64. * this returns the address of the start of the last item,
  65. * which is the stop of the leaf data stack
  66. */
  67. static inline unsigned int leaf_data_end(struct btrfs_root *root,
  68. struct btrfs_leaf *leaf)
  69. {
  70. u32 nr = btrfs_header_nritems(&leaf->header);
  71. if (nr == 0)
  72. return BTRFS_LEAF_DATA_SIZE(root);
  73. return btrfs_item_offset(leaf->items + nr - 1);
  74. }
  75. /*
  76. * The space between the end of the leaf items and
  77. * the start of the leaf data. IOW, how much room
  78. * the leaf has left for both items and data
  79. */
  80. int btrfs_leaf_free_space(struct btrfs_root *root, struct btrfs_leaf *leaf)
  81. {
  82. int data_end = leaf_data_end(root, leaf);
  83. int nritems = btrfs_header_nritems(&leaf->header);
  84. char *items_end = (char *)(leaf->items + nritems + 1);
  85. return (char *)(btrfs_leaf_data(leaf) + data_end) - (char *)items_end;
  86. }
  87. /*
  88. * compare two keys in a memcmp fashion
  89. */
  90. static int comp_keys(struct btrfs_disk_key *disk, struct btrfs_key *k2)
  91. {
  92. struct btrfs_key k1;
  93. btrfs_disk_key_to_cpu(&k1, disk);
  94. if (k1.objectid > k2->objectid)
  95. return 1;
  96. if (k1.objectid < k2->objectid)
  97. return -1;
  98. if (k1.flags > k2->flags)
  99. return 1;
  100. if (k1.flags < k2->flags)
  101. return -1;
  102. if (k1.offset > k2->offset)
  103. return 1;
  104. if (k1.offset < k2->offset)
  105. return -1;
  106. return 0;
  107. }
  108. static int check_node(struct btrfs_root *root, struct btrfs_path *path,
  109. int level)
  110. {
  111. int i;
  112. struct btrfs_node *parent = NULL;
  113. struct btrfs_node *node = btrfs_buffer_node(path->nodes[level]);
  114. int parent_slot;
  115. u32 nritems = btrfs_header_nritems(&node->header);
  116. if (path->nodes[level + 1])
  117. parent = btrfs_buffer_node(path->nodes[level + 1]);
  118. parent_slot = path->slots[level + 1];
  119. BUG_ON(nritems == 0);
  120. if (parent) {
  121. struct btrfs_disk_key *parent_key;
  122. parent_key = &parent->ptrs[parent_slot].key;
  123. BUG_ON(memcmp(parent_key, &node->ptrs[0].key,
  124. sizeof(struct btrfs_disk_key)));
  125. BUG_ON(btrfs_node_blockptr(parent, parent_slot) !=
  126. btrfs_header_blocknr(&node->header));
  127. }
  128. BUG_ON(nritems > BTRFS_NODEPTRS_PER_BLOCK(root));
  129. for (i = 0; nritems > 1 && i < nritems - 2; i++) {
  130. struct btrfs_key cpukey;
  131. btrfs_disk_key_to_cpu(&cpukey, &node->ptrs[i + 1].key);
  132. BUG_ON(comp_keys(&node->ptrs[i].key, &cpukey) >= 0);
  133. }
  134. return 0;
  135. }
  136. static int check_leaf(struct btrfs_root *root, struct btrfs_path *path,
  137. int level)
  138. {
  139. int i;
  140. struct btrfs_leaf *leaf = btrfs_buffer_leaf(path->nodes[level]);
  141. struct btrfs_node *parent = NULL;
  142. int parent_slot;
  143. u32 nritems = btrfs_header_nritems(&leaf->header);
  144. if (path->nodes[level + 1])
  145. parent = btrfs_buffer_node(path->nodes[level + 1]);
  146. parent_slot = path->slots[level + 1];
  147. BUG_ON(btrfs_leaf_free_space(root, leaf) < 0);
  148. if (nritems == 0)
  149. return 0;
  150. if (parent) {
  151. struct btrfs_disk_key *parent_key;
  152. parent_key = &parent->ptrs[parent_slot].key;
  153. BUG_ON(memcmp(parent_key, &leaf->items[0].key,
  154. sizeof(struct btrfs_disk_key)));
  155. BUG_ON(btrfs_node_blockptr(parent, parent_slot) !=
  156. btrfs_header_blocknr(&leaf->header));
  157. }
  158. for (i = 0; nritems > 1 && i < nritems - 2; i++) {
  159. struct btrfs_key cpukey;
  160. btrfs_disk_key_to_cpu(&cpukey, &leaf->items[i + 1].key);
  161. BUG_ON(comp_keys(&leaf->items[i].key,
  162. &cpukey) >= 0);
  163. BUG_ON(btrfs_item_offset(leaf->items + i) !=
  164. btrfs_item_end(leaf->items + i + 1));
  165. if (i == 0) {
  166. BUG_ON(btrfs_item_offset(leaf->items + i) +
  167. btrfs_item_size(leaf->items + i) !=
  168. BTRFS_LEAF_DATA_SIZE(root));
  169. }
  170. }
  171. return 0;
  172. }
  173. static int check_block(struct btrfs_root *root, struct btrfs_path *path,
  174. int level)
  175. {
  176. if (level == 0)
  177. return check_leaf(root, path, level);
  178. return check_node(root, path, level);
  179. }
  180. /*
  181. * search for key in the array p. items p are item_size apart
  182. * and there are 'max' items in p
  183. * the slot in the array is returned via slot, and it points to
  184. * the place where you would insert key if it is not found in
  185. * the array.
  186. *
  187. * slot may point to max if the key is bigger than all of the keys
  188. */
  189. static int generic_bin_search(char *p, int item_size, struct btrfs_key *key,
  190. int max, int *slot)
  191. {
  192. int low = 0;
  193. int high = max;
  194. int mid;
  195. int ret;
  196. struct btrfs_disk_key *tmp;
  197. while(low < high) {
  198. mid = (low + high) / 2;
  199. tmp = (struct btrfs_disk_key *)(p + mid * item_size);
  200. ret = comp_keys(tmp, key);
  201. if (ret < 0)
  202. low = mid + 1;
  203. else if (ret > 0)
  204. high = mid;
  205. else {
  206. *slot = mid;
  207. return 0;
  208. }
  209. }
  210. *slot = low;
  211. return 1;
  212. }
  213. /*
  214. * simple bin_search frontend that does the right thing for
  215. * leaves vs nodes
  216. */
  217. static int bin_search(struct btrfs_node *c, struct btrfs_key *key, int *slot)
  218. {
  219. if (btrfs_is_leaf(c)) {
  220. struct btrfs_leaf *l = (struct btrfs_leaf *)c;
  221. return generic_bin_search((void *)l->items,
  222. sizeof(struct btrfs_item),
  223. key, btrfs_header_nritems(&c->header),
  224. slot);
  225. } else {
  226. return generic_bin_search((void *)c->ptrs,
  227. sizeof(struct btrfs_key_ptr),
  228. key, btrfs_header_nritems(&c->header),
  229. slot);
  230. }
  231. return -1;
  232. }
  233. static struct buffer_head *read_node_slot(struct btrfs_root *root,
  234. struct buffer_head *parent_buf,
  235. int slot)
  236. {
  237. struct btrfs_node *node = btrfs_buffer_node(parent_buf);
  238. if (slot < 0)
  239. return NULL;
  240. if (slot >= btrfs_header_nritems(&node->header))
  241. return NULL;
  242. return read_tree_block(root, btrfs_node_blockptr(node, slot));
  243. }
  244. static int balance_level(struct btrfs_trans_handle *trans, struct btrfs_root
  245. *root, struct btrfs_path *path, int level)
  246. {
  247. struct buffer_head *right_buf;
  248. struct buffer_head *mid_buf;
  249. struct buffer_head *left_buf;
  250. struct buffer_head *parent_buf = NULL;
  251. struct btrfs_node *right = NULL;
  252. struct btrfs_node *mid;
  253. struct btrfs_node *left = NULL;
  254. struct btrfs_node *parent = NULL;
  255. int ret = 0;
  256. int wret;
  257. int pslot;
  258. int orig_slot = path->slots[level];
  259. u64 orig_ptr;
  260. if (level == 0)
  261. return 0;
  262. mid_buf = path->nodes[level];
  263. mid = btrfs_buffer_node(mid_buf);
  264. orig_ptr = btrfs_node_blockptr(mid, orig_slot);
  265. if (level < BTRFS_MAX_LEVEL - 1)
  266. parent_buf = path->nodes[level + 1];
  267. pslot = path->slots[level + 1];
  268. /*
  269. * deal with the case where there is only one pointer in the root
  270. * by promoting the node below to a root
  271. */
  272. if (!parent_buf) {
  273. struct buffer_head *child;
  274. u64 blocknr = mid_buf->b_blocknr;
  275. if (btrfs_header_nritems(&mid->header) != 1)
  276. return 0;
  277. /* promote the child to a root */
  278. child = read_node_slot(root, mid_buf, 0);
  279. BUG_ON(!child);
  280. root->node = child;
  281. path->nodes[level] = NULL;
  282. /* once for the path */
  283. btrfs_block_release(root, mid_buf);
  284. /* once for the root ptr */
  285. btrfs_block_release(root, mid_buf);
  286. clean_tree_block(trans, root, mid_buf);
  287. return btrfs_free_extent(trans, root, blocknr, 1, 1);
  288. }
  289. parent = btrfs_buffer_node(parent_buf);
  290. if (btrfs_header_nritems(&mid->header) >
  291. BTRFS_NODEPTRS_PER_BLOCK(root) / 4)
  292. return 0;
  293. left_buf = read_node_slot(root, parent_buf, pslot - 1);
  294. right_buf = read_node_slot(root, parent_buf, pslot + 1);
  295. /* first, try to make some room in the middle buffer */
  296. if (left_buf) {
  297. btrfs_cow_block(trans, root, left_buf, parent_buf, pslot - 1,
  298. &left_buf);
  299. left = btrfs_buffer_node(left_buf);
  300. orig_slot += btrfs_header_nritems(&left->header);
  301. wret = push_node_left(trans, root, left_buf, mid_buf);
  302. if (wret < 0)
  303. ret = wret;
  304. }
  305. /*
  306. * then try to empty the right most buffer into the middle
  307. */
  308. if (right_buf) {
  309. btrfs_cow_block(trans, root, right_buf, parent_buf, pslot + 1,
  310. &right_buf);
  311. right = btrfs_buffer_node(right_buf);
  312. wret = push_node_left(trans, root, mid_buf, right_buf);
  313. if (wret < 0)
  314. ret = wret;
  315. if (btrfs_header_nritems(&right->header) == 0) {
  316. u64 blocknr = right_buf->b_blocknr;
  317. btrfs_block_release(root, right_buf);
  318. clean_tree_block(trans, root, right_buf);
  319. right_buf = NULL;
  320. right = NULL;
  321. wret = del_ptr(trans, root, path, level + 1, pslot +
  322. 1);
  323. if (wret)
  324. ret = wret;
  325. wret = btrfs_free_extent(trans, root, blocknr, 1, 1);
  326. if (wret)
  327. ret = wret;
  328. } else {
  329. memcpy(&parent->ptrs[pslot + 1].key,
  330. &right->ptrs[0].key,
  331. sizeof(struct btrfs_disk_key));
  332. BUG_ON(!buffer_dirty(parent_buf));
  333. }
  334. }
  335. if (btrfs_header_nritems(&mid->header) == 1) {
  336. /*
  337. * we're not allowed to leave a node with one item in the
  338. * tree during a delete. A deletion from lower in the tree
  339. * could try to delete the only pointer in this node.
  340. * So, pull some keys from the left.
  341. * There has to be a left pointer at this point because
  342. * otherwise we would have pulled some pointers from the
  343. * right
  344. */
  345. BUG_ON(!left_buf);
  346. wret = balance_node_right(trans, root, mid_buf, left_buf);
  347. if (wret < 0)
  348. ret = wret;
  349. BUG_ON(wret == 1);
  350. }
  351. if (btrfs_header_nritems(&mid->header) == 0) {
  352. /* we've managed to empty the middle node, drop it */
  353. u64 blocknr = mid_buf->b_blocknr;
  354. btrfs_block_release(root, mid_buf);
  355. clean_tree_block(trans, root, mid_buf);
  356. mid_buf = NULL;
  357. mid = NULL;
  358. wret = del_ptr(trans, root, path, level + 1, pslot);
  359. if (wret)
  360. ret = wret;
  361. wret = btrfs_free_extent(trans, root, blocknr, 1, 1);
  362. if (wret)
  363. ret = wret;
  364. } else {
  365. /* update the parent key to reflect our changes */
  366. memcpy(&parent->ptrs[pslot].key, &mid->ptrs[0].key,
  367. sizeof(struct btrfs_disk_key));
  368. BUG_ON(!buffer_dirty(parent_buf));
  369. }
  370. /* update the path */
  371. if (left_buf) {
  372. if (btrfs_header_nritems(&left->header) > orig_slot) {
  373. get_bh(left_buf);
  374. path->nodes[level] = left_buf;
  375. path->slots[level + 1] -= 1;
  376. path->slots[level] = orig_slot;
  377. if (mid_buf)
  378. btrfs_block_release(root, mid_buf);
  379. } else {
  380. orig_slot -= btrfs_header_nritems(&left->header);
  381. path->slots[level] = orig_slot;
  382. }
  383. }
  384. /* double check we haven't messed things up */
  385. check_block(root, path, level);
  386. if (orig_ptr !=
  387. btrfs_node_blockptr(btrfs_buffer_node(path->nodes[level]),
  388. path->slots[level]))
  389. BUG();
  390. if (right_buf)
  391. btrfs_block_release(root, right_buf);
  392. if (left_buf)
  393. btrfs_block_release(root, left_buf);
  394. return ret;
  395. }
  396. /*
  397. * look for key in the tree. path is filled in with nodes along the way
  398. * if key is found, we return zero and you can find the item in the leaf
  399. * level of the path (level 0)
  400. *
  401. * If the key isn't found, the path points to the slot where it should
  402. * be inserted, and 1 is returned. If there are other errors during the
  403. * search a negative error number is returned.
  404. *
  405. * if ins_len > 0, nodes and leaves will be split as we walk down the
  406. * tree. if ins_len < 0, nodes will be merged as we walk down the tree (if
  407. * possible)
  408. */
  409. int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root
  410. *root, struct btrfs_key *key, struct btrfs_path *p, int
  411. ins_len, int cow)
  412. {
  413. struct buffer_head *b;
  414. struct buffer_head *cow_buf;
  415. struct btrfs_node *c;
  416. int slot;
  417. int ret;
  418. int level;
  419. again:
  420. b = root->node;
  421. get_bh(b);
  422. while (b) {
  423. c = btrfs_buffer_node(b);
  424. level = btrfs_header_level(&c->header);
  425. if (cow) {
  426. int wret;
  427. wret = btrfs_cow_block(trans, root, b,
  428. p->nodes[level + 1],
  429. p->slots[level + 1],
  430. &cow_buf);
  431. b = cow_buf;
  432. }
  433. BUG_ON(!cow && ins_len);
  434. c = btrfs_buffer_node(b);
  435. p->nodes[level] = b;
  436. ret = check_block(root, p, level);
  437. if (ret)
  438. return -1;
  439. ret = bin_search(c, key, &slot);
  440. if (!btrfs_is_leaf(c)) {
  441. if (ret && slot > 0)
  442. slot -= 1;
  443. p->slots[level] = slot;
  444. if (ins_len > 0 && btrfs_header_nritems(&c->header) ==
  445. BTRFS_NODEPTRS_PER_BLOCK(root)) {
  446. int sret = split_node(trans, root, p, level);
  447. BUG_ON(sret > 0);
  448. if (sret)
  449. return sret;
  450. b = p->nodes[level];
  451. c = btrfs_buffer_node(b);
  452. slot = p->slots[level];
  453. } else if (ins_len < 0) {
  454. int sret = balance_level(trans, root, p,
  455. level);
  456. if (sret)
  457. return sret;
  458. b = p->nodes[level];
  459. if (!b)
  460. goto again;
  461. c = btrfs_buffer_node(b);
  462. slot = p->slots[level];
  463. BUG_ON(btrfs_header_nritems(&c->header) == 1);
  464. }
  465. b = read_tree_block(root, btrfs_node_blockptr(c, slot));
  466. } else {
  467. struct btrfs_leaf *l = (struct btrfs_leaf *)c;
  468. p->slots[level] = slot;
  469. if (ins_len > 0 && btrfs_leaf_free_space(root, l) <
  470. sizeof(struct btrfs_item) + ins_len) {
  471. int sret = split_leaf(trans, root, p, ins_len);
  472. BUG_ON(sret > 0);
  473. if (sret)
  474. return sret;
  475. }
  476. return ret;
  477. }
  478. }
  479. return 1;
  480. }
  481. /*
  482. * adjust the pointers going up the tree, starting at level
  483. * making sure the right key of each node is points to 'key'.
  484. * This is used after shifting pointers to the left, so it stops
  485. * fixing up pointers when a given leaf/node is not in slot 0 of the
  486. * higher levels
  487. *
  488. * If this fails to write a tree block, it returns -1, but continues
  489. * fixing up the blocks in ram so the tree is consistent.
  490. */
  491. static int fixup_low_keys(struct btrfs_trans_handle *trans, struct btrfs_root
  492. *root, struct btrfs_path *path, struct btrfs_disk_key
  493. *key, int level)
  494. {
  495. int i;
  496. int ret = 0;
  497. for (i = level; i < BTRFS_MAX_LEVEL; i++) {
  498. struct btrfs_node *t;
  499. int tslot = path->slots[i];
  500. if (!path->nodes[i])
  501. break;
  502. t = btrfs_buffer_node(path->nodes[i]);
  503. memcpy(&t->ptrs[tslot].key, key, sizeof(*key));
  504. BUG_ON(!buffer_dirty(path->nodes[i]));
  505. if (tslot != 0)
  506. break;
  507. }
  508. return ret;
  509. }
  510. /*
  511. * try to push data from one node into the next node left in the
  512. * tree.
  513. *
  514. * returns 0 if some ptrs were pushed left, < 0 if there was some horrible
  515. * error, and > 0 if there was no room in the left hand block.
  516. */
  517. static int push_node_left(struct btrfs_trans_handle *trans, struct btrfs_root
  518. *root, struct buffer_head *dst_buf, struct
  519. buffer_head *src_buf)
  520. {
  521. struct btrfs_node *src = btrfs_buffer_node(src_buf);
  522. struct btrfs_node *dst = btrfs_buffer_node(dst_buf);
  523. int push_items = 0;
  524. int src_nritems;
  525. int dst_nritems;
  526. int ret = 0;
  527. src_nritems = btrfs_header_nritems(&src->header);
  528. dst_nritems = btrfs_header_nritems(&dst->header);
  529. push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
  530. if (push_items <= 0) {
  531. return 1;
  532. }
  533. if (src_nritems < push_items)
  534. push_items = src_nritems;
  535. memcpy(dst->ptrs + dst_nritems, src->ptrs,
  536. push_items * sizeof(struct btrfs_key_ptr));
  537. if (push_items < src_nritems) {
  538. memmove(src->ptrs, src->ptrs + push_items,
  539. (src_nritems - push_items) *
  540. sizeof(struct btrfs_key_ptr));
  541. }
  542. btrfs_set_header_nritems(&src->header, src_nritems - push_items);
  543. btrfs_set_header_nritems(&dst->header, dst_nritems + push_items);
  544. BUG_ON(!buffer_dirty(src_buf));
  545. BUG_ON(!buffer_dirty(dst_buf));
  546. return ret;
  547. }
  548. /*
  549. * try to push data from one node into the next node right in the
  550. * tree.
  551. *
  552. * returns 0 if some ptrs were pushed, < 0 if there was some horrible
  553. * error, and > 0 if there was no room in the right hand block.
  554. *
  555. * this will only push up to 1/2 the contents of the left node over
  556. */
  557. static int balance_node_right(struct btrfs_trans_handle *trans, struct
  558. btrfs_root *root, struct buffer_head *dst_buf,
  559. struct buffer_head *src_buf)
  560. {
  561. struct btrfs_node *src = btrfs_buffer_node(src_buf);
  562. struct btrfs_node *dst = btrfs_buffer_node(dst_buf);
  563. int push_items = 0;
  564. int max_push;
  565. int src_nritems;
  566. int dst_nritems;
  567. int ret = 0;
  568. src_nritems = btrfs_header_nritems(&src->header);
  569. dst_nritems = btrfs_header_nritems(&dst->header);
  570. push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems;
  571. if (push_items <= 0) {
  572. return 1;
  573. }
  574. max_push = src_nritems / 2 + 1;
  575. /* don't try to empty the node */
  576. if (max_push > src_nritems)
  577. return 1;
  578. if (max_push < push_items)
  579. push_items = max_push;
  580. memmove(dst->ptrs + push_items, dst->ptrs,
  581. dst_nritems * sizeof(struct btrfs_key_ptr));
  582. memcpy(dst->ptrs, src->ptrs + src_nritems - push_items,
  583. push_items * sizeof(struct btrfs_key_ptr));
  584. btrfs_set_header_nritems(&src->header, src_nritems - push_items);
  585. btrfs_set_header_nritems(&dst->header, dst_nritems + push_items);
  586. BUG_ON(!buffer_dirty(src_buf));
  587. BUG_ON(!buffer_dirty(dst_buf));
  588. return ret;
  589. }
  590. /*
  591. * helper function to insert a new root level in the tree.
  592. * A new node is allocated, and a single item is inserted to
  593. * point to the existing root
  594. *
  595. * returns zero on success or < 0 on failure.
  596. */
  597. static int insert_new_root(struct btrfs_trans_handle *trans, struct btrfs_root
  598. *root, struct btrfs_path *path, int level)
  599. {
  600. struct buffer_head *t;
  601. struct btrfs_node *lower;
  602. struct btrfs_node *c;
  603. struct btrfs_disk_key *lower_key;
  604. BUG_ON(path->nodes[level]);
  605. BUG_ON(path->nodes[level-1] != root->node);
  606. t = btrfs_alloc_free_block(trans, root);
  607. c = btrfs_buffer_node(t);
  608. memset(c, 0, root->blocksize);
  609. btrfs_set_header_nritems(&c->header, 1);
  610. btrfs_set_header_level(&c->header, level);
  611. btrfs_set_header_blocknr(&c->header, t->b_blocknr);
  612. btrfs_set_header_parentid(&c->header,
  613. btrfs_header_parentid(btrfs_buffer_header(root->node)));
  614. lower = btrfs_buffer_node(path->nodes[level-1]);
  615. if (btrfs_is_leaf(lower))
  616. lower_key = &((struct btrfs_leaf *)lower)->items[0].key;
  617. else
  618. lower_key = &lower->ptrs[0].key;
  619. memcpy(&c->ptrs[0].key, lower_key, sizeof(struct btrfs_disk_key));
  620. btrfs_set_node_blockptr(c, 0, path->nodes[level - 1]->b_blocknr);
  621. /* the super has an extra ref to root->node */
  622. btrfs_block_release(root, root->node);
  623. root->node = t;
  624. get_bh(t);
  625. path->nodes[level] = t;
  626. path->slots[level] = 0;
  627. return 0;
  628. }
  629. /*
  630. * worker function to insert a single pointer in a node.
  631. * the node should have enough room for the pointer already
  632. *
  633. * slot and level indicate where you want the key to go, and
  634. * blocknr is the block the key points to.
  635. *
  636. * returns zero on success and < 0 on any error
  637. */
  638. static int insert_ptr(struct btrfs_trans_handle *trans, struct btrfs_root
  639. *root, struct btrfs_path *path, struct btrfs_disk_key
  640. *key, u64 blocknr, int slot, int level)
  641. {
  642. struct btrfs_node *lower;
  643. int nritems;
  644. BUG_ON(!path->nodes[level]);
  645. lower = btrfs_buffer_node(path->nodes[level]);
  646. nritems = btrfs_header_nritems(&lower->header);
  647. if (slot > nritems)
  648. BUG();
  649. if (nritems == BTRFS_NODEPTRS_PER_BLOCK(root))
  650. BUG();
  651. if (slot != nritems) {
  652. memmove(lower->ptrs + slot + 1, lower->ptrs + slot,
  653. (nritems - slot) * sizeof(struct btrfs_key_ptr));
  654. }
  655. memcpy(&lower->ptrs[slot].key, key, sizeof(struct btrfs_disk_key));
  656. btrfs_set_node_blockptr(lower, slot, blocknr);
  657. btrfs_set_header_nritems(&lower->header, nritems + 1);
  658. BUG_ON(!buffer_dirty(path->nodes[level]));
  659. return 0;
  660. }
  661. /*
  662. * split the node at the specified level in path in two.
  663. * The path is corrected to point to the appropriate node after the split
  664. *
  665. * Before splitting this tries to make some room in the node by pushing
  666. * left and right, if either one works, it returns right away.
  667. *
  668. * returns 0 on success and < 0 on failure
  669. */
  670. static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root
  671. *root, struct btrfs_path *path, int level)
  672. {
  673. struct buffer_head *t;
  674. struct btrfs_node *c;
  675. struct buffer_head *split_buffer;
  676. struct btrfs_node *split;
  677. int mid;
  678. int ret;
  679. int wret;
  680. u32 c_nritems;
  681. t = path->nodes[level];
  682. c = btrfs_buffer_node(t);
  683. if (t == root->node) {
  684. /* trying to split the root, lets make a new one */
  685. ret = insert_new_root(trans, root, path, level + 1);
  686. if (ret)
  687. return ret;
  688. }
  689. c_nritems = btrfs_header_nritems(&c->header);
  690. split_buffer = btrfs_alloc_free_block(trans, root);
  691. split = btrfs_buffer_node(split_buffer);
  692. btrfs_set_header_flags(&split->header, btrfs_header_flags(&c->header));
  693. btrfs_set_header_blocknr(&split->header, split_buffer->b_blocknr);
  694. btrfs_set_header_parentid(&split->header,
  695. btrfs_header_parentid(btrfs_buffer_header(root->node)));
  696. mid = (c_nritems + 1) / 2;
  697. memcpy(split->ptrs, c->ptrs + mid,
  698. (c_nritems - mid) * sizeof(struct btrfs_key_ptr));
  699. btrfs_set_header_nritems(&split->header, c_nritems - mid);
  700. btrfs_set_header_nritems(&c->header, mid);
  701. ret = 0;
  702. BUG_ON(!buffer_dirty(t));
  703. wret = insert_ptr(trans, root, path, &split->ptrs[0].key,
  704. split_buffer->b_blocknr, path->slots[level + 1] + 1,
  705. level + 1);
  706. if (wret)
  707. ret = wret;
  708. if (path->slots[level] >= mid) {
  709. path->slots[level] -= mid;
  710. btrfs_block_release(root, t);
  711. path->nodes[level] = split_buffer;
  712. path->slots[level + 1] += 1;
  713. } else {
  714. btrfs_block_release(root, split_buffer);
  715. }
  716. return ret;
  717. }
  718. /*
  719. * how many bytes are required to store the items in a leaf. start
  720. * and nr indicate which items in the leaf to check. This totals up the
  721. * space used both by the item structs and the item data
  722. */
  723. static int leaf_space_used(struct btrfs_leaf *l, int start, int nr)
  724. {
  725. int data_len;
  726. int end = start + nr - 1;
  727. if (!nr)
  728. return 0;
  729. data_len = btrfs_item_end(l->items + start);
  730. data_len = data_len - btrfs_item_offset(l->items + end);
  731. data_len += sizeof(struct btrfs_item) * nr;
  732. return data_len;
  733. }
  734. /*
  735. * push some data in the path leaf to the right, trying to free up at
  736. * least data_size bytes. returns zero if the push worked, nonzero otherwise
  737. *
  738. * returns 1 if the push failed because the other node didn't have enough
  739. * room, 0 if everything worked out and < 0 if there were major errors.
  740. */
  741. static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root
  742. *root, struct btrfs_path *path, int data_size)
  743. {
  744. struct buffer_head *left_buf = path->nodes[0];
  745. struct btrfs_leaf *left = btrfs_buffer_leaf(left_buf);
  746. struct btrfs_leaf *right;
  747. struct buffer_head *right_buf;
  748. struct buffer_head *upper;
  749. struct btrfs_node *upper_node;
  750. int slot;
  751. int i;
  752. int free_space;
  753. int push_space = 0;
  754. int push_items = 0;
  755. struct btrfs_item *item;
  756. u32 left_nritems;
  757. u32 right_nritems;
  758. slot = path->slots[1];
  759. if (!path->nodes[1]) {
  760. return 1;
  761. }
  762. upper = path->nodes[1];
  763. upper_node = btrfs_buffer_node(upper);
  764. if (slot >= btrfs_header_nritems(&upper_node->header) - 1) {
  765. return 1;
  766. }
  767. right_buf = read_tree_block(root,
  768. btrfs_node_blockptr(btrfs_buffer_node(upper), slot + 1));
  769. right = btrfs_buffer_leaf(right_buf);
  770. free_space = btrfs_leaf_free_space(root, right);
  771. if (free_space < data_size + sizeof(struct btrfs_item)) {
  772. btrfs_block_release(root, right_buf);
  773. return 1;
  774. }
  775. /* cow and double check */
  776. btrfs_cow_block(trans, root, right_buf, upper, slot + 1, &right_buf);
  777. right = btrfs_buffer_leaf(right_buf);
  778. free_space = btrfs_leaf_free_space(root, right);
  779. if (free_space < data_size + sizeof(struct btrfs_item)) {
  780. btrfs_block_release(root, right_buf);
  781. return 1;
  782. }
  783. left_nritems = btrfs_header_nritems(&left->header);
  784. for (i = left_nritems - 1; i >= 0; i--) {
  785. item = left->items + i;
  786. if (path->slots[0] == i)
  787. push_space += data_size + sizeof(*item);
  788. if (btrfs_item_size(item) + sizeof(*item) + push_space >
  789. free_space)
  790. break;
  791. push_items++;
  792. push_space += btrfs_item_size(item) + sizeof(*item);
  793. }
  794. if (push_items == 0) {
  795. btrfs_block_release(root, right_buf);
  796. return 1;
  797. }
  798. right_nritems = btrfs_header_nritems(&right->header);
  799. /* push left to right */
  800. push_space = btrfs_item_end(left->items + left_nritems - push_items);
  801. push_space -= leaf_data_end(root, left);
  802. /* make room in the right data area */
  803. memmove(btrfs_leaf_data(right) + leaf_data_end(root, right) -
  804. push_space, btrfs_leaf_data(right) + leaf_data_end(root, right),
  805. BTRFS_LEAF_DATA_SIZE(root) - leaf_data_end(root, right));
  806. /* copy from the left data area */
  807. memcpy(btrfs_leaf_data(right) + BTRFS_LEAF_DATA_SIZE(root) - push_space,
  808. btrfs_leaf_data(left) + leaf_data_end(root, left), push_space);
  809. memmove(right->items + push_items, right->items,
  810. right_nritems * sizeof(struct btrfs_item));
  811. /* copy the items from left to right */
  812. memcpy(right->items, left->items + left_nritems - push_items,
  813. push_items * sizeof(struct btrfs_item));
  814. /* update the item pointers */
  815. right_nritems += push_items;
  816. btrfs_set_header_nritems(&right->header, right_nritems);
  817. push_space = BTRFS_LEAF_DATA_SIZE(root);
  818. for (i = 0; i < right_nritems; i++) {
  819. btrfs_set_item_offset(right->items + i, push_space -
  820. btrfs_item_size(right->items + i));
  821. push_space = btrfs_item_offset(right->items + i);
  822. }
  823. left_nritems -= push_items;
  824. btrfs_set_header_nritems(&left->header, left_nritems);
  825. BUG_ON(!buffer_dirty(left_buf));
  826. BUG_ON(!buffer_dirty(right_buf));
  827. memcpy(&upper_node->ptrs[slot + 1].key,
  828. &right->items[0].key, sizeof(struct btrfs_disk_key));
  829. BUG_ON(!buffer_dirty(upper));
  830. /* then fixup the leaf pointer in the path */
  831. if (path->slots[0] >= left_nritems) {
  832. path->slots[0] -= left_nritems;
  833. btrfs_block_release(root, path->nodes[0]);
  834. path->nodes[0] = right_buf;
  835. path->slots[1] += 1;
  836. } else {
  837. btrfs_block_release(root, right_buf);
  838. }
  839. return 0;
  840. }
  841. /*
  842. * push some data in the path leaf to the left, trying to free up at
  843. * least data_size bytes. returns zero if the push worked, nonzero otherwise
  844. */
  845. static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
  846. *root, struct btrfs_path *path, int data_size)
  847. {
  848. struct buffer_head *right_buf = path->nodes[0];
  849. struct btrfs_leaf *right = btrfs_buffer_leaf(right_buf);
  850. struct buffer_head *t;
  851. struct btrfs_leaf *left;
  852. int slot;
  853. int i;
  854. int free_space;
  855. int push_space = 0;
  856. int push_items = 0;
  857. struct btrfs_item *item;
  858. u32 old_left_nritems;
  859. int ret = 0;
  860. int wret;
  861. slot = path->slots[1];
  862. if (slot == 0) {
  863. return 1;
  864. }
  865. if (!path->nodes[1]) {
  866. return 1;
  867. }
  868. t = read_tree_block(root,
  869. btrfs_node_blockptr(btrfs_buffer_node(path->nodes[1]), slot - 1));
  870. left = btrfs_buffer_leaf(t);
  871. free_space = btrfs_leaf_free_space(root, left);
  872. if (free_space < data_size + sizeof(struct btrfs_item)) {
  873. btrfs_block_release(root, t);
  874. return 1;
  875. }
  876. /* cow and double check */
  877. btrfs_cow_block(trans, root, t, path->nodes[1], slot - 1, &t);
  878. left = btrfs_buffer_leaf(t);
  879. free_space = btrfs_leaf_free_space(root, left);
  880. if (free_space < data_size + sizeof(struct btrfs_item)) {
  881. btrfs_block_release(root, t);
  882. return 1;
  883. }
  884. for (i = 0; i < btrfs_header_nritems(&right->header); i++) {
  885. item = right->items + i;
  886. if (path->slots[0] == i)
  887. push_space += data_size + sizeof(*item);
  888. if (btrfs_item_size(item) + sizeof(*item) + push_space >
  889. free_space)
  890. break;
  891. push_items++;
  892. push_space += btrfs_item_size(item) + sizeof(*item);
  893. }
  894. if (push_items == 0) {
  895. btrfs_block_release(root, t);
  896. return 1;
  897. }
  898. /* push data from right to left */
  899. memcpy(left->items + btrfs_header_nritems(&left->header),
  900. right->items, push_items * sizeof(struct btrfs_item));
  901. push_space = BTRFS_LEAF_DATA_SIZE(root) -
  902. btrfs_item_offset(right->items + push_items -1);
  903. memcpy(btrfs_leaf_data(left) + leaf_data_end(root, left) - push_space,
  904. btrfs_leaf_data(right) +
  905. btrfs_item_offset(right->items + push_items - 1),
  906. push_space);
  907. old_left_nritems = btrfs_header_nritems(&left->header);
  908. BUG_ON(old_left_nritems < 0);
  909. for (i = old_left_nritems; i < old_left_nritems + push_items; i++) {
  910. u32 ioff = btrfs_item_offset(left->items + i);
  911. btrfs_set_item_offset(left->items + i, ioff -
  912. (BTRFS_LEAF_DATA_SIZE(root) -
  913. btrfs_item_offset(left->items +
  914. old_left_nritems - 1)));
  915. }
  916. btrfs_set_header_nritems(&left->header, old_left_nritems + push_items);
  917. /* fixup right node */
  918. push_space = btrfs_item_offset(right->items + push_items - 1) -
  919. leaf_data_end(root, right);
  920. memmove(btrfs_leaf_data(right) + BTRFS_LEAF_DATA_SIZE(root) -
  921. push_space, btrfs_leaf_data(right) +
  922. leaf_data_end(root, right), push_space);
  923. memmove(right->items, right->items + push_items,
  924. (btrfs_header_nritems(&right->header) - push_items) *
  925. sizeof(struct btrfs_item));
  926. btrfs_set_header_nritems(&right->header,
  927. btrfs_header_nritems(&right->header) -
  928. push_items);
  929. push_space = BTRFS_LEAF_DATA_SIZE(root);
  930. for (i = 0; i < btrfs_header_nritems(&right->header); i++) {
  931. btrfs_set_item_offset(right->items + i, push_space -
  932. btrfs_item_size(right->items + i));
  933. push_space = btrfs_item_offset(right->items + i);
  934. }
  935. BUG_ON(!buffer_dirty(t));
  936. BUG_ON(!buffer_dirty(right_buf));
  937. wret = fixup_low_keys(trans, root, path, &right->items[0].key, 1);
  938. if (wret)
  939. ret = wret;
  940. /* then fixup the leaf pointer in the path */
  941. if (path->slots[0] < push_items) {
  942. path->slots[0] += old_left_nritems;
  943. btrfs_block_release(root, path->nodes[0]);
  944. path->nodes[0] = t;
  945. path->slots[1] -= 1;
  946. } else {
  947. btrfs_block_release(root, t);
  948. path->slots[0] -= push_items;
  949. }
  950. BUG_ON(path->slots[0] < 0);
  951. return ret;
  952. }
  953. /*
  954. * split the path's leaf in two, making sure there is at least data_size
  955. * available for the resulting leaf level of the path.
  956. *
  957. * returns 0 if all went well and < 0 on failure.
  958. */
  959. static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root
  960. *root, struct btrfs_path *path, int data_size)
  961. {
  962. struct buffer_head *l_buf;
  963. struct btrfs_leaf *l;
  964. u32 nritems;
  965. int mid;
  966. int slot;
  967. struct btrfs_leaf *right;
  968. struct buffer_head *right_buffer;
  969. int space_needed = data_size + sizeof(struct btrfs_item);
  970. int data_copy_size;
  971. int rt_data_off;
  972. int i;
  973. int ret;
  974. int wret;
  975. /* first try to make some room by pushing left and right */
  976. wret = push_leaf_left(trans, root, path, data_size);
  977. if (wret < 0)
  978. return wret;
  979. if (wret) {
  980. wret = push_leaf_right(trans, root, path, data_size);
  981. if (wret < 0)
  982. return wret;
  983. }
  984. l_buf = path->nodes[0];
  985. l = btrfs_buffer_leaf(l_buf);
  986. /* did the pushes work? */
  987. if (btrfs_leaf_free_space(root, l) >=
  988. sizeof(struct btrfs_item) + data_size)
  989. return 0;
  990. if (!path->nodes[1]) {
  991. ret = insert_new_root(trans, root, path, 1);
  992. if (ret)
  993. return ret;
  994. }
  995. slot = path->slots[0];
  996. nritems = btrfs_header_nritems(&l->header);
  997. mid = (nritems + 1)/ 2;
  998. right_buffer = btrfs_alloc_free_block(trans, root);
  999. BUG_ON(!right_buffer);
  1000. BUG_ON(mid == nritems);
  1001. right = btrfs_buffer_leaf(right_buffer);
  1002. memset(&right->header, 0, sizeof(right->header));
  1003. if (mid <= slot) {
  1004. /* FIXME, just alloc a new leaf here */
  1005. if (leaf_space_used(l, mid, nritems - mid) + space_needed >
  1006. BTRFS_LEAF_DATA_SIZE(root))
  1007. BUG();
  1008. } else {
  1009. /* FIXME, just alloc a new leaf here */
  1010. if (leaf_space_used(l, 0, mid + 1) + space_needed >
  1011. BTRFS_LEAF_DATA_SIZE(root))
  1012. BUG();
  1013. }
  1014. btrfs_set_header_nritems(&right->header, nritems - mid);
  1015. btrfs_set_header_blocknr(&right->header, right_buffer->b_blocknr);
  1016. btrfs_set_header_level(&right->header, 0);
  1017. btrfs_set_header_parentid(&right->header,
  1018. btrfs_header_parentid(btrfs_buffer_header(root->node)));
  1019. data_copy_size = btrfs_item_end(l->items + mid) -
  1020. leaf_data_end(root, l);
  1021. memcpy(right->items, l->items + mid,
  1022. (nritems - mid) * sizeof(struct btrfs_item));
  1023. memcpy(btrfs_leaf_data(right) + BTRFS_LEAF_DATA_SIZE(root) -
  1024. data_copy_size, btrfs_leaf_data(l) +
  1025. leaf_data_end(root, l), data_copy_size);
  1026. rt_data_off = BTRFS_LEAF_DATA_SIZE(root) -
  1027. btrfs_item_end(l->items + mid);
  1028. for (i = 0; i < btrfs_header_nritems(&right->header); i++) {
  1029. u32 ioff = btrfs_item_offset(right->items + i);
  1030. btrfs_set_item_offset(right->items + i, ioff + rt_data_off);
  1031. }
  1032. btrfs_set_header_nritems(&l->header, mid);
  1033. ret = 0;
  1034. wret = insert_ptr(trans, root, path, &right->items[0].key,
  1035. right_buffer->b_blocknr, path->slots[1] + 1, 1);
  1036. if (wret)
  1037. ret = wret;
  1038. BUG_ON(!buffer_dirty(right_buffer));
  1039. BUG_ON(!buffer_dirty(l_buf));
  1040. BUG_ON(path->slots[0] != slot);
  1041. if (mid <= slot) {
  1042. btrfs_block_release(root, path->nodes[0]);
  1043. path->nodes[0] = right_buffer;
  1044. path->slots[0] -= mid;
  1045. path->slots[1] += 1;
  1046. } else
  1047. btrfs_block_release(root, right_buffer);
  1048. BUG_ON(path->slots[0] < 0);
  1049. return ret;
  1050. }
  1051. /*
  1052. * Given a key and some data, insert an item into the tree.
  1053. * This does all the path init required, making room in the tree if needed.
  1054. */
  1055. int btrfs_insert_empty_item(struct btrfs_trans_handle *trans, struct btrfs_root
  1056. *root, struct btrfs_path *path, struct btrfs_key
  1057. *cpu_key, u32 data_size)
  1058. {
  1059. int ret = 0;
  1060. int slot;
  1061. int slot_orig;
  1062. struct btrfs_leaf *leaf;
  1063. struct buffer_head *leaf_buf;
  1064. u32 nritems;
  1065. unsigned int data_end;
  1066. struct btrfs_disk_key disk_key;
  1067. btrfs_cpu_key_to_disk(&disk_key, cpu_key);
  1068. /* create a root if there isn't one */
  1069. if (!root->node)
  1070. BUG();
  1071. ret = btrfs_search_slot(trans, root, cpu_key, path, data_size, 1);
  1072. if (ret == 0) {
  1073. btrfs_release_path(root, path);
  1074. return -EEXIST;
  1075. }
  1076. if (ret < 0)
  1077. goto out;
  1078. slot_orig = path->slots[0];
  1079. leaf_buf = path->nodes[0];
  1080. leaf = btrfs_buffer_leaf(leaf_buf);
  1081. nritems = btrfs_header_nritems(&leaf->header);
  1082. data_end = leaf_data_end(root, leaf);
  1083. if (btrfs_leaf_free_space(root, leaf) <
  1084. sizeof(struct btrfs_item) + data_size)
  1085. BUG();
  1086. slot = path->slots[0];
  1087. BUG_ON(slot < 0);
  1088. if (slot != nritems) {
  1089. int i;
  1090. unsigned int old_data = btrfs_item_end(leaf->items + slot);
  1091. /*
  1092. * item0..itemN ... dataN.offset..dataN.size .. data0.size
  1093. */
  1094. /* first correct the data pointers */
  1095. for (i = slot; i < nritems; i++) {
  1096. u32 ioff = btrfs_item_offset(leaf->items + i);
  1097. btrfs_set_item_offset(leaf->items + i,
  1098. ioff - data_size);
  1099. }
  1100. /* shift the items */
  1101. memmove(leaf->items + slot + 1, leaf->items + slot,
  1102. (nritems - slot) * sizeof(struct btrfs_item));
  1103. /* shift the data */
  1104. memmove(btrfs_leaf_data(leaf) + data_end - data_size,
  1105. btrfs_leaf_data(leaf) +
  1106. data_end, old_data - data_end);
  1107. data_end = old_data;
  1108. }
  1109. /* setup the item for the new data */
  1110. memcpy(&leaf->items[slot].key, &disk_key,
  1111. sizeof(struct btrfs_disk_key));
  1112. btrfs_set_item_offset(leaf->items + slot, data_end - data_size);
  1113. btrfs_set_item_size(leaf->items + slot, data_size);
  1114. btrfs_set_header_nritems(&leaf->header, nritems + 1);
  1115. ret = 0;
  1116. if (slot == 0)
  1117. ret = fixup_low_keys(trans, root, path, &disk_key, 1);
  1118. BUG_ON(!buffer_dirty(leaf_buf));
  1119. if (btrfs_leaf_free_space(root, leaf) < 0)
  1120. BUG();
  1121. check_leaf(root, path, 0);
  1122. out:
  1123. return ret;
  1124. }
  1125. /*
  1126. * Given a key and some data, insert an item into the tree.
  1127. * This does all the path init required, making room in the tree if needed.
  1128. */
  1129. int btrfs_insert_item(struct btrfs_trans_handle *trans, struct btrfs_root
  1130. *root, struct btrfs_key *cpu_key, void *data, u32
  1131. data_size)
  1132. {
  1133. int ret = 0;
  1134. struct btrfs_path path;
  1135. u8 *ptr;
  1136. btrfs_init_path(&path);
  1137. ret = btrfs_insert_empty_item(trans, root, &path, cpu_key, data_size);
  1138. if (!ret) {
  1139. ptr = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]),
  1140. path.slots[0], u8);
  1141. memcpy(ptr, data, data_size);
  1142. }
  1143. btrfs_release_path(root, &path);
  1144. return ret;
  1145. }
  1146. /*
  1147. * delete the pointer from a given node.
  1148. *
  1149. * If the delete empties a node, the node is removed from the tree,
  1150. * continuing all the way the root if required. The root is converted into
  1151. * a leaf if all the nodes are emptied.
  1152. */
  1153. static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root,
  1154. struct btrfs_path *path, int level, int slot)
  1155. {
  1156. struct btrfs_node *node;
  1157. struct buffer_head *parent = path->nodes[level];
  1158. u32 nritems;
  1159. int ret = 0;
  1160. int wret;
  1161. node = btrfs_buffer_node(parent);
  1162. nritems = btrfs_header_nritems(&node->header);
  1163. if (slot != nritems -1) {
  1164. memmove(node->ptrs + slot, node->ptrs + slot + 1,
  1165. sizeof(struct btrfs_key_ptr) * (nritems - slot - 1));
  1166. }
  1167. nritems--;
  1168. btrfs_set_header_nritems(&node->header, nritems);
  1169. if (nritems == 0 && parent == root->node) {
  1170. struct btrfs_header *header = btrfs_buffer_header(root->node);
  1171. BUG_ON(btrfs_header_level(header) != 1);
  1172. /* just turn the root into a leaf and break */
  1173. btrfs_set_header_level(header, 0);
  1174. } else if (slot == 0) {
  1175. wret = fixup_low_keys(trans, root, path, &node->ptrs[0].key,
  1176. level + 1);
  1177. if (wret)
  1178. ret = wret;
  1179. }
  1180. BUG_ON(!buffer_dirty(parent));
  1181. return ret;
  1182. }
  1183. /*
  1184. * delete the item at the leaf level in path. If that empties
  1185. * the leaf, remove it from the tree
  1186. */
  1187. int btrfs_del_item(struct btrfs_trans_handle *trans, struct btrfs_root *root,
  1188. struct btrfs_path *path)
  1189. {
  1190. int slot;
  1191. struct btrfs_leaf *leaf;
  1192. struct buffer_head *leaf_buf;
  1193. int doff;
  1194. int dsize;
  1195. int ret = 0;
  1196. int wret;
  1197. u32 nritems;
  1198. leaf_buf = path->nodes[0];
  1199. leaf = btrfs_buffer_leaf(leaf_buf);
  1200. slot = path->slots[0];
  1201. doff = btrfs_item_offset(leaf->items + slot);
  1202. dsize = btrfs_item_size(leaf->items + slot);
  1203. nritems = btrfs_header_nritems(&leaf->header);
  1204. if (slot != nritems - 1) {
  1205. int i;
  1206. int data_end = leaf_data_end(root, leaf);
  1207. memmove(btrfs_leaf_data(leaf) + data_end + dsize,
  1208. btrfs_leaf_data(leaf) + data_end,
  1209. doff - data_end);
  1210. for (i = slot + 1; i < nritems; i++) {
  1211. u32 ioff = btrfs_item_offset(leaf->items + i);
  1212. btrfs_set_item_offset(leaf->items + i, ioff + dsize);
  1213. }
  1214. memmove(leaf->items + slot, leaf->items + slot + 1,
  1215. sizeof(struct btrfs_item) *
  1216. (nritems - slot - 1));
  1217. }
  1218. btrfs_set_header_nritems(&leaf->header, nritems - 1);
  1219. nritems--;
  1220. /* delete the leaf if we've emptied it */
  1221. if (nritems == 0) {
  1222. if (leaf_buf == root->node) {
  1223. btrfs_set_header_level(&leaf->header, 0);
  1224. } else {
  1225. clean_tree_block(trans, root, leaf_buf);
  1226. wret = del_ptr(trans, root, path, 1, path->slots[1]);
  1227. if (wret)
  1228. ret = wret;
  1229. wret = btrfs_free_extent(trans, root,
  1230. leaf_buf->b_blocknr, 1, 1);
  1231. if (wret)
  1232. ret = wret;
  1233. }
  1234. } else {
  1235. int used = leaf_space_used(leaf, 0, nritems);
  1236. if (slot == 0) {
  1237. wret = fixup_low_keys(trans, root, path,
  1238. &leaf->items[0].key, 1);
  1239. if (wret)
  1240. ret = wret;
  1241. }
  1242. /* delete the leaf if it is mostly empty */
  1243. if (used < BTRFS_LEAF_DATA_SIZE(root) / 3) {
  1244. /* push_leaf_left fixes the path.
  1245. * make sure the path still points to our leaf
  1246. * for possible call to del_ptr below
  1247. */
  1248. slot = path->slots[1];
  1249. get_bh(leaf_buf);
  1250. wret = push_leaf_left(trans, root, path, 1);
  1251. if (wret < 0)
  1252. ret = wret;
  1253. if (path->nodes[0] == leaf_buf &&
  1254. btrfs_header_nritems(&leaf->header)) {
  1255. wret = push_leaf_right(trans, root, path, 1);
  1256. if (wret < 0)
  1257. ret = wret;
  1258. }
  1259. if (btrfs_header_nritems(&leaf->header) == 0) {
  1260. u64 blocknr = leaf_buf->b_blocknr;
  1261. clean_tree_block(trans, root, leaf_buf);
  1262. wret = del_ptr(trans, root, path, 1, slot);
  1263. if (wret)
  1264. ret = wret;
  1265. btrfs_block_release(root, leaf_buf);
  1266. wret = btrfs_free_extent(trans, root, blocknr,
  1267. 1, 1);
  1268. if (wret)
  1269. ret = wret;
  1270. } else {
  1271. btrfs_block_release(root, leaf_buf);
  1272. }
  1273. }
  1274. }
  1275. return ret;
  1276. }
  1277. /*
  1278. * walk up the tree as far as required to find the next leaf.
  1279. * returns 0 if it found something or 1 if there are no greater leaves.
  1280. * returns < 0 on io errors.
  1281. */
  1282. int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path)
  1283. {
  1284. int slot;
  1285. int level = 1;
  1286. u64 blocknr;
  1287. struct buffer_head *c;
  1288. struct btrfs_node *c_node;
  1289. struct buffer_head *next = NULL;
  1290. while(level < BTRFS_MAX_LEVEL) {
  1291. if (!path->nodes[level])
  1292. return 1;
  1293. slot = path->slots[level] + 1;
  1294. c = path->nodes[level];
  1295. c_node = btrfs_buffer_node(c);
  1296. if (slot >= btrfs_header_nritems(&c_node->header)) {
  1297. level++;
  1298. continue;
  1299. }
  1300. blocknr = btrfs_node_blockptr(c_node, slot);
  1301. if (next)
  1302. btrfs_block_release(root, next);
  1303. next = read_tree_block(root, blocknr);
  1304. break;
  1305. }
  1306. path->slots[level] = slot;
  1307. while(1) {
  1308. level--;
  1309. c = path->nodes[level];
  1310. btrfs_block_release(root, c);
  1311. path->nodes[level] = next;
  1312. path->slots[level] = 0;
  1313. if (!level)
  1314. break;
  1315. next = read_tree_block(root,
  1316. btrfs_node_blockptr(btrfs_buffer_node(next), 0));
  1317. }
  1318. return 0;
  1319. }