debug.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Assorted bcachefs debug code
  4. *
  5. * Copyright 2010, 2011 Kent Overstreet <kent.overstreet@gmail.com>
  6. * Copyright 2012 Google, Inc.
  7. */
  8. #include "bcachefs.h"
  9. #include "bkey_methods.h"
  10. #include "btree_cache.h"
  11. #include "btree_io.h"
  12. #include "btree_iter.h"
  13. #include "btree_locking.h"
  14. #include "btree_update.h"
  15. #include "btree_update_interior.h"
  16. #include "buckets.h"
  17. #include "debug.h"
  18. #include "error.h"
  19. #include "extents.h"
  20. #include "fsck.h"
  21. #include "inode.h"
  22. #include "super.h"
  23. #include <linux/console.h>
  24. #include <linux/debugfs.h>
  25. #include <linux/module.h>
  26. #include <linux/random.h>
  27. #include <linux/seq_file.h>
  28. static struct dentry *bch_debug;
  29. static bool bch2_btree_verify_replica(struct bch_fs *c, struct btree *b,
  30. struct extent_ptr_decoded pick)
  31. {
  32. struct btree *v = c->verify_data;
  33. struct btree_node *n_ondisk = c->verify_ondisk;
  34. struct btree_node *n_sorted = c->verify_data->data;
  35. struct bset *sorted, *inmemory = &b->data->keys;
  36. struct bio *bio;
  37. bool failed = false, saw_error = false;
  38. struct bch_dev *ca = bch2_dev_get_ioref(c, pick.ptr.dev, READ);
  39. if (!ca)
  40. return false;
  41. bio = bio_alloc_bioset(ca->disk_sb.bdev,
  42. buf_pages(n_sorted, btree_buf_bytes(b)),
  43. REQ_OP_READ|REQ_META,
  44. GFP_NOFS,
  45. &c->btree_bio);
  46. bio->bi_iter.bi_sector = pick.ptr.offset;
  47. bch2_bio_map(bio, n_sorted, btree_buf_bytes(b));
  48. submit_bio_wait(bio);
  49. bio_put(bio);
  50. percpu_ref_put(&ca->io_ref);
  51. memcpy(n_ondisk, n_sorted, btree_buf_bytes(b));
  52. v->written = 0;
  53. if (bch2_btree_node_read_done(c, ca, v, false, &saw_error) || saw_error)
  54. return false;
  55. n_sorted = c->verify_data->data;
  56. sorted = &n_sorted->keys;
  57. if (inmemory->u64s != sorted->u64s ||
  58. memcmp(inmemory->start,
  59. sorted->start,
  60. vstruct_end(inmemory) - (void *) inmemory->start)) {
  61. unsigned offset = 0, sectors;
  62. struct bset *i;
  63. unsigned j;
  64. console_lock();
  65. printk(KERN_ERR "*** in memory:\n");
  66. bch2_dump_bset(c, b, inmemory, 0);
  67. printk(KERN_ERR "*** read back in:\n");
  68. bch2_dump_bset(c, v, sorted, 0);
  69. while (offset < v->written) {
  70. if (!offset) {
  71. i = &n_ondisk->keys;
  72. sectors = vstruct_blocks(n_ondisk, c->block_bits) <<
  73. c->block_bits;
  74. } else {
  75. struct btree_node_entry *bne =
  76. (void *) n_ondisk + (offset << 9);
  77. i = &bne->keys;
  78. sectors = vstruct_blocks(bne, c->block_bits) <<
  79. c->block_bits;
  80. }
  81. printk(KERN_ERR "*** on disk block %u:\n", offset);
  82. bch2_dump_bset(c, b, i, offset);
  83. offset += sectors;
  84. }
  85. for (j = 0; j < le16_to_cpu(inmemory->u64s); j++)
  86. if (inmemory->_data[j] != sorted->_data[j])
  87. break;
  88. console_unlock();
  89. bch_err(c, "verify failed at key %u", j);
  90. failed = true;
  91. }
  92. if (v->written != b->written) {
  93. bch_err(c, "written wrong: expected %u, got %u",
  94. b->written, v->written);
  95. failed = true;
  96. }
  97. return failed;
  98. }
  99. void __bch2_btree_verify(struct bch_fs *c, struct btree *b)
  100. {
  101. struct bkey_ptrs_c ptrs;
  102. struct extent_ptr_decoded p;
  103. const union bch_extent_entry *entry;
  104. struct btree *v;
  105. struct bset *inmemory = &b->data->keys;
  106. struct bkey_packed *k;
  107. bool failed = false;
  108. if (c->opts.nochanges)
  109. return;
  110. bch2_btree_node_io_lock(b);
  111. mutex_lock(&c->verify_lock);
  112. if (!c->verify_ondisk) {
  113. c->verify_ondisk = kvmalloc(btree_buf_bytes(b), GFP_KERNEL);
  114. if (!c->verify_ondisk)
  115. goto out;
  116. }
  117. if (!c->verify_data) {
  118. c->verify_data = __bch2_btree_node_mem_alloc(c);
  119. if (!c->verify_data)
  120. goto out;
  121. list_del_init(&c->verify_data->list);
  122. }
  123. BUG_ON(b->nsets != 1);
  124. for (k = inmemory->start; k != vstruct_last(inmemory); k = bkey_p_next(k))
  125. if (k->type == KEY_TYPE_btree_ptr_v2)
  126. ((struct bch_btree_ptr_v2 *) bkeyp_val(&b->format, k))->mem_ptr = 0;
  127. v = c->verify_data;
  128. bkey_copy(&v->key, &b->key);
  129. v->c.level = b->c.level;
  130. v->c.btree_id = b->c.btree_id;
  131. bch2_btree_keys_init(v);
  132. ptrs = bch2_bkey_ptrs_c(bkey_i_to_s_c(&b->key));
  133. bkey_for_each_ptr_decode(&b->key.k, ptrs, p, entry)
  134. failed |= bch2_btree_verify_replica(c, b, p);
  135. if (failed) {
  136. struct printbuf buf = PRINTBUF;
  137. bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(&b->key));
  138. bch2_fs_fatal_error(c, ": btree node verify failed for: %s\n", buf.buf);
  139. printbuf_exit(&buf);
  140. }
  141. out:
  142. mutex_unlock(&c->verify_lock);
  143. bch2_btree_node_io_unlock(b);
  144. }
  145. void bch2_btree_node_ondisk_to_text(struct printbuf *out, struct bch_fs *c,
  146. const struct btree *b)
  147. {
  148. struct btree_node *n_ondisk = NULL;
  149. struct extent_ptr_decoded pick;
  150. struct bch_dev *ca;
  151. struct bio *bio = NULL;
  152. unsigned offset = 0;
  153. int ret;
  154. if (bch2_bkey_pick_read_device(c, bkey_i_to_s_c(&b->key), NULL, &pick) <= 0) {
  155. prt_printf(out, "error getting device to read from: invalid device\n");
  156. return;
  157. }
  158. ca = bch2_dev_get_ioref(c, pick.ptr.dev, READ);
  159. if (!ca) {
  160. prt_printf(out, "error getting device to read from: not online\n");
  161. return;
  162. }
  163. n_ondisk = kvmalloc(btree_buf_bytes(b), GFP_KERNEL);
  164. if (!n_ondisk) {
  165. prt_printf(out, "memory allocation failure\n");
  166. goto out;
  167. }
  168. bio = bio_alloc_bioset(ca->disk_sb.bdev,
  169. buf_pages(n_ondisk, btree_buf_bytes(b)),
  170. REQ_OP_READ|REQ_META,
  171. GFP_NOFS,
  172. &c->btree_bio);
  173. bio->bi_iter.bi_sector = pick.ptr.offset;
  174. bch2_bio_map(bio, n_ondisk, btree_buf_bytes(b));
  175. ret = submit_bio_wait(bio);
  176. if (ret) {
  177. prt_printf(out, "IO error reading btree node: %s\n", bch2_err_str(ret));
  178. goto out;
  179. }
  180. while (offset < btree_sectors(c)) {
  181. struct bset *i;
  182. struct nonce nonce;
  183. struct bch_csum csum;
  184. struct bkey_packed *k;
  185. unsigned sectors;
  186. if (!offset) {
  187. i = &n_ondisk->keys;
  188. if (!bch2_checksum_type_valid(c, BSET_CSUM_TYPE(i))) {
  189. prt_printf(out, "unknown checksum type at offset %u: %llu\n",
  190. offset, BSET_CSUM_TYPE(i));
  191. goto out;
  192. }
  193. nonce = btree_nonce(i, offset << 9);
  194. csum = csum_vstruct(c, BSET_CSUM_TYPE(i), nonce, n_ondisk);
  195. if (bch2_crc_cmp(csum, n_ondisk->csum)) {
  196. prt_printf(out, "invalid checksum\n");
  197. goto out;
  198. }
  199. bset_encrypt(c, i, offset << 9);
  200. sectors = vstruct_sectors(n_ondisk, c->block_bits);
  201. } else {
  202. struct btree_node_entry *bne = (void *) n_ondisk + (offset << 9);
  203. i = &bne->keys;
  204. if (i->seq != n_ondisk->keys.seq)
  205. break;
  206. if (!bch2_checksum_type_valid(c, BSET_CSUM_TYPE(i))) {
  207. prt_printf(out, "unknown checksum type at offset %u: %llu\n",
  208. offset, BSET_CSUM_TYPE(i));
  209. goto out;
  210. }
  211. nonce = btree_nonce(i, offset << 9);
  212. csum = csum_vstruct(c, BSET_CSUM_TYPE(i), nonce, bne);
  213. if (bch2_crc_cmp(csum, bne->csum)) {
  214. prt_printf(out, "invalid checksum");
  215. goto out;
  216. }
  217. bset_encrypt(c, i, offset << 9);
  218. sectors = vstruct_sectors(bne, c->block_bits);
  219. }
  220. prt_printf(out, " offset %u version %u, journal seq %llu\n",
  221. offset,
  222. le16_to_cpu(i->version),
  223. le64_to_cpu(i->journal_seq));
  224. offset += sectors;
  225. printbuf_indent_add(out, 4);
  226. for (k = i->start; k != vstruct_last(i); k = bkey_p_next(k)) {
  227. struct bkey u;
  228. bch2_bkey_val_to_text(out, c, bkey_disassemble(b, k, &u));
  229. prt_newline(out);
  230. }
  231. printbuf_indent_sub(out, 4);
  232. }
  233. out:
  234. if (bio)
  235. bio_put(bio);
  236. kvfree(n_ondisk);
  237. percpu_ref_put(&ca->io_ref);
  238. }
  239. #ifdef CONFIG_DEBUG_FS
  240. /* XXX: bch_fs refcounting */
  241. struct dump_iter {
  242. struct bch_fs *c;
  243. enum btree_id id;
  244. struct bpos from;
  245. struct bpos prev_node;
  246. u64 iter;
  247. struct printbuf buf;
  248. char __user *ubuf; /* destination user buffer */
  249. size_t size; /* size of requested read */
  250. ssize_t ret; /* bytes read so far */
  251. };
  252. static ssize_t flush_buf(struct dump_iter *i)
  253. {
  254. if (i->buf.pos) {
  255. size_t bytes = min_t(size_t, i->buf.pos, i->size);
  256. int copied = bytes - copy_to_user(i->ubuf, i->buf.buf, bytes);
  257. i->ret += copied;
  258. i->ubuf += copied;
  259. i->size -= copied;
  260. i->buf.pos -= copied;
  261. memmove(i->buf.buf, i->buf.buf + copied, i->buf.pos);
  262. if (copied != bytes)
  263. return -EFAULT;
  264. }
  265. return i->size ? 0 : i->ret;
  266. }
  267. static int bch2_dump_open(struct inode *inode, struct file *file)
  268. {
  269. struct btree_debug *bd = inode->i_private;
  270. struct dump_iter *i;
  271. i = kzalloc(sizeof(struct dump_iter), GFP_KERNEL);
  272. if (!i)
  273. return -ENOMEM;
  274. file->private_data = i;
  275. i->from = POS_MIN;
  276. i->iter = 0;
  277. i->c = container_of(bd, struct bch_fs, btree_debug[bd->id]);
  278. i->id = bd->id;
  279. i->buf = PRINTBUF;
  280. return 0;
  281. }
  282. static int bch2_dump_release(struct inode *inode, struct file *file)
  283. {
  284. struct dump_iter *i = file->private_data;
  285. printbuf_exit(&i->buf);
  286. kfree(i);
  287. return 0;
  288. }
  289. static ssize_t bch2_read_btree(struct file *file, char __user *buf,
  290. size_t size, loff_t *ppos)
  291. {
  292. struct dump_iter *i = file->private_data;
  293. i->ubuf = buf;
  294. i->size = size;
  295. i->ret = 0;
  296. return flush_buf(i) ?:
  297. bch2_trans_run(i->c,
  298. for_each_btree_key(trans, iter, i->id, i->from,
  299. BTREE_ITER_prefetch|
  300. BTREE_ITER_all_snapshots, k, ({
  301. bch2_bkey_val_to_text(&i->buf, i->c, k);
  302. prt_newline(&i->buf);
  303. bch2_trans_unlock(trans);
  304. i->from = bpos_successor(iter.pos);
  305. flush_buf(i);
  306. }))) ?:
  307. i->ret;
  308. }
  309. static const struct file_operations btree_debug_ops = {
  310. .owner = THIS_MODULE,
  311. .open = bch2_dump_open,
  312. .release = bch2_dump_release,
  313. .read = bch2_read_btree,
  314. };
  315. static ssize_t bch2_read_btree_formats(struct file *file, char __user *buf,
  316. size_t size, loff_t *ppos)
  317. {
  318. struct dump_iter *i = file->private_data;
  319. i->ubuf = buf;
  320. i->size = size;
  321. i->ret = 0;
  322. ssize_t ret = flush_buf(i);
  323. if (ret)
  324. return ret;
  325. if (bpos_eq(SPOS_MAX, i->from))
  326. return i->ret;
  327. return bch2_trans_run(i->c,
  328. for_each_btree_node(trans, iter, i->id, i->from, 0, b, ({
  329. bch2_btree_node_to_text(&i->buf, i->c, b);
  330. i->from = !bpos_eq(SPOS_MAX, b->key.k.p)
  331. ? bpos_successor(b->key.k.p)
  332. : b->key.k.p;
  333. drop_locks_do(trans, flush_buf(i));
  334. }))) ?: i->ret;
  335. }
  336. static const struct file_operations btree_format_debug_ops = {
  337. .owner = THIS_MODULE,
  338. .open = bch2_dump_open,
  339. .release = bch2_dump_release,
  340. .read = bch2_read_btree_formats,
  341. };
  342. static ssize_t bch2_read_bfloat_failed(struct file *file, char __user *buf,
  343. size_t size, loff_t *ppos)
  344. {
  345. struct dump_iter *i = file->private_data;
  346. i->ubuf = buf;
  347. i->size = size;
  348. i->ret = 0;
  349. return flush_buf(i) ?:
  350. bch2_trans_run(i->c,
  351. for_each_btree_key(trans, iter, i->id, i->from,
  352. BTREE_ITER_prefetch|
  353. BTREE_ITER_all_snapshots, k, ({
  354. struct btree_path_level *l =
  355. &btree_iter_path(trans, &iter)->l[0];
  356. struct bkey_packed *_k =
  357. bch2_btree_node_iter_peek(&l->iter, l->b);
  358. if (bpos_gt(l->b->key.k.p, i->prev_node)) {
  359. bch2_btree_node_to_text(&i->buf, i->c, l->b);
  360. i->prev_node = l->b->key.k.p;
  361. }
  362. bch2_bfloat_to_text(&i->buf, l->b, _k);
  363. bch2_trans_unlock(trans);
  364. i->from = bpos_successor(iter.pos);
  365. flush_buf(i);
  366. }))) ?:
  367. i->ret;
  368. }
  369. static const struct file_operations bfloat_failed_debug_ops = {
  370. .owner = THIS_MODULE,
  371. .open = bch2_dump_open,
  372. .release = bch2_dump_release,
  373. .read = bch2_read_bfloat_failed,
  374. };
  375. static void bch2_cached_btree_node_to_text(struct printbuf *out, struct bch_fs *c,
  376. struct btree *b)
  377. {
  378. if (!out->nr_tabstops)
  379. printbuf_tabstop_push(out, 32);
  380. prt_printf(out, "%px btree=%s l=%u\n", b, bch2_btree_id_str(b->c.btree_id), b->c.level);
  381. printbuf_indent_add(out, 2);
  382. bch2_bkey_val_to_text(out, c, bkey_i_to_s_c(&b->key));
  383. prt_newline(out);
  384. prt_printf(out, "flags:\t");
  385. prt_bitflags(out, bch2_btree_node_flags, b->flags);
  386. prt_newline(out);
  387. prt_printf(out, "pcpu read locks:\t%u\n", b->c.lock.readers != NULL);
  388. prt_printf(out, "written:\t%u\n", b->written);
  389. prt_printf(out, "writes blocked:\t%u\n", !list_empty_careful(&b->write_blocked));
  390. prt_printf(out, "will make reachable:\t%lx\n", b->will_make_reachable);
  391. prt_printf(out, "journal pin %px:\t%llu\n",
  392. &b->writes[0].journal, b->writes[0].journal.seq);
  393. prt_printf(out, "journal pin %px:\t%llu\n",
  394. &b->writes[1].journal, b->writes[1].journal.seq);
  395. printbuf_indent_sub(out, 2);
  396. }
  397. static ssize_t bch2_cached_btree_nodes_read(struct file *file, char __user *buf,
  398. size_t size, loff_t *ppos)
  399. {
  400. struct dump_iter *i = file->private_data;
  401. struct bch_fs *c = i->c;
  402. bool done = false;
  403. ssize_t ret = 0;
  404. i->ubuf = buf;
  405. i->size = size;
  406. i->ret = 0;
  407. do {
  408. struct bucket_table *tbl;
  409. struct rhash_head *pos;
  410. struct btree *b;
  411. ret = flush_buf(i);
  412. if (ret)
  413. return ret;
  414. rcu_read_lock();
  415. i->buf.atomic++;
  416. tbl = rht_dereference_rcu(c->btree_cache.table.tbl,
  417. &c->btree_cache.table);
  418. if (i->iter < tbl->size) {
  419. rht_for_each_entry_rcu(b, pos, tbl, i->iter, hash)
  420. bch2_cached_btree_node_to_text(&i->buf, c, b);
  421. i->iter++;
  422. } else {
  423. done = true;
  424. }
  425. --i->buf.atomic;
  426. rcu_read_unlock();
  427. } while (!done);
  428. if (i->buf.allocation_failure)
  429. ret = -ENOMEM;
  430. if (!ret)
  431. ret = flush_buf(i);
  432. return ret ?: i->ret;
  433. }
  434. static const struct file_operations cached_btree_nodes_ops = {
  435. .owner = THIS_MODULE,
  436. .open = bch2_dump_open,
  437. .release = bch2_dump_release,
  438. .read = bch2_cached_btree_nodes_read,
  439. };
  440. typedef int (*list_cmp_fn)(const struct list_head *l, const struct list_head *r);
  441. static void list_sort(struct list_head *head, list_cmp_fn cmp)
  442. {
  443. struct list_head *pos;
  444. list_for_each(pos, head)
  445. while (!list_is_last(pos, head) &&
  446. cmp(pos, pos->next) > 0) {
  447. struct list_head *pos2, *next = pos->next;
  448. list_del(next);
  449. list_for_each(pos2, head)
  450. if (cmp(next, pos2) < 0)
  451. goto pos_found;
  452. BUG();
  453. pos_found:
  454. list_add_tail(next, pos2);
  455. }
  456. }
  457. static int list_ptr_order_cmp(const struct list_head *l, const struct list_head *r)
  458. {
  459. return cmp_int(l, r);
  460. }
  461. static ssize_t bch2_btree_transactions_read(struct file *file, char __user *buf,
  462. size_t size, loff_t *ppos)
  463. {
  464. struct dump_iter *i = file->private_data;
  465. struct bch_fs *c = i->c;
  466. struct btree_trans *trans;
  467. ssize_t ret = 0;
  468. i->ubuf = buf;
  469. i->size = size;
  470. i->ret = 0;
  471. restart:
  472. seqmutex_lock(&c->btree_trans_lock);
  473. list_sort(&c->btree_trans_list, list_ptr_order_cmp);
  474. list_for_each_entry(trans, &c->btree_trans_list, list) {
  475. if ((ulong) trans <= i->iter)
  476. continue;
  477. i->iter = (ulong) trans;
  478. if (!closure_get_not_zero(&trans->ref))
  479. continue;
  480. u32 seq = seqmutex_unlock(&c->btree_trans_lock);
  481. bch2_btree_trans_to_text(&i->buf, trans);
  482. prt_printf(&i->buf, "backtrace:\n");
  483. printbuf_indent_add(&i->buf, 2);
  484. bch2_prt_task_backtrace(&i->buf, trans->locking_wait.task, 0, GFP_KERNEL);
  485. printbuf_indent_sub(&i->buf, 2);
  486. prt_newline(&i->buf);
  487. closure_put(&trans->ref);
  488. ret = flush_buf(i);
  489. if (ret)
  490. goto unlocked;
  491. if (!seqmutex_relock(&c->btree_trans_lock, seq))
  492. goto restart;
  493. }
  494. seqmutex_unlock(&c->btree_trans_lock);
  495. unlocked:
  496. if (i->buf.allocation_failure)
  497. ret = -ENOMEM;
  498. if (!ret)
  499. ret = flush_buf(i);
  500. return ret ?: i->ret;
  501. }
  502. static const struct file_operations btree_transactions_ops = {
  503. .owner = THIS_MODULE,
  504. .open = bch2_dump_open,
  505. .release = bch2_dump_release,
  506. .read = bch2_btree_transactions_read,
  507. };
  508. static ssize_t bch2_journal_pins_read(struct file *file, char __user *buf,
  509. size_t size, loff_t *ppos)
  510. {
  511. struct dump_iter *i = file->private_data;
  512. struct bch_fs *c = i->c;
  513. bool done = false;
  514. int err;
  515. i->ubuf = buf;
  516. i->size = size;
  517. i->ret = 0;
  518. while (1) {
  519. err = flush_buf(i);
  520. if (err)
  521. return err;
  522. if (!i->size)
  523. break;
  524. if (done)
  525. break;
  526. done = bch2_journal_seq_pins_to_text(&i->buf, &c->journal, &i->iter);
  527. i->iter++;
  528. }
  529. if (i->buf.allocation_failure)
  530. return -ENOMEM;
  531. return i->ret;
  532. }
  533. static const struct file_operations journal_pins_ops = {
  534. .owner = THIS_MODULE,
  535. .open = bch2_dump_open,
  536. .release = bch2_dump_release,
  537. .read = bch2_journal_pins_read,
  538. };
  539. static ssize_t bch2_btree_updates_read(struct file *file, char __user *buf,
  540. size_t size, loff_t *ppos)
  541. {
  542. struct dump_iter *i = file->private_data;
  543. struct bch_fs *c = i->c;
  544. int err;
  545. i->ubuf = buf;
  546. i->size = size;
  547. i->ret = 0;
  548. if (!i->iter) {
  549. bch2_btree_updates_to_text(&i->buf, c);
  550. i->iter++;
  551. }
  552. err = flush_buf(i);
  553. if (err)
  554. return err;
  555. if (i->buf.allocation_failure)
  556. return -ENOMEM;
  557. return i->ret;
  558. }
  559. static const struct file_operations btree_updates_ops = {
  560. .owner = THIS_MODULE,
  561. .open = bch2_dump_open,
  562. .release = bch2_dump_release,
  563. .read = bch2_btree_updates_read,
  564. };
  565. static int btree_transaction_stats_open(struct inode *inode, struct file *file)
  566. {
  567. struct bch_fs *c = inode->i_private;
  568. struct dump_iter *i;
  569. i = kzalloc(sizeof(struct dump_iter), GFP_KERNEL);
  570. if (!i)
  571. return -ENOMEM;
  572. i->iter = 1;
  573. i->c = c;
  574. i->buf = PRINTBUF;
  575. file->private_data = i;
  576. return 0;
  577. }
  578. static int btree_transaction_stats_release(struct inode *inode, struct file *file)
  579. {
  580. struct dump_iter *i = file->private_data;
  581. printbuf_exit(&i->buf);
  582. kfree(i);
  583. return 0;
  584. }
  585. static ssize_t btree_transaction_stats_read(struct file *file, char __user *buf,
  586. size_t size, loff_t *ppos)
  587. {
  588. struct dump_iter *i = file->private_data;
  589. struct bch_fs *c = i->c;
  590. int err;
  591. i->ubuf = buf;
  592. i->size = size;
  593. i->ret = 0;
  594. while (1) {
  595. struct btree_transaction_stats *s = &c->btree_transaction_stats[i->iter];
  596. err = flush_buf(i);
  597. if (err)
  598. return err;
  599. if (!i->size)
  600. break;
  601. if (i->iter == ARRAY_SIZE(bch2_btree_transaction_fns) ||
  602. !bch2_btree_transaction_fns[i->iter])
  603. break;
  604. prt_printf(&i->buf, "%s:\n", bch2_btree_transaction_fns[i->iter]);
  605. printbuf_indent_add(&i->buf, 2);
  606. mutex_lock(&s->lock);
  607. prt_printf(&i->buf, "Max mem used: %u\n", s->max_mem);
  608. prt_printf(&i->buf, "Transaction duration:\n");
  609. printbuf_indent_add(&i->buf, 2);
  610. bch2_time_stats_to_text(&i->buf, &s->duration);
  611. printbuf_indent_sub(&i->buf, 2);
  612. if (IS_ENABLED(CONFIG_BCACHEFS_LOCK_TIME_STATS)) {
  613. prt_printf(&i->buf, "Lock hold times:\n");
  614. printbuf_indent_add(&i->buf, 2);
  615. bch2_time_stats_to_text(&i->buf, &s->lock_hold_times);
  616. printbuf_indent_sub(&i->buf, 2);
  617. }
  618. if (s->max_paths_text) {
  619. prt_printf(&i->buf, "Maximum allocated btree paths (%u):\n", s->nr_max_paths);
  620. printbuf_indent_add(&i->buf, 2);
  621. prt_str_indented(&i->buf, s->max_paths_text);
  622. printbuf_indent_sub(&i->buf, 2);
  623. }
  624. mutex_unlock(&s->lock);
  625. printbuf_indent_sub(&i->buf, 2);
  626. prt_newline(&i->buf);
  627. i->iter++;
  628. }
  629. if (i->buf.allocation_failure)
  630. return -ENOMEM;
  631. return i->ret;
  632. }
  633. static const struct file_operations btree_transaction_stats_op = {
  634. .owner = THIS_MODULE,
  635. .open = btree_transaction_stats_open,
  636. .release = btree_transaction_stats_release,
  637. .read = btree_transaction_stats_read,
  638. };
  639. /* walk btree transactions until we find a deadlock and print it */
  640. static void btree_deadlock_to_text(struct printbuf *out, struct bch_fs *c)
  641. {
  642. struct btree_trans *trans;
  643. ulong iter = 0;
  644. restart:
  645. seqmutex_lock(&c->btree_trans_lock);
  646. list_sort(&c->btree_trans_list, list_ptr_order_cmp);
  647. list_for_each_entry(trans, &c->btree_trans_list, list) {
  648. if ((ulong) trans <= iter)
  649. continue;
  650. iter = (ulong) trans;
  651. if (!closure_get_not_zero(&trans->ref))
  652. continue;
  653. u32 seq = seqmutex_unlock(&c->btree_trans_lock);
  654. bool found = bch2_check_for_deadlock(trans, out) != 0;
  655. closure_put(&trans->ref);
  656. if (found)
  657. return;
  658. if (!seqmutex_relock(&c->btree_trans_lock, seq))
  659. goto restart;
  660. }
  661. seqmutex_unlock(&c->btree_trans_lock);
  662. }
  663. static ssize_t bch2_btree_deadlock_read(struct file *file, char __user *buf,
  664. size_t size, loff_t *ppos)
  665. {
  666. struct dump_iter *i = file->private_data;
  667. struct bch_fs *c = i->c;
  668. ssize_t ret = 0;
  669. i->ubuf = buf;
  670. i->size = size;
  671. i->ret = 0;
  672. if (!i->iter) {
  673. btree_deadlock_to_text(&i->buf, c);
  674. i->iter++;
  675. }
  676. if (i->buf.allocation_failure)
  677. ret = -ENOMEM;
  678. if (!ret)
  679. ret = flush_buf(i);
  680. return ret ?: i->ret;
  681. }
  682. static const struct file_operations btree_deadlock_ops = {
  683. .owner = THIS_MODULE,
  684. .open = bch2_dump_open,
  685. .release = bch2_dump_release,
  686. .read = bch2_btree_deadlock_read,
  687. };
  688. void bch2_fs_debug_exit(struct bch_fs *c)
  689. {
  690. if (!IS_ERR_OR_NULL(c->fs_debug_dir))
  691. debugfs_remove_recursive(c->fs_debug_dir);
  692. }
  693. static void bch2_fs_debug_btree_init(struct bch_fs *c, struct btree_debug *bd)
  694. {
  695. struct dentry *d;
  696. d = debugfs_create_dir(bch2_btree_id_str(bd->id), c->btree_debug_dir);
  697. debugfs_create_file("keys", 0400, d, bd, &btree_debug_ops);
  698. debugfs_create_file("formats", 0400, d, bd, &btree_format_debug_ops);
  699. debugfs_create_file("bfloat-failed", 0400, d, bd,
  700. &bfloat_failed_debug_ops);
  701. }
  702. void bch2_fs_debug_init(struct bch_fs *c)
  703. {
  704. struct btree_debug *bd;
  705. char name[100];
  706. if (IS_ERR_OR_NULL(bch_debug))
  707. return;
  708. snprintf(name, sizeof(name), "%pU", c->sb.user_uuid.b);
  709. c->fs_debug_dir = debugfs_create_dir(name, bch_debug);
  710. if (IS_ERR_OR_NULL(c->fs_debug_dir))
  711. return;
  712. debugfs_create_file("cached_btree_nodes", 0400, c->fs_debug_dir,
  713. c->btree_debug, &cached_btree_nodes_ops);
  714. debugfs_create_file("btree_transactions", 0400, c->fs_debug_dir,
  715. c->btree_debug, &btree_transactions_ops);
  716. debugfs_create_file("journal_pins", 0400, c->fs_debug_dir,
  717. c->btree_debug, &journal_pins_ops);
  718. debugfs_create_file("btree_updates", 0400, c->fs_debug_dir,
  719. c->btree_debug, &btree_updates_ops);
  720. debugfs_create_file("btree_transaction_stats", 0400, c->fs_debug_dir,
  721. c, &btree_transaction_stats_op);
  722. debugfs_create_file("btree_deadlock", 0400, c->fs_debug_dir,
  723. c->btree_debug, &btree_deadlock_ops);
  724. c->btree_debug_dir = debugfs_create_dir("btrees", c->fs_debug_dir);
  725. if (IS_ERR_OR_NULL(c->btree_debug_dir))
  726. return;
  727. for (bd = c->btree_debug;
  728. bd < c->btree_debug + ARRAY_SIZE(c->btree_debug);
  729. bd++) {
  730. bd->id = bd - c->btree_debug;
  731. bch2_fs_debug_btree_init(c, bd);
  732. }
  733. }
  734. #endif
  735. void bch2_debug_exit(void)
  736. {
  737. if (!IS_ERR_OR_NULL(bch_debug))
  738. debugfs_remove_recursive(bch_debug);
  739. }
  740. int __init bch2_debug_init(void)
  741. {
  742. bch_debug = debugfs_create_dir("bcachefs", NULL);
  743. return 0;
  744. }