ctree.c 41 KB

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