1 // SPDX-License-Identifier: GPL-2.0
5 #include "btree_update.h"
15 #include <linux/bsearch.h>
16 #include <linux/dcache.h> /* struct qstr */
18 #define QSTR(n) { { { .len = strlen(n) } }, .name = n }
20 static s64 bch2_count_inode_sectors(struct btree_trans *trans, u64 inum)
22 struct btree_iter *iter;
27 for_each_btree_key(trans, iter, BTREE_ID_extents,
28 POS(inum, 0), 0, k, ret) {
29 if (k.k->p.inode != inum)
32 if (bkey_extent_is_allocation(k.k))
36 bch2_trans_iter_free(trans, iter);
38 return ret ?: sectors;
41 static int __lookup_inode(struct btree_trans *trans, u64 inode_nr,
42 struct bch_inode_unpacked *inode,
45 struct btree_iter *iter;
49 iter = bch2_trans_get_iter(trans, BTREE_ID_inodes,
51 k = bch2_btree_iter_peek_slot(iter);
57 *snapshot = iter->pos.snapshot;
58 ret = k.k->type == KEY_TYPE_inode
59 ? bch2_inode_unpack(bkey_s_c_to_inode(k), inode)
62 bch2_trans_iter_free(trans, iter);
66 static int lookup_inode(struct btree_trans *trans, u64 inode_nr,
67 struct bch_inode_unpacked *inode,
70 return lockrestart_do(trans, __lookup_inode(trans, inode_nr, inode, snapshot));
73 static int __write_inode(struct btree_trans *trans,
74 struct bch_inode_unpacked *inode,
77 struct btree_iter *inode_iter =
78 bch2_trans_get_iter(trans, BTREE_ID_inodes,
79 SPOS(0, inode->bi_inum, snapshot),
81 int ret = bch2_inode_write(trans, inode_iter, inode);
82 bch2_trans_iter_put(trans, inode_iter);
86 static int write_inode(struct btree_trans *trans,
87 struct bch_inode_unpacked *inode,
90 int ret = __bch2_trans_do(trans, NULL, NULL,
93 __write_inode(trans, inode, snapshot));
95 bch_err(trans->c, "error in fsck: error %i updating inode", ret);
99 static int __remove_dirent(struct btree_trans *trans, struct bpos pos)
101 struct bch_fs *c = trans->c;
102 struct btree_iter *iter;
103 struct bch_inode_unpacked dir_inode;
104 struct bch_hash_info dir_hash_info;
107 ret = lookup_inode(trans, pos.inode, &dir_inode, NULL);
111 dir_hash_info = bch2_hash_info_init(c, &dir_inode);
113 iter = bch2_trans_get_iter(trans, BTREE_ID_dirents, pos, BTREE_ITER_INTENT);
115 ret = bch2_hash_delete_at(trans, bch2_dirent_hash_desc,
116 &dir_hash_info, iter);
117 bch2_trans_iter_put(trans, iter);
121 static int remove_dirent(struct btree_trans *trans, struct bpos pos)
123 int ret = __bch2_trans_do(trans, NULL, NULL,
125 BTREE_INSERT_LAZY_RW,
126 __remove_dirent(trans, pos));
128 bch_err(trans->c, "remove_dirent: err %i deleting dirent", ret);
132 /* Get lost+found, create if it doesn't exist: */
133 static int lookup_lostfound(struct btree_trans *trans,
134 struct bch_inode_unpacked *lostfound)
136 struct bch_fs *c = trans->c;
137 struct bch_inode_unpacked root;
138 struct bch_hash_info root_hash_info;
139 struct qstr lostfound_str = QSTR("lost+found");
144 ret = lookup_inode(trans, BCACHEFS_ROOT_INO, &root, &snapshot);
145 if (ret && ret != -ENOENT)
148 root_hash_info = bch2_hash_info_init(c, &root);
149 inum = bch2_dirent_lookup(c, BCACHEFS_ROOT_INO, &root_hash_info,
152 bch_notice(c, "creating lost+found");
153 goto create_lostfound;
156 ret = lookup_inode(trans, inum, lostfound, &snapshot);
157 if (ret && ret != -ENOENT) {
159 * The check_dirents pass has already run, dangling dirents
160 * shouldn't exist here:
162 bch_err(c, "error looking up lost+found: %i", ret);
166 if (ret == -ENOENT) {
168 bch2_inode_init_early(c, lostfound);
170 ret = __bch2_trans_do(trans, NULL, NULL,
172 BTREE_INSERT_LAZY_RW,
173 bch2_create_trans(trans,
174 BCACHEFS_ROOT_INO, &root,
177 0, 0, S_IFDIR|0700, 0, NULL, NULL));
179 bch_err(c, "error creating lost+found: %i", ret);
185 static int reattach_inode(struct btree_trans *trans,
186 struct bch_inode_unpacked *inode)
188 struct bch_hash_info dir_hash;
189 struct bch_inode_unpacked lostfound;
195 ret = lookup_lostfound(trans, &lostfound);
199 if (S_ISDIR(inode->bi_mode)) {
200 lostfound.bi_nlink++;
202 ret = write_inode(trans, &lostfound, U32_MAX);
207 dir_hash = bch2_hash_info_init(trans->c, &lostfound);
209 snprintf(name_buf, sizeof(name_buf), "%llu", inode->bi_inum);
210 name = (struct qstr) QSTR(name_buf);
212 ret = __bch2_trans_do(trans, NULL, NULL, BTREE_INSERT_LAZY_RW,
213 bch2_dirent_create(trans, lostfound.bi_inum, &dir_hash,
214 mode_to_type(inode->bi_mode),
215 &name, inode->bi_inum, &dir_offset,
216 BCH_HASH_SET_MUST_CREATE));
218 bch_err(trans->c, "error %i reattaching inode %llu",
219 ret, inode->bi_inum);
223 inode->bi_dir = lostfound.bi_inum;
224 inode->bi_dir_offset = dir_offset;
226 return write_inode(trans, inode, U32_MAX);
229 static int remove_backpointer(struct btree_trans *trans,
230 struct bch_inode_unpacked *inode)
232 struct btree_iter *iter;
236 iter = bch2_trans_get_iter(trans, BTREE_ID_dirents,
237 POS(inode->bi_dir, inode->bi_dir_offset), 0);
238 k = bch2_btree_iter_peek_slot(iter);
242 if (k.k->type != KEY_TYPE_dirent) {
247 ret = remove_dirent(trans, k.k->p);
249 bch2_trans_iter_put(trans, iter);
253 struct inode_walker {
254 bool first_this_inode;
258 struct bch_inode_unpacked inode;
261 static struct inode_walker inode_walker_init(void)
263 return (struct inode_walker) {
269 static int walk_inode(struct btree_trans *trans,
270 struct inode_walker *w, u64 inum)
272 if (inum != w->cur_inum) {
273 int ret = lookup_inode(trans, inum, &w->inode, &w->snapshot);
275 if (ret && ret != -ENOENT)
278 w->have_inode = !ret;
280 w->first_this_inode = true;
282 w->first_this_inode = false;
288 static int hash_redo_key(struct btree_trans *trans,
289 const struct bch_hash_desc desc,
290 struct bch_hash_info *hash_info,
291 struct btree_iter *k_iter, struct bkey_s_c k)
293 struct bkey_i *delete;
296 delete = bch2_trans_kmalloc(trans, sizeof(*delete));
298 return PTR_ERR(delete);
300 tmp = bch2_trans_kmalloc(trans, bkey_bytes(k.k));
304 bkey_reassemble(tmp, k);
306 bkey_init(&delete->k);
307 delete->k.p = k_iter->pos;
308 return bch2_trans_update(trans, k_iter, delete, 0) ?:
309 bch2_hash_set(trans, desc, hash_info, k_iter->pos.inode, tmp, 0);
312 static int fsck_hash_delete_at(struct btree_trans *trans,
313 const struct bch_hash_desc desc,
314 struct bch_hash_info *info,
315 struct btree_iter *iter)
319 ret = bch2_hash_delete_at(trans, desc, info, iter) ?:
320 bch2_trans_commit(trans, NULL, NULL,
322 BTREE_INSERT_LAZY_RW);
324 ret = bch2_btree_iter_traverse(iter);
332 static int hash_check_key(struct btree_trans *trans,
333 const struct bch_hash_desc desc,
334 struct bch_hash_info *hash_info,
335 struct btree_iter *k_iter, struct bkey_s_c hash_k)
337 struct bch_fs *c = trans->c;
338 struct btree_iter *iter = NULL;
344 if (hash_k.k->type != desc.key_type)
347 hash = desc.hash_bkey(hash_info, hash_k);
349 if (likely(hash == hash_k.k->p.offset))
352 if (hash_k.k->p.offset < hash)
355 for_each_btree_key(trans, iter, desc.btree_id, POS(hash_k.k->p.inode, hash),
356 BTREE_ITER_SLOTS, k, ret) {
357 if (!bkey_cmp(k.k->p, hash_k.k->p))
360 if (fsck_err_on(k.k->type == desc.key_type &&
361 !desc.cmp_bkey(k, hash_k), c,
362 "duplicate hash table keys:\n%s",
363 (bch2_bkey_val_to_text(&PBUF(buf), c,
365 ret = fsck_hash_delete_at(trans, desc, hash_info, k_iter);
372 if (bkey_deleted(k.k)) {
373 bch2_trans_iter_free(trans, iter);
378 bch2_trans_iter_free(trans, iter);
381 if (fsck_err(c, "hash table key at wrong offset: btree %u inode %llu offset %llu, "
382 "hashed to %llu\n%s",
383 desc.btree_id, hash_k.k->p.inode, hash_k.k->p.offset, hash,
384 (bch2_bkey_val_to_text(&PBUF(buf), c, hash_k), buf)) == FSCK_ERR_IGNORE)
387 ret = __bch2_trans_do(trans, NULL, NULL,
388 BTREE_INSERT_NOFAIL|BTREE_INSERT_LAZY_RW,
389 hash_redo_key(trans, desc, hash_info, k_iter, hash_k));
391 bch_err(c, "hash_redo_key err %i", ret);
399 static int check_inode(struct btree_trans *trans,
400 struct btree_iter *iter,
401 struct bkey_s_c_inode inode)
403 struct bch_fs *c = trans->c;
404 struct bch_inode_unpacked u;
405 bool do_update = false;
408 ret = bch2_inode_unpack(inode, &u);
410 if (bch2_fs_inconsistent_on(ret, c,
411 "error unpacking inode %llu in fsck",
415 if (u.bi_flags & BCH_INODE_UNLINKED &&
417 fsck_err(c, "filesystem marked clean, but inode %llu unlinked",
419 bch_verbose(c, "deleting inode %llu", u.bi_inum);
421 bch2_trans_unlock(trans);
424 ret = bch2_inode_rm(c, u.bi_inum, false);
426 bch_err(c, "error in fsck: error %i while deleting inode", ret);
430 if (u.bi_flags & BCH_INODE_I_SIZE_DIRTY &&
432 fsck_err(c, "filesystem marked clean, but inode %llu has i_size dirty",
434 bch_verbose(c, "truncating inode %llu", u.bi_inum);
436 bch2_trans_unlock(trans);
440 * XXX: need to truncate partial blocks too here - or ideally
441 * just switch units to bytes and that issue goes away
443 ret = bch2_btree_delete_range_trans(trans, BTREE_ID_extents,
444 POS(u.bi_inum, round_up(u.bi_size, block_bytes(c)) >> 9),
445 POS(u.bi_inum, U64_MAX),
448 bch_err(c, "error in fsck: error %i truncating inode", ret);
453 * We truncated without our normal sector accounting hook, just
454 * make sure we recalculate it:
456 u.bi_flags |= BCH_INODE_I_SECTORS_DIRTY;
458 u.bi_flags &= ~BCH_INODE_I_SIZE_DIRTY;
462 if (u.bi_flags & BCH_INODE_I_SECTORS_DIRTY &&
464 fsck_err(c, "filesystem marked clean, but inode %llu has i_sectors dirty",
468 bch_verbose(c, "recounting sectors for inode %llu",
471 sectors = bch2_count_inode_sectors(trans, u.bi_inum);
473 bch_err(c, "error in fsck: error %i recounting inode sectors",
478 u.bi_sectors = sectors;
479 u.bi_flags &= ~BCH_INODE_I_SECTORS_DIRTY;
483 if (u.bi_flags & BCH_INODE_BACKPTR_UNTRUSTED) {
486 u.bi_flags &= ~BCH_INODE_BACKPTR_UNTRUSTED;
491 ret = __bch2_trans_do(trans, NULL, NULL,
493 BTREE_INSERT_LAZY_RW,
494 bch2_inode_write(trans, iter, &u));
496 bch_err(c, "error in fsck: error %i "
497 "updating inode", ret);
504 static int check_inodes(struct bch_fs *c, bool full)
506 struct btree_trans trans;
507 struct btree_iter *iter;
509 struct bkey_s_c_inode inode;
512 bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0);
514 for_each_btree_key(&trans, iter, BTREE_ID_inodes, POS_MIN,
516 BTREE_ITER_PREFETCH, k, ret) {
517 if (k.k->type != KEY_TYPE_inode)
520 inode = bkey_s_c_to_inode(k);
523 (inode.v->bi_flags & (BCH_INODE_I_SIZE_DIRTY|
524 BCH_INODE_I_SECTORS_DIRTY|
525 BCH_INODE_UNLINKED))) {
526 ret = check_inode(&trans, iter, inode);
531 bch2_trans_iter_put(&trans, iter);
533 BUG_ON(ret == -EINTR);
535 return bch2_trans_exit(&trans) ?: ret;
538 static int fix_overlapping_extent(struct btree_trans *trans,
539 struct bkey_s_c k, struct bpos cut_at)
541 struct btree_iter *iter;
545 u = bch2_trans_kmalloc(trans, bkey_bytes(k.k));
546 ret = PTR_ERR_OR_ZERO(u);
550 bkey_reassemble(u, k);
551 bch2_cut_front(cut_at, u);
555 * We don't want to go through the extent_handle_overwrites path:
557 * XXX: this is going to screw up disk accounting, extent triggers
558 * assume things about extent overwrites - we should be running the
559 * triggers manually here
561 iter = bch2_trans_get_iter(trans, BTREE_ID_extents, u->k.p,
562 BTREE_ITER_INTENT|BTREE_ITER_NOT_EXTENTS);
564 BUG_ON(iter->flags & BTREE_ITER_IS_EXTENTS);
565 ret = bch2_trans_update(trans, iter, u, BTREE_TRIGGER_NORUN) ?:
566 bch2_trans_commit(trans, NULL, NULL,
568 BTREE_INSERT_LAZY_RW);
569 bch2_trans_iter_put(trans, iter);
573 static int inode_backpointer_exists(struct btree_trans *trans,
574 struct bch_inode_unpacked *inode)
576 struct btree_iter *iter;
580 iter = bch2_trans_get_iter(trans, BTREE_ID_dirents,
581 POS(inode->bi_dir, inode->bi_dir_offset), 0);
582 k = bch2_btree_iter_peek_slot(iter);
586 if (k.k->type != KEY_TYPE_dirent)
589 ret = le64_to_cpu(bkey_s_c_to_dirent(k).v->d_inum) == inode->bi_inum;
591 bch2_trans_iter_free(trans, iter);
595 static bool inode_backpointer_matches(struct bkey_s_c_dirent d,
596 struct bch_inode_unpacked *inode)
598 return d.k->p.inode == inode->bi_dir &&
599 d.k->p.offset == inode->bi_dir_offset;
603 * Walk extents: verify that extents have a corresponding S_ISREG inode, and
604 * that i_size an i_sectors are consistent
607 static int check_extents(struct bch_fs *c)
609 struct inode_walker w = inode_walker_init();
610 struct btree_trans trans;
611 struct btree_iter *iter;
613 struct bkey_buf prev;
617 bch2_bkey_buf_init(&prev);
618 prev.k->k = KEY(0, 0, 0);
619 bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0);
621 bch_verbose(c, "checking extents");
623 iter = bch2_trans_get_iter(&trans, BTREE_ID_extents,
624 POS(BCACHEFS_ROOT_INO, 0),
626 BTREE_ITER_PREFETCH);
628 while ((k = bch2_btree_iter_peek(iter)).k &&
629 !(ret = bkey_err(k))) {
631 w.cur_inum != k.k->p.inode &&
632 !(w.inode.bi_flags & BCH_INODE_I_SECTORS_DIRTY) &&
633 fsck_err_on(w.inode.bi_sectors != i_sectors, c,
634 "inode %llu has incorrect i_sectors: got %llu, should be %llu",
636 w.inode.bi_sectors, i_sectors)) {
637 w.inode.bi_sectors = i_sectors;
639 ret = write_inode(&trans, &w.inode, w.snapshot);
644 if (bkey_cmp(prev.k->k.p, bkey_start_pos(k.k)) > 0) {
648 bch2_bkey_val_to_text(&PBUF(buf1), c, bkey_i_to_s_c(prev.k));
649 bch2_bkey_val_to_text(&PBUF(buf2), c, k);
651 if (fsck_err(c, "overlapping extents:\n%s\n%s", buf1, buf2))
652 return fix_overlapping_extent(&trans, k, prev.k->k.p) ?: -EINTR;
655 ret = walk_inode(&trans, &w, k.k->p.inode);
659 if (w.first_this_inode)
662 if (fsck_err_on(!w.have_inode, c,
663 "extent type %u for missing inode %llu",
664 k.k->type, k.k->p.inode) ||
665 fsck_err_on(w.have_inode &&
666 !S_ISREG(w.inode.bi_mode) && !S_ISLNK(w.inode.bi_mode), c,
667 "extent type %u for non regular file, inode %llu mode %o",
668 k.k->type, k.k->p.inode, w.inode.bi_mode)) {
670 return bch2_btree_delete_range_trans(&trans, BTREE_ID_extents,
671 POS(k.k->p.inode, 0),
672 POS(k.k->p.inode, U64_MAX),
676 if (fsck_err_on(w.have_inode &&
677 !(w.inode.bi_flags & BCH_INODE_I_SIZE_DIRTY) &&
678 k.k->type != KEY_TYPE_reservation &&
679 k.k->p.offset > round_up(w.inode.bi_size, block_bytes(c)) >> 9, c,
680 "extent type %u offset %llu past end of inode %llu, i_size %llu",
681 k.k->type, k.k->p.offset, k.k->p.inode, w.inode.bi_size)) {
683 return bch2_btree_delete_range_trans(&trans, BTREE_ID_extents,
684 POS(k.k->p.inode, round_up(w.inode.bi_size, block_bytes(c)) >> 9),
685 POS(k.k->p.inode, U64_MAX),
689 if (bkey_extent_is_allocation(k.k))
690 i_sectors += k.k->size;
691 bch2_bkey_buf_reassemble(&prev, c, k);
693 bch2_btree_iter_advance(iter);
698 bch2_trans_iter_put(&trans, iter);
699 bch2_bkey_buf_exit(&prev, c);
700 return bch2_trans_exit(&trans) ?: ret;
704 * Walk dirents: verify that they all have a corresponding S_ISDIR inode,
708 static int check_dirents(struct bch_fs *c)
710 struct inode_walker w = inode_walker_init();
711 struct bch_hash_info hash_info;
712 struct btree_trans trans;
713 struct btree_iter *iter;
716 unsigned nr_subdirs = 0;
719 bch_verbose(c, "checking dirents");
721 bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0);
723 iter = bch2_trans_get_iter(&trans, BTREE_ID_dirents,
724 POS(BCACHEFS_ROOT_INO, 0),
726 BTREE_ITER_PREFETCH);
728 while ((k = bch2_btree_iter_peek(iter)).k &&
729 !(ret = bkey_err(k))) {
730 struct bkey_s_c_dirent d;
731 struct bch_inode_unpacked target;
734 bool backpointer_exists = true;
738 w.cur_inum != k.k->p.inode &&
739 fsck_err_on(w.inode.bi_nlink != nr_subdirs, c,
740 "directory %llu with wrong i_nlink: got %u, should be %u",
741 w.inode.bi_inum, w.inode.bi_nlink, nr_subdirs)) {
742 w.inode.bi_nlink = nr_subdirs;
743 ret = write_inode(&trans, &w.inode, w.snapshot);
748 ret = walk_inode(&trans, &w, k.k->p.inode);
752 if (w.first_this_inode)
755 if (fsck_err_on(!w.have_inode, c,
756 "dirent in nonexisting directory:\n%s",
757 (bch2_bkey_val_to_text(&PBUF(buf), c,
759 fsck_err_on(!S_ISDIR(w.inode.bi_mode), c,
760 "dirent in non directory inode type %u:\n%s",
761 mode_to_type(w.inode.bi_mode),
762 (bch2_bkey_val_to_text(&PBUF(buf), c,
764 ret = lockrestart_do(&trans,
765 bch2_btree_delete_at(&trans, iter, 0));
774 if (w.first_this_inode)
775 hash_info = bch2_hash_info_init(c, &w.inode);
777 ret = hash_check_key(&trans, bch2_dirent_hash_desc,
778 &hash_info, iter, k);
786 if (k.k->type != KEY_TYPE_dirent)
789 d = bkey_s_c_to_dirent(k);
790 d_inum = le64_to_cpu(d.v->d_inum);
792 ret = lookup_inode(&trans, d_inum, &target, &target_snapshot);
793 if (ret && ret != -ENOENT)
799 if (fsck_err_on(!have_target, c,
800 "dirent points to missing inode:\n%s",
801 (bch2_bkey_val_to_text(&PBUF(buf), c,
803 ret = remove_dirent(&trans, d.k->p);
812 if (!target.bi_dir &&
813 !target.bi_dir_offset) {
814 target.bi_dir = k.k->p.inode;
815 target.bi_dir_offset = k.k->p.offset;
817 ret = write_inode(&trans, &target, target_snapshot);
822 if (!inode_backpointer_matches(d, &target)) {
823 ret = inode_backpointer_exists(&trans, &target);
827 backpointer_exists = ret;
830 if (fsck_err_on(S_ISDIR(target.bi_mode) &&
831 backpointer_exists, c,
832 "directory %llu with multiple links",
834 ret = remove_dirent(&trans, d.k->p);
840 if (fsck_err_on(backpointer_exists &&
842 "inode %llu has multiple links but i_nlink 0",
845 target.bi_flags &= ~BCH_INODE_UNLINKED;
847 ret = write_inode(&trans, &target, target_snapshot);
852 if (fsck_err_on(!backpointer_exists, c,
853 "inode %llu has wrong backpointer:\n"
855 "should be %llu:%llu",
858 target.bi_dir_offset,
861 target.bi_dir = k.k->p.inode;
862 target.bi_dir_offset = k.k->p.offset;
864 ret = write_inode(&trans, &target, target_snapshot);
870 if (fsck_err_on(d.v->d_type != mode_to_type(target.bi_mode), c,
871 "incorrect d_type: should be %u:\n%s",
872 mode_to_type(target.bi_mode),
873 (bch2_bkey_val_to_text(&PBUF(buf), c,
875 struct bkey_i_dirent *n;
877 n = kmalloc(bkey_bytes(d.k), GFP_KERNEL);
883 bkey_reassemble(&n->k_i, d.s_c);
884 n->v.d_type = mode_to_type(target.bi_mode);
886 ret = __bch2_trans_do(&trans, NULL, NULL,
888 BTREE_INSERT_LAZY_RW,
889 bch2_trans_update(&trans, iter, &n->k_i, 0));
896 nr_subdirs += d.v->d_type == DT_DIR;
898 bch2_btree_iter_advance(iter);
905 bch2_trans_iter_put(&trans, iter);
906 return bch2_trans_exit(&trans) ?: ret;
910 * Walk xattrs: verify that they all have a corresponding inode
913 static int check_xattrs(struct bch_fs *c)
915 struct inode_walker w = inode_walker_init();
916 struct bch_hash_info hash_info;
917 struct btree_trans trans;
918 struct btree_iter *iter;
922 bch_verbose(c, "checking xattrs");
924 bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0);
926 iter = bch2_trans_get_iter(&trans, BTREE_ID_xattrs,
927 POS(BCACHEFS_ROOT_INO, 0),
929 BTREE_ITER_PREFETCH);
931 while ((k = bch2_btree_iter_peek(iter)).k &&
932 !(ret = bkey_err(k))) {
933 ret = walk_inode(&trans, &w, k.k->p.inode);
937 if (fsck_err_on(!w.have_inode, c,
938 "xattr for missing inode %llu",
940 ret = bch2_btree_delete_at(&trans, iter, 0);
946 if (w.first_this_inode && w.have_inode)
947 hash_info = bch2_hash_info_init(c, &w.inode);
949 ret = hash_check_key(&trans, bch2_xattr_hash_desc,
950 &hash_info, iter, k);
954 bch2_btree_iter_advance(iter);
960 bch2_trans_iter_put(&trans, iter);
961 return bch2_trans_exit(&trans) ?: ret;
964 /* Get root directory, create if it doesn't exist: */
965 static int check_root(struct bch_fs *c, struct bch_inode_unpacked *root_inode)
967 struct bkey_inode_buf packed;
971 bch_verbose(c, "checking root directory");
973 ret = bch2_trans_do(c, NULL, NULL, 0,
974 lookup_inode(&trans, BCACHEFS_ROOT_INO, root_inode, &snapshot));
975 if (ret && ret != -ENOENT)
978 if (fsck_err_on(ret, c, "root directory missing"))
981 if (fsck_err_on(!S_ISDIR(root_inode->bi_mode), c,
982 "root inode not a directory"))
989 bch2_inode_init(c, root_inode, 0, 0, S_IFDIR|0755,
991 root_inode->bi_inum = BCACHEFS_ROOT_INO;
993 bch2_inode_pack(c, &packed, root_inode);
995 return bch2_btree_insert(c, BTREE_ID_inodes, &packed.inode.k_i,
998 BTREE_INSERT_LAZY_RW);
1005 struct pathbuf_entry {
1010 static int path_down(struct pathbuf *p, u64 inum)
1012 if (p->nr == p->size) {
1013 size_t new_size = max_t(size_t, 256UL, p->size * 2);
1014 void *n = krealloc(p->entries,
1015 new_size * sizeof(p->entries[0]),
1025 p->entries[p->nr++] = (struct pathbuf_entry) {
1031 static int check_path(struct btree_trans *trans,
1033 struct bch_inode_unpacked *inode)
1035 struct bch_fs *c = trans->c;
1042 while (inode->bi_inum != BCACHEFS_ROOT_INO) {
1043 ret = lockrestart_do(trans,
1044 inode_backpointer_exists(trans, inode));
1049 if (fsck_err(c, "unreachable inode %llu, type %u nlink %u backptr %llu:%llu",
1051 mode_to_type(inode->bi_mode),
1054 inode->bi_dir_offset))
1055 ret = reattach_inode(trans, inode);
1060 if (!S_ISDIR(inode->bi_mode))
1063 ret = path_down(p, inode->bi_inum);
1065 bch_err(c, "memory allocation failure");
1069 for (i = 0; i < p->nr; i++) {
1070 if (inode->bi_dir != p->entries[i].inum)
1073 /* XXX print path */
1074 if (!fsck_err(c, "directory structure loop"))
1077 ret = lockrestart_do(trans,
1078 remove_backpointer(trans, inode));
1080 bch_err(c, "error removing dirent: %i", ret);
1084 ret = reattach_inode(trans, inode);
1088 ret = lookup_inode(trans, inode->bi_dir, inode, &snapshot);
1090 /* Should have been caught in dirents pass */
1091 bch_err(c, "error looking up parent directory: %i", ret);
1097 bch_err(c, "%s: err %i", __func__, ret);
1102 * Check for unreachable inodes, as well as loops in the directory structure:
1103 * After check_dirents(), if an inode backpointer doesn't exist that means it's
1106 static int check_directory_structure(struct bch_fs *c)
1108 struct btree_trans trans;
1109 struct btree_iter *iter;
1111 struct bch_inode_unpacked u;
1112 struct pathbuf path = { 0, 0, NULL };
1115 bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0);
1117 for_each_btree_key(&trans, iter, BTREE_ID_inodes, POS_MIN,
1119 BTREE_ITER_PREFETCH, k, ret) {
1120 if (k.k->type != KEY_TYPE_inode)
1123 ret = bch2_inode_unpack(bkey_s_c_to_inode(k), &u);
1125 /* Should have been caught earlier in fsck: */
1126 bch_err(c, "error unpacking inode %llu: %i", k.k->p.offset, ret);
1130 ret = check_path(&trans, &path, &u);
1134 bch2_trans_iter_put(&trans, iter);
1136 BUG_ON(ret == -EINTR);
1138 kfree(path.entries);
1140 return bch2_trans_exit(&trans) ?: ret;
1143 struct nlink_table {
1154 static int add_nlink(struct nlink_table *t, u64 inum, u32 snapshot)
1156 if (t->nr == t->size) {
1157 size_t new_size = max_t(size_t, 128UL, t->size * 2);
1158 void *d = kvmalloc(new_size * sizeof(t->d[0]), GFP_KERNEL);
1164 memcpy(d, t->d, t->size * sizeof(t->d[0]));
1172 t->d[t->nr++] = (struct nlink) {
1174 .snapshot = snapshot,
1180 static int nlink_cmp(const void *_l, const void *_r)
1182 const struct nlink *l = _l;
1183 const struct nlink *r = _r;
1185 return cmp_int(l->inum, r->inum) ?: cmp_int(l->snapshot, r->snapshot);
1188 static void inc_link(struct bch_fs *c, struct nlink_table *links,
1189 u64 range_start, u64 range_end, u64 inum)
1191 struct nlink *link, key = {
1192 .inum = inum, .snapshot = U32_MAX,
1195 if (inum < range_start || inum >= range_end)
1198 link = __inline_bsearch(&key, links->d, links->nr,
1199 sizeof(links->d[0]), nlink_cmp);
1205 static int check_nlinks_find_hardlinks(struct bch_fs *c,
1206 struct nlink_table *t,
1207 u64 start, u64 *end)
1209 struct btree_trans trans;
1210 struct btree_iter *iter;
1212 struct bkey_s_c_inode inode;
1213 struct bch_inode_unpacked u;
1216 bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0);
1218 for_each_btree_key(&trans, iter, BTREE_ID_inodes,
1221 BTREE_ITER_PREFETCH, k, ret) {
1222 if (k.k->type != KEY_TYPE_inode)
1225 inode = bkey_s_c_to_inode(k);
1228 * Backpointer and directory structure checks are sufficient for
1229 * directories, since they can't have hardlinks:
1231 if (S_ISDIR(le16_to_cpu(inode.v->bi_mode)))
1234 /* Should never fail, checked by bch2_inode_invalid: */
1235 BUG_ON(bch2_inode_unpack(inode, &u));
1240 ret = add_nlink(t, k.k->p.offset, k.k->p.snapshot);
1242 *end = k.k->p.offset;
1248 bch2_trans_iter_put(&trans, iter);
1249 bch2_trans_exit(&trans);
1252 bch_err(c, "error in fsck: btree error %i while walking inodes", ret);
1258 static int check_nlinks_walk_dirents(struct bch_fs *c, struct nlink_table *links,
1259 u64 range_start, u64 range_end)
1261 struct btree_trans trans;
1262 struct btree_iter *iter;
1264 struct bkey_s_c_dirent d;
1267 bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0);
1269 for_each_btree_key(&trans, iter, BTREE_ID_dirents, POS_MIN,
1271 BTREE_ITER_PREFETCH, k, ret) {
1272 switch (k.k->type) {
1273 case KEY_TYPE_dirent:
1274 d = bkey_s_c_to_dirent(k);
1276 if (d.v->d_type != DT_DIR)
1277 inc_link(c, links, range_start, range_end,
1278 le64_to_cpu(d.v->d_inum));
1282 bch2_trans_cond_resched(&trans);
1284 bch2_trans_iter_put(&trans, iter);
1286 ret = bch2_trans_exit(&trans) ?: ret;
1288 bch_err(c, "error in fsck: btree error %i while walking dirents", ret);
1294 static int check_nlinks_update_hardlinks(struct bch_fs *c,
1295 struct nlink_table *links,
1296 u64 range_start, u64 range_end)
1298 struct btree_trans trans;
1299 struct btree_iter *iter;
1301 struct bkey_s_c_inode inode;
1302 struct bch_inode_unpacked u;
1303 struct nlink *link = links->d;
1306 bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0);
1308 for_each_btree_key(&trans, iter, BTREE_ID_inodes,
1309 POS(0, range_start),
1311 BTREE_ITER_PREFETCH, k, ret) {
1312 if (k.k->p.offset >= range_end)
1315 if (k.k->type != KEY_TYPE_inode)
1318 inode = bkey_s_c_to_inode(k);
1319 if (S_ISDIR(le16_to_cpu(inode.v->bi_mode)))
1322 BUG_ON(bch2_inode_unpack(inode, &u));
1327 while (link->inum < k.k->p.offset) {
1329 BUG_ON(link >= links->d + links->nr);
1332 if (fsck_err_on(bch2_inode_nlink_get(&u) != link->count, c,
1333 "inode %llu has wrong i_nlink (type %u i_nlink %u, should be %u)",
1334 u.bi_inum, mode_to_type(u.bi_mode),
1335 bch2_inode_nlink_get(&u), link->count)) {
1336 bch2_inode_nlink_set(&u, link->count);
1338 ret = __bch2_trans_do(&trans, NULL, NULL,
1339 BTREE_INSERT_NOFAIL|
1340 BTREE_INSERT_LAZY_RW,
1341 bch2_inode_write(&trans, iter, &u));
1343 bch_err(c, "error in fsck: error %i updating inode", ret);
1347 bch2_trans_iter_put(&trans, iter);
1348 bch2_trans_exit(&trans);
1351 bch_err(c, "error in fsck: btree error %i while walking inodes", ret);
1357 static int check_nlinks(struct bch_fs *c)
1359 struct nlink_table links = { 0 };
1360 u64 this_iter_range_start, next_iter_range_start = 0;
1363 bch_verbose(c, "checking inode nlinks");
1366 this_iter_range_start = next_iter_range_start;
1367 next_iter_range_start = U64_MAX;
1369 ret = check_nlinks_find_hardlinks(c, &links,
1370 this_iter_range_start,
1371 &next_iter_range_start);
1373 ret = check_nlinks_walk_dirents(c, &links,
1374 this_iter_range_start,
1375 next_iter_range_start);
1379 ret = check_nlinks_update_hardlinks(c, &links,
1380 this_iter_range_start,
1381 next_iter_range_start);
1386 } while (next_iter_range_start != U64_MAX);
1394 * Checks for inconsistencies that shouldn't happen, unless we have a bug.
1395 * Doesn't fix them yet, mainly because they haven't yet been observed:
1397 int bch2_fsck_full(struct bch_fs *c)
1399 struct bch_inode_unpacked root_inode;
1401 return check_inodes(c, true) ?:
1405 check_root(c, &root_inode) ?:
1406 check_directory_structure(c) ?:
1410 int bch2_fsck_walk_inodes_only(struct bch_fs *c)
1412 return check_inodes(c, false);