ref-verify.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2014 Facebook. All rights reserved.
  4. */
  5. #include <linux/sched.h>
  6. #include <linux/stacktrace.h>
  7. #include "ctree.h"
  8. #include "disk-io.h"
  9. #include "locking.h"
  10. #include "delayed-ref.h"
  11. #include "ref-verify.h"
  12. /*
  13. * Used to keep track the roots and number of refs each root has for a given
  14. * bytenr. This just tracks the number of direct references, no shared
  15. * references.
  16. */
  17. struct root_entry {
  18. u64 root_objectid;
  19. u64 num_refs;
  20. struct rb_node node;
  21. };
  22. /*
  23. * These are meant to represent what should exist in the extent tree, these can
  24. * be used to verify the extent tree is consistent as these should all match
  25. * what the extent tree says.
  26. */
  27. struct ref_entry {
  28. u64 root_objectid;
  29. u64 parent;
  30. u64 owner;
  31. u64 offset;
  32. u64 num_refs;
  33. struct rb_node node;
  34. };
  35. #define MAX_TRACE 16
  36. /*
  37. * Whenever we add/remove a reference we record the action. The action maps
  38. * back to the delayed ref action. We hold the ref we are changing in the
  39. * action so we can account for the history properly, and we record the root we
  40. * were called with since it could be different from ref_root. We also store
  41. * stack traces because thats how I roll.
  42. */
  43. struct ref_action {
  44. int action;
  45. u64 root;
  46. struct ref_entry ref;
  47. struct list_head list;
  48. unsigned long trace[MAX_TRACE];
  49. unsigned int trace_len;
  50. };
  51. /*
  52. * One of these for every block we reference, it holds the roots and references
  53. * to it as well as all of the ref actions that have occured to it. We never
  54. * free it until we unmount the file system in order to make sure re-allocations
  55. * are happening properly.
  56. */
  57. struct block_entry {
  58. u64 bytenr;
  59. u64 len;
  60. u64 num_refs;
  61. int metadata;
  62. int from_disk;
  63. struct rb_root roots;
  64. struct rb_root refs;
  65. struct rb_node node;
  66. struct list_head actions;
  67. };
  68. static struct block_entry *insert_block_entry(struct rb_root *root,
  69. struct block_entry *be)
  70. {
  71. struct rb_node **p = &root->rb_node;
  72. struct rb_node *parent_node = NULL;
  73. struct block_entry *entry;
  74. while (*p) {
  75. parent_node = *p;
  76. entry = rb_entry(parent_node, struct block_entry, node);
  77. if (entry->bytenr > be->bytenr)
  78. p = &(*p)->rb_left;
  79. else if (entry->bytenr < be->bytenr)
  80. p = &(*p)->rb_right;
  81. else
  82. return entry;
  83. }
  84. rb_link_node(&be->node, parent_node, p);
  85. rb_insert_color(&be->node, root);
  86. return NULL;
  87. }
  88. static struct block_entry *lookup_block_entry(struct rb_root *root, u64 bytenr)
  89. {
  90. struct rb_node *n;
  91. struct block_entry *entry = NULL;
  92. n = root->rb_node;
  93. while (n) {
  94. entry = rb_entry(n, struct block_entry, node);
  95. if (entry->bytenr < bytenr)
  96. n = n->rb_right;
  97. else if (entry->bytenr > bytenr)
  98. n = n->rb_left;
  99. else
  100. return entry;
  101. }
  102. return NULL;
  103. }
  104. static struct root_entry *insert_root_entry(struct rb_root *root,
  105. struct root_entry *re)
  106. {
  107. struct rb_node **p = &root->rb_node;
  108. struct rb_node *parent_node = NULL;
  109. struct root_entry *entry;
  110. while (*p) {
  111. parent_node = *p;
  112. entry = rb_entry(parent_node, struct root_entry, node);
  113. if (entry->root_objectid > re->root_objectid)
  114. p = &(*p)->rb_left;
  115. else if (entry->root_objectid < re->root_objectid)
  116. p = &(*p)->rb_right;
  117. else
  118. return entry;
  119. }
  120. rb_link_node(&re->node, parent_node, p);
  121. rb_insert_color(&re->node, root);
  122. return NULL;
  123. }
  124. static int comp_refs(struct ref_entry *ref1, struct ref_entry *ref2)
  125. {
  126. if (ref1->root_objectid < ref2->root_objectid)
  127. return -1;
  128. if (ref1->root_objectid > ref2->root_objectid)
  129. return 1;
  130. if (ref1->parent < ref2->parent)
  131. return -1;
  132. if (ref1->parent > ref2->parent)
  133. return 1;
  134. if (ref1->owner < ref2->owner)
  135. return -1;
  136. if (ref1->owner > ref2->owner)
  137. return 1;
  138. if (ref1->offset < ref2->offset)
  139. return -1;
  140. if (ref1->offset > ref2->offset)
  141. return 1;
  142. return 0;
  143. }
  144. static struct ref_entry *insert_ref_entry(struct rb_root *root,
  145. struct ref_entry *ref)
  146. {
  147. struct rb_node **p = &root->rb_node;
  148. struct rb_node *parent_node = NULL;
  149. struct ref_entry *entry;
  150. int cmp;
  151. while (*p) {
  152. parent_node = *p;
  153. entry = rb_entry(parent_node, struct ref_entry, node);
  154. cmp = comp_refs(entry, ref);
  155. if (cmp > 0)
  156. p = &(*p)->rb_left;
  157. else if (cmp < 0)
  158. p = &(*p)->rb_right;
  159. else
  160. return entry;
  161. }
  162. rb_link_node(&ref->node, parent_node, p);
  163. rb_insert_color(&ref->node, root);
  164. return NULL;
  165. }
  166. static struct root_entry *lookup_root_entry(struct rb_root *root, u64 objectid)
  167. {
  168. struct rb_node *n;
  169. struct root_entry *entry = NULL;
  170. n = root->rb_node;
  171. while (n) {
  172. entry = rb_entry(n, struct root_entry, node);
  173. if (entry->root_objectid < objectid)
  174. n = n->rb_right;
  175. else if (entry->root_objectid > objectid)
  176. n = n->rb_left;
  177. else
  178. return entry;
  179. }
  180. return NULL;
  181. }
  182. #ifdef CONFIG_STACKTRACE
  183. static void __save_stack_trace(struct ref_action *ra)
  184. {
  185. struct stack_trace stack_trace;
  186. stack_trace.max_entries = MAX_TRACE;
  187. stack_trace.nr_entries = 0;
  188. stack_trace.entries = ra->trace;
  189. stack_trace.skip = 2;
  190. save_stack_trace(&stack_trace);
  191. ra->trace_len = stack_trace.nr_entries;
  192. }
  193. static void __print_stack_trace(struct btrfs_fs_info *fs_info,
  194. struct ref_action *ra)
  195. {
  196. struct stack_trace trace;
  197. if (ra->trace_len == 0) {
  198. btrfs_err(fs_info, " ref-verify: no stacktrace");
  199. return;
  200. }
  201. trace.nr_entries = ra->trace_len;
  202. trace.entries = ra->trace;
  203. print_stack_trace(&trace, 2);
  204. }
  205. #else
  206. static void inline __save_stack_trace(struct ref_action *ra)
  207. {
  208. }
  209. static void inline __print_stack_trace(struct btrfs_fs_info *fs_info,
  210. struct ref_action *ra)
  211. {
  212. btrfs_err(fs_info, " ref-verify: no stacktrace support");
  213. }
  214. #endif
  215. static void free_block_entry(struct block_entry *be)
  216. {
  217. struct root_entry *re;
  218. struct ref_entry *ref;
  219. struct ref_action *ra;
  220. struct rb_node *n;
  221. while ((n = rb_first(&be->roots))) {
  222. re = rb_entry(n, struct root_entry, node);
  223. rb_erase(&re->node, &be->roots);
  224. kfree(re);
  225. }
  226. while((n = rb_first(&be->refs))) {
  227. ref = rb_entry(n, struct ref_entry, node);
  228. rb_erase(&ref->node, &be->refs);
  229. kfree(ref);
  230. }
  231. while (!list_empty(&be->actions)) {
  232. ra = list_first_entry(&be->actions, struct ref_action,
  233. list);
  234. list_del(&ra->list);
  235. kfree(ra);
  236. }
  237. kfree(be);
  238. }
  239. static struct block_entry *add_block_entry(struct btrfs_fs_info *fs_info,
  240. u64 bytenr, u64 len,
  241. u64 root_objectid)
  242. {
  243. struct block_entry *be = NULL, *exist;
  244. struct root_entry *re = NULL;
  245. re = kzalloc(sizeof(struct root_entry), GFP_KERNEL);
  246. be = kzalloc(sizeof(struct block_entry), GFP_KERNEL);
  247. if (!be || !re) {
  248. kfree(re);
  249. kfree(be);
  250. return ERR_PTR(-ENOMEM);
  251. }
  252. be->bytenr = bytenr;
  253. be->len = len;
  254. re->root_objectid = root_objectid;
  255. re->num_refs = 0;
  256. spin_lock(&fs_info->ref_verify_lock);
  257. exist = insert_block_entry(&fs_info->block_tree, be);
  258. if (exist) {
  259. if (root_objectid) {
  260. struct root_entry *exist_re;
  261. exist_re = insert_root_entry(&exist->roots, re);
  262. if (exist_re)
  263. kfree(re);
  264. } else {
  265. kfree(re);
  266. }
  267. kfree(be);
  268. return exist;
  269. }
  270. be->num_refs = 0;
  271. be->metadata = 0;
  272. be->from_disk = 0;
  273. be->roots = RB_ROOT;
  274. be->refs = RB_ROOT;
  275. INIT_LIST_HEAD(&be->actions);
  276. if (root_objectid)
  277. insert_root_entry(&be->roots, re);
  278. else
  279. kfree(re);
  280. return be;
  281. }
  282. static int add_tree_block(struct btrfs_fs_info *fs_info, u64 ref_root,
  283. u64 parent, u64 bytenr, int level)
  284. {
  285. struct block_entry *be;
  286. struct root_entry *re;
  287. struct ref_entry *ref = NULL, *exist;
  288. ref = kmalloc(sizeof(struct ref_entry), GFP_KERNEL);
  289. if (!ref)
  290. return -ENOMEM;
  291. if (parent)
  292. ref->root_objectid = 0;
  293. else
  294. ref->root_objectid = ref_root;
  295. ref->parent = parent;
  296. ref->owner = level;
  297. ref->offset = 0;
  298. ref->num_refs = 1;
  299. be = add_block_entry(fs_info, bytenr, fs_info->nodesize, ref_root);
  300. if (IS_ERR(be)) {
  301. kfree(ref);
  302. return PTR_ERR(be);
  303. }
  304. be->num_refs++;
  305. be->from_disk = 1;
  306. be->metadata = 1;
  307. if (!parent) {
  308. ASSERT(ref_root);
  309. re = lookup_root_entry(&be->roots, ref_root);
  310. ASSERT(re);
  311. re->num_refs++;
  312. }
  313. exist = insert_ref_entry(&be->refs, ref);
  314. if (exist) {
  315. exist->num_refs++;
  316. kfree(ref);
  317. }
  318. spin_unlock(&fs_info->ref_verify_lock);
  319. return 0;
  320. }
  321. static int add_shared_data_ref(struct btrfs_fs_info *fs_info,
  322. u64 parent, u32 num_refs, u64 bytenr,
  323. u64 num_bytes)
  324. {
  325. struct block_entry *be;
  326. struct ref_entry *ref;
  327. ref = kzalloc(sizeof(struct ref_entry), GFP_KERNEL);
  328. if (!ref)
  329. return -ENOMEM;
  330. be = add_block_entry(fs_info, bytenr, num_bytes, 0);
  331. if (IS_ERR(be)) {
  332. kfree(ref);
  333. return PTR_ERR(be);
  334. }
  335. be->num_refs += num_refs;
  336. ref->parent = parent;
  337. ref->num_refs = num_refs;
  338. if (insert_ref_entry(&be->refs, ref)) {
  339. spin_unlock(&fs_info->ref_verify_lock);
  340. btrfs_err(fs_info, "existing shared ref when reading from disk?");
  341. kfree(ref);
  342. return -EINVAL;
  343. }
  344. spin_unlock(&fs_info->ref_verify_lock);
  345. return 0;
  346. }
  347. static int add_extent_data_ref(struct btrfs_fs_info *fs_info,
  348. struct extent_buffer *leaf,
  349. struct btrfs_extent_data_ref *dref,
  350. u64 bytenr, u64 num_bytes)
  351. {
  352. struct block_entry *be;
  353. struct ref_entry *ref;
  354. struct root_entry *re;
  355. u64 ref_root = btrfs_extent_data_ref_root(leaf, dref);
  356. u64 owner = btrfs_extent_data_ref_objectid(leaf, dref);
  357. u64 offset = btrfs_extent_data_ref_offset(leaf, dref);
  358. u32 num_refs = btrfs_extent_data_ref_count(leaf, dref);
  359. ref = kzalloc(sizeof(struct ref_entry), GFP_KERNEL);
  360. if (!ref)
  361. return -ENOMEM;
  362. be = add_block_entry(fs_info, bytenr, num_bytes, ref_root);
  363. if (IS_ERR(be)) {
  364. kfree(ref);
  365. return PTR_ERR(be);
  366. }
  367. be->num_refs += num_refs;
  368. ref->parent = 0;
  369. ref->owner = owner;
  370. ref->root_objectid = ref_root;
  371. ref->offset = offset;
  372. ref->num_refs = num_refs;
  373. if (insert_ref_entry(&be->refs, ref)) {
  374. spin_unlock(&fs_info->ref_verify_lock);
  375. btrfs_err(fs_info, "existing ref when reading from disk?");
  376. kfree(ref);
  377. return -EINVAL;
  378. }
  379. re = lookup_root_entry(&be->roots, ref_root);
  380. if (!re) {
  381. spin_unlock(&fs_info->ref_verify_lock);
  382. btrfs_err(fs_info, "missing root in new block entry?");
  383. return -EINVAL;
  384. }
  385. re->num_refs += num_refs;
  386. spin_unlock(&fs_info->ref_verify_lock);
  387. return 0;
  388. }
  389. static int process_extent_item(struct btrfs_fs_info *fs_info,
  390. struct btrfs_path *path, struct btrfs_key *key,
  391. int slot, int *tree_block_level)
  392. {
  393. struct btrfs_extent_item *ei;
  394. struct btrfs_extent_inline_ref *iref;
  395. struct btrfs_extent_data_ref *dref;
  396. struct btrfs_shared_data_ref *sref;
  397. struct extent_buffer *leaf = path->nodes[0];
  398. u32 item_size = btrfs_item_size_nr(leaf, slot);
  399. unsigned long end, ptr;
  400. u64 offset, flags, count;
  401. int type, ret;
  402. ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
  403. flags = btrfs_extent_flags(leaf, ei);
  404. if ((key->type == BTRFS_EXTENT_ITEM_KEY) &&
  405. flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
  406. struct btrfs_tree_block_info *info;
  407. info = (struct btrfs_tree_block_info *)(ei + 1);
  408. *tree_block_level = btrfs_tree_block_level(leaf, info);
  409. iref = (struct btrfs_extent_inline_ref *)(info + 1);
  410. } else {
  411. if (key->type == BTRFS_METADATA_ITEM_KEY)
  412. *tree_block_level = key->offset;
  413. iref = (struct btrfs_extent_inline_ref *)(ei + 1);
  414. }
  415. ptr = (unsigned long)iref;
  416. end = (unsigned long)ei + item_size;
  417. while (ptr < end) {
  418. iref = (struct btrfs_extent_inline_ref *)ptr;
  419. type = btrfs_extent_inline_ref_type(leaf, iref);
  420. offset = btrfs_extent_inline_ref_offset(leaf, iref);
  421. switch (type) {
  422. case BTRFS_TREE_BLOCK_REF_KEY:
  423. ret = add_tree_block(fs_info, offset, 0, key->objectid,
  424. *tree_block_level);
  425. break;
  426. case BTRFS_SHARED_BLOCK_REF_KEY:
  427. ret = add_tree_block(fs_info, 0, offset, key->objectid,
  428. *tree_block_level);
  429. break;
  430. case BTRFS_EXTENT_DATA_REF_KEY:
  431. dref = (struct btrfs_extent_data_ref *)(&iref->offset);
  432. ret = add_extent_data_ref(fs_info, leaf, dref,
  433. key->objectid, key->offset);
  434. break;
  435. case BTRFS_SHARED_DATA_REF_KEY:
  436. sref = (struct btrfs_shared_data_ref *)(iref + 1);
  437. count = btrfs_shared_data_ref_count(leaf, sref);
  438. ret = add_shared_data_ref(fs_info, offset, count,
  439. key->objectid, key->offset);
  440. break;
  441. default:
  442. btrfs_err(fs_info, "invalid key type in iref");
  443. ret = -EINVAL;
  444. break;
  445. }
  446. if (ret)
  447. break;
  448. ptr += btrfs_extent_inline_ref_size(type);
  449. }
  450. return ret;
  451. }
  452. static int process_leaf(struct btrfs_root *root,
  453. struct btrfs_path *path, u64 *bytenr, u64 *num_bytes)
  454. {
  455. struct btrfs_fs_info *fs_info = root->fs_info;
  456. struct extent_buffer *leaf = path->nodes[0];
  457. struct btrfs_extent_data_ref *dref;
  458. struct btrfs_shared_data_ref *sref;
  459. u32 count;
  460. int i = 0, tree_block_level = 0, ret = 0;
  461. struct btrfs_key key;
  462. int nritems = btrfs_header_nritems(leaf);
  463. for (i = 0; i < nritems; i++) {
  464. btrfs_item_key_to_cpu(leaf, &key, i);
  465. switch (key.type) {
  466. case BTRFS_EXTENT_ITEM_KEY:
  467. *num_bytes = key.offset;
  468. case BTRFS_METADATA_ITEM_KEY:
  469. *bytenr = key.objectid;
  470. ret = process_extent_item(fs_info, path, &key, i,
  471. &tree_block_level);
  472. break;
  473. case BTRFS_TREE_BLOCK_REF_KEY:
  474. ret = add_tree_block(fs_info, key.offset, 0,
  475. key.objectid, tree_block_level);
  476. break;
  477. case BTRFS_SHARED_BLOCK_REF_KEY:
  478. ret = add_tree_block(fs_info, 0, key.offset,
  479. key.objectid, tree_block_level);
  480. break;
  481. case BTRFS_EXTENT_DATA_REF_KEY:
  482. dref = btrfs_item_ptr(leaf, i,
  483. struct btrfs_extent_data_ref);
  484. ret = add_extent_data_ref(fs_info, leaf, dref, *bytenr,
  485. *num_bytes);
  486. break;
  487. case BTRFS_SHARED_DATA_REF_KEY:
  488. sref = btrfs_item_ptr(leaf, i,
  489. struct btrfs_shared_data_ref);
  490. count = btrfs_shared_data_ref_count(leaf, sref);
  491. ret = add_shared_data_ref(fs_info, key.offset, count,
  492. *bytenr, *num_bytes);
  493. break;
  494. default:
  495. break;
  496. }
  497. if (ret)
  498. break;
  499. }
  500. return ret;
  501. }
  502. /* Walk down to the leaf from the given level */
  503. static int walk_down_tree(struct btrfs_root *root, struct btrfs_path *path,
  504. int level, u64 *bytenr, u64 *num_bytes)
  505. {
  506. struct btrfs_fs_info *fs_info = root->fs_info;
  507. struct extent_buffer *eb;
  508. u64 block_bytenr, gen;
  509. int ret = 0;
  510. while (level >= 0) {
  511. if (level) {
  512. struct btrfs_key first_key;
  513. block_bytenr = btrfs_node_blockptr(path->nodes[level],
  514. path->slots[level]);
  515. gen = btrfs_node_ptr_generation(path->nodes[level],
  516. path->slots[level]);
  517. btrfs_node_key_to_cpu(path->nodes[level], &first_key,
  518. path->slots[level]);
  519. eb = read_tree_block(fs_info, block_bytenr, gen,
  520. level - 1, &first_key);
  521. if (IS_ERR(eb))
  522. return PTR_ERR(eb);
  523. if (!extent_buffer_uptodate(eb)) {
  524. free_extent_buffer(eb);
  525. return -EIO;
  526. }
  527. btrfs_tree_read_lock(eb);
  528. btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK);
  529. path->nodes[level-1] = eb;
  530. path->slots[level-1] = 0;
  531. path->locks[level-1] = BTRFS_READ_LOCK_BLOCKING;
  532. } else {
  533. ret = process_leaf(root, path, bytenr, num_bytes);
  534. if (ret)
  535. break;
  536. }
  537. level--;
  538. }
  539. return ret;
  540. }
  541. /* Walk up to the next node that needs to be processed */
  542. static int walk_up_tree(struct btrfs_path *path, int *level)
  543. {
  544. int l;
  545. for (l = 0; l < BTRFS_MAX_LEVEL; l++) {
  546. if (!path->nodes[l])
  547. continue;
  548. if (l) {
  549. path->slots[l]++;
  550. if (path->slots[l] <
  551. btrfs_header_nritems(path->nodes[l])) {
  552. *level = l;
  553. return 0;
  554. }
  555. }
  556. btrfs_tree_unlock_rw(path->nodes[l], path->locks[l]);
  557. free_extent_buffer(path->nodes[l]);
  558. path->nodes[l] = NULL;
  559. path->slots[l] = 0;
  560. path->locks[l] = 0;
  561. }
  562. return 1;
  563. }
  564. static void dump_ref_action(struct btrfs_fs_info *fs_info,
  565. struct ref_action *ra)
  566. {
  567. btrfs_err(fs_info,
  568. " Ref action %d, root %llu, ref_root %llu, parent %llu, owner %llu, offset %llu, num_refs %llu",
  569. ra->action, ra->root, ra->ref.root_objectid, ra->ref.parent,
  570. ra->ref.owner, ra->ref.offset, ra->ref.num_refs);
  571. __print_stack_trace(fs_info, ra);
  572. }
  573. /*
  574. * Dumps all the information from the block entry to printk, it's going to be
  575. * awesome.
  576. */
  577. static void dump_block_entry(struct btrfs_fs_info *fs_info,
  578. struct block_entry *be)
  579. {
  580. struct ref_entry *ref;
  581. struct root_entry *re;
  582. struct ref_action *ra;
  583. struct rb_node *n;
  584. btrfs_err(fs_info,
  585. "dumping block entry [%llu %llu], num_refs %llu, metadata %d, from disk %d",
  586. be->bytenr, be->len, be->num_refs, be->metadata,
  587. be->from_disk);
  588. for (n = rb_first(&be->refs); n; n = rb_next(n)) {
  589. ref = rb_entry(n, struct ref_entry, node);
  590. btrfs_err(fs_info,
  591. " ref root %llu, parent %llu, owner %llu, offset %llu, num_refs %llu",
  592. ref->root_objectid, ref->parent, ref->owner,
  593. ref->offset, ref->num_refs);
  594. }
  595. for (n = rb_first(&be->roots); n; n = rb_next(n)) {
  596. re = rb_entry(n, struct root_entry, node);
  597. btrfs_err(fs_info, " root entry %llu, num_refs %llu",
  598. re->root_objectid, re->num_refs);
  599. }
  600. list_for_each_entry(ra, &be->actions, list)
  601. dump_ref_action(fs_info, ra);
  602. }
  603. /*
  604. * btrfs_ref_tree_mod: called when we modify a ref for a bytenr
  605. * @root: the root we are making this modification from.
  606. * @bytenr: the bytenr we are modifying.
  607. * @num_bytes: number of bytes.
  608. * @parent: the parent bytenr.
  609. * @ref_root: the original root owner of the bytenr.
  610. * @owner: level in the case of metadata, inode in the case of data.
  611. * @offset: 0 for metadata, file offset for data.
  612. * @action: the action that we are doing, this is the same as the delayed ref
  613. * action.
  614. *
  615. * This will add an action item to the given bytenr and do sanity checks to make
  616. * sure we haven't messed something up. If we are making a new allocation and
  617. * this block entry has history we will delete all previous actions as long as
  618. * our sanity checks pass as they are no longer needed.
  619. */
  620. int btrfs_ref_tree_mod(struct btrfs_root *root, u64 bytenr, u64 num_bytes,
  621. u64 parent, u64 ref_root, u64 owner, u64 offset,
  622. int action)
  623. {
  624. struct btrfs_fs_info *fs_info = root->fs_info;
  625. struct ref_entry *ref = NULL, *exist;
  626. struct ref_action *ra = NULL;
  627. struct block_entry *be = NULL;
  628. struct root_entry *re = NULL;
  629. int ret = 0;
  630. bool metadata = owner < BTRFS_FIRST_FREE_OBJECTID;
  631. if (!btrfs_test_opt(root->fs_info, REF_VERIFY))
  632. return 0;
  633. ref = kzalloc(sizeof(struct ref_entry), GFP_NOFS);
  634. ra = kmalloc(sizeof(struct ref_action), GFP_NOFS);
  635. if (!ra || !ref) {
  636. kfree(ref);
  637. kfree(ra);
  638. ret = -ENOMEM;
  639. goto out;
  640. }
  641. if (parent) {
  642. ref->parent = parent;
  643. } else {
  644. ref->root_objectid = ref_root;
  645. ref->owner = owner;
  646. ref->offset = offset;
  647. }
  648. ref->num_refs = (action == BTRFS_DROP_DELAYED_REF) ? -1 : 1;
  649. memcpy(&ra->ref, ref, sizeof(struct ref_entry));
  650. /*
  651. * Save the extra info from the delayed ref in the ref action to make it
  652. * easier to figure out what is happening. The real ref's we add to the
  653. * ref tree need to reflect what we save on disk so it matches any
  654. * on-disk refs we pre-loaded.
  655. */
  656. ra->ref.owner = owner;
  657. ra->ref.offset = offset;
  658. ra->ref.root_objectid = ref_root;
  659. __save_stack_trace(ra);
  660. INIT_LIST_HEAD(&ra->list);
  661. ra->action = action;
  662. ra->root = root->objectid;
  663. /*
  664. * This is an allocation, preallocate the block_entry in case we haven't
  665. * used it before.
  666. */
  667. ret = -EINVAL;
  668. if (action == BTRFS_ADD_DELAYED_EXTENT) {
  669. /*
  670. * For subvol_create we'll just pass in whatever the parent root
  671. * is and the new root objectid, so let's not treat the passed
  672. * in root as if it really has a ref for this bytenr.
  673. */
  674. be = add_block_entry(root->fs_info, bytenr, num_bytes, ref_root);
  675. if (IS_ERR(be)) {
  676. kfree(ref);
  677. kfree(ra);
  678. ret = PTR_ERR(be);
  679. goto out;
  680. }
  681. be->num_refs++;
  682. if (metadata)
  683. be->metadata = 1;
  684. if (be->num_refs != 1) {
  685. btrfs_err(fs_info,
  686. "re-allocated a block that still has references to it!");
  687. dump_block_entry(fs_info, be);
  688. dump_ref_action(fs_info, ra);
  689. kfree(ref);
  690. kfree(ra);
  691. goto out_unlock;
  692. }
  693. while (!list_empty(&be->actions)) {
  694. struct ref_action *tmp;
  695. tmp = list_first_entry(&be->actions, struct ref_action,
  696. list);
  697. list_del(&tmp->list);
  698. kfree(tmp);
  699. }
  700. } else {
  701. struct root_entry *tmp;
  702. if (!parent) {
  703. re = kmalloc(sizeof(struct root_entry), GFP_NOFS);
  704. if (!re) {
  705. kfree(ref);
  706. kfree(ra);
  707. ret = -ENOMEM;
  708. goto out;
  709. }
  710. /*
  711. * This is the root that is modifying us, so it's the
  712. * one we want to lookup below when we modify the
  713. * re->num_refs.
  714. */
  715. ref_root = root->objectid;
  716. re->root_objectid = root->objectid;
  717. re->num_refs = 0;
  718. }
  719. spin_lock(&root->fs_info->ref_verify_lock);
  720. be = lookup_block_entry(&root->fs_info->block_tree, bytenr);
  721. if (!be) {
  722. btrfs_err(fs_info,
  723. "trying to do action %d to bytenr %llu num_bytes %llu but there is no existing entry!",
  724. action, (unsigned long long)bytenr,
  725. (unsigned long long)num_bytes);
  726. dump_ref_action(fs_info, ra);
  727. kfree(ref);
  728. kfree(ra);
  729. goto out_unlock;
  730. }
  731. if (!parent) {
  732. tmp = insert_root_entry(&be->roots, re);
  733. if (tmp) {
  734. kfree(re);
  735. re = tmp;
  736. }
  737. }
  738. }
  739. exist = insert_ref_entry(&be->refs, ref);
  740. if (exist) {
  741. if (action == BTRFS_DROP_DELAYED_REF) {
  742. if (exist->num_refs == 0) {
  743. btrfs_err(fs_info,
  744. "dropping a ref for a existing root that doesn't have a ref on the block");
  745. dump_block_entry(fs_info, be);
  746. dump_ref_action(fs_info, ra);
  747. kfree(ref);
  748. kfree(ra);
  749. goto out_unlock;
  750. }
  751. exist->num_refs--;
  752. if (exist->num_refs == 0) {
  753. rb_erase(&exist->node, &be->refs);
  754. kfree(exist);
  755. }
  756. } else if (!be->metadata) {
  757. exist->num_refs++;
  758. } else {
  759. btrfs_err(fs_info,
  760. "attempting to add another ref for an existing ref on a tree block");
  761. dump_block_entry(fs_info, be);
  762. dump_ref_action(fs_info, ra);
  763. kfree(ref);
  764. kfree(ra);
  765. goto out_unlock;
  766. }
  767. kfree(ref);
  768. } else {
  769. if (action == BTRFS_DROP_DELAYED_REF) {
  770. btrfs_err(fs_info,
  771. "dropping a ref for a root that doesn't have a ref on the block");
  772. dump_block_entry(fs_info, be);
  773. dump_ref_action(fs_info, ra);
  774. kfree(ref);
  775. kfree(ra);
  776. goto out_unlock;
  777. }
  778. }
  779. if (!parent && !re) {
  780. re = lookup_root_entry(&be->roots, ref_root);
  781. if (!re) {
  782. /*
  783. * This shouldn't happen because we will add our re
  784. * above when we lookup the be with !parent, but just in
  785. * case catch this case so we don't panic because I
  786. * didn't thik of some other corner case.
  787. */
  788. btrfs_err(fs_info, "failed to find root %llu for %llu",
  789. root->objectid, be->bytenr);
  790. dump_block_entry(fs_info, be);
  791. dump_ref_action(fs_info, ra);
  792. kfree(ra);
  793. goto out_unlock;
  794. }
  795. }
  796. if (action == BTRFS_DROP_DELAYED_REF) {
  797. if (re)
  798. re->num_refs--;
  799. be->num_refs--;
  800. } else if (action == BTRFS_ADD_DELAYED_REF) {
  801. be->num_refs++;
  802. if (re)
  803. re->num_refs++;
  804. }
  805. list_add_tail(&ra->list, &be->actions);
  806. ret = 0;
  807. out_unlock:
  808. spin_unlock(&root->fs_info->ref_verify_lock);
  809. out:
  810. if (ret)
  811. btrfs_clear_opt(fs_info->mount_opt, REF_VERIFY);
  812. return ret;
  813. }
  814. /* Free up the ref cache */
  815. void btrfs_free_ref_cache(struct btrfs_fs_info *fs_info)
  816. {
  817. struct block_entry *be;
  818. struct rb_node *n;
  819. if (!btrfs_test_opt(fs_info, REF_VERIFY))
  820. return;
  821. spin_lock(&fs_info->ref_verify_lock);
  822. while ((n = rb_first(&fs_info->block_tree))) {
  823. be = rb_entry(n, struct block_entry, node);
  824. rb_erase(&be->node, &fs_info->block_tree);
  825. free_block_entry(be);
  826. cond_resched_lock(&fs_info->ref_verify_lock);
  827. }
  828. spin_unlock(&fs_info->ref_verify_lock);
  829. }
  830. void btrfs_free_ref_tree_range(struct btrfs_fs_info *fs_info, u64 start,
  831. u64 len)
  832. {
  833. struct block_entry *be = NULL, *entry;
  834. struct rb_node *n;
  835. if (!btrfs_test_opt(fs_info, REF_VERIFY))
  836. return;
  837. spin_lock(&fs_info->ref_verify_lock);
  838. n = fs_info->block_tree.rb_node;
  839. while (n) {
  840. entry = rb_entry(n, struct block_entry, node);
  841. if (entry->bytenr < start) {
  842. n = n->rb_right;
  843. } else if (entry->bytenr > start) {
  844. n = n->rb_left;
  845. } else {
  846. be = entry;
  847. break;
  848. }
  849. /* We want to get as close to start as possible */
  850. if (be == NULL ||
  851. (entry->bytenr < start && be->bytenr > start) ||
  852. (entry->bytenr < start && entry->bytenr > be->bytenr))
  853. be = entry;
  854. }
  855. /*
  856. * Could have an empty block group, maybe have something to check for
  857. * this case to verify we were actually empty?
  858. */
  859. if (!be) {
  860. spin_unlock(&fs_info->ref_verify_lock);
  861. return;
  862. }
  863. n = &be->node;
  864. while (n) {
  865. be = rb_entry(n, struct block_entry, node);
  866. n = rb_next(n);
  867. if (be->bytenr < start && be->bytenr + be->len > start) {
  868. btrfs_err(fs_info,
  869. "block entry overlaps a block group [%llu,%llu]!",
  870. start, len);
  871. dump_block_entry(fs_info, be);
  872. continue;
  873. }
  874. if (be->bytenr < start)
  875. continue;
  876. if (be->bytenr >= start + len)
  877. break;
  878. if (be->bytenr + be->len > start + len) {
  879. btrfs_err(fs_info,
  880. "block entry overlaps a block group [%llu,%llu]!",
  881. start, len);
  882. dump_block_entry(fs_info, be);
  883. }
  884. rb_erase(&be->node, &fs_info->block_tree);
  885. free_block_entry(be);
  886. }
  887. spin_unlock(&fs_info->ref_verify_lock);
  888. }
  889. /* Walk down all roots and build the ref tree, meant to be called at mount */
  890. int btrfs_build_ref_tree(struct btrfs_fs_info *fs_info)
  891. {
  892. struct btrfs_path *path;
  893. struct extent_buffer *eb;
  894. u64 bytenr = 0, num_bytes = 0;
  895. int ret, level;
  896. if (!btrfs_test_opt(fs_info, REF_VERIFY))
  897. return 0;
  898. path = btrfs_alloc_path();
  899. if (!path)
  900. return -ENOMEM;
  901. eb = btrfs_read_lock_root_node(fs_info->extent_root);
  902. btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK);
  903. level = btrfs_header_level(eb);
  904. path->nodes[level] = eb;
  905. path->slots[level] = 0;
  906. path->locks[level] = BTRFS_READ_LOCK_BLOCKING;
  907. while (1) {
  908. /*
  909. * We have to keep track of the bytenr/num_bytes we last hit
  910. * because we could have run out of space for an inline ref, and
  911. * would have had to added a ref key item which may appear on a
  912. * different leaf from the original extent item.
  913. */
  914. ret = walk_down_tree(fs_info->extent_root, path, level,
  915. &bytenr, &num_bytes);
  916. if (ret)
  917. break;
  918. ret = walk_up_tree(path, &level);
  919. if (ret < 0)
  920. break;
  921. if (ret > 0) {
  922. ret = 0;
  923. break;
  924. }
  925. }
  926. if (ret) {
  927. btrfs_clear_opt(fs_info->mount_opt, REF_VERIFY);
  928. btrfs_free_ref_cache(fs_info);
  929. }
  930. btrfs_free_path(path);
  931. return ret;
  932. }