btree.c 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265
  1. /*
  2. * btree.c - NILFS B-tree.
  3. *
  4. * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  19. *
  20. * Written by Koji Sato <koji@osrg.net>.
  21. */
  22. #include <linux/slab.h>
  23. #include <linux/string.h>
  24. #include <linux/errno.h>
  25. #include <linux/pagevec.h>
  26. #include "nilfs.h"
  27. #include "page.h"
  28. #include "btnode.h"
  29. #include "btree.h"
  30. #include "alloc.h"
  31. /**
  32. * struct nilfs_btree_path - A path on which B-tree operations are executed
  33. * @bp_bh: buffer head of node block
  34. * @bp_sib_bh: buffer head of sibling node block
  35. * @bp_index: index of child node
  36. * @bp_oldreq: ptr end request for old ptr
  37. * @bp_newreq: ptr alloc request for new ptr
  38. * @bp_op: rebalance operation
  39. */
  40. struct nilfs_btree_path {
  41. struct buffer_head *bp_bh;
  42. struct buffer_head *bp_sib_bh;
  43. int bp_index;
  44. union nilfs_bmap_ptr_req bp_oldreq;
  45. union nilfs_bmap_ptr_req bp_newreq;
  46. struct nilfs_btnode_chkey_ctxt bp_ctxt;
  47. void (*bp_op)(struct nilfs_btree *, struct nilfs_btree_path *,
  48. int, __u64 *, __u64 *);
  49. };
  50. /*
  51. * B-tree path operations
  52. */
  53. static struct kmem_cache *nilfs_btree_path_cache;
  54. int __init nilfs_btree_path_cache_init(void)
  55. {
  56. nilfs_btree_path_cache =
  57. kmem_cache_create("nilfs2_btree_path_cache",
  58. sizeof(struct nilfs_btree_path) *
  59. NILFS_BTREE_LEVEL_MAX, 0, 0, NULL);
  60. return (nilfs_btree_path_cache != NULL) ? 0 : -ENOMEM;
  61. }
  62. void nilfs_btree_path_cache_destroy(void)
  63. {
  64. kmem_cache_destroy(nilfs_btree_path_cache);
  65. }
  66. static inline struct nilfs_btree_path *
  67. nilfs_btree_alloc_path(const struct nilfs_btree *btree)
  68. {
  69. return (struct nilfs_btree_path *)
  70. kmem_cache_alloc(nilfs_btree_path_cache, GFP_NOFS);
  71. }
  72. static inline void nilfs_btree_free_path(const struct nilfs_btree *btree,
  73. struct nilfs_btree_path *path)
  74. {
  75. kmem_cache_free(nilfs_btree_path_cache, path);
  76. }
  77. static void nilfs_btree_init_path(const struct nilfs_btree *btree,
  78. struct nilfs_btree_path *path)
  79. {
  80. int level;
  81. for (level = NILFS_BTREE_LEVEL_DATA;
  82. level < NILFS_BTREE_LEVEL_MAX;
  83. level++) {
  84. path[level].bp_bh = NULL;
  85. path[level].bp_sib_bh = NULL;
  86. path[level].bp_index = 0;
  87. path[level].bp_oldreq.bpr_ptr = NILFS_BMAP_INVALID_PTR;
  88. path[level].bp_newreq.bpr_ptr = NILFS_BMAP_INVALID_PTR;
  89. path[level].bp_op = NULL;
  90. }
  91. }
  92. static void nilfs_btree_clear_path(const struct nilfs_btree *btree,
  93. struct nilfs_btree_path *path)
  94. {
  95. int level;
  96. for (level = NILFS_BTREE_LEVEL_DATA;
  97. level < NILFS_BTREE_LEVEL_MAX;
  98. level++) {
  99. if (path[level].bp_bh != NULL) {
  100. brelse(path[level].bp_bh);
  101. path[level].bp_bh = NULL;
  102. }
  103. /* sib_bh is released or deleted by prepare or commit
  104. * operations. */
  105. path[level].bp_sib_bh = NULL;
  106. path[level].bp_index = 0;
  107. path[level].bp_oldreq.bpr_ptr = NILFS_BMAP_INVALID_PTR;
  108. path[level].bp_newreq.bpr_ptr = NILFS_BMAP_INVALID_PTR;
  109. path[level].bp_op = NULL;
  110. }
  111. }
  112. /*
  113. * B-tree node operations
  114. */
  115. static inline int
  116. nilfs_btree_node_get_flags(const struct nilfs_btree *btree,
  117. const struct nilfs_btree_node *node)
  118. {
  119. return node->bn_flags;
  120. }
  121. static inline void
  122. nilfs_btree_node_set_flags(struct nilfs_btree *btree,
  123. struct nilfs_btree_node *node,
  124. int flags)
  125. {
  126. node->bn_flags = flags;
  127. }
  128. static inline int nilfs_btree_node_root(const struct nilfs_btree *btree,
  129. const struct nilfs_btree_node *node)
  130. {
  131. return nilfs_btree_node_get_flags(btree, node) & NILFS_BTREE_NODE_ROOT;
  132. }
  133. static inline int
  134. nilfs_btree_node_get_level(const struct nilfs_btree *btree,
  135. const struct nilfs_btree_node *node)
  136. {
  137. return node->bn_level;
  138. }
  139. static inline void
  140. nilfs_btree_node_set_level(struct nilfs_btree *btree,
  141. struct nilfs_btree_node *node,
  142. int level)
  143. {
  144. node->bn_level = level;
  145. }
  146. static inline int
  147. nilfs_btree_node_get_nchildren(const struct nilfs_btree *btree,
  148. const struct nilfs_btree_node *node)
  149. {
  150. return le16_to_cpu(node->bn_nchildren);
  151. }
  152. static inline void
  153. nilfs_btree_node_set_nchildren(struct nilfs_btree *btree,
  154. struct nilfs_btree_node *node,
  155. int nchildren)
  156. {
  157. node->bn_nchildren = cpu_to_le16(nchildren);
  158. }
  159. static inline int
  160. nilfs_btree_node_size(const struct nilfs_btree *btree)
  161. {
  162. return 1 << btree->bt_bmap.b_inode->i_blkbits;
  163. }
  164. static inline int
  165. nilfs_btree_node_nchildren_min(const struct nilfs_btree *btree,
  166. const struct nilfs_btree_node *node)
  167. {
  168. return nilfs_btree_node_root(btree, node) ?
  169. NILFS_BTREE_ROOT_NCHILDREN_MIN :
  170. NILFS_BTREE_NODE_NCHILDREN_MIN(nilfs_btree_node_size(btree));
  171. }
  172. static inline int
  173. nilfs_btree_node_nchildren_max(const struct nilfs_btree *btree,
  174. const struct nilfs_btree_node *node)
  175. {
  176. return nilfs_btree_node_root(btree, node) ?
  177. NILFS_BTREE_ROOT_NCHILDREN_MAX :
  178. NILFS_BTREE_NODE_NCHILDREN_MAX(nilfs_btree_node_size(btree));
  179. }
  180. static inline __le64 *
  181. nilfs_btree_node_dkeys(const struct nilfs_btree *btree,
  182. const struct nilfs_btree_node *node)
  183. {
  184. return (__le64 *)((char *)(node + 1) +
  185. (nilfs_btree_node_root(btree, node) ?
  186. 0 : NILFS_BTREE_NODE_EXTRA_PAD_SIZE));
  187. }
  188. static inline __le64 *
  189. nilfs_btree_node_dptrs(const struct nilfs_btree *btree,
  190. const struct nilfs_btree_node *node)
  191. {
  192. return (__le64 *)(nilfs_btree_node_dkeys(btree, node) +
  193. nilfs_btree_node_nchildren_max(btree, node));
  194. }
  195. static inline __u64
  196. nilfs_btree_node_get_key(const struct nilfs_btree *btree,
  197. const struct nilfs_btree_node *node, int index)
  198. {
  199. return nilfs_bmap_dkey_to_key(*(nilfs_btree_node_dkeys(btree, node) +
  200. index));
  201. }
  202. static inline void
  203. nilfs_btree_node_set_key(struct nilfs_btree *btree,
  204. struct nilfs_btree_node *node, int index, __u64 key)
  205. {
  206. *(nilfs_btree_node_dkeys(btree, node) + index) =
  207. nilfs_bmap_key_to_dkey(key);
  208. }
  209. static inline __u64
  210. nilfs_btree_node_get_ptr(const struct nilfs_btree *btree,
  211. const struct nilfs_btree_node *node,
  212. int index)
  213. {
  214. return nilfs_bmap_dptr_to_ptr(*(nilfs_btree_node_dptrs(btree, node) +
  215. index));
  216. }
  217. static inline void
  218. nilfs_btree_node_set_ptr(struct nilfs_btree *btree,
  219. struct nilfs_btree_node *node,
  220. int index,
  221. __u64 ptr)
  222. {
  223. *(nilfs_btree_node_dptrs(btree, node) + index) =
  224. nilfs_bmap_ptr_to_dptr(ptr);
  225. }
  226. static void nilfs_btree_node_init(struct nilfs_btree *btree,
  227. struct nilfs_btree_node *node,
  228. int flags, int level, int nchildren,
  229. const __u64 *keys, const __u64 *ptrs)
  230. {
  231. __le64 *dkeys;
  232. __le64 *dptrs;
  233. int i;
  234. nilfs_btree_node_set_flags(btree, node, flags);
  235. nilfs_btree_node_set_level(btree, node, level);
  236. nilfs_btree_node_set_nchildren(btree, node, nchildren);
  237. dkeys = nilfs_btree_node_dkeys(btree, node);
  238. dptrs = nilfs_btree_node_dptrs(btree, node);
  239. for (i = 0; i < nchildren; i++) {
  240. dkeys[i] = nilfs_bmap_key_to_dkey(keys[i]);
  241. dptrs[i] = nilfs_bmap_ptr_to_dptr(ptrs[i]);
  242. }
  243. }
  244. /* Assume the buffer heads corresponding to left and right are locked. */
  245. static void nilfs_btree_node_move_left(struct nilfs_btree *btree,
  246. struct nilfs_btree_node *left,
  247. struct nilfs_btree_node *right,
  248. int n)
  249. {
  250. __le64 *ldkeys, *rdkeys;
  251. __le64 *ldptrs, *rdptrs;
  252. int lnchildren, rnchildren;
  253. ldkeys = nilfs_btree_node_dkeys(btree, left);
  254. ldptrs = nilfs_btree_node_dptrs(btree, left);
  255. lnchildren = nilfs_btree_node_get_nchildren(btree, left);
  256. rdkeys = nilfs_btree_node_dkeys(btree, right);
  257. rdptrs = nilfs_btree_node_dptrs(btree, right);
  258. rnchildren = nilfs_btree_node_get_nchildren(btree, right);
  259. memcpy(ldkeys + lnchildren, rdkeys, n * sizeof(*rdkeys));
  260. memcpy(ldptrs + lnchildren, rdptrs, n * sizeof(*rdptrs));
  261. memmove(rdkeys, rdkeys + n, (rnchildren - n) * sizeof(*rdkeys));
  262. memmove(rdptrs, rdptrs + n, (rnchildren - n) * sizeof(*rdptrs));
  263. lnchildren += n;
  264. rnchildren -= n;
  265. nilfs_btree_node_set_nchildren(btree, left, lnchildren);
  266. nilfs_btree_node_set_nchildren(btree, right, rnchildren);
  267. }
  268. /* Assume that the buffer heads corresponding to left and right are locked. */
  269. static void nilfs_btree_node_move_right(struct nilfs_btree *btree,
  270. struct nilfs_btree_node *left,
  271. struct nilfs_btree_node *right,
  272. int n)
  273. {
  274. __le64 *ldkeys, *rdkeys;
  275. __le64 *ldptrs, *rdptrs;
  276. int lnchildren, rnchildren;
  277. ldkeys = nilfs_btree_node_dkeys(btree, left);
  278. ldptrs = nilfs_btree_node_dptrs(btree, left);
  279. lnchildren = nilfs_btree_node_get_nchildren(btree, left);
  280. rdkeys = nilfs_btree_node_dkeys(btree, right);
  281. rdptrs = nilfs_btree_node_dptrs(btree, right);
  282. rnchildren = nilfs_btree_node_get_nchildren(btree, right);
  283. memmove(rdkeys + n, rdkeys, rnchildren * sizeof(*rdkeys));
  284. memmove(rdptrs + n, rdptrs, rnchildren * sizeof(*rdptrs));
  285. memcpy(rdkeys, ldkeys + lnchildren - n, n * sizeof(*rdkeys));
  286. memcpy(rdptrs, ldptrs + lnchildren - n, n * sizeof(*rdptrs));
  287. lnchildren -= n;
  288. rnchildren += n;
  289. nilfs_btree_node_set_nchildren(btree, left, lnchildren);
  290. nilfs_btree_node_set_nchildren(btree, right, rnchildren);
  291. }
  292. /* Assume that the buffer head corresponding to node is locked. */
  293. static void nilfs_btree_node_insert(struct nilfs_btree *btree,
  294. struct nilfs_btree_node *node,
  295. __u64 key, __u64 ptr, int index)
  296. {
  297. __le64 *dkeys;
  298. __le64 *dptrs;
  299. int nchildren;
  300. dkeys = nilfs_btree_node_dkeys(btree, node);
  301. dptrs = nilfs_btree_node_dptrs(btree, node);
  302. nchildren = nilfs_btree_node_get_nchildren(btree, node);
  303. if (index < nchildren) {
  304. memmove(dkeys + index + 1, dkeys + index,
  305. (nchildren - index) * sizeof(*dkeys));
  306. memmove(dptrs + index + 1, dptrs + index,
  307. (nchildren - index) * sizeof(*dptrs));
  308. }
  309. dkeys[index] = nilfs_bmap_key_to_dkey(key);
  310. dptrs[index] = nilfs_bmap_ptr_to_dptr(ptr);
  311. nchildren++;
  312. nilfs_btree_node_set_nchildren(btree, node, nchildren);
  313. }
  314. /* Assume that the buffer head corresponding to node is locked. */
  315. static void nilfs_btree_node_delete(struct nilfs_btree *btree,
  316. struct nilfs_btree_node *node,
  317. __u64 *keyp, __u64 *ptrp, int index)
  318. {
  319. __u64 key;
  320. __u64 ptr;
  321. __le64 *dkeys;
  322. __le64 *dptrs;
  323. int nchildren;
  324. dkeys = nilfs_btree_node_dkeys(btree, node);
  325. dptrs = nilfs_btree_node_dptrs(btree, node);
  326. key = nilfs_bmap_dkey_to_key(dkeys[index]);
  327. ptr = nilfs_bmap_dptr_to_ptr(dptrs[index]);
  328. nchildren = nilfs_btree_node_get_nchildren(btree, node);
  329. if (keyp != NULL)
  330. *keyp = key;
  331. if (ptrp != NULL)
  332. *ptrp = ptr;
  333. if (index < nchildren - 1) {
  334. memmove(dkeys + index, dkeys + index + 1,
  335. (nchildren - index - 1) * sizeof(*dkeys));
  336. memmove(dptrs + index, dptrs + index + 1,
  337. (nchildren - index - 1) * sizeof(*dptrs));
  338. }
  339. nchildren--;
  340. nilfs_btree_node_set_nchildren(btree, node, nchildren);
  341. }
  342. static int nilfs_btree_node_lookup(const struct nilfs_btree *btree,
  343. const struct nilfs_btree_node *node,
  344. __u64 key, int *indexp)
  345. {
  346. __u64 nkey;
  347. int index, low, high, s;
  348. /* binary search */
  349. low = 0;
  350. high = nilfs_btree_node_get_nchildren(btree, node) - 1;
  351. index = 0;
  352. s = 0;
  353. while (low <= high) {
  354. index = (low + high) / 2;
  355. nkey = nilfs_btree_node_get_key(btree, node, index);
  356. if (nkey == key) {
  357. s = 0;
  358. goto out;
  359. } else if (nkey < key) {
  360. low = index + 1;
  361. s = -1;
  362. } else {
  363. high = index - 1;
  364. s = 1;
  365. }
  366. }
  367. /* adjust index */
  368. if (nilfs_btree_node_get_level(btree, node) >
  369. NILFS_BTREE_LEVEL_NODE_MIN) {
  370. if ((s > 0) && (index > 0))
  371. index--;
  372. } else if (s < 0)
  373. index++;
  374. out:
  375. *indexp = index;
  376. return s == 0;
  377. }
  378. static inline struct nilfs_btree_node *
  379. nilfs_btree_get_root(const struct nilfs_btree *btree)
  380. {
  381. return (struct nilfs_btree_node *)btree->bt_bmap.b_u.u_data;
  382. }
  383. static inline struct nilfs_btree_node *
  384. nilfs_btree_get_nonroot_node(const struct nilfs_btree *btree,
  385. const struct nilfs_btree_path *path,
  386. int level)
  387. {
  388. return (struct nilfs_btree_node *)path[level].bp_bh->b_data;
  389. }
  390. static inline struct nilfs_btree_node *
  391. nilfs_btree_get_sib_node(const struct nilfs_btree *btree,
  392. const struct nilfs_btree_path *path,
  393. int level)
  394. {
  395. return (struct nilfs_btree_node *)path[level].bp_sib_bh->b_data;
  396. }
  397. static inline int nilfs_btree_height(const struct nilfs_btree *btree)
  398. {
  399. return nilfs_btree_node_get_level(btree, nilfs_btree_get_root(btree))
  400. + 1;
  401. }
  402. static inline struct nilfs_btree_node *
  403. nilfs_btree_get_node(const struct nilfs_btree *btree,
  404. const struct nilfs_btree_path *path,
  405. int level)
  406. {
  407. return (level == nilfs_btree_height(btree) - 1) ?
  408. nilfs_btree_get_root(btree) :
  409. nilfs_btree_get_nonroot_node(btree, path, level);
  410. }
  411. static int nilfs_btree_do_lookup(const struct nilfs_btree *btree,
  412. struct nilfs_btree_path *path,
  413. __u64 key, __u64 *ptrp, int minlevel)
  414. {
  415. struct nilfs_btree_node *node;
  416. __u64 ptr;
  417. int level, index, found, ret;
  418. node = nilfs_btree_get_root(btree);
  419. level = nilfs_btree_node_get_level(btree, node);
  420. if ((level < minlevel) ||
  421. (nilfs_btree_node_get_nchildren(btree, node) <= 0))
  422. return -ENOENT;
  423. found = nilfs_btree_node_lookup(btree, node, key, &index);
  424. ptr = nilfs_btree_node_get_ptr(btree, node, index);
  425. path[level].bp_bh = NULL;
  426. path[level].bp_index = index;
  427. for (level--; level >= minlevel; level--) {
  428. ret = nilfs_bmap_get_block(&btree->bt_bmap, ptr,
  429. &path[level].bp_bh);
  430. if (ret < 0)
  431. return ret;
  432. node = nilfs_btree_get_nonroot_node(btree, path, level);
  433. BUG_ON(level != nilfs_btree_node_get_level(btree, node));
  434. if (!found)
  435. found = nilfs_btree_node_lookup(btree, node, key,
  436. &index);
  437. else
  438. index = 0;
  439. if (index < nilfs_btree_node_nchildren_max(btree, node))
  440. ptr = nilfs_btree_node_get_ptr(btree, node, index);
  441. else {
  442. WARN_ON(found || level != NILFS_BTREE_LEVEL_NODE_MIN);
  443. /* insert */
  444. ptr = NILFS_BMAP_INVALID_PTR;
  445. }
  446. path[level].bp_index = index;
  447. }
  448. if (!found)
  449. return -ENOENT;
  450. if (ptrp != NULL)
  451. *ptrp = ptr;
  452. return 0;
  453. }
  454. static int nilfs_btree_do_lookup_last(const struct nilfs_btree *btree,
  455. struct nilfs_btree_path *path,
  456. __u64 *keyp, __u64 *ptrp)
  457. {
  458. struct nilfs_btree_node *node;
  459. __u64 ptr;
  460. int index, level, ret;
  461. node = nilfs_btree_get_root(btree);
  462. index = nilfs_btree_node_get_nchildren(btree, node) - 1;
  463. if (index < 0)
  464. return -ENOENT;
  465. level = nilfs_btree_node_get_level(btree, node);
  466. ptr = nilfs_btree_node_get_ptr(btree, node, index);
  467. path[level].bp_bh = NULL;
  468. path[level].bp_index = index;
  469. for (level--; level > 0; level--) {
  470. ret = nilfs_bmap_get_block(&btree->bt_bmap, ptr,
  471. &path[level].bp_bh);
  472. if (ret < 0)
  473. return ret;
  474. node = nilfs_btree_get_nonroot_node(btree, path, level);
  475. BUG_ON(level != nilfs_btree_node_get_level(btree, node));
  476. index = nilfs_btree_node_get_nchildren(btree, node) - 1;
  477. ptr = nilfs_btree_node_get_ptr(btree, node, index);
  478. path[level].bp_index = index;
  479. }
  480. if (keyp != NULL)
  481. *keyp = nilfs_btree_node_get_key(btree, node, index);
  482. if (ptrp != NULL)
  483. *ptrp = ptr;
  484. return 0;
  485. }
  486. static int nilfs_btree_lookup(const struct nilfs_bmap *bmap,
  487. __u64 key, int level, __u64 *ptrp)
  488. {
  489. struct nilfs_btree *btree;
  490. struct nilfs_btree_path *path;
  491. __u64 ptr;
  492. int ret;
  493. btree = (struct nilfs_btree *)bmap;
  494. path = nilfs_btree_alloc_path(btree);
  495. if (path == NULL)
  496. return -ENOMEM;
  497. nilfs_btree_init_path(btree, path);
  498. ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level);
  499. if (ptrp != NULL)
  500. *ptrp = ptr;
  501. nilfs_btree_clear_path(btree, path);
  502. nilfs_btree_free_path(btree, path);
  503. return ret;
  504. }
  505. static void nilfs_btree_promote_key(struct nilfs_btree *btree,
  506. struct nilfs_btree_path *path,
  507. int level, __u64 key)
  508. {
  509. if (level < nilfs_btree_height(btree) - 1) {
  510. do {
  511. lock_buffer(path[level].bp_bh);
  512. nilfs_btree_node_set_key(
  513. btree,
  514. nilfs_btree_get_nonroot_node(
  515. btree, path, level),
  516. path[level].bp_index, key);
  517. if (!buffer_dirty(path[level].bp_bh))
  518. nilfs_btnode_mark_dirty(path[level].bp_bh);
  519. unlock_buffer(path[level].bp_bh);
  520. } while ((path[level].bp_index == 0) &&
  521. (++level < nilfs_btree_height(btree) - 1));
  522. }
  523. /* root */
  524. if (level == nilfs_btree_height(btree) - 1) {
  525. nilfs_btree_node_set_key(btree,
  526. nilfs_btree_get_root(btree),
  527. path[level].bp_index, key);
  528. }
  529. }
  530. static void nilfs_btree_do_insert(struct nilfs_btree *btree,
  531. struct nilfs_btree_path *path,
  532. int level, __u64 *keyp, __u64 *ptrp)
  533. {
  534. struct nilfs_btree_node *node;
  535. if (level < nilfs_btree_height(btree) - 1) {
  536. lock_buffer(path[level].bp_bh);
  537. node = nilfs_btree_get_nonroot_node(btree, path, level);
  538. nilfs_btree_node_insert(btree, node, *keyp, *ptrp,
  539. path[level].bp_index);
  540. if (!buffer_dirty(path[level].bp_bh))
  541. nilfs_btnode_mark_dirty(path[level].bp_bh);
  542. unlock_buffer(path[level].bp_bh);
  543. if (path[level].bp_index == 0)
  544. nilfs_btree_promote_key(btree, path, level + 1,
  545. nilfs_btree_node_get_key(
  546. btree, node, 0));
  547. } else {
  548. node = nilfs_btree_get_root(btree);
  549. nilfs_btree_node_insert(btree, node, *keyp, *ptrp,
  550. path[level].bp_index);
  551. }
  552. }
  553. static void nilfs_btree_carry_left(struct nilfs_btree *btree,
  554. struct nilfs_btree_path *path,
  555. int level, __u64 *keyp, __u64 *ptrp)
  556. {
  557. struct nilfs_btree_node *node, *left;
  558. int nchildren, lnchildren, n, move;
  559. lock_buffer(path[level].bp_bh);
  560. lock_buffer(path[level].bp_sib_bh);
  561. node = nilfs_btree_get_nonroot_node(btree, path, level);
  562. left = nilfs_btree_get_sib_node(btree, path, level);
  563. nchildren = nilfs_btree_node_get_nchildren(btree, node);
  564. lnchildren = nilfs_btree_node_get_nchildren(btree, left);
  565. move = 0;
  566. n = (nchildren + lnchildren + 1) / 2 - lnchildren;
  567. if (n > path[level].bp_index) {
  568. /* move insert point */
  569. n--;
  570. move = 1;
  571. }
  572. nilfs_btree_node_move_left(btree, left, node, n);
  573. if (!buffer_dirty(path[level].bp_bh))
  574. nilfs_btnode_mark_dirty(path[level].bp_bh);
  575. if (!buffer_dirty(path[level].bp_sib_bh))
  576. nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
  577. unlock_buffer(path[level].bp_bh);
  578. unlock_buffer(path[level].bp_sib_bh);
  579. nilfs_btree_promote_key(btree, path, level + 1,
  580. nilfs_btree_node_get_key(btree, node, 0));
  581. if (move) {
  582. brelse(path[level].bp_bh);
  583. path[level].bp_bh = path[level].bp_sib_bh;
  584. path[level].bp_sib_bh = NULL;
  585. path[level].bp_index += lnchildren;
  586. path[level + 1].bp_index--;
  587. } else {
  588. brelse(path[level].bp_sib_bh);
  589. path[level].bp_sib_bh = NULL;
  590. path[level].bp_index -= n;
  591. }
  592. nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
  593. }
  594. static void nilfs_btree_carry_right(struct nilfs_btree *btree,
  595. struct nilfs_btree_path *path,
  596. int level, __u64 *keyp, __u64 *ptrp)
  597. {
  598. struct nilfs_btree_node *node, *right;
  599. int nchildren, rnchildren, n, move;
  600. lock_buffer(path[level].bp_bh);
  601. lock_buffer(path[level].bp_sib_bh);
  602. node = nilfs_btree_get_nonroot_node(btree, path, level);
  603. right = nilfs_btree_get_sib_node(btree, path, level);
  604. nchildren = nilfs_btree_node_get_nchildren(btree, node);
  605. rnchildren = nilfs_btree_node_get_nchildren(btree, right);
  606. move = 0;
  607. n = (nchildren + rnchildren + 1) / 2 - rnchildren;
  608. if (n > nchildren - path[level].bp_index) {
  609. /* move insert point */
  610. n--;
  611. move = 1;
  612. }
  613. nilfs_btree_node_move_right(btree, node, right, n);
  614. if (!buffer_dirty(path[level].bp_bh))
  615. nilfs_btnode_mark_dirty(path[level].bp_bh);
  616. if (!buffer_dirty(path[level].bp_sib_bh))
  617. nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
  618. unlock_buffer(path[level].bp_bh);
  619. unlock_buffer(path[level].bp_sib_bh);
  620. path[level + 1].bp_index++;
  621. nilfs_btree_promote_key(btree, path, level + 1,
  622. nilfs_btree_node_get_key(btree, right, 0));
  623. path[level + 1].bp_index--;
  624. if (move) {
  625. brelse(path[level].bp_bh);
  626. path[level].bp_bh = path[level].bp_sib_bh;
  627. path[level].bp_sib_bh = NULL;
  628. path[level].bp_index -=
  629. nilfs_btree_node_get_nchildren(btree, node);
  630. path[level + 1].bp_index++;
  631. } else {
  632. brelse(path[level].bp_sib_bh);
  633. path[level].bp_sib_bh = NULL;
  634. }
  635. nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
  636. }
  637. static void nilfs_btree_split(struct nilfs_btree *btree,
  638. struct nilfs_btree_path *path,
  639. int level, __u64 *keyp, __u64 *ptrp)
  640. {
  641. struct nilfs_btree_node *node, *right;
  642. __u64 newkey;
  643. __u64 newptr;
  644. int nchildren, n, move;
  645. lock_buffer(path[level].bp_bh);
  646. lock_buffer(path[level].bp_sib_bh);
  647. node = nilfs_btree_get_nonroot_node(btree, path, level);
  648. right = nilfs_btree_get_sib_node(btree, path, level);
  649. nchildren = nilfs_btree_node_get_nchildren(btree, node);
  650. move = 0;
  651. n = (nchildren + 1) / 2;
  652. if (n > nchildren - path[level].bp_index) {
  653. n--;
  654. move = 1;
  655. }
  656. nilfs_btree_node_move_right(btree, node, right, n);
  657. if (!buffer_dirty(path[level].bp_bh))
  658. nilfs_btnode_mark_dirty(path[level].bp_bh);
  659. if (!buffer_dirty(path[level].bp_sib_bh))
  660. nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
  661. unlock_buffer(path[level].bp_bh);
  662. unlock_buffer(path[level].bp_sib_bh);
  663. newkey = nilfs_btree_node_get_key(btree, right, 0);
  664. newptr = path[level].bp_newreq.bpr_ptr;
  665. if (move) {
  666. path[level].bp_index -=
  667. nilfs_btree_node_get_nchildren(btree, node);
  668. nilfs_btree_node_insert(btree, right, *keyp, *ptrp,
  669. path[level].bp_index);
  670. *keyp = nilfs_btree_node_get_key(btree, right, 0);
  671. *ptrp = path[level].bp_newreq.bpr_ptr;
  672. brelse(path[level].bp_bh);
  673. path[level].bp_bh = path[level].bp_sib_bh;
  674. path[level].bp_sib_bh = NULL;
  675. } else {
  676. nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
  677. *keyp = nilfs_btree_node_get_key(btree, right, 0);
  678. *ptrp = path[level].bp_newreq.bpr_ptr;
  679. brelse(path[level].bp_sib_bh);
  680. path[level].bp_sib_bh = NULL;
  681. }
  682. path[level + 1].bp_index++;
  683. }
  684. static void nilfs_btree_grow(struct nilfs_btree *btree,
  685. struct nilfs_btree_path *path,
  686. int level, __u64 *keyp, __u64 *ptrp)
  687. {
  688. struct nilfs_btree_node *root, *child;
  689. int n;
  690. lock_buffer(path[level].bp_sib_bh);
  691. root = nilfs_btree_get_root(btree);
  692. child = nilfs_btree_get_sib_node(btree, path, level);
  693. n = nilfs_btree_node_get_nchildren(btree, root);
  694. nilfs_btree_node_move_right(btree, root, child, n);
  695. nilfs_btree_node_set_level(btree, root, level + 1);
  696. if (!buffer_dirty(path[level].bp_sib_bh))
  697. nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
  698. unlock_buffer(path[level].bp_sib_bh);
  699. path[level].bp_bh = path[level].bp_sib_bh;
  700. path[level].bp_sib_bh = NULL;
  701. nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
  702. *keyp = nilfs_btree_node_get_key(btree, child, 0);
  703. *ptrp = path[level].bp_newreq.bpr_ptr;
  704. }
  705. static __u64 nilfs_btree_find_near(const struct nilfs_btree *btree,
  706. const struct nilfs_btree_path *path)
  707. {
  708. struct nilfs_btree_node *node;
  709. int level;
  710. if (path == NULL)
  711. return NILFS_BMAP_INVALID_PTR;
  712. /* left sibling */
  713. level = NILFS_BTREE_LEVEL_NODE_MIN;
  714. if (path[level].bp_index > 0) {
  715. node = nilfs_btree_get_node(btree, path, level);
  716. return nilfs_btree_node_get_ptr(btree, node,
  717. path[level].bp_index - 1);
  718. }
  719. /* parent */
  720. level = NILFS_BTREE_LEVEL_NODE_MIN + 1;
  721. if (level <= nilfs_btree_height(btree) - 1) {
  722. node = nilfs_btree_get_node(btree, path, level);
  723. return nilfs_btree_node_get_ptr(btree, node,
  724. path[level].bp_index);
  725. }
  726. return NILFS_BMAP_INVALID_PTR;
  727. }
  728. static __u64 nilfs_btree_find_target_v(const struct nilfs_btree *btree,
  729. const struct nilfs_btree_path *path,
  730. __u64 key)
  731. {
  732. __u64 ptr;
  733. ptr = nilfs_bmap_find_target_seq(&btree->bt_bmap, key);
  734. if (ptr != NILFS_BMAP_INVALID_PTR)
  735. /* sequential access */
  736. return ptr;
  737. else {
  738. ptr = nilfs_btree_find_near(btree, path);
  739. if (ptr != NILFS_BMAP_INVALID_PTR)
  740. /* near */
  741. return ptr;
  742. }
  743. /* block group */
  744. return nilfs_bmap_find_target_in_group(&btree->bt_bmap);
  745. }
  746. static void nilfs_btree_set_target_v(struct nilfs_btree *btree, __u64 key,
  747. __u64 ptr)
  748. {
  749. btree->bt_bmap.b_last_allocated_key = key;
  750. btree->bt_bmap.b_last_allocated_ptr = ptr;
  751. }
  752. static int nilfs_btree_prepare_insert(struct nilfs_btree *btree,
  753. struct nilfs_btree_path *path,
  754. int *levelp, __u64 key, __u64 ptr,
  755. struct nilfs_bmap_stats *stats)
  756. {
  757. struct buffer_head *bh;
  758. struct nilfs_btree_node *node, *parent, *sib;
  759. __u64 sibptr;
  760. int pindex, level, ret;
  761. stats->bs_nblocks = 0;
  762. level = NILFS_BTREE_LEVEL_DATA;
  763. /* allocate a new ptr for data block */
  764. if (btree->bt_ops->btop_find_target != NULL)
  765. path[level].bp_newreq.bpr_ptr =
  766. btree->bt_ops->btop_find_target(btree, path, key);
  767. ret = btree->bt_bmap.b_pops->bpop_prepare_alloc_ptr(
  768. &btree->bt_bmap, &path[level].bp_newreq);
  769. if (ret < 0)
  770. goto err_out_data;
  771. for (level = NILFS_BTREE_LEVEL_NODE_MIN;
  772. level < nilfs_btree_height(btree) - 1;
  773. level++) {
  774. node = nilfs_btree_get_nonroot_node(btree, path, level);
  775. if (nilfs_btree_node_get_nchildren(btree, node) <
  776. nilfs_btree_node_nchildren_max(btree, node)) {
  777. path[level].bp_op = nilfs_btree_do_insert;
  778. stats->bs_nblocks++;
  779. goto out;
  780. }
  781. parent = nilfs_btree_get_node(btree, path, level + 1);
  782. pindex = path[level + 1].bp_index;
  783. /* left sibling */
  784. if (pindex > 0) {
  785. sibptr = nilfs_btree_node_get_ptr(btree, parent,
  786. pindex - 1);
  787. ret = nilfs_bmap_get_block(&btree->bt_bmap, sibptr,
  788. &bh);
  789. if (ret < 0)
  790. goto err_out_child_node;
  791. sib = (struct nilfs_btree_node *)bh->b_data;
  792. if (nilfs_btree_node_get_nchildren(btree, sib) <
  793. nilfs_btree_node_nchildren_max(btree, sib)) {
  794. path[level].bp_sib_bh = bh;
  795. path[level].bp_op = nilfs_btree_carry_left;
  796. stats->bs_nblocks++;
  797. goto out;
  798. } else
  799. brelse(bh);
  800. }
  801. /* right sibling */
  802. if (pindex <
  803. nilfs_btree_node_get_nchildren(btree, parent) - 1) {
  804. sibptr = nilfs_btree_node_get_ptr(btree, parent,
  805. pindex + 1);
  806. ret = nilfs_bmap_get_block(&btree->bt_bmap, sibptr,
  807. &bh);
  808. if (ret < 0)
  809. goto err_out_child_node;
  810. sib = (struct nilfs_btree_node *)bh->b_data;
  811. if (nilfs_btree_node_get_nchildren(btree, sib) <
  812. nilfs_btree_node_nchildren_max(btree, sib)) {
  813. path[level].bp_sib_bh = bh;
  814. path[level].bp_op = nilfs_btree_carry_right;
  815. stats->bs_nblocks++;
  816. goto out;
  817. } else
  818. brelse(bh);
  819. }
  820. /* split */
  821. path[level].bp_newreq.bpr_ptr =
  822. path[level - 1].bp_newreq.bpr_ptr + 1;
  823. ret = btree->bt_bmap.b_pops->bpop_prepare_alloc_ptr(
  824. &btree->bt_bmap, &path[level].bp_newreq);
  825. if (ret < 0)
  826. goto err_out_child_node;
  827. ret = nilfs_bmap_get_new_block(&btree->bt_bmap,
  828. path[level].bp_newreq.bpr_ptr,
  829. &bh);
  830. if (ret < 0)
  831. goto err_out_curr_node;
  832. stats->bs_nblocks++;
  833. lock_buffer(bh);
  834. nilfs_btree_node_init(btree,
  835. (struct nilfs_btree_node *)bh->b_data,
  836. 0, level, 0, NULL, NULL);
  837. unlock_buffer(bh);
  838. path[level].bp_sib_bh = bh;
  839. path[level].bp_op = nilfs_btree_split;
  840. }
  841. /* root */
  842. node = nilfs_btree_get_root(btree);
  843. if (nilfs_btree_node_get_nchildren(btree, node) <
  844. nilfs_btree_node_nchildren_max(btree, node)) {
  845. path[level].bp_op = nilfs_btree_do_insert;
  846. stats->bs_nblocks++;
  847. goto out;
  848. }
  849. /* grow */
  850. path[level].bp_newreq.bpr_ptr = path[level - 1].bp_newreq.bpr_ptr + 1;
  851. ret = btree->bt_bmap.b_pops->bpop_prepare_alloc_ptr(
  852. &btree->bt_bmap, &path[level].bp_newreq);
  853. if (ret < 0)
  854. goto err_out_child_node;
  855. ret = nilfs_bmap_get_new_block(&btree->bt_bmap,
  856. path[level].bp_newreq.bpr_ptr, &bh);
  857. if (ret < 0)
  858. goto err_out_curr_node;
  859. lock_buffer(bh);
  860. nilfs_btree_node_init(btree, (struct nilfs_btree_node *)bh->b_data,
  861. 0, level, 0, NULL, NULL);
  862. unlock_buffer(bh);
  863. path[level].bp_sib_bh = bh;
  864. path[level].bp_op = nilfs_btree_grow;
  865. level++;
  866. path[level].bp_op = nilfs_btree_do_insert;
  867. /* a newly-created node block and a data block are added */
  868. stats->bs_nblocks += 2;
  869. /* success */
  870. out:
  871. *levelp = level;
  872. return ret;
  873. /* error */
  874. err_out_curr_node:
  875. btree->bt_bmap.b_pops->bpop_abort_alloc_ptr(&btree->bt_bmap,
  876. &path[level].bp_newreq);
  877. err_out_child_node:
  878. for (level--; level > NILFS_BTREE_LEVEL_DATA; level--) {
  879. nilfs_bmap_delete_block(&btree->bt_bmap, path[level].bp_sib_bh);
  880. btree->bt_bmap.b_pops->bpop_abort_alloc_ptr(
  881. &btree->bt_bmap, &path[level].bp_newreq);
  882. }
  883. btree->bt_bmap.b_pops->bpop_abort_alloc_ptr(&btree->bt_bmap,
  884. &path[level].bp_newreq);
  885. err_out_data:
  886. *levelp = level;
  887. stats->bs_nblocks = 0;
  888. return ret;
  889. }
  890. static void nilfs_btree_commit_insert(struct nilfs_btree *btree,
  891. struct nilfs_btree_path *path,
  892. int maxlevel, __u64 key, __u64 ptr)
  893. {
  894. int level;
  895. set_buffer_nilfs_volatile((struct buffer_head *)((unsigned long)ptr));
  896. ptr = path[NILFS_BTREE_LEVEL_DATA].bp_newreq.bpr_ptr;
  897. if (btree->bt_ops->btop_set_target != NULL)
  898. btree->bt_ops->btop_set_target(btree, key, ptr);
  899. for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) {
  900. if (btree->bt_bmap.b_pops->bpop_commit_alloc_ptr != NULL) {
  901. btree->bt_bmap.b_pops->bpop_commit_alloc_ptr(
  902. &btree->bt_bmap, &path[level - 1].bp_newreq);
  903. }
  904. path[level].bp_op(btree, path, level, &key, &ptr);
  905. }
  906. if (!nilfs_bmap_dirty(&btree->bt_bmap))
  907. nilfs_bmap_set_dirty(&btree->bt_bmap);
  908. }
  909. static int nilfs_btree_insert(struct nilfs_bmap *bmap, __u64 key, __u64 ptr)
  910. {
  911. struct nilfs_btree *btree;
  912. struct nilfs_btree_path *path;
  913. struct nilfs_bmap_stats stats;
  914. int level, ret;
  915. btree = (struct nilfs_btree *)bmap;
  916. path = nilfs_btree_alloc_path(btree);
  917. if (path == NULL)
  918. return -ENOMEM;
  919. nilfs_btree_init_path(btree, path);
  920. ret = nilfs_btree_do_lookup(btree, path, key, NULL,
  921. NILFS_BTREE_LEVEL_NODE_MIN);
  922. if (ret != -ENOENT) {
  923. if (ret == 0)
  924. ret = -EEXIST;
  925. goto out;
  926. }
  927. ret = nilfs_btree_prepare_insert(btree, path, &level, key, ptr, &stats);
  928. if (ret < 0)
  929. goto out;
  930. nilfs_btree_commit_insert(btree, path, level, key, ptr);
  931. nilfs_bmap_add_blocks(bmap, stats.bs_nblocks);
  932. out:
  933. nilfs_btree_clear_path(btree, path);
  934. nilfs_btree_free_path(btree, path);
  935. return ret;
  936. }
  937. static void nilfs_btree_do_delete(struct nilfs_btree *btree,
  938. struct nilfs_btree_path *path,
  939. int level, __u64 *keyp, __u64 *ptrp)
  940. {
  941. struct nilfs_btree_node *node;
  942. if (level < nilfs_btree_height(btree) - 1) {
  943. lock_buffer(path[level].bp_bh);
  944. node = nilfs_btree_get_nonroot_node(btree, path, level);
  945. nilfs_btree_node_delete(btree, node, keyp, ptrp,
  946. path[level].bp_index);
  947. if (!buffer_dirty(path[level].bp_bh))
  948. nilfs_btnode_mark_dirty(path[level].bp_bh);
  949. unlock_buffer(path[level].bp_bh);
  950. if (path[level].bp_index == 0)
  951. nilfs_btree_promote_key(btree, path, level + 1,
  952. nilfs_btree_node_get_key(btree, node, 0));
  953. } else {
  954. node = nilfs_btree_get_root(btree);
  955. nilfs_btree_node_delete(btree, node, keyp, ptrp,
  956. path[level].bp_index);
  957. }
  958. }
  959. static void nilfs_btree_borrow_left(struct nilfs_btree *btree,
  960. struct nilfs_btree_path *path,
  961. int level, __u64 *keyp, __u64 *ptrp)
  962. {
  963. struct nilfs_btree_node *node, *left;
  964. int nchildren, lnchildren, n;
  965. nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
  966. lock_buffer(path[level].bp_bh);
  967. lock_buffer(path[level].bp_sib_bh);
  968. node = nilfs_btree_get_nonroot_node(btree, path, level);
  969. left = nilfs_btree_get_sib_node(btree, path, level);
  970. nchildren = nilfs_btree_node_get_nchildren(btree, node);
  971. lnchildren = nilfs_btree_node_get_nchildren(btree, left);
  972. n = (nchildren + lnchildren) / 2 - nchildren;
  973. nilfs_btree_node_move_right(btree, left, node, n);
  974. if (!buffer_dirty(path[level].bp_bh))
  975. nilfs_btnode_mark_dirty(path[level].bp_bh);
  976. if (!buffer_dirty(path[level].bp_sib_bh))
  977. nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
  978. unlock_buffer(path[level].bp_bh);
  979. unlock_buffer(path[level].bp_sib_bh);
  980. nilfs_btree_promote_key(btree, path, level + 1,
  981. nilfs_btree_node_get_key(btree, node, 0));
  982. brelse(path[level].bp_sib_bh);
  983. path[level].bp_sib_bh = NULL;
  984. path[level].bp_index += n;
  985. }
  986. static void nilfs_btree_borrow_right(struct nilfs_btree *btree,
  987. struct nilfs_btree_path *path,
  988. int level, __u64 *keyp, __u64 *ptrp)
  989. {
  990. struct nilfs_btree_node *node, *right;
  991. int nchildren, rnchildren, n;
  992. nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
  993. lock_buffer(path[level].bp_bh);
  994. lock_buffer(path[level].bp_sib_bh);
  995. node = nilfs_btree_get_nonroot_node(btree, path, level);
  996. right = nilfs_btree_get_sib_node(btree, path, level);
  997. nchildren = nilfs_btree_node_get_nchildren(btree, node);
  998. rnchildren = nilfs_btree_node_get_nchildren(btree, right);
  999. n = (nchildren + rnchildren) / 2 - nchildren;
  1000. nilfs_btree_node_move_left(btree, node, right, n);
  1001. if (!buffer_dirty(path[level].bp_bh))
  1002. nilfs_btnode_mark_dirty(path[level].bp_bh);
  1003. if (!buffer_dirty(path[level].bp_sib_bh))
  1004. nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
  1005. unlock_buffer(path[level].bp_bh);
  1006. unlock_buffer(path[level].bp_sib_bh);
  1007. path[level + 1].bp_index++;
  1008. nilfs_btree_promote_key(btree, path, level + 1,
  1009. nilfs_btree_node_get_key(btree, right, 0));
  1010. path[level + 1].bp_index--;
  1011. brelse(path[level].bp_sib_bh);
  1012. path[level].bp_sib_bh = NULL;
  1013. }
  1014. static void nilfs_btree_concat_left(struct nilfs_btree *btree,
  1015. struct nilfs_btree_path *path,
  1016. int level, __u64 *keyp, __u64 *ptrp)
  1017. {
  1018. struct nilfs_btree_node *node, *left;
  1019. int n;
  1020. nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
  1021. lock_buffer(path[level].bp_bh);
  1022. lock_buffer(path[level].bp_sib_bh);
  1023. node = nilfs_btree_get_nonroot_node(btree, path, level);
  1024. left = nilfs_btree_get_sib_node(btree, path, level);
  1025. n = nilfs_btree_node_get_nchildren(btree, node);
  1026. nilfs_btree_node_move_left(btree, left, node, n);
  1027. if (!buffer_dirty(path[level].bp_sib_bh))
  1028. nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
  1029. unlock_buffer(path[level].bp_bh);
  1030. unlock_buffer(path[level].bp_sib_bh);
  1031. nilfs_bmap_delete_block(&btree->bt_bmap, path[level].bp_bh);
  1032. path[level].bp_bh = path[level].bp_sib_bh;
  1033. path[level].bp_sib_bh = NULL;
  1034. path[level].bp_index += nilfs_btree_node_get_nchildren(btree, left);
  1035. }
  1036. static void nilfs_btree_concat_right(struct nilfs_btree *btree,
  1037. struct nilfs_btree_path *path,
  1038. int level, __u64 *keyp, __u64 *ptrp)
  1039. {
  1040. struct nilfs_btree_node *node, *right;
  1041. int n;
  1042. nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
  1043. lock_buffer(path[level].bp_bh);
  1044. lock_buffer(path[level].bp_sib_bh);
  1045. node = nilfs_btree_get_nonroot_node(btree, path, level);
  1046. right = nilfs_btree_get_sib_node(btree, path, level);
  1047. n = nilfs_btree_node_get_nchildren(btree, right);
  1048. nilfs_btree_node_move_left(btree, node, right, n);
  1049. if (!buffer_dirty(path[level].bp_bh))
  1050. nilfs_btnode_mark_dirty(path[level].bp_bh);
  1051. unlock_buffer(path[level].bp_bh);
  1052. unlock_buffer(path[level].bp_sib_bh);
  1053. nilfs_bmap_delete_block(&btree->bt_bmap, path[level].bp_sib_bh);
  1054. path[level].bp_sib_bh = NULL;
  1055. path[level + 1].bp_index++;
  1056. }
  1057. static void nilfs_btree_shrink(struct nilfs_btree *btree,
  1058. struct nilfs_btree_path *path,
  1059. int level, __u64 *keyp, __u64 *ptrp)
  1060. {
  1061. struct nilfs_btree_node *root, *child;
  1062. int n;
  1063. nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
  1064. lock_buffer(path[level].bp_bh);
  1065. root = nilfs_btree_get_root(btree);
  1066. child = nilfs_btree_get_nonroot_node(btree, path, level);
  1067. nilfs_btree_node_delete(btree, root, NULL, NULL, 0);
  1068. nilfs_btree_node_set_level(btree, root, level);
  1069. n = nilfs_btree_node_get_nchildren(btree, child);
  1070. nilfs_btree_node_move_left(btree, root, child, n);
  1071. unlock_buffer(path[level].bp_bh);
  1072. nilfs_bmap_delete_block(&btree->bt_bmap, path[level].bp_bh);
  1073. path[level].bp_bh = NULL;
  1074. }
  1075. static int nilfs_btree_prepare_delete(struct nilfs_btree *btree,
  1076. struct nilfs_btree_path *path,
  1077. int *levelp,
  1078. struct nilfs_bmap_stats *stats)
  1079. {
  1080. struct buffer_head *bh;
  1081. struct nilfs_btree_node *node, *parent, *sib;
  1082. __u64 sibptr;
  1083. int pindex, level, ret;
  1084. ret = 0;
  1085. stats->bs_nblocks = 0;
  1086. for (level = NILFS_BTREE_LEVEL_NODE_MIN;
  1087. level < nilfs_btree_height(btree) - 1;
  1088. level++) {
  1089. node = nilfs_btree_get_nonroot_node(btree, path, level);
  1090. path[level].bp_oldreq.bpr_ptr =
  1091. nilfs_btree_node_get_ptr(btree, node,
  1092. path[level].bp_index);
  1093. if (btree->bt_bmap.b_pops->bpop_prepare_end_ptr != NULL) {
  1094. ret = btree->bt_bmap.b_pops->bpop_prepare_end_ptr(
  1095. &btree->bt_bmap, &path[level].bp_oldreq);
  1096. if (ret < 0)
  1097. goto err_out_child_node;
  1098. }
  1099. if (nilfs_btree_node_get_nchildren(btree, node) >
  1100. nilfs_btree_node_nchildren_min(btree, node)) {
  1101. path[level].bp_op = nilfs_btree_do_delete;
  1102. stats->bs_nblocks++;
  1103. goto out;
  1104. }
  1105. parent = nilfs_btree_get_node(btree, path, level + 1);
  1106. pindex = path[level + 1].bp_index;
  1107. if (pindex > 0) {
  1108. /* left sibling */
  1109. sibptr = nilfs_btree_node_get_ptr(btree, parent,
  1110. pindex - 1);
  1111. ret = nilfs_bmap_get_block(&btree->bt_bmap, sibptr,
  1112. &bh);
  1113. if (ret < 0)
  1114. goto err_out_curr_node;
  1115. sib = (struct nilfs_btree_node *)bh->b_data;
  1116. if (nilfs_btree_node_get_nchildren(btree, sib) >
  1117. nilfs_btree_node_nchildren_min(btree, sib)) {
  1118. path[level].bp_sib_bh = bh;
  1119. path[level].bp_op = nilfs_btree_borrow_left;
  1120. stats->bs_nblocks++;
  1121. goto out;
  1122. } else {
  1123. path[level].bp_sib_bh = bh;
  1124. path[level].bp_op = nilfs_btree_concat_left;
  1125. stats->bs_nblocks++;
  1126. /* continue; */
  1127. }
  1128. } else if (pindex <
  1129. nilfs_btree_node_get_nchildren(btree, parent) - 1) {
  1130. /* right sibling */
  1131. sibptr = nilfs_btree_node_get_ptr(btree, parent,
  1132. pindex + 1);
  1133. ret = nilfs_bmap_get_block(&btree->bt_bmap, sibptr,
  1134. &bh);
  1135. if (ret < 0)
  1136. goto err_out_curr_node;
  1137. sib = (struct nilfs_btree_node *)bh->b_data;
  1138. if (nilfs_btree_node_get_nchildren(btree, sib) >
  1139. nilfs_btree_node_nchildren_min(btree, sib)) {
  1140. path[level].bp_sib_bh = bh;
  1141. path[level].bp_op = nilfs_btree_borrow_right;
  1142. stats->bs_nblocks++;
  1143. goto out;
  1144. } else {
  1145. path[level].bp_sib_bh = bh;
  1146. path[level].bp_op = nilfs_btree_concat_right;
  1147. stats->bs_nblocks++;
  1148. /* continue; */
  1149. }
  1150. } else {
  1151. /* no siblings */
  1152. /* the only child of the root node */
  1153. WARN_ON(level != nilfs_btree_height(btree) - 2);
  1154. if (nilfs_btree_node_get_nchildren(btree, node) - 1 <=
  1155. NILFS_BTREE_ROOT_NCHILDREN_MAX) {
  1156. path[level].bp_op = nilfs_btree_shrink;
  1157. stats->bs_nblocks += 2;
  1158. } else {
  1159. path[level].bp_op = nilfs_btree_do_delete;
  1160. stats->bs_nblocks++;
  1161. }
  1162. goto out;
  1163. }
  1164. }
  1165. node = nilfs_btree_get_root(btree);
  1166. path[level].bp_oldreq.bpr_ptr =
  1167. nilfs_btree_node_get_ptr(btree, node, path[level].bp_index);
  1168. if (btree->bt_bmap.b_pops->bpop_prepare_end_ptr != NULL) {
  1169. ret = btree->bt_bmap.b_pops->bpop_prepare_end_ptr(
  1170. &btree->bt_bmap, &path[level].bp_oldreq);
  1171. if (ret < 0)
  1172. goto err_out_child_node;
  1173. }
  1174. /* child of the root node is deleted */
  1175. path[level].bp_op = nilfs_btree_do_delete;
  1176. stats->bs_nblocks++;
  1177. /* success */
  1178. out:
  1179. *levelp = level;
  1180. return ret;
  1181. /* error */
  1182. err_out_curr_node:
  1183. if (btree->bt_bmap.b_pops->bpop_abort_end_ptr != NULL)
  1184. btree->bt_bmap.b_pops->bpop_abort_end_ptr(
  1185. &btree->bt_bmap, &path[level].bp_oldreq);
  1186. err_out_child_node:
  1187. for (level--; level >= NILFS_BTREE_LEVEL_NODE_MIN; level--) {
  1188. brelse(path[level].bp_sib_bh);
  1189. if (btree->bt_bmap.b_pops->bpop_abort_end_ptr != NULL)
  1190. btree->bt_bmap.b_pops->bpop_abort_end_ptr(
  1191. &btree->bt_bmap, &path[level].bp_oldreq);
  1192. }
  1193. *levelp = level;
  1194. stats->bs_nblocks = 0;
  1195. return ret;
  1196. }
  1197. static void nilfs_btree_commit_delete(struct nilfs_btree *btree,
  1198. struct nilfs_btree_path *path,
  1199. int maxlevel)
  1200. {
  1201. int level;
  1202. for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) {
  1203. if (btree->bt_bmap.b_pops->bpop_commit_end_ptr != NULL)
  1204. btree->bt_bmap.b_pops->bpop_commit_end_ptr(
  1205. &btree->bt_bmap, &path[level].bp_oldreq);
  1206. path[level].bp_op(btree, path, level, NULL, NULL);
  1207. }
  1208. if (!nilfs_bmap_dirty(&btree->bt_bmap))
  1209. nilfs_bmap_set_dirty(&btree->bt_bmap);
  1210. }
  1211. static int nilfs_btree_delete(struct nilfs_bmap *bmap, __u64 key)
  1212. {
  1213. struct nilfs_btree *btree;
  1214. struct nilfs_btree_path *path;
  1215. struct nilfs_bmap_stats stats;
  1216. int level, ret;
  1217. btree = (struct nilfs_btree *)bmap;
  1218. path = nilfs_btree_alloc_path(btree);
  1219. if (path == NULL)
  1220. return -ENOMEM;
  1221. nilfs_btree_init_path(btree, path);
  1222. ret = nilfs_btree_do_lookup(btree, path, key, NULL,
  1223. NILFS_BTREE_LEVEL_NODE_MIN);
  1224. if (ret < 0)
  1225. goto out;
  1226. ret = nilfs_btree_prepare_delete(btree, path, &level, &stats);
  1227. if (ret < 0)
  1228. goto out;
  1229. nilfs_btree_commit_delete(btree, path, level);
  1230. nilfs_bmap_sub_blocks(bmap, stats.bs_nblocks);
  1231. out:
  1232. nilfs_btree_clear_path(btree, path);
  1233. nilfs_btree_free_path(btree, path);
  1234. return ret;
  1235. }
  1236. static int nilfs_btree_last_key(const struct nilfs_bmap *bmap, __u64 *keyp)
  1237. {
  1238. struct nilfs_btree *btree;
  1239. struct nilfs_btree_path *path;
  1240. int ret;
  1241. btree = (struct nilfs_btree *)bmap;
  1242. path = nilfs_btree_alloc_path(btree);
  1243. if (path == NULL)
  1244. return -ENOMEM;
  1245. nilfs_btree_init_path(btree, path);
  1246. ret = nilfs_btree_do_lookup_last(btree, path, keyp, NULL);
  1247. nilfs_btree_clear_path(btree, path);
  1248. nilfs_btree_free_path(btree, path);
  1249. return ret;
  1250. }
  1251. static int nilfs_btree_check_delete(struct nilfs_bmap *bmap, __u64 key)
  1252. {
  1253. struct buffer_head *bh;
  1254. struct nilfs_btree *btree;
  1255. struct nilfs_btree_node *root, *node;
  1256. __u64 maxkey, nextmaxkey;
  1257. __u64 ptr;
  1258. int nchildren, ret;
  1259. btree = (struct nilfs_btree *)bmap;
  1260. root = nilfs_btree_get_root(btree);
  1261. switch (nilfs_btree_height(btree)) {
  1262. case 2:
  1263. bh = NULL;
  1264. node = root;
  1265. break;
  1266. case 3:
  1267. nchildren = nilfs_btree_node_get_nchildren(btree, root);
  1268. if (nchildren > 1)
  1269. return 0;
  1270. ptr = nilfs_btree_node_get_ptr(btree, root, nchildren - 1);
  1271. ret = nilfs_bmap_get_block(bmap, ptr, &bh);
  1272. if (ret < 0)
  1273. return ret;
  1274. node = (struct nilfs_btree_node *)bh->b_data;
  1275. break;
  1276. default:
  1277. return 0;
  1278. }
  1279. nchildren = nilfs_btree_node_get_nchildren(btree, node);
  1280. maxkey = nilfs_btree_node_get_key(btree, node, nchildren - 1);
  1281. nextmaxkey = (nchildren > 1) ?
  1282. nilfs_btree_node_get_key(btree, node, nchildren - 2) : 0;
  1283. if (bh != NULL)
  1284. brelse(bh);
  1285. return (maxkey == key) && (nextmaxkey < bmap->b_low);
  1286. }
  1287. static int nilfs_btree_gather_data(struct nilfs_bmap *bmap,
  1288. __u64 *keys, __u64 *ptrs, int nitems)
  1289. {
  1290. struct buffer_head *bh;
  1291. struct nilfs_btree *btree;
  1292. struct nilfs_btree_node *node, *root;
  1293. __le64 *dkeys;
  1294. __le64 *dptrs;
  1295. __u64 ptr;
  1296. int nchildren, i, ret;
  1297. btree = (struct nilfs_btree *)bmap;
  1298. root = nilfs_btree_get_root(btree);
  1299. switch (nilfs_btree_height(btree)) {
  1300. case 2:
  1301. bh = NULL;
  1302. node = root;
  1303. break;
  1304. case 3:
  1305. nchildren = nilfs_btree_node_get_nchildren(btree, root);
  1306. WARN_ON(nchildren > 1);
  1307. ptr = nilfs_btree_node_get_ptr(btree, root, nchildren - 1);
  1308. ret = nilfs_bmap_get_block(bmap, ptr, &bh);
  1309. if (ret < 0)
  1310. return ret;
  1311. node = (struct nilfs_btree_node *)bh->b_data;
  1312. break;
  1313. default:
  1314. node = NULL;
  1315. return -EINVAL;
  1316. }
  1317. nchildren = nilfs_btree_node_get_nchildren(btree, node);
  1318. if (nchildren < nitems)
  1319. nitems = nchildren;
  1320. dkeys = nilfs_btree_node_dkeys(btree, node);
  1321. dptrs = nilfs_btree_node_dptrs(btree, node);
  1322. for (i = 0; i < nitems; i++) {
  1323. keys[i] = nilfs_bmap_dkey_to_key(dkeys[i]);
  1324. ptrs[i] = nilfs_bmap_dptr_to_ptr(dptrs[i]);
  1325. }
  1326. if (bh != NULL)
  1327. brelse(bh);
  1328. return nitems;
  1329. }
  1330. static int
  1331. nilfs_btree_prepare_convert_and_insert(struct nilfs_bmap *bmap, __u64 key,
  1332. union nilfs_bmap_ptr_req *dreq,
  1333. union nilfs_bmap_ptr_req *nreq,
  1334. struct buffer_head **bhp,
  1335. struct nilfs_bmap_stats *stats)
  1336. {
  1337. struct buffer_head *bh;
  1338. struct nilfs_btree *btree;
  1339. int ret;
  1340. btree = (struct nilfs_btree *)bmap;
  1341. stats->bs_nblocks = 0;
  1342. /* for data */
  1343. /* cannot find near ptr */
  1344. if (btree->bt_ops->btop_find_target != NULL)
  1345. dreq->bpr_ptr
  1346. = btree->bt_ops->btop_find_target(btree, NULL, key);
  1347. ret = bmap->b_pops->bpop_prepare_alloc_ptr(bmap, dreq);
  1348. if (ret < 0)
  1349. return ret;
  1350. *bhp = NULL;
  1351. stats->bs_nblocks++;
  1352. if (nreq != NULL) {
  1353. nreq->bpr_ptr = dreq->bpr_ptr + 1;
  1354. ret = bmap->b_pops->bpop_prepare_alloc_ptr(bmap, nreq);
  1355. if (ret < 0)
  1356. goto err_out_dreq;
  1357. ret = nilfs_bmap_get_new_block(bmap, nreq->bpr_ptr, &bh);
  1358. if (ret < 0)
  1359. goto err_out_nreq;
  1360. *bhp = bh;
  1361. stats->bs_nblocks++;
  1362. }
  1363. /* success */
  1364. return 0;
  1365. /* error */
  1366. err_out_nreq:
  1367. bmap->b_pops->bpop_abort_alloc_ptr(bmap, nreq);
  1368. err_out_dreq:
  1369. bmap->b_pops->bpop_abort_alloc_ptr(bmap, dreq);
  1370. stats->bs_nblocks = 0;
  1371. return ret;
  1372. }
  1373. static void
  1374. nilfs_btree_commit_convert_and_insert(struct nilfs_bmap *bmap,
  1375. __u64 key, __u64 ptr,
  1376. const __u64 *keys, const __u64 *ptrs,
  1377. int n, __u64 low, __u64 high,
  1378. union nilfs_bmap_ptr_req *dreq,
  1379. union nilfs_bmap_ptr_req *nreq,
  1380. struct buffer_head *bh)
  1381. {
  1382. struct nilfs_btree *btree;
  1383. struct nilfs_btree_node *node;
  1384. __u64 tmpptr;
  1385. /* free resources */
  1386. if (bmap->b_ops->bop_clear != NULL)
  1387. bmap->b_ops->bop_clear(bmap);
  1388. /* ptr must be a pointer to a buffer head. */
  1389. set_buffer_nilfs_volatile((struct buffer_head *)((unsigned long)ptr));
  1390. /* convert and insert */
  1391. btree = (struct nilfs_btree *)bmap;
  1392. nilfs_btree_init(bmap, low, high);
  1393. if (nreq != NULL) {
  1394. if (bmap->b_pops->bpop_commit_alloc_ptr != NULL) {
  1395. bmap->b_pops->bpop_commit_alloc_ptr(bmap, dreq);
  1396. bmap->b_pops->bpop_commit_alloc_ptr(bmap, nreq);
  1397. }
  1398. /* create child node at level 1 */
  1399. lock_buffer(bh);
  1400. node = (struct nilfs_btree_node *)bh->b_data;
  1401. nilfs_btree_node_init(btree, node, 0, 1, n, keys, ptrs);
  1402. nilfs_btree_node_insert(btree, node,
  1403. key, dreq->bpr_ptr, n);
  1404. if (!buffer_dirty(bh))
  1405. nilfs_btnode_mark_dirty(bh);
  1406. if (!nilfs_bmap_dirty(bmap))
  1407. nilfs_bmap_set_dirty(bmap);
  1408. unlock_buffer(bh);
  1409. brelse(bh);
  1410. /* create root node at level 2 */
  1411. node = nilfs_btree_get_root(btree);
  1412. tmpptr = nreq->bpr_ptr;
  1413. nilfs_btree_node_init(btree, node, NILFS_BTREE_NODE_ROOT,
  1414. 2, 1, &keys[0], &tmpptr);
  1415. } else {
  1416. if (bmap->b_pops->bpop_commit_alloc_ptr != NULL)
  1417. bmap->b_pops->bpop_commit_alloc_ptr(bmap, dreq);
  1418. /* create root node at level 1 */
  1419. node = nilfs_btree_get_root(btree);
  1420. nilfs_btree_node_init(btree, node, NILFS_BTREE_NODE_ROOT,
  1421. 1, n, keys, ptrs);
  1422. nilfs_btree_node_insert(btree, node,
  1423. key, dreq->bpr_ptr, n);
  1424. if (!nilfs_bmap_dirty(bmap))
  1425. nilfs_bmap_set_dirty(bmap);
  1426. }
  1427. if (btree->bt_ops->btop_set_target != NULL)
  1428. btree->bt_ops->btop_set_target(btree, key, dreq->bpr_ptr);
  1429. }
  1430. /**
  1431. * nilfs_btree_convert_and_insert -
  1432. * @bmap:
  1433. * @key:
  1434. * @ptr:
  1435. * @keys:
  1436. * @ptrs:
  1437. * @n:
  1438. * @low:
  1439. * @high:
  1440. */
  1441. int nilfs_btree_convert_and_insert(struct nilfs_bmap *bmap,
  1442. __u64 key, __u64 ptr,
  1443. const __u64 *keys, const __u64 *ptrs,
  1444. int n, __u64 low, __u64 high)
  1445. {
  1446. struct buffer_head *bh;
  1447. union nilfs_bmap_ptr_req dreq, nreq, *di, *ni;
  1448. struct nilfs_bmap_stats stats;
  1449. int ret;
  1450. if (n + 1 <= NILFS_BTREE_ROOT_NCHILDREN_MAX) {
  1451. di = &dreq;
  1452. ni = NULL;
  1453. } else if ((n + 1) <= NILFS_BTREE_NODE_NCHILDREN_MAX(
  1454. 1 << bmap->b_inode->i_blkbits)) {
  1455. di = &dreq;
  1456. ni = &nreq;
  1457. } else {
  1458. di = NULL;
  1459. ni = NULL;
  1460. BUG();
  1461. }
  1462. ret = nilfs_btree_prepare_convert_and_insert(bmap, key, di, ni, &bh,
  1463. &stats);
  1464. if (ret < 0)
  1465. return ret;
  1466. nilfs_btree_commit_convert_and_insert(bmap, key, ptr, keys, ptrs, n,
  1467. low, high, di, ni, bh);
  1468. nilfs_bmap_add_blocks(bmap, stats.bs_nblocks);
  1469. return 0;
  1470. }
  1471. static int nilfs_btree_propagate_p(struct nilfs_btree *btree,
  1472. struct nilfs_btree_path *path,
  1473. int level,
  1474. struct buffer_head *bh)
  1475. {
  1476. while ((++level < nilfs_btree_height(btree) - 1) &&
  1477. !buffer_dirty(path[level].bp_bh))
  1478. nilfs_btnode_mark_dirty(path[level].bp_bh);
  1479. return 0;
  1480. }
  1481. static int nilfs_btree_prepare_update_v(struct nilfs_btree *btree,
  1482. struct nilfs_btree_path *path,
  1483. int level)
  1484. {
  1485. struct nilfs_btree_node *parent;
  1486. int ret;
  1487. parent = nilfs_btree_get_node(btree, path, level + 1);
  1488. path[level].bp_oldreq.bpr_ptr =
  1489. nilfs_btree_node_get_ptr(btree, parent,
  1490. path[level + 1].bp_index);
  1491. path[level].bp_newreq.bpr_ptr = path[level].bp_oldreq.bpr_ptr + 1;
  1492. ret = nilfs_bmap_prepare_update(&btree->bt_bmap,
  1493. &path[level].bp_oldreq,
  1494. &path[level].bp_newreq);
  1495. if (ret < 0)
  1496. return ret;
  1497. if (buffer_nilfs_node(path[level].bp_bh)) {
  1498. path[level].bp_ctxt.oldkey = path[level].bp_oldreq.bpr_ptr;
  1499. path[level].bp_ctxt.newkey = path[level].bp_newreq.bpr_ptr;
  1500. path[level].bp_ctxt.bh = path[level].bp_bh;
  1501. ret = nilfs_btnode_prepare_change_key(
  1502. &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache,
  1503. &path[level].bp_ctxt);
  1504. if (ret < 0) {
  1505. nilfs_bmap_abort_update(&btree->bt_bmap,
  1506. &path[level].bp_oldreq,
  1507. &path[level].bp_newreq);
  1508. return ret;
  1509. }
  1510. }
  1511. return 0;
  1512. }
  1513. static void nilfs_btree_commit_update_v(struct nilfs_btree *btree,
  1514. struct nilfs_btree_path *path,
  1515. int level)
  1516. {
  1517. struct nilfs_btree_node *parent;
  1518. nilfs_bmap_commit_update(&btree->bt_bmap,
  1519. &path[level].bp_oldreq,
  1520. &path[level].bp_newreq);
  1521. if (buffer_nilfs_node(path[level].bp_bh)) {
  1522. nilfs_btnode_commit_change_key(
  1523. &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache,
  1524. &path[level].bp_ctxt);
  1525. path[level].bp_bh = path[level].bp_ctxt.bh;
  1526. }
  1527. set_buffer_nilfs_volatile(path[level].bp_bh);
  1528. parent = nilfs_btree_get_node(btree, path, level + 1);
  1529. nilfs_btree_node_set_ptr(btree, parent, path[level + 1].bp_index,
  1530. path[level].bp_newreq.bpr_ptr);
  1531. }
  1532. static void nilfs_btree_abort_update_v(struct nilfs_btree *btree,
  1533. struct nilfs_btree_path *path,
  1534. int level)
  1535. {
  1536. nilfs_bmap_abort_update(&btree->bt_bmap,
  1537. &path[level].bp_oldreq,
  1538. &path[level].bp_newreq);
  1539. if (buffer_nilfs_node(path[level].bp_bh))
  1540. nilfs_btnode_abort_change_key(
  1541. &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache,
  1542. &path[level].bp_ctxt);
  1543. }
  1544. static int nilfs_btree_prepare_propagate_v(struct nilfs_btree *btree,
  1545. struct nilfs_btree_path *path,
  1546. int minlevel,
  1547. int *maxlevelp)
  1548. {
  1549. int level, ret;
  1550. level = minlevel;
  1551. if (!buffer_nilfs_volatile(path[level].bp_bh)) {
  1552. ret = nilfs_btree_prepare_update_v(btree, path, level);
  1553. if (ret < 0)
  1554. return ret;
  1555. }
  1556. while ((++level < nilfs_btree_height(btree) - 1) &&
  1557. !buffer_dirty(path[level].bp_bh)) {
  1558. WARN_ON(buffer_nilfs_volatile(path[level].bp_bh));
  1559. ret = nilfs_btree_prepare_update_v(btree, path, level);
  1560. if (ret < 0)
  1561. goto out;
  1562. }
  1563. /* success */
  1564. *maxlevelp = level - 1;
  1565. return 0;
  1566. /* error */
  1567. out:
  1568. while (--level > minlevel)
  1569. nilfs_btree_abort_update_v(btree, path, level);
  1570. if (!buffer_nilfs_volatile(path[level].bp_bh))
  1571. nilfs_btree_abort_update_v(btree, path, level);
  1572. return ret;
  1573. }
  1574. static void nilfs_btree_commit_propagate_v(struct nilfs_btree *btree,
  1575. struct nilfs_btree_path *path,
  1576. int minlevel,
  1577. int maxlevel,
  1578. struct buffer_head *bh)
  1579. {
  1580. int level;
  1581. if (!buffer_nilfs_volatile(path[minlevel].bp_bh))
  1582. nilfs_btree_commit_update_v(btree, path, minlevel);
  1583. for (level = minlevel + 1; level <= maxlevel; level++)
  1584. nilfs_btree_commit_update_v(btree, path, level);
  1585. }
  1586. static int nilfs_btree_propagate_v(struct nilfs_btree *btree,
  1587. struct nilfs_btree_path *path,
  1588. int level,
  1589. struct buffer_head *bh)
  1590. {
  1591. int maxlevel, ret;
  1592. struct nilfs_btree_node *parent;
  1593. __u64 ptr;
  1594. get_bh(bh);
  1595. path[level].bp_bh = bh;
  1596. ret = nilfs_btree_prepare_propagate_v(btree, path, level, &maxlevel);
  1597. if (ret < 0)
  1598. goto out;
  1599. if (buffer_nilfs_volatile(path[level].bp_bh)) {
  1600. parent = nilfs_btree_get_node(btree, path, level + 1);
  1601. ptr = nilfs_btree_node_get_ptr(btree, parent,
  1602. path[level + 1].bp_index);
  1603. ret = nilfs_bmap_mark_dirty(&btree->bt_bmap, ptr);
  1604. if (ret < 0)
  1605. goto out;
  1606. }
  1607. nilfs_btree_commit_propagate_v(btree, path, level, maxlevel, bh);
  1608. out:
  1609. brelse(path[level].bp_bh);
  1610. path[level].bp_bh = NULL;
  1611. return ret;
  1612. }
  1613. static int nilfs_btree_propagate(const struct nilfs_bmap *bmap,
  1614. struct buffer_head *bh)
  1615. {
  1616. struct nilfs_btree *btree;
  1617. struct nilfs_btree_path *path;
  1618. struct nilfs_btree_node *node;
  1619. __u64 key;
  1620. int level, ret;
  1621. WARN_ON(!buffer_dirty(bh));
  1622. btree = (struct nilfs_btree *)bmap;
  1623. path = nilfs_btree_alloc_path(btree);
  1624. if (path == NULL)
  1625. return -ENOMEM;
  1626. nilfs_btree_init_path(btree, path);
  1627. if (buffer_nilfs_node(bh)) {
  1628. node = (struct nilfs_btree_node *)bh->b_data;
  1629. key = nilfs_btree_node_get_key(btree, node, 0);
  1630. level = nilfs_btree_node_get_level(btree, node);
  1631. } else {
  1632. key = nilfs_bmap_data_get_key(bmap, bh);
  1633. level = NILFS_BTREE_LEVEL_DATA;
  1634. }
  1635. ret = nilfs_btree_do_lookup(btree, path, key, NULL, level + 1);
  1636. if (ret < 0) {
  1637. if (unlikely(ret == -ENOENT))
  1638. printk(KERN_CRIT "%s: key = %llu, level == %d\n",
  1639. __func__, (unsigned long long)key, level);
  1640. goto out;
  1641. }
  1642. ret = btree->bt_ops->btop_propagate(btree, path, level, bh);
  1643. out:
  1644. nilfs_btree_clear_path(btree, path);
  1645. nilfs_btree_free_path(btree, path);
  1646. return ret;
  1647. }
  1648. static int nilfs_btree_propagate_gc(const struct nilfs_bmap *bmap,
  1649. struct buffer_head *bh)
  1650. {
  1651. return nilfs_bmap_mark_dirty(bmap, bh->b_blocknr);
  1652. }
  1653. static void nilfs_btree_add_dirty_buffer(struct nilfs_btree *btree,
  1654. struct list_head *lists,
  1655. struct buffer_head *bh)
  1656. {
  1657. struct list_head *head;
  1658. struct buffer_head *cbh;
  1659. struct nilfs_btree_node *node, *cnode;
  1660. __u64 key, ckey;
  1661. int level;
  1662. get_bh(bh);
  1663. node = (struct nilfs_btree_node *)bh->b_data;
  1664. key = nilfs_btree_node_get_key(btree, node, 0);
  1665. level = nilfs_btree_node_get_level(btree, node);
  1666. list_for_each(head, &lists[level]) {
  1667. cbh = list_entry(head, struct buffer_head, b_assoc_buffers);
  1668. cnode = (struct nilfs_btree_node *)cbh->b_data;
  1669. ckey = nilfs_btree_node_get_key(btree, cnode, 0);
  1670. if (key < ckey)
  1671. break;
  1672. }
  1673. list_add_tail(&bh->b_assoc_buffers, head);
  1674. }
  1675. static void nilfs_btree_lookup_dirty_buffers(struct nilfs_bmap *bmap,
  1676. struct list_head *listp)
  1677. {
  1678. struct nilfs_btree *btree = (struct nilfs_btree *)bmap;
  1679. struct address_space *btcache = &NILFS_BMAP_I(bmap)->i_btnode_cache;
  1680. struct list_head lists[NILFS_BTREE_LEVEL_MAX];
  1681. struct pagevec pvec;
  1682. struct buffer_head *bh, *head;
  1683. pgoff_t index = 0;
  1684. int level, i;
  1685. for (level = NILFS_BTREE_LEVEL_NODE_MIN;
  1686. level < NILFS_BTREE_LEVEL_MAX;
  1687. level++)
  1688. INIT_LIST_HEAD(&lists[level]);
  1689. pagevec_init(&pvec, 0);
  1690. while (pagevec_lookup_tag(&pvec, btcache, &index, PAGECACHE_TAG_DIRTY,
  1691. PAGEVEC_SIZE)) {
  1692. for (i = 0; i < pagevec_count(&pvec); i++) {
  1693. bh = head = page_buffers(pvec.pages[i]);
  1694. do {
  1695. if (buffer_dirty(bh))
  1696. nilfs_btree_add_dirty_buffer(btree,
  1697. lists, bh);
  1698. } while ((bh = bh->b_this_page) != head);
  1699. }
  1700. pagevec_release(&pvec);
  1701. cond_resched();
  1702. }
  1703. for (level = NILFS_BTREE_LEVEL_NODE_MIN;
  1704. level < NILFS_BTREE_LEVEL_MAX;
  1705. level++)
  1706. list_splice(&lists[level], listp->prev);
  1707. }
  1708. static int nilfs_btree_assign_p(struct nilfs_btree *btree,
  1709. struct nilfs_btree_path *path,
  1710. int level,
  1711. struct buffer_head **bh,
  1712. sector_t blocknr,
  1713. union nilfs_binfo *binfo)
  1714. {
  1715. struct nilfs_btree_node *parent;
  1716. __u64 key;
  1717. __u64 ptr;
  1718. int ret;
  1719. parent = nilfs_btree_get_node(btree, path, level + 1);
  1720. ptr = nilfs_btree_node_get_ptr(btree, parent,
  1721. path[level + 1].bp_index);
  1722. if (buffer_nilfs_node(*bh)) {
  1723. path[level].bp_ctxt.oldkey = ptr;
  1724. path[level].bp_ctxt.newkey = blocknr;
  1725. path[level].bp_ctxt.bh = *bh;
  1726. ret = nilfs_btnode_prepare_change_key(
  1727. &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache,
  1728. &path[level].bp_ctxt);
  1729. if (ret < 0)
  1730. return ret;
  1731. nilfs_btnode_commit_change_key(
  1732. &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache,
  1733. &path[level].bp_ctxt);
  1734. *bh = path[level].bp_ctxt.bh;
  1735. }
  1736. nilfs_btree_node_set_ptr(btree, parent,
  1737. path[level + 1].bp_index, blocknr);
  1738. key = nilfs_btree_node_get_key(btree, parent,
  1739. path[level + 1].bp_index);
  1740. /* on-disk format */
  1741. binfo->bi_dat.bi_blkoff = nilfs_bmap_key_to_dkey(key);
  1742. binfo->bi_dat.bi_level = level;
  1743. return 0;
  1744. }
  1745. static int nilfs_btree_assign_v(struct nilfs_btree *btree,
  1746. struct nilfs_btree_path *path,
  1747. int level,
  1748. struct buffer_head **bh,
  1749. sector_t blocknr,
  1750. union nilfs_binfo *binfo)
  1751. {
  1752. struct nilfs_btree_node *parent;
  1753. __u64 key;
  1754. __u64 ptr;
  1755. union nilfs_bmap_ptr_req req;
  1756. int ret;
  1757. parent = nilfs_btree_get_node(btree, path, level + 1);
  1758. ptr = nilfs_btree_node_get_ptr(btree, parent,
  1759. path[level + 1].bp_index);
  1760. req.bpr_ptr = ptr;
  1761. ret = nilfs_bmap_start_v(&btree->bt_bmap, &req, blocknr);
  1762. if (unlikely(ret < 0))
  1763. return ret;
  1764. key = nilfs_btree_node_get_key(btree, parent,
  1765. path[level + 1].bp_index);
  1766. /* on-disk format */
  1767. binfo->bi_v.bi_vblocknr = nilfs_bmap_ptr_to_dptr(ptr);
  1768. binfo->bi_v.bi_blkoff = nilfs_bmap_key_to_dkey(key);
  1769. return 0;
  1770. }
  1771. static int nilfs_btree_assign(struct nilfs_bmap *bmap,
  1772. struct buffer_head **bh,
  1773. sector_t blocknr,
  1774. union nilfs_binfo *binfo)
  1775. {
  1776. struct nilfs_btree *btree;
  1777. struct nilfs_btree_path *path;
  1778. struct nilfs_btree_node *node;
  1779. __u64 key;
  1780. int level, ret;
  1781. btree = (struct nilfs_btree *)bmap;
  1782. path = nilfs_btree_alloc_path(btree);
  1783. if (path == NULL)
  1784. return -ENOMEM;
  1785. nilfs_btree_init_path(btree, path);
  1786. if (buffer_nilfs_node(*bh)) {
  1787. node = (struct nilfs_btree_node *)(*bh)->b_data;
  1788. key = nilfs_btree_node_get_key(btree, node, 0);
  1789. level = nilfs_btree_node_get_level(btree, node);
  1790. } else {
  1791. key = nilfs_bmap_data_get_key(bmap, *bh);
  1792. level = NILFS_BTREE_LEVEL_DATA;
  1793. }
  1794. ret = nilfs_btree_do_lookup(btree, path, key, NULL, level + 1);
  1795. if (ret < 0) {
  1796. WARN_ON(ret == -ENOENT);
  1797. goto out;
  1798. }
  1799. ret = btree->bt_ops->btop_assign(btree, path, level, bh,
  1800. blocknr, binfo);
  1801. out:
  1802. nilfs_btree_clear_path(btree, path);
  1803. nilfs_btree_free_path(btree, path);
  1804. return ret;
  1805. }
  1806. static int nilfs_btree_assign_gc(struct nilfs_bmap *bmap,
  1807. struct buffer_head **bh,
  1808. sector_t blocknr,
  1809. union nilfs_binfo *binfo)
  1810. {
  1811. struct nilfs_btree *btree;
  1812. struct nilfs_btree_node *node;
  1813. __u64 key;
  1814. int ret;
  1815. btree = (struct nilfs_btree *)bmap;
  1816. ret = nilfs_bmap_move_v(bmap, (*bh)->b_blocknr, blocknr);
  1817. if (ret < 0)
  1818. return ret;
  1819. if (buffer_nilfs_node(*bh)) {
  1820. node = (struct nilfs_btree_node *)(*bh)->b_data;
  1821. key = nilfs_btree_node_get_key(btree, node, 0);
  1822. } else
  1823. key = nilfs_bmap_data_get_key(bmap, *bh);
  1824. /* on-disk format */
  1825. binfo->bi_v.bi_vblocknr = cpu_to_le64((*bh)->b_blocknr);
  1826. binfo->bi_v.bi_blkoff = nilfs_bmap_key_to_dkey(key);
  1827. return 0;
  1828. }
  1829. static int nilfs_btree_mark(struct nilfs_bmap *bmap, __u64 key, int level)
  1830. {
  1831. struct buffer_head *bh;
  1832. struct nilfs_btree *btree;
  1833. struct nilfs_btree_path *path;
  1834. __u64 ptr;
  1835. int ret;
  1836. btree = (struct nilfs_btree *)bmap;
  1837. path = nilfs_btree_alloc_path(btree);
  1838. if (path == NULL)
  1839. return -ENOMEM;
  1840. nilfs_btree_init_path(btree, path);
  1841. ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level + 1);
  1842. if (ret < 0) {
  1843. WARN_ON(ret == -ENOENT);
  1844. goto out;
  1845. }
  1846. ret = nilfs_bmap_get_block(&btree->bt_bmap, ptr, &bh);
  1847. if (ret < 0) {
  1848. WARN_ON(ret == -ENOENT);
  1849. goto out;
  1850. }
  1851. if (!buffer_dirty(bh))
  1852. nilfs_btnode_mark_dirty(bh);
  1853. brelse(bh);
  1854. if (!nilfs_bmap_dirty(&btree->bt_bmap))
  1855. nilfs_bmap_set_dirty(&btree->bt_bmap);
  1856. out:
  1857. nilfs_btree_clear_path(btree, path);
  1858. nilfs_btree_free_path(btree, path);
  1859. return ret;
  1860. }
  1861. static const struct nilfs_bmap_operations nilfs_btree_ops = {
  1862. .bop_lookup = nilfs_btree_lookup,
  1863. .bop_insert = nilfs_btree_insert,
  1864. .bop_delete = nilfs_btree_delete,
  1865. .bop_clear = NULL,
  1866. .bop_propagate = nilfs_btree_propagate,
  1867. .bop_lookup_dirty_buffers = nilfs_btree_lookup_dirty_buffers,
  1868. .bop_assign = nilfs_btree_assign,
  1869. .bop_mark = nilfs_btree_mark,
  1870. .bop_last_key = nilfs_btree_last_key,
  1871. .bop_check_insert = NULL,
  1872. .bop_check_delete = nilfs_btree_check_delete,
  1873. .bop_gather_data = nilfs_btree_gather_data,
  1874. };
  1875. static const struct nilfs_bmap_operations nilfs_btree_ops_gc = {
  1876. .bop_lookup = NULL,
  1877. .bop_insert = NULL,
  1878. .bop_delete = NULL,
  1879. .bop_clear = NULL,
  1880. .bop_propagate = nilfs_btree_propagate_gc,
  1881. .bop_lookup_dirty_buffers = nilfs_btree_lookup_dirty_buffers,
  1882. .bop_assign = nilfs_btree_assign_gc,
  1883. .bop_mark = NULL,
  1884. .bop_last_key = NULL,
  1885. .bop_check_insert = NULL,
  1886. .bop_check_delete = NULL,
  1887. .bop_gather_data = NULL,
  1888. };
  1889. static const struct nilfs_btree_operations nilfs_btree_ops_v = {
  1890. .btop_find_target = nilfs_btree_find_target_v,
  1891. .btop_set_target = nilfs_btree_set_target_v,
  1892. .btop_propagate = nilfs_btree_propagate_v,
  1893. .btop_assign = nilfs_btree_assign_v,
  1894. };
  1895. static const struct nilfs_btree_operations nilfs_btree_ops_p = {
  1896. .btop_find_target = NULL,
  1897. .btop_set_target = NULL,
  1898. .btop_propagate = nilfs_btree_propagate_p,
  1899. .btop_assign = nilfs_btree_assign_p,
  1900. };
  1901. int nilfs_btree_init(struct nilfs_bmap *bmap, __u64 low, __u64 high)
  1902. {
  1903. struct nilfs_btree *btree;
  1904. btree = (struct nilfs_btree *)bmap;
  1905. bmap->b_ops = &nilfs_btree_ops;
  1906. bmap->b_low = low;
  1907. bmap->b_high = high;
  1908. switch (bmap->b_inode->i_ino) {
  1909. case NILFS_DAT_INO:
  1910. btree->bt_ops = &nilfs_btree_ops_p;
  1911. break;
  1912. default:
  1913. btree->bt_ops = &nilfs_btree_ops_v;
  1914. break;
  1915. }
  1916. return 0;
  1917. }
  1918. void nilfs_btree_init_gc(struct nilfs_bmap *bmap)
  1919. {
  1920. bmap->b_low = NILFS_BMAP_LARGE_LOW;
  1921. bmap->b_high = NILFS_BMAP_LARGE_HIGH;
  1922. bmap->b_ops = &nilfs_btree_ops_gc;
  1923. }