btree.c 64 KB

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