2 * Copyright (C) 2007 Oracle. All rights reserved.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public
6 * License v2 as published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
13 * You should have received a copy of the GNU General Public
14 * License along with this program; if not, write to the
15 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16 * Boston, MA 021110-1307, USA.
23 #include <sys/types.h>
27 #include <uuid/uuid.h>
32 #include "print-tree.h"
33 #include "task-utils.h"
34 #include "transaction.h"
37 #include "free-space-cache.h"
38 #include "free-space-tree.h"
40 #include "qgroup-verify.h"
41 #include "rbtree-utils.h"
43 #include "kernel-shared/ulist.h"
51 TASK_NOTHING, /* have to be the last element */
56 enum task_position tp;
58 struct task_info *info;
61 static u64 bytes_used = 0;
62 static u64 total_csum_bytes = 0;
63 static u64 total_btree_bytes = 0;
64 static u64 total_fs_tree_bytes = 0;
65 static u64 total_extent_tree_bytes = 0;
66 static u64 btree_space_waste = 0;
67 static u64 data_bytes_allocated = 0;
68 static u64 data_bytes_referenced = 0;
69 static LIST_HEAD(duplicate_extents);
70 static LIST_HEAD(delete_items);
71 static int no_holes = 0;
72 static int init_extent_tree = 0;
73 static int check_data_csum = 0;
74 static struct btrfs_fs_info *global_info;
75 static struct task_ctx ctx = { 0 };
76 static struct cache_tree *roots_info_cache = NULL;
78 enum btrfs_check_mode {
82 CHECK_MODE_DEFAULT = CHECK_MODE_ORIGINAL
85 static enum btrfs_check_mode check_mode = CHECK_MODE_DEFAULT;
87 struct extent_backref {
89 unsigned int is_data:1;
90 unsigned int found_extent_tree:1;
91 unsigned int full_backref:1;
92 unsigned int found_ref:1;
93 unsigned int broken:1;
96 static inline struct extent_backref* rb_node_to_extent_backref(struct rb_node *node)
98 return rb_entry(node, struct extent_backref, node);
101 struct data_backref {
102 struct extent_backref node;
116 #define ROOT_DIR_ERROR (1<<1) /* bad ROOT_DIR */
117 #define DIR_ITEM_MISSING (1<<2) /* DIR_ITEM not found */
118 #define DIR_ITEM_MISMATCH (1<<3) /* DIR_ITEM found but not match */
119 #define INODE_REF_MISSING (1<<4) /* INODE_REF/INODE_EXTREF not found */
120 #define INODE_ITEM_MISSING (1<<5) /* INODE_ITEM not found */
121 #define INODE_ITEM_MISMATCH (1<<6) /* INODE_ITEM found but not match */
122 #define FILE_EXTENT_ERROR (1<<7) /* bad FILE_EXTENT */
123 #define ODD_CSUM_ITEM (1<<8) /* CSUM_ITEM error */
124 #define CSUM_ITEM_MISSING (1<<9) /* CSUM_ITEM not found */
125 #define LINK_COUNT_ERROR (1<<10) /* INODE_ITEM nlink count error */
126 #define NBYTES_ERROR (1<<11) /* INODE_ITEM nbytes count error */
127 #define ISIZE_ERROR (1<<12) /* INODE_ITEM size count error */
128 #define ORPHAN_ITEM (1<<13) /* INODE_ITEM no reference */
129 #define NO_INODE_ITEM (1<<14) /* no inode_item */
130 #define LAST_ITEM (1<<15) /* Complete this tree traversal */
131 #define ROOT_REF_MISSING (1<<16) /* ROOT_REF not found */
132 #define ROOT_REF_MISMATCH (1<<17) /* ROOT_REF found but not match */
133 #define DIR_INDEX_MISSING (1<<18) /* INODE_INDEX not found */
134 #define DIR_INDEX_MISMATCH (1<<19) /* INODE_INDEX found but not match */
136 static inline struct data_backref* to_data_backref(struct extent_backref *back)
138 return container_of(back, struct data_backref, node);
141 static int compare_data_backref(struct rb_node *node1, struct rb_node *node2)
143 struct extent_backref *ext1 = rb_node_to_extent_backref(node1);
144 struct extent_backref *ext2 = rb_node_to_extent_backref(node2);
145 struct data_backref *back1 = to_data_backref(ext1);
146 struct data_backref *back2 = to_data_backref(ext2);
148 WARN_ON(!ext1->is_data);
149 WARN_ON(!ext2->is_data);
151 /* parent and root are a union, so this covers both */
152 if (back1->parent > back2->parent)
154 if (back1->parent < back2->parent)
157 /* This is a full backref and the parents match. */
158 if (back1->node.full_backref)
161 if (back1->owner > back2->owner)
163 if (back1->owner < back2->owner)
166 if (back1->offset > back2->offset)
168 if (back1->offset < back2->offset)
171 if (back1->found_ref && back2->found_ref) {
172 if (back1->disk_bytenr > back2->disk_bytenr)
174 if (back1->disk_bytenr < back2->disk_bytenr)
177 if (back1->bytes > back2->bytes)
179 if (back1->bytes < back2->bytes)
187 * Much like data_backref, just removed the undetermined members
188 * and change it to use list_head.
189 * During extent scan, it is stored in root->orphan_data_extent.
190 * During fs tree scan, it is then moved to inode_rec->orphan_data_extents.
192 struct orphan_data_extent {
193 struct list_head list;
201 struct tree_backref {
202 struct extent_backref node;
209 static inline struct tree_backref* to_tree_backref(struct extent_backref *back)
211 return container_of(back, struct tree_backref, node);
214 static int compare_tree_backref(struct rb_node *node1, struct rb_node *node2)
216 struct extent_backref *ext1 = rb_node_to_extent_backref(node1);
217 struct extent_backref *ext2 = rb_node_to_extent_backref(node2);
218 struct tree_backref *back1 = to_tree_backref(ext1);
219 struct tree_backref *back2 = to_tree_backref(ext2);
221 WARN_ON(ext1->is_data);
222 WARN_ON(ext2->is_data);
224 /* parent and root are a union, so this covers both */
225 if (back1->parent > back2->parent)
227 if (back1->parent < back2->parent)
233 static int compare_extent_backref(struct rb_node *node1, struct rb_node *node2)
235 struct extent_backref *ext1 = rb_node_to_extent_backref(node1);
236 struct extent_backref *ext2 = rb_node_to_extent_backref(node2);
238 if (ext1->is_data > ext2->is_data)
241 if (ext1->is_data < ext2->is_data)
244 if (ext1->full_backref > ext2->full_backref)
246 if (ext1->full_backref < ext2->full_backref)
250 return compare_data_backref(node1, node2);
252 return compare_tree_backref(node1, node2);
255 /* Explicit initialization for extent_record::flag_block_full_backref */
256 enum { FLAG_UNSET = 2 };
258 struct extent_record {
259 struct list_head backrefs;
260 struct list_head dups;
261 struct rb_root backref_tree;
262 struct list_head list;
263 struct cache_extent cache;
264 struct btrfs_disk_key parent_key;
269 u64 extent_item_refs;
271 u64 parent_generation;
275 unsigned int flag_block_full_backref:2;
276 unsigned int found_rec:1;
277 unsigned int content_checked:1;
278 unsigned int owner_ref_checked:1;
279 unsigned int is_root:1;
280 unsigned int metadata:1;
281 unsigned int bad_full_backref:1;
282 unsigned int crossing_stripes:1;
283 unsigned int wrong_chunk_type:1;
286 static inline struct extent_record* to_extent_record(struct list_head *entry)
288 return container_of(entry, struct extent_record, list);
291 struct inode_backref {
292 struct list_head list;
293 unsigned int found_dir_item:1;
294 unsigned int found_dir_index:1;
295 unsigned int found_inode_ref:1;
305 static inline struct inode_backref* to_inode_backref(struct list_head *entry)
307 return list_entry(entry, struct inode_backref, list);
310 struct root_item_record {
311 struct list_head list;
317 struct btrfs_key drop_key;
320 #define REF_ERR_NO_DIR_ITEM (1 << 0)
321 #define REF_ERR_NO_DIR_INDEX (1 << 1)
322 #define REF_ERR_NO_INODE_REF (1 << 2)
323 #define REF_ERR_DUP_DIR_ITEM (1 << 3)
324 #define REF_ERR_DUP_DIR_INDEX (1 << 4)
325 #define REF_ERR_DUP_INODE_REF (1 << 5)
326 #define REF_ERR_INDEX_UNMATCH (1 << 6)
327 #define REF_ERR_FILETYPE_UNMATCH (1 << 7)
328 #define REF_ERR_NAME_TOO_LONG (1 << 8) // 100
329 #define REF_ERR_NO_ROOT_REF (1 << 9)
330 #define REF_ERR_NO_ROOT_BACKREF (1 << 10)
331 #define REF_ERR_DUP_ROOT_REF (1 << 11)
332 #define REF_ERR_DUP_ROOT_BACKREF (1 << 12)
334 struct file_extent_hole {
340 struct inode_record {
341 struct list_head backrefs;
342 unsigned int checked:1;
343 unsigned int merging:1;
344 unsigned int found_inode_item:1;
345 unsigned int found_dir_item:1;
346 unsigned int found_file_extent:1;
347 unsigned int found_csum_item:1;
348 unsigned int some_csum_missing:1;
349 unsigned int nodatasum:1;
362 struct rb_root holes;
363 struct list_head orphan_extents;
368 #define I_ERR_NO_INODE_ITEM (1 << 0)
369 #define I_ERR_NO_ORPHAN_ITEM (1 << 1)
370 #define I_ERR_DUP_INODE_ITEM (1 << 2)
371 #define I_ERR_DUP_DIR_INDEX (1 << 3)
372 #define I_ERR_ODD_DIR_ITEM (1 << 4)
373 #define I_ERR_ODD_FILE_EXTENT (1 << 5)
374 #define I_ERR_BAD_FILE_EXTENT (1 << 6)
375 #define I_ERR_FILE_EXTENT_OVERLAP (1 << 7)
376 #define I_ERR_FILE_EXTENT_DISCOUNT (1 << 8) // 100
377 #define I_ERR_DIR_ISIZE_WRONG (1 << 9)
378 #define I_ERR_FILE_NBYTES_WRONG (1 << 10) // 400
379 #define I_ERR_ODD_CSUM_ITEM (1 << 11)
380 #define I_ERR_SOME_CSUM_MISSING (1 << 12)
381 #define I_ERR_LINK_COUNT_WRONG (1 << 13)
382 #define I_ERR_FILE_EXTENT_ORPHAN (1 << 14)
384 struct root_backref {
385 struct list_head list;
386 unsigned int found_dir_item:1;
387 unsigned int found_dir_index:1;
388 unsigned int found_back_ref:1;
389 unsigned int found_forward_ref:1;
390 unsigned int reachable:1;
399 static inline struct root_backref* to_root_backref(struct list_head *entry)
401 return list_entry(entry, struct root_backref, list);
405 struct list_head backrefs;
406 struct cache_extent cache;
407 unsigned int found_root_item:1;
413 struct cache_extent cache;
418 struct cache_extent cache;
419 struct cache_tree root_cache;
420 struct cache_tree inode_cache;
421 struct inode_record *current;
430 struct walk_control {
431 struct cache_tree shared;
432 struct shared_node *nodes[BTRFS_MAX_LEVEL];
438 struct btrfs_key key;
440 struct list_head list;
443 struct extent_entry {
448 struct list_head list;
451 struct root_item_info {
452 /* level of the root */
454 /* number of nodes at this level, must be 1 for a root */
458 struct cache_extent cache_extent;
462 * Error bit for low memory mode check.
464 * Currently no caller cares about it yet. Just internal use for error
467 #define BACKREF_MISSING (1 << 0) /* Backref missing in extent tree */
468 #define BACKREF_MISMATCH (1 << 1) /* Backref exists but does not match */
469 #define BYTES_UNALIGNED (1 << 2) /* Some bytes are not aligned */
470 #define REFERENCER_MISSING (1 << 3) /* Referencer not found */
471 #define REFERENCER_MISMATCH (1 << 4) /* Referenceer found but does not match */
472 #define CROSSING_STRIPE_BOUNDARY (1 << 4) /* For kernel scrub workaround */
473 #define ITEM_SIZE_MISMATCH (1 << 5) /* Bad item size */
474 #define UNKNOWN_TYPE (1 << 6) /* Unknown type */
475 #define ACCOUNTING_MISMATCH (1 << 7) /* Used space accounting error */
476 #define CHUNK_TYPE_MISMATCH (1 << 8)
478 static void *print_status_check(void *p)
480 struct task_ctx *priv = p;
481 const char work_indicator[] = { '.', 'o', 'O', 'o' };
483 static char *task_position_string[] = {
485 "checking free space cache",
489 task_period_start(priv->info, 1000 /* 1s */);
491 if (priv->tp == TASK_NOTHING)
495 printf("%s [%c]\r", task_position_string[priv->tp],
496 work_indicator[count % 4]);
499 task_period_wait(priv->info);
504 static int print_status_return(void *p)
512 static enum btrfs_check_mode parse_check_mode(const char *str)
514 if (strcmp(str, "lowmem") == 0)
515 return CHECK_MODE_LOWMEM;
516 if (strcmp(str, "orig") == 0)
517 return CHECK_MODE_ORIGINAL;
518 if (strcmp(str, "original") == 0)
519 return CHECK_MODE_ORIGINAL;
521 return CHECK_MODE_UNKNOWN;
524 /* Compatible function to allow reuse of old codes */
525 static u64 first_extent_gap(struct rb_root *holes)
527 struct file_extent_hole *hole;
529 if (RB_EMPTY_ROOT(holes))
532 hole = rb_entry(rb_first(holes), struct file_extent_hole, node);
536 static int compare_hole(struct rb_node *node1, struct rb_node *node2)
538 struct file_extent_hole *hole1;
539 struct file_extent_hole *hole2;
541 hole1 = rb_entry(node1, struct file_extent_hole, node);
542 hole2 = rb_entry(node2, struct file_extent_hole, node);
544 if (hole1->start > hole2->start)
546 if (hole1->start < hole2->start)
548 /* Now hole1->start == hole2->start */
549 if (hole1->len >= hole2->len)
551 * Hole 1 will be merge center
552 * Same hole will be merged later
555 /* Hole 2 will be merge center */
560 * Add a hole to the record
562 * This will do hole merge for copy_file_extent_holes(),
563 * which will ensure there won't be continuous holes.
565 static int add_file_extent_hole(struct rb_root *holes,
568 struct file_extent_hole *hole;
569 struct file_extent_hole *prev = NULL;
570 struct file_extent_hole *next = NULL;
572 hole = malloc(sizeof(*hole));
577 /* Since compare will not return 0, no -EEXIST will happen */
578 rb_insert(holes, &hole->node, compare_hole);
580 /* simple merge with previous hole */
581 if (rb_prev(&hole->node))
582 prev = rb_entry(rb_prev(&hole->node), struct file_extent_hole,
584 if (prev && prev->start + prev->len >= hole->start) {
585 hole->len = hole->start + hole->len - prev->start;
586 hole->start = prev->start;
587 rb_erase(&prev->node, holes);
592 /* iterate merge with next holes */
594 if (!rb_next(&hole->node))
596 next = rb_entry(rb_next(&hole->node), struct file_extent_hole,
598 if (hole->start + hole->len >= next->start) {
599 if (hole->start + hole->len <= next->start + next->len)
600 hole->len = next->start + next->len -
602 rb_erase(&next->node, holes);
611 static int compare_hole_range(struct rb_node *node, void *data)
613 struct file_extent_hole *hole;
616 hole = (struct file_extent_hole *)data;
619 hole = rb_entry(node, struct file_extent_hole, node);
620 if (start < hole->start)
622 if (start >= hole->start && start < hole->start + hole->len)
628 * Delete a hole in the record
630 * This will do the hole split and is much restrict than add.
632 static int del_file_extent_hole(struct rb_root *holes,
635 struct file_extent_hole *hole;
636 struct file_extent_hole tmp;
641 struct rb_node *node;
648 node = rb_search(holes, &tmp, compare_hole_range, NULL);
651 hole = rb_entry(node, struct file_extent_hole, node);
652 if (start + len > hole->start + hole->len)
656 * Now there will be no overlap, delete the hole and re-add the
657 * split(s) if they exists.
659 if (start > hole->start) {
660 prev_start = hole->start;
661 prev_len = start - hole->start;
664 if (hole->start + hole->len > start + len) {
665 next_start = start + len;
666 next_len = hole->start + hole->len - start - len;
669 rb_erase(node, holes);
672 ret = add_file_extent_hole(holes, prev_start, prev_len);
677 ret = add_file_extent_hole(holes, next_start, next_len);
684 static int copy_file_extent_holes(struct rb_root *dst,
687 struct file_extent_hole *hole;
688 struct rb_node *node;
691 node = rb_first(src);
693 hole = rb_entry(node, struct file_extent_hole, node);
694 ret = add_file_extent_hole(dst, hole->start, hole->len);
697 node = rb_next(node);
702 static void free_file_extent_holes(struct rb_root *holes)
704 struct rb_node *node;
705 struct file_extent_hole *hole;
707 node = rb_first(holes);
709 hole = rb_entry(node, struct file_extent_hole, node);
710 rb_erase(node, holes);
712 node = rb_first(holes);
716 static void reset_cached_block_groups(struct btrfs_fs_info *fs_info);
718 static void record_root_in_trans(struct btrfs_trans_handle *trans,
719 struct btrfs_root *root)
721 if (root->last_trans != trans->transid) {
722 root->track_dirty = 1;
723 root->last_trans = trans->transid;
724 root->commit_root = root->node;
725 extent_buffer_get(root->node);
729 static u8 imode_to_type(u32 imode)
732 static unsigned char btrfs_type_by_mode[S_IFMT >> S_SHIFT] = {
733 [S_IFREG >> S_SHIFT] = BTRFS_FT_REG_FILE,
734 [S_IFDIR >> S_SHIFT] = BTRFS_FT_DIR,
735 [S_IFCHR >> S_SHIFT] = BTRFS_FT_CHRDEV,
736 [S_IFBLK >> S_SHIFT] = BTRFS_FT_BLKDEV,
737 [S_IFIFO >> S_SHIFT] = BTRFS_FT_FIFO,
738 [S_IFSOCK >> S_SHIFT] = BTRFS_FT_SOCK,
739 [S_IFLNK >> S_SHIFT] = BTRFS_FT_SYMLINK,
742 return btrfs_type_by_mode[(imode & S_IFMT) >> S_SHIFT];
746 static int device_record_compare(struct rb_node *node1, struct rb_node *node2)
748 struct device_record *rec1;
749 struct device_record *rec2;
751 rec1 = rb_entry(node1, struct device_record, node);
752 rec2 = rb_entry(node2, struct device_record, node);
753 if (rec1->devid > rec2->devid)
755 else if (rec1->devid < rec2->devid)
761 static struct inode_record *clone_inode_rec(struct inode_record *orig_rec)
763 struct inode_record *rec;
764 struct inode_backref *backref;
765 struct inode_backref *orig;
766 struct inode_backref *tmp;
767 struct orphan_data_extent *src_orphan;
768 struct orphan_data_extent *dst_orphan;
773 rec = malloc(sizeof(*rec));
775 return ERR_PTR(-ENOMEM);
776 memcpy(rec, orig_rec, sizeof(*rec));
778 INIT_LIST_HEAD(&rec->backrefs);
779 INIT_LIST_HEAD(&rec->orphan_extents);
780 rec->holes = RB_ROOT;
782 list_for_each_entry(orig, &orig_rec->backrefs, list) {
783 size = sizeof(*orig) + orig->namelen + 1;
784 backref = malloc(size);
789 memcpy(backref, orig, size);
790 list_add_tail(&backref->list, &rec->backrefs);
792 list_for_each_entry(src_orphan, &orig_rec->orphan_extents, list) {
793 dst_orphan = malloc(sizeof(*dst_orphan));
798 memcpy(dst_orphan, src_orphan, sizeof(*src_orphan));
799 list_add_tail(&dst_orphan->list, &rec->orphan_extents);
801 ret = copy_file_extent_holes(&rec->holes, &orig_rec->holes);
808 rb = rb_first(&rec->holes);
810 struct file_extent_hole *hole;
812 hole = rb_entry(rb, struct file_extent_hole, node);
818 if (!list_empty(&rec->backrefs))
819 list_for_each_entry_safe(orig, tmp, &rec->backrefs, list) {
820 list_del(&orig->list);
824 if (!list_empty(&rec->orphan_extents))
825 list_for_each_entry_safe(orig, tmp, &rec->orphan_extents, list) {
826 list_del(&orig->list);
835 static void print_orphan_data_extents(struct list_head *orphan_extents,
838 struct orphan_data_extent *orphan;
840 if (list_empty(orphan_extents))
842 printf("The following data extent is lost in tree %llu:\n",
844 list_for_each_entry(orphan, orphan_extents, list) {
845 printf("\tinode: %llu, offset:%llu, disk_bytenr: %llu, disk_len: %llu\n",
846 orphan->objectid, orphan->offset, orphan->disk_bytenr,
851 static void print_inode_error(struct btrfs_root *root, struct inode_record *rec)
853 u64 root_objectid = root->root_key.objectid;
854 int errors = rec->errors;
858 /* reloc root errors, we print its corresponding fs root objectid*/
859 if (root_objectid == BTRFS_TREE_RELOC_OBJECTID) {
860 root_objectid = root->root_key.offset;
861 fprintf(stderr, "reloc");
863 fprintf(stderr, "root %llu inode %llu errors %x",
864 (unsigned long long) root_objectid,
865 (unsigned long long) rec->ino, rec->errors);
867 if (errors & I_ERR_NO_INODE_ITEM)
868 fprintf(stderr, ", no inode item");
869 if (errors & I_ERR_NO_ORPHAN_ITEM)
870 fprintf(stderr, ", no orphan item");
871 if (errors & I_ERR_DUP_INODE_ITEM)
872 fprintf(stderr, ", dup inode item");
873 if (errors & I_ERR_DUP_DIR_INDEX)
874 fprintf(stderr, ", dup dir index");
875 if (errors & I_ERR_ODD_DIR_ITEM)
876 fprintf(stderr, ", odd dir item");
877 if (errors & I_ERR_ODD_FILE_EXTENT)
878 fprintf(stderr, ", odd file extent");
879 if (errors & I_ERR_BAD_FILE_EXTENT)
880 fprintf(stderr, ", bad file extent");
881 if (errors & I_ERR_FILE_EXTENT_OVERLAP)
882 fprintf(stderr, ", file extent overlap");
883 if (errors & I_ERR_FILE_EXTENT_DISCOUNT)
884 fprintf(stderr, ", file extent discount");
885 if (errors & I_ERR_DIR_ISIZE_WRONG)
886 fprintf(stderr, ", dir isize wrong");
887 if (errors & I_ERR_FILE_NBYTES_WRONG)
888 fprintf(stderr, ", nbytes wrong");
889 if (errors & I_ERR_ODD_CSUM_ITEM)
890 fprintf(stderr, ", odd csum item");
891 if (errors & I_ERR_SOME_CSUM_MISSING)
892 fprintf(stderr, ", some csum missing");
893 if (errors & I_ERR_LINK_COUNT_WRONG)
894 fprintf(stderr, ", link count wrong");
895 if (errors & I_ERR_FILE_EXTENT_ORPHAN)
896 fprintf(stderr, ", orphan file extent");
897 fprintf(stderr, "\n");
898 /* Print the orphan extents if needed */
899 if (errors & I_ERR_FILE_EXTENT_ORPHAN)
900 print_orphan_data_extents(&rec->orphan_extents, root->objectid);
902 /* Print the holes if needed */
903 if (errors & I_ERR_FILE_EXTENT_DISCOUNT) {
904 struct file_extent_hole *hole;
905 struct rb_node *node;
908 node = rb_first(&rec->holes);
909 fprintf(stderr, "Found file extent holes:\n");
912 hole = rb_entry(node, struct file_extent_hole, node);
913 fprintf(stderr, "\tstart: %llu, len: %llu\n",
914 hole->start, hole->len);
915 node = rb_next(node);
918 fprintf(stderr, "\tstart: 0, len: %llu\n",
920 root->fs_info->sectorsize));
924 static void print_ref_error(int errors)
926 if (errors & REF_ERR_NO_DIR_ITEM)
927 fprintf(stderr, ", no dir item");
928 if (errors & REF_ERR_NO_DIR_INDEX)
929 fprintf(stderr, ", no dir index");
930 if (errors & REF_ERR_NO_INODE_REF)
931 fprintf(stderr, ", no inode ref");
932 if (errors & REF_ERR_DUP_DIR_ITEM)
933 fprintf(stderr, ", dup dir item");
934 if (errors & REF_ERR_DUP_DIR_INDEX)
935 fprintf(stderr, ", dup dir index");
936 if (errors & REF_ERR_DUP_INODE_REF)
937 fprintf(stderr, ", dup inode ref");
938 if (errors & REF_ERR_INDEX_UNMATCH)
939 fprintf(stderr, ", index mismatch");
940 if (errors & REF_ERR_FILETYPE_UNMATCH)
941 fprintf(stderr, ", filetype mismatch");
942 if (errors & REF_ERR_NAME_TOO_LONG)
943 fprintf(stderr, ", name too long");
944 if (errors & REF_ERR_NO_ROOT_REF)
945 fprintf(stderr, ", no root ref");
946 if (errors & REF_ERR_NO_ROOT_BACKREF)
947 fprintf(stderr, ", no root backref");
948 if (errors & REF_ERR_DUP_ROOT_REF)
949 fprintf(stderr, ", dup root ref");
950 if (errors & REF_ERR_DUP_ROOT_BACKREF)
951 fprintf(stderr, ", dup root backref");
952 fprintf(stderr, "\n");
955 static struct inode_record *get_inode_rec(struct cache_tree *inode_cache,
958 struct ptr_node *node;
959 struct cache_extent *cache;
960 struct inode_record *rec = NULL;
963 cache = lookup_cache_extent(inode_cache, ino, 1);
965 node = container_of(cache, struct ptr_node, cache);
967 if (mod && rec->refs > 1) {
968 node->data = clone_inode_rec(rec);
969 if (IS_ERR(node->data))
975 rec = calloc(1, sizeof(*rec));
977 return ERR_PTR(-ENOMEM);
979 rec->extent_start = (u64)-1;
981 INIT_LIST_HEAD(&rec->backrefs);
982 INIT_LIST_HEAD(&rec->orphan_extents);
983 rec->holes = RB_ROOT;
985 node = malloc(sizeof(*node));
988 return ERR_PTR(-ENOMEM);
990 node->cache.start = ino;
991 node->cache.size = 1;
994 if (ino == BTRFS_FREE_INO_OBJECTID)
997 ret = insert_cache_extent(inode_cache, &node->cache);
999 return ERR_PTR(-EEXIST);
1004 static void free_orphan_data_extents(struct list_head *orphan_extents)
1006 struct orphan_data_extent *orphan;
1008 while (!list_empty(orphan_extents)) {
1009 orphan = list_entry(orphan_extents->next,
1010 struct orphan_data_extent, list);
1011 list_del(&orphan->list);
1016 static void free_inode_rec(struct inode_record *rec)
1018 struct inode_backref *backref;
1020 if (--rec->refs > 0)
1023 while (!list_empty(&rec->backrefs)) {
1024 backref = to_inode_backref(rec->backrefs.next);
1025 list_del(&backref->list);
1028 free_orphan_data_extents(&rec->orphan_extents);
1029 free_file_extent_holes(&rec->holes);
1033 static int can_free_inode_rec(struct inode_record *rec)
1035 if (!rec->errors && rec->checked && rec->found_inode_item &&
1036 rec->nlink == rec->found_link && list_empty(&rec->backrefs))
1041 static void maybe_free_inode_rec(struct cache_tree *inode_cache,
1042 struct inode_record *rec)
1044 struct cache_extent *cache;
1045 struct inode_backref *tmp, *backref;
1046 struct ptr_node *node;
1049 if (!rec->found_inode_item)
1052 filetype = imode_to_type(rec->imode);
1053 list_for_each_entry_safe(backref, tmp, &rec->backrefs, list) {
1054 if (backref->found_dir_item && backref->found_dir_index) {
1055 if (backref->filetype != filetype)
1056 backref->errors |= REF_ERR_FILETYPE_UNMATCH;
1057 if (!backref->errors && backref->found_inode_ref &&
1058 rec->nlink == rec->found_link) {
1059 list_del(&backref->list);
1065 if (!rec->checked || rec->merging)
1068 if (S_ISDIR(rec->imode)) {
1069 if (rec->found_size != rec->isize)
1070 rec->errors |= I_ERR_DIR_ISIZE_WRONG;
1071 if (rec->found_file_extent)
1072 rec->errors |= I_ERR_ODD_FILE_EXTENT;
1073 } else if (S_ISREG(rec->imode) || S_ISLNK(rec->imode)) {
1074 if (rec->found_dir_item)
1075 rec->errors |= I_ERR_ODD_DIR_ITEM;
1076 if (rec->found_size != rec->nbytes)
1077 rec->errors |= I_ERR_FILE_NBYTES_WRONG;
1078 if (rec->nlink > 0 && !no_holes &&
1079 (rec->extent_end < rec->isize ||
1080 first_extent_gap(&rec->holes) < rec->isize))
1081 rec->errors |= I_ERR_FILE_EXTENT_DISCOUNT;
1084 if (S_ISREG(rec->imode) || S_ISLNK(rec->imode)) {
1085 if (rec->found_csum_item && rec->nodatasum)
1086 rec->errors |= I_ERR_ODD_CSUM_ITEM;
1087 if (rec->some_csum_missing && !rec->nodatasum)
1088 rec->errors |= I_ERR_SOME_CSUM_MISSING;
1091 BUG_ON(rec->refs != 1);
1092 if (can_free_inode_rec(rec)) {
1093 cache = lookup_cache_extent(inode_cache, rec->ino, 1);
1094 node = container_of(cache, struct ptr_node, cache);
1095 BUG_ON(node->data != rec);
1096 remove_cache_extent(inode_cache, &node->cache);
1098 free_inode_rec(rec);
1102 static int check_orphan_item(struct btrfs_root *root, u64 ino)
1104 struct btrfs_path path;
1105 struct btrfs_key key;
1108 key.objectid = BTRFS_ORPHAN_OBJECTID;
1109 key.type = BTRFS_ORPHAN_ITEM_KEY;
1112 btrfs_init_path(&path);
1113 ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
1114 btrfs_release_path(&path);
1120 static int process_inode_item(struct extent_buffer *eb,
1121 int slot, struct btrfs_key *key,
1122 struct shared_node *active_node)
1124 struct inode_record *rec;
1125 struct btrfs_inode_item *item;
1127 rec = active_node->current;
1128 BUG_ON(rec->ino != key->objectid || rec->refs > 1);
1129 if (rec->found_inode_item) {
1130 rec->errors |= I_ERR_DUP_INODE_ITEM;
1133 item = btrfs_item_ptr(eb, slot, struct btrfs_inode_item);
1134 rec->nlink = btrfs_inode_nlink(eb, item);
1135 rec->isize = btrfs_inode_size(eb, item);
1136 rec->nbytes = btrfs_inode_nbytes(eb, item);
1137 rec->imode = btrfs_inode_mode(eb, item);
1138 if (btrfs_inode_flags(eb, item) & BTRFS_INODE_NODATASUM)
1140 rec->found_inode_item = 1;
1141 if (rec->nlink == 0)
1142 rec->errors |= I_ERR_NO_ORPHAN_ITEM;
1143 maybe_free_inode_rec(&active_node->inode_cache, rec);
1147 static struct inode_backref *get_inode_backref(struct inode_record *rec,
1149 int namelen, u64 dir)
1151 struct inode_backref *backref;
1153 list_for_each_entry(backref, &rec->backrefs, list) {
1154 if (rec->ino == BTRFS_MULTIPLE_OBJECTIDS)
1156 if (backref->dir != dir || backref->namelen != namelen)
1158 if (memcmp(name, backref->name, namelen))
1163 backref = malloc(sizeof(*backref) + namelen + 1);
1166 memset(backref, 0, sizeof(*backref));
1168 backref->namelen = namelen;
1169 memcpy(backref->name, name, namelen);
1170 backref->name[namelen] = '\0';
1171 list_add_tail(&backref->list, &rec->backrefs);
1175 static int add_inode_backref(struct cache_tree *inode_cache,
1176 u64 ino, u64 dir, u64 index,
1177 const char *name, int namelen,
1178 u8 filetype, u8 itemtype, int errors)
1180 struct inode_record *rec;
1181 struct inode_backref *backref;
1183 rec = get_inode_rec(inode_cache, ino, 1);
1184 BUG_ON(IS_ERR(rec));
1185 backref = get_inode_backref(rec, name, namelen, dir);
1188 backref->errors |= errors;
1189 if (itemtype == BTRFS_DIR_INDEX_KEY) {
1190 if (backref->found_dir_index)
1191 backref->errors |= REF_ERR_DUP_DIR_INDEX;
1192 if (backref->found_inode_ref && backref->index != index)
1193 backref->errors |= REF_ERR_INDEX_UNMATCH;
1194 if (backref->found_dir_item && backref->filetype != filetype)
1195 backref->errors |= REF_ERR_FILETYPE_UNMATCH;
1197 backref->index = index;
1198 backref->filetype = filetype;
1199 backref->found_dir_index = 1;
1200 } else if (itemtype == BTRFS_DIR_ITEM_KEY) {
1202 if (backref->found_dir_item)
1203 backref->errors |= REF_ERR_DUP_DIR_ITEM;
1204 if (backref->found_dir_index && backref->filetype != filetype)
1205 backref->errors |= REF_ERR_FILETYPE_UNMATCH;
1207 backref->filetype = filetype;
1208 backref->found_dir_item = 1;
1209 } else if ((itemtype == BTRFS_INODE_REF_KEY) ||
1210 (itemtype == BTRFS_INODE_EXTREF_KEY)) {
1211 if (backref->found_inode_ref)
1212 backref->errors |= REF_ERR_DUP_INODE_REF;
1213 if (backref->found_dir_index && backref->index != index)
1214 backref->errors |= REF_ERR_INDEX_UNMATCH;
1216 backref->index = index;
1218 backref->ref_type = itemtype;
1219 backref->found_inode_ref = 1;
1224 maybe_free_inode_rec(inode_cache, rec);
1228 static int merge_inode_recs(struct inode_record *src, struct inode_record *dst,
1229 struct cache_tree *dst_cache)
1231 struct inode_backref *backref;
1236 list_for_each_entry(backref, &src->backrefs, list) {
1237 if (backref->found_dir_index) {
1238 add_inode_backref(dst_cache, dst->ino, backref->dir,
1239 backref->index, backref->name,
1240 backref->namelen, backref->filetype,
1241 BTRFS_DIR_INDEX_KEY, backref->errors);
1243 if (backref->found_dir_item) {
1245 add_inode_backref(dst_cache, dst->ino,
1246 backref->dir, 0, backref->name,
1247 backref->namelen, backref->filetype,
1248 BTRFS_DIR_ITEM_KEY, backref->errors);
1250 if (backref->found_inode_ref) {
1251 add_inode_backref(dst_cache, dst->ino,
1252 backref->dir, backref->index,
1253 backref->name, backref->namelen, 0,
1254 backref->ref_type, backref->errors);
1258 if (src->found_dir_item)
1259 dst->found_dir_item = 1;
1260 if (src->found_file_extent)
1261 dst->found_file_extent = 1;
1262 if (src->found_csum_item)
1263 dst->found_csum_item = 1;
1264 if (src->some_csum_missing)
1265 dst->some_csum_missing = 1;
1266 if (first_extent_gap(&dst->holes) > first_extent_gap(&src->holes)) {
1267 ret = copy_file_extent_holes(&dst->holes, &src->holes);
1272 BUG_ON(src->found_link < dir_count);
1273 dst->found_link += src->found_link - dir_count;
1274 dst->found_size += src->found_size;
1275 if (src->extent_start != (u64)-1) {
1276 if (dst->extent_start == (u64)-1) {
1277 dst->extent_start = src->extent_start;
1278 dst->extent_end = src->extent_end;
1280 if (dst->extent_end > src->extent_start)
1281 dst->errors |= I_ERR_FILE_EXTENT_OVERLAP;
1282 else if (dst->extent_end < src->extent_start) {
1283 ret = add_file_extent_hole(&dst->holes,
1285 src->extent_start - dst->extent_end);
1287 if (dst->extent_end < src->extent_end)
1288 dst->extent_end = src->extent_end;
1292 dst->errors |= src->errors;
1293 if (src->found_inode_item) {
1294 if (!dst->found_inode_item) {
1295 dst->nlink = src->nlink;
1296 dst->isize = src->isize;
1297 dst->nbytes = src->nbytes;
1298 dst->imode = src->imode;
1299 dst->nodatasum = src->nodatasum;
1300 dst->found_inode_item = 1;
1302 dst->errors |= I_ERR_DUP_INODE_ITEM;
1310 static int splice_shared_node(struct shared_node *src_node,
1311 struct shared_node *dst_node)
1313 struct cache_extent *cache;
1314 struct ptr_node *node, *ins;
1315 struct cache_tree *src, *dst;
1316 struct inode_record *rec, *conflict;
1317 u64 current_ino = 0;
1321 if (--src_node->refs == 0)
1323 if (src_node->current)
1324 current_ino = src_node->current->ino;
1326 src = &src_node->root_cache;
1327 dst = &dst_node->root_cache;
1329 cache = search_cache_extent(src, 0);
1331 node = container_of(cache, struct ptr_node, cache);
1333 cache = next_cache_extent(cache);
1336 remove_cache_extent(src, &node->cache);
1339 ins = malloc(sizeof(*ins));
1341 ins->cache.start = node->cache.start;
1342 ins->cache.size = node->cache.size;
1346 ret = insert_cache_extent(dst, &ins->cache);
1347 if (ret == -EEXIST) {
1348 conflict = get_inode_rec(dst, rec->ino, 1);
1349 BUG_ON(IS_ERR(conflict));
1350 merge_inode_recs(rec, conflict, dst);
1352 conflict->checked = 1;
1353 if (dst_node->current == conflict)
1354 dst_node->current = NULL;
1356 maybe_free_inode_rec(dst, conflict);
1357 free_inode_rec(rec);
1364 if (src == &src_node->root_cache) {
1365 src = &src_node->inode_cache;
1366 dst = &dst_node->inode_cache;
1370 if (current_ino > 0 && (!dst_node->current ||
1371 current_ino > dst_node->current->ino)) {
1372 if (dst_node->current) {
1373 dst_node->current->checked = 1;
1374 maybe_free_inode_rec(dst, dst_node->current);
1376 dst_node->current = get_inode_rec(dst, current_ino, 1);
1377 BUG_ON(IS_ERR(dst_node->current));
1382 static void free_inode_ptr(struct cache_extent *cache)
1384 struct ptr_node *node;
1385 struct inode_record *rec;
1387 node = container_of(cache, struct ptr_node, cache);
1389 free_inode_rec(rec);
1393 FREE_EXTENT_CACHE_BASED_TREE(inode_recs, free_inode_ptr);
1395 static struct shared_node *find_shared_node(struct cache_tree *shared,
1398 struct cache_extent *cache;
1399 struct shared_node *node;
1401 cache = lookup_cache_extent(shared, bytenr, 1);
1403 node = container_of(cache, struct shared_node, cache);
1409 static int add_shared_node(struct cache_tree *shared, u64 bytenr, u32 refs)
1412 struct shared_node *node;
1414 node = calloc(1, sizeof(*node));
1417 node->cache.start = bytenr;
1418 node->cache.size = 1;
1419 cache_tree_init(&node->root_cache);
1420 cache_tree_init(&node->inode_cache);
1423 ret = insert_cache_extent(shared, &node->cache);
1428 static int enter_shared_node(struct btrfs_root *root, u64 bytenr, u32 refs,
1429 struct walk_control *wc, int level)
1431 struct shared_node *node;
1432 struct shared_node *dest;
1435 if (level == wc->active_node)
1438 BUG_ON(wc->active_node <= level);
1439 node = find_shared_node(&wc->shared, bytenr);
1441 ret = add_shared_node(&wc->shared, bytenr, refs);
1443 node = find_shared_node(&wc->shared, bytenr);
1444 wc->nodes[level] = node;
1445 wc->active_node = level;
1449 if (wc->root_level == wc->active_node &&
1450 btrfs_root_refs(&root->root_item) == 0) {
1451 if (--node->refs == 0) {
1452 free_inode_recs_tree(&node->root_cache);
1453 free_inode_recs_tree(&node->inode_cache);
1454 remove_cache_extent(&wc->shared, &node->cache);
1460 dest = wc->nodes[wc->active_node];
1461 splice_shared_node(node, dest);
1462 if (node->refs == 0) {
1463 remove_cache_extent(&wc->shared, &node->cache);
1469 static int leave_shared_node(struct btrfs_root *root,
1470 struct walk_control *wc, int level)
1472 struct shared_node *node;
1473 struct shared_node *dest;
1476 if (level == wc->root_level)
1479 for (i = level + 1; i < BTRFS_MAX_LEVEL; i++) {
1483 BUG_ON(i >= BTRFS_MAX_LEVEL);
1485 node = wc->nodes[wc->active_node];
1486 wc->nodes[wc->active_node] = NULL;
1487 wc->active_node = i;
1489 dest = wc->nodes[wc->active_node];
1490 if (wc->active_node < wc->root_level ||
1491 btrfs_root_refs(&root->root_item) > 0) {
1492 BUG_ON(node->refs <= 1);
1493 splice_shared_node(node, dest);
1495 BUG_ON(node->refs < 2);
1504 * 1 - if the root with id child_root_id is a child of root parent_root_id
1505 * 0 - if the root child_root_id isn't a child of the root parent_root_id but
1506 * has other root(s) as parent(s)
1507 * 2 - if the root child_root_id doesn't have any parent roots
1509 static int is_child_root(struct btrfs_root *root, u64 parent_root_id,
1512 struct btrfs_path path;
1513 struct btrfs_key key;
1514 struct extent_buffer *leaf;
1518 btrfs_init_path(&path);
1520 key.objectid = parent_root_id;
1521 key.type = BTRFS_ROOT_REF_KEY;
1522 key.offset = child_root_id;
1523 ret = btrfs_search_slot(NULL, root->fs_info->tree_root, &key, &path,
1527 btrfs_release_path(&path);
1531 key.objectid = child_root_id;
1532 key.type = BTRFS_ROOT_BACKREF_KEY;
1534 ret = btrfs_search_slot(NULL, root->fs_info->tree_root, &key, &path,
1540 leaf = path.nodes[0];
1541 if (path.slots[0] >= btrfs_header_nritems(leaf)) {
1542 ret = btrfs_next_leaf(root->fs_info->tree_root, &path);
1545 leaf = path.nodes[0];
1548 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
1549 if (key.objectid != child_root_id ||
1550 key.type != BTRFS_ROOT_BACKREF_KEY)
1555 if (key.offset == parent_root_id) {
1556 btrfs_release_path(&path);
1563 btrfs_release_path(&path);
1566 return has_parent ? 0 : 2;
1569 static int process_dir_item(struct extent_buffer *eb,
1570 int slot, struct btrfs_key *key,
1571 struct shared_node *active_node)
1581 struct btrfs_dir_item *di;
1582 struct inode_record *rec;
1583 struct cache_tree *root_cache;
1584 struct cache_tree *inode_cache;
1585 struct btrfs_key location;
1586 char namebuf[BTRFS_NAME_LEN];
1588 root_cache = &active_node->root_cache;
1589 inode_cache = &active_node->inode_cache;
1590 rec = active_node->current;
1591 rec->found_dir_item = 1;
1593 di = btrfs_item_ptr(eb, slot, struct btrfs_dir_item);
1594 total = btrfs_item_size_nr(eb, slot);
1595 while (cur < total) {
1597 btrfs_dir_item_key_to_cpu(eb, di, &location);
1598 name_len = btrfs_dir_name_len(eb, di);
1599 data_len = btrfs_dir_data_len(eb, di);
1600 filetype = btrfs_dir_type(eb, di);
1602 rec->found_size += name_len;
1603 if (cur + sizeof(*di) + name_len > total ||
1604 name_len > BTRFS_NAME_LEN) {
1605 error = REF_ERR_NAME_TOO_LONG;
1607 if (cur + sizeof(*di) > total)
1609 len = min_t(u32, total - cur - sizeof(*di),
1616 read_extent_buffer(eb, namebuf, (unsigned long)(di + 1), len);
1618 if (key->type == BTRFS_DIR_ITEM_KEY &&
1619 key->offset != btrfs_name_hash(namebuf, len)) {
1620 rec->errors |= I_ERR_ODD_DIR_ITEM;
1621 error("DIR_ITEM[%llu %llu] name %s namelen %u filetype %u mismatch with its hash, wanted %llu have %llu",
1622 key->objectid, key->offset, namebuf, len, filetype,
1623 key->offset, btrfs_name_hash(namebuf, len));
1626 if (location.type == BTRFS_INODE_ITEM_KEY) {
1627 add_inode_backref(inode_cache, location.objectid,
1628 key->objectid, key->offset, namebuf,
1629 len, filetype, key->type, error);
1630 } else if (location.type == BTRFS_ROOT_ITEM_KEY) {
1631 add_inode_backref(root_cache, location.objectid,
1632 key->objectid, key->offset,
1633 namebuf, len, filetype,
1636 fprintf(stderr, "invalid location in dir item %u\n",
1638 add_inode_backref(inode_cache, BTRFS_MULTIPLE_OBJECTIDS,
1639 key->objectid, key->offset, namebuf,
1640 len, filetype, key->type, error);
1643 len = sizeof(*di) + name_len + data_len;
1644 di = (struct btrfs_dir_item *)((char *)di + len);
1647 if (key->type == BTRFS_DIR_INDEX_KEY && nritems > 1)
1648 rec->errors |= I_ERR_DUP_DIR_INDEX;
1653 static int process_inode_ref(struct extent_buffer *eb,
1654 int slot, struct btrfs_key *key,
1655 struct shared_node *active_node)
1663 struct cache_tree *inode_cache;
1664 struct btrfs_inode_ref *ref;
1665 char namebuf[BTRFS_NAME_LEN];
1667 inode_cache = &active_node->inode_cache;
1669 ref = btrfs_item_ptr(eb, slot, struct btrfs_inode_ref);
1670 total = btrfs_item_size_nr(eb, slot);
1671 while (cur < total) {
1672 name_len = btrfs_inode_ref_name_len(eb, ref);
1673 index = btrfs_inode_ref_index(eb, ref);
1675 /* inode_ref + namelen should not cross item boundary */
1676 if (cur + sizeof(*ref) + name_len > total ||
1677 name_len > BTRFS_NAME_LEN) {
1678 if (total < cur + sizeof(*ref))
1681 /* Still try to read out the remaining part */
1682 len = min_t(u32, total - cur - sizeof(*ref),
1684 error = REF_ERR_NAME_TOO_LONG;
1690 read_extent_buffer(eb, namebuf, (unsigned long)(ref + 1), len);
1691 add_inode_backref(inode_cache, key->objectid, key->offset,
1692 index, namebuf, len, 0, key->type, error);
1694 len = sizeof(*ref) + name_len;
1695 ref = (struct btrfs_inode_ref *)((char *)ref + len);
1701 static int process_inode_extref(struct extent_buffer *eb,
1702 int slot, struct btrfs_key *key,
1703 struct shared_node *active_node)
1712 struct cache_tree *inode_cache;
1713 struct btrfs_inode_extref *extref;
1714 char namebuf[BTRFS_NAME_LEN];
1716 inode_cache = &active_node->inode_cache;
1718 extref = btrfs_item_ptr(eb, slot, struct btrfs_inode_extref);
1719 total = btrfs_item_size_nr(eb, slot);
1720 while (cur < total) {
1721 name_len = btrfs_inode_extref_name_len(eb, extref);
1722 index = btrfs_inode_extref_index(eb, extref);
1723 parent = btrfs_inode_extref_parent(eb, extref);
1724 if (name_len <= BTRFS_NAME_LEN) {
1728 len = BTRFS_NAME_LEN;
1729 error = REF_ERR_NAME_TOO_LONG;
1731 read_extent_buffer(eb, namebuf,
1732 (unsigned long)(extref + 1), len);
1733 add_inode_backref(inode_cache, key->objectid, parent,
1734 index, namebuf, len, 0, key->type, error);
1736 len = sizeof(*extref) + name_len;
1737 extref = (struct btrfs_inode_extref *)((char *)extref + len);
1744 static int count_csum_range(struct btrfs_root *root, u64 start,
1745 u64 len, u64 *found)
1747 struct btrfs_key key;
1748 struct btrfs_path path;
1749 struct extent_buffer *leaf;
1754 u16 csum_size = btrfs_super_csum_size(root->fs_info->super_copy);
1756 btrfs_init_path(&path);
1758 key.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
1760 key.type = BTRFS_EXTENT_CSUM_KEY;
1762 ret = btrfs_search_slot(NULL, root->fs_info->csum_root,
1766 if (ret > 0 && path.slots[0] > 0) {
1767 leaf = path.nodes[0];
1768 btrfs_item_key_to_cpu(leaf, &key, path.slots[0] - 1);
1769 if (key.objectid == BTRFS_EXTENT_CSUM_OBJECTID &&
1770 key.type == BTRFS_EXTENT_CSUM_KEY)
1775 leaf = path.nodes[0];
1776 if (path.slots[0] >= btrfs_header_nritems(leaf)) {
1777 ret = btrfs_next_leaf(root->fs_info->csum_root, &path);
1782 leaf = path.nodes[0];
1785 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
1786 if (key.objectid != BTRFS_EXTENT_CSUM_OBJECTID ||
1787 key.type != BTRFS_EXTENT_CSUM_KEY)
1790 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
1791 if (key.offset >= start + len)
1794 if (key.offset > start)
1797 size = btrfs_item_size_nr(leaf, path.slots[0]);
1798 csum_end = key.offset + (size / csum_size) *
1799 root->fs_info->sectorsize;
1800 if (csum_end > start) {
1801 size = min(csum_end - start, len);
1810 btrfs_release_path(&path);
1816 static int process_file_extent(struct btrfs_root *root,
1817 struct extent_buffer *eb,
1818 int slot, struct btrfs_key *key,
1819 struct shared_node *active_node)
1821 struct inode_record *rec;
1822 struct btrfs_file_extent_item *fi;
1824 u64 disk_bytenr = 0;
1825 u64 extent_offset = 0;
1826 u64 mask = root->fs_info->sectorsize - 1;
1830 rec = active_node->current;
1831 BUG_ON(rec->ino != key->objectid || rec->refs > 1);
1832 rec->found_file_extent = 1;
1834 if (rec->extent_start == (u64)-1) {
1835 rec->extent_start = key->offset;
1836 rec->extent_end = key->offset;
1839 if (rec->extent_end > key->offset)
1840 rec->errors |= I_ERR_FILE_EXTENT_OVERLAP;
1841 else if (rec->extent_end < key->offset) {
1842 ret = add_file_extent_hole(&rec->holes, rec->extent_end,
1843 key->offset - rec->extent_end);
1848 fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
1849 extent_type = btrfs_file_extent_type(eb, fi);
1851 if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
1852 num_bytes = btrfs_file_extent_inline_len(eb, slot, fi);
1854 rec->errors |= I_ERR_BAD_FILE_EXTENT;
1855 rec->found_size += num_bytes;
1856 num_bytes = (num_bytes + mask) & ~mask;
1857 } else if (extent_type == BTRFS_FILE_EXTENT_REG ||
1858 extent_type == BTRFS_FILE_EXTENT_PREALLOC) {
1859 num_bytes = btrfs_file_extent_num_bytes(eb, fi);
1860 disk_bytenr = btrfs_file_extent_disk_bytenr(eb, fi);
1861 extent_offset = btrfs_file_extent_offset(eb, fi);
1862 if (num_bytes == 0 || (num_bytes & mask))
1863 rec->errors |= I_ERR_BAD_FILE_EXTENT;
1864 if (num_bytes + extent_offset >
1865 btrfs_file_extent_ram_bytes(eb, fi))
1866 rec->errors |= I_ERR_BAD_FILE_EXTENT;
1867 if (extent_type == BTRFS_FILE_EXTENT_PREALLOC &&
1868 (btrfs_file_extent_compression(eb, fi) ||
1869 btrfs_file_extent_encryption(eb, fi) ||
1870 btrfs_file_extent_other_encoding(eb, fi)))
1871 rec->errors |= I_ERR_BAD_FILE_EXTENT;
1872 if (disk_bytenr > 0)
1873 rec->found_size += num_bytes;
1875 rec->errors |= I_ERR_BAD_FILE_EXTENT;
1877 rec->extent_end = key->offset + num_bytes;
1880 * The data reloc tree will copy full extents into its inode and then
1881 * copy the corresponding csums. Because the extent it copied could be
1882 * a preallocated extent that hasn't been written to yet there may be no
1883 * csums to copy, ergo we won't have csums for our file extent. This is
1884 * ok so just don't bother checking csums if the inode belongs to the
1887 if (disk_bytenr > 0 &&
1888 btrfs_header_owner(eb) != BTRFS_DATA_RELOC_TREE_OBJECTID) {
1890 if (btrfs_file_extent_compression(eb, fi))
1891 num_bytes = btrfs_file_extent_disk_num_bytes(eb, fi);
1893 disk_bytenr += extent_offset;
1895 ret = count_csum_range(root, disk_bytenr, num_bytes, &found);
1898 if (extent_type == BTRFS_FILE_EXTENT_REG) {
1900 rec->found_csum_item = 1;
1901 if (found < num_bytes)
1902 rec->some_csum_missing = 1;
1903 } else if (extent_type == BTRFS_FILE_EXTENT_PREALLOC) {
1905 rec->errors |= I_ERR_ODD_CSUM_ITEM;
1911 static int process_one_leaf(struct btrfs_root *root, struct extent_buffer *eb,
1912 struct walk_control *wc)
1914 struct btrfs_key key;
1918 struct cache_tree *inode_cache;
1919 struct shared_node *active_node;
1921 if (wc->root_level == wc->active_node &&
1922 btrfs_root_refs(&root->root_item) == 0)
1925 active_node = wc->nodes[wc->active_node];
1926 inode_cache = &active_node->inode_cache;
1927 nritems = btrfs_header_nritems(eb);
1928 for (i = 0; i < nritems; i++) {
1929 btrfs_item_key_to_cpu(eb, &key, i);
1931 if (key.objectid == BTRFS_FREE_SPACE_OBJECTID)
1933 if (key.type == BTRFS_ORPHAN_ITEM_KEY)
1936 if (active_node->current == NULL ||
1937 active_node->current->ino < key.objectid) {
1938 if (active_node->current) {
1939 active_node->current->checked = 1;
1940 maybe_free_inode_rec(inode_cache,
1941 active_node->current);
1943 active_node->current = get_inode_rec(inode_cache,
1945 BUG_ON(IS_ERR(active_node->current));
1948 case BTRFS_DIR_ITEM_KEY:
1949 case BTRFS_DIR_INDEX_KEY:
1950 ret = process_dir_item(eb, i, &key, active_node);
1952 case BTRFS_INODE_REF_KEY:
1953 ret = process_inode_ref(eb, i, &key, active_node);
1955 case BTRFS_INODE_EXTREF_KEY:
1956 ret = process_inode_extref(eb, i, &key, active_node);
1958 case BTRFS_INODE_ITEM_KEY:
1959 ret = process_inode_item(eb, i, &key, active_node);
1961 case BTRFS_EXTENT_DATA_KEY:
1962 ret = process_file_extent(root, eb, i, &key,
1973 u64 bytenr[BTRFS_MAX_LEVEL];
1974 u64 refs[BTRFS_MAX_LEVEL];
1975 int need_check[BTRFS_MAX_LEVEL];
1978 static int update_nodes_refs(struct btrfs_root *root, u64 bytenr,
1979 struct node_refs *nrefs, u64 level);
1980 static int check_inode_item(struct btrfs_root *root, struct btrfs_path *path,
1981 unsigned int ext_ref);
1984 * Returns >0 Found error, not fatal, should continue
1985 * Returns <0 Fatal error, must exit the whole check
1986 * Returns 0 No errors found
1988 static int process_one_leaf_v2(struct btrfs_root *root, struct btrfs_path *path,
1989 struct node_refs *nrefs, int *level, int ext_ref)
1991 struct extent_buffer *cur = path->nodes[0];
1992 struct btrfs_key key;
1996 int root_level = btrfs_header_level(root->node);
1998 int ret = 0; /* Final return value */
1999 int err = 0; /* Positive error bitmap */
2001 cur_bytenr = cur->start;
2003 /* skip to first inode item or the first inode number change */
2004 nritems = btrfs_header_nritems(cur);
2005 for (i = 0; i < nritems; i++) {
2006 btrfs_item_key_to_cpu(cur, &key, i);
2008 first_ino = key.objectid;
2009 if (key.type == BTRFS_INODE_ITEM_KEY ||
2010 (first_ino && first_ino != key.objectid))
2014 path->slots[0] = nritems;
2020 err |= check_inode_item(root, path, ext_ref);
2022 /* modify cur since check_inode_item may change path */
2023 cur = path->nodes[0];
2025 if (err & LAST_ITEM)
2028 /* still have inode items in thie leaf */
2029 if (cur->start == cur_bytenr)
2033 * we have switched to another leaf, above nodes may
2034 * have changed, here walk down the path, if a node
2035 * or leaf is shared, check whether we can skip this
2038 for (i = root_level; i >= 0; i--) {
2039 if (path->nodes[i]->start == nrefs->bytenr[i])
2042 ret = update_nodes_refs(root,
2043 path->nodes[i]->start,
2048 if (!nrefs->need_check[i]) {
2054 for (i = 0; i < *level; i++) {
2055 free_extent_buffer(path->nodes[i]);
2056 path->nodes[i] = NULL;
2065 static void reada_walk_down(struct btrfs_root *root,
2066 struct extent_buffer *node, int slot)
2068 struct btrfs_fs_info *fs_info = root->fs_info;
2075 level = btrfs_header_level(node);
2079 nritems = btrfs_header_nritems(node);
2080 for (i = slot; i < nritems; i++) {
2081 bytenr = btrfs_node_blockptr(node, i);
2082 ptr_gen = btrfs_node_ptr_generation(node, i);
2083 readahead_tree_block(fs_info, bytenr, ptr_gen);
2088 * Check the child node/leaf by the following condition:
2089 * 1. the first item key of the node/leaf should be the same with the one
2091 * 2. block in parent node should match the child node/leaf.
2092 * 3. generation of parent node and child's header should be consistent.
2094 * Or the child node/leaf pointed by the key in parent is not valid.
2096 * We hope to check leaf owner too, but since subvol may share leaves,
2097 * which makes leaf owner check not so strong, key check should be
2098 * sufficient enough for that case.
2100 static int check_child_node(struct extent_buffer *parent, int slot,
2101 struct extent_buffer *child)
2103 struct btrfs_key parent_key;
2104 struct btrfs_key child_key;
2107 btrfs_node_key_to_cpu(parent, &parent_key, slot);
2108 if (btrfs_header_level(child) == 0)
2109 btrfs_item_key_to_cpu(child, &child_key, 0);
2111 btrfs_node_key_to_cpu(child, &child_key, 0);
2113 if (memcmp(&parent_key, &child_key, sizeof(parent_key))) {
2116 "Wrong key of child node/leaf, wanted: (%llu, %u, %llu), have: (%llu, %u, %llu)\n",
2117 parent_key.objectid, parent_key.type, parent_key.offset,
2118 child_key.objectid, child_key.type, child_key.offset);
2120 if (btrfs_header_bytenr(child) != btrfs_node_blockptr(parent, slot)) {
2122 fprintf(stderr, "Wrong block of child node/leaf, wanted: %llu, have: %llu\n",
2123 btrfs_node_blockptr(parent, slot),
2124 btrfs_header_bytenr(child));
2126 if (btrfs_node_ptr_generation(parent, slot) !=
2127 btrfs_header_generation(child)) {
2129 fprintf(stderr, "Wrong generation of child node/leaf, wanted: %llu, have: %llu\n",
2130 btrfs_header_generation(child),
2131 btrfs_node_ptr_generation(parent, slot));
2137 * for a tree node or leaf, if it's shared, indeed we don't need to iterate it
2138 * in every fs or file tree check. Here we find its all root ids, and only check
2139 * it in the fs or file tree which has the smallest root id.
2141 static int need_check(struct btrfs_root *root, struct ulist *roots)
2143 struct rb_node *node;
2144 struct ulist_node *u;
2146 if (roots->nnodes == 1)
2149 node = rb_first(&roots->root);
2150 u = rb_entry(node, struct ulist_node, rb_node);
2152 * current root id is not smallest, we skip it and let it be checked
2153 * in the fs or file tree who hash the smallest root id.
2155 if (root->objectid != u->val)
2162 * for a tree node or leaf, we record its reference count, so later if we still
2163 * process this node or leaf, don't need to compute its reference count again.
2165 static int update_nodes_refs(struct btrfs_root *root, u64 bytenr,
2166 struct node_refs *nrefs, u64 level)
2170 struct ulist *roots;
2172 if (nrefs->bytenr[level] != bytenr) {
2173 ret = btrfs_lookup_extent_info(NULL, root, bytenr,
2174 level, 1, &refs, NULL);
2178 nrefs->bytenr[level] = bytenr;
2179 nrefs->refs[level] = refs;
2181 ret = btrfs_find_all_roots(NULL, root->fs_info, bytenr,
2186 check = need_check(root, roots);
2188 nrefs->need_check[level] = check;
2190 nrefs->need_check[level] = 1;
2197 static int walk_down_tree(struct btrfs_root *root, struct btrfs_path *path,
2198 struct walk_control *wc, int *level,
2199 struct node_refs *nrefs)
2201 enum btrfs_tree_block_status status;
2204 struct btrfs_fs_info *fs_info = root->fs_info;
2205 struct extent_buffer *next;
2206 struct extent_buffer *cur;
2210 WARN_ON(*level < 0);
2211 WARN_ON(*level >= BTRFS_MAX_LEVEL);
2213 if (path->nodes[*level]->start == nrefs->bytenr[*level]) {
2214 refs = nrefs->refs[*level];
2217 ret = btrfs_lookup_extent_info(NULL, root,
2218 path->nodes[*level]->start,
2219 *level, 1, &refs, NULL);
2224 nrefs->bytenr[*level] = path->nodes[*level]->start;
2225 nrefs->refs[*level] = refs;
2229 ret = enter_shared_node(root, path->nodes[*level]->start,
2237 while (*level >= 0) {
2238 WARN_ON(*level < 0);
2239 WARN_ON(*level >= BTRFS_MAX_LEVEL);
2240 cur = path->nodes[*level];
2242 if (btrfs_header_level(cur) != *level)
2245 if (path->slots[*level] >= btrfs_header_nritems(cur))
2248 ret = process_one_leaf(root, cur, wc);
2253 bytenr = btrfs_node_blockptr(cur, path->slots[*level]);
2254 ptr_gen = btrfs_node_ptr_generation(cur, path->slots[*level]);
2256 if (bytenr == nrefs->bytenr[*level - 1]) {
2257 refs = nrefs->refs[*level - 1];
2259 ret = btrfs_lookup_extent_info(NULL, root, bytenr,
2260 *level - 1, 1, &refs, NULL);
2264 nrefs->bytenr[*level - 1] = bytenr;
2265 nrefs->refs[*level - 1] = refs;
2270 ret = enter_shared_node(root, bytenr, refs,
2273 path->slots[*level]++;
2278 next = btrfs_find_tree_block(fs_info, bytenr, fs_info->nodesize);
2279 if (!next || !btrfs_buffer_uptodate(next, ptr_gen)) {
2280 free_extent_buffer(next);
2281 reada_walk_down(root, cur, path->slots[*level]);
2282 next = read_tree_block(root->fs_info, bytenr, ptr_gen);
2283 if (!extent_buffer_uptodate(next)) {
2284 struct btrfs_key node_key;
2286 btrfs_node_key_to_cpu(path->nodes[*level],
2288 path->slots[*level]);
2289 btrfs_add_corrupt_extent_record(root->fs_info,
2291 path->nodes[*level]->start,
2292 root->fs_info->nodesize,
2299 ret = check_child_node(cur, path->slots[*level], next);
2301 free_extent_buffer(next);
2306 if (btrfs_is_leaf(next))
2307 status = btrfs_check_leaf(root, NULL, next);
2309 status = btrfs_check_node(root, NULL, next);
2310 if (status != BTRFS_TREE_BLOCK_CLEAN) {
2311 free_extent_buffer(next);
2316 *level = *level - 1;
2317 free_extent_buffer(path->nodes[*level]);
2318 path->nodes[*level] = next;
2319 path->slots[*level] = 0;
2322 path->slots[*level] = btrfs_header_nritems(path->nodes[*level]);
2326 static int check_inode_item(struct btrfs_root *root, struct btrfs_path *path,
2327 unsigned int ext_ref);
2330 * Returns >0 Found error, should continue
2331 * Returns <0 Fatal error, must exit the whole check
2332 * Returns 0 No errors found
2334 static int walk_down_tree_v2(struct btrfs_root *root, struct btrfs_path *path,
2335 int *level, struct node_refs *nrefs, int ext_ref)
2337 enum btrfs_tree_block_status status;
2340 struct btrfs_fs_info *fs_info = root->fs_info;
2341 struct extent_buffer *next;
2342 struct extent_buffer *cur;
2345 WARN_ON(*level < 0);
2346 WARN_ON(*level >= BTRFS_MAX_LEVEL);
2348 ret = update_nodes_refs(root, path->nodes[*level]->start,
2353 while (*level >= 0) {
2354 WARN_ON(*level < 0);
2355 WARN_ON(*level >= BTRFS_MAX_LEVEL);
2356 cur = path->nodes[*level];
2358 if (btrfs_header_level(cur) != *level)
2361 if (path->slots[*level] >= btrfs_header_nritems(cur))
2363 /* Don't forgot to check leaf/node validation */
2365 ret = btrfs_check_leaf(root, NULL, cur);
2366 if (ret != BTRFS_TREE_BLOCK_CLEAN) {
2370 ret = process_one_leaf_v2(root, path, nrefs,
2372 cur = path->nodes[*level];
2375 ret = btrfs_check_node(root, NULL, cur);
2376 if (ret != BTRFS_TREE_BLOCK_CLEAN) {
2381 bytenr = btrfs_node_blockptr(cur, path->slots[*level]);
2382 ptr_gen = btrfs_node_ptr_generation(cur, path->slots[*level]);
2384 ret = update_nodes_refs(root, bytenr, nrefs, *level - 1);
2387 if (!nrefs->need_check[*level - 1]) {
2388 path->slots[*level]++;
2392 next = btrfs_find_tree_block(fs_info, bytenr, fs_info->nodesize);
2393 if (!next || !btrfs_buffer_uptodate(next, ptr_gen)) {
2394 free_extent_buffer(next);
2395 reada_walk_down(root, cur, path->slots[*level]);
2396 next = read_tree_block(fs_info, bytenr, ptr_gen);
2397 if (!extent_buffer_uptodate(next)) {
2398 struct btrfs_key node_key;
2400 btrfs_node_key_to_cpu(path->nodes[*level],
2402 path->slots[*level]);
2403 btrfs_add_corrupt_extent_record(fs_info,
2405 path->nodes[*level]->start,
2413 ret = check_child_node(cur, path->slots[*level], next);
2417 if (btrfs_is_leaf(next))
2418 status = btrfs_check_leaf(root, NULL, next);
2420 status = btrfs_check_node(root, NULL, next);
2421 if (status != BTRFS_TREE_BLOCK_CLEAN) {
2422 free_extent_buffer(next);
2427 *level = *level - 1;
2428 free_extent_buffer(path->nodes[*level]);
2429 path->nodes[*level] = next;
2430 path->slots[*level] = 0;
2435 static int walk_up_tree(struct btrfs_root *root, struct btrfs_path *path,
2436 struct walk_control *wc, int *level)
2439 struct extent_buffer *leaf;
2441 for (i = *level; i < BTRFS_MAX_LEVEL - 1 && path->nodes[i]; i++) {
2442 leaf = path->nodes[i];
2443 if (path->slots[i] + 1 < btrfs_header_nritems(leaf)) {
2448 free_extent_buffer(path->nodes[*level]);
2449 path->nodes[*level] = NULL;
2450 BUG_ON(*level > wc->active_node);
2451 if (*level == wc->active_node)
2452 leave_shared_node(root, wc, *level);
2459 static int walk_up_tree_v2(struct btrfs_root *root, struct btrfs_path *path,
2463 struct extent_buffer *leaf;
2465 for (i = *level; i < BTRFS_MAX_LEVEL - 1 && path->nodes[i]; i++) {
2466 leaf = path->nodes[i];
2467 if (path->slots[i] + 1 < btrfs_header_nritems(leaf)) {
2472 free_extent_buffer(path->nodes[*level]);
2473 path->nodes[*level] = NULL;
2480 static int check_root_dir(struct inode_record *rec)
2482 struct inode_backref *backref;
2485 if (!rec->found_inode_item || rec->errors)
2487 if (rec->nlink != 1 || rec->found_link != 0)
2489 if (list_empty(&rec->backrefs))
2491 backref = to_inode_backref(rec->backrefs.next);
2492 if (!backref->found_inode_ref)
2494 if (backref->index != 0 || backref->namelen != 2 ||
2495 memcmp(backref->name, "..", 2))
2497 if (backref->found_dir_index || backref->found_dir_item)
2504 static int repair_inode_isize(struct btrfs_trans_handle *trans,
2505 struct btrfs_root *root, struct btrfs_path *path,
2506 struct inode_record *rec)
2508 struct btrfs_inode_item *ei;
2509 struct btrfs_key key;
2512 key.objectid = rec->ino;
2513 key.type = BTRFS_INODE_ITEM_KEY;
2514 key.offset = (u64)-1;
2516 ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
2520 if (!path->slots[0]) {
2527 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
2528 if (key.objectid != rec->ino) {
2533 ei = btrfs_item_ptr(path->nodes[0], path->slots[0],
2534 struct btrfs_inode_item);
2535 btrfs_set_inode_size(path->nodes[0], ei, rec->found_size);
2536 btrfs_mark_buffer_dirty(path->nodes[0]);
2537 rec->errors &= ~I_ERR_DIR_ISIZE_WRONG;
2538 printf("reset isize for dir %Lu root %Lu\n", rec->ino,
2539 root->root_key.objectid);
2541 btrfs_release_path(path);
2545 static int repair_inode_orphan_item(struct btrfs_trans_handle *trans,
2546 struct btrfs_root *root,
2547 struct btrfs_path *path,
2548 struct inode_record *rec)
2552 ret = btrfs_add_orphan_item(trans, root, path, rec->ino);
2553 btrfs_release_path(path);
2555 rec->errors &= ~I_ERR_NO_ORPHAN_ITEM;
2559 static int repair_inode_nbytes(struct btrfs_trans_handle *trans,
2560 struct btrfs_root *root,
2561 struct btrfs_path *path,
2562 struct inode_record *rec)
2564 struct btrfs_inode_item *ei;
2565 struct btrfs_key key;
2568 key.objectid = rec->ino;
2569 key.type = BTRFS_INODE_ITEM_KEY;
2572 ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
2579 /* Since ret == 0, no need to check anything */
2580 ei = btrfs_item_ptr(path->nodes[0], path->slots[0],
2581 struct btrfs_inode_item);
2582 btrfs_set_inode_nbytes(path->nodes[0], ei, rec->found_size);
2583 btrfs_mark_buffer_dirty(path->nodes[0]);
2584 rec->errors &= ~I_ERR_FILE_NBYTES_WRONG;
2585 printf("reset nbytes for ino %llu root %llu\n",
2586 rec->ino, root->root_key.objectid);
2588 btrfs_release_path(path);
2592 static int add_missing_dir_index(struct btrfs_root *root,
2593 struct cache_tree *inode_cache,
2594 struct inode_record *rec,
2595 struct inode_backref *backref)
2597 struct btrfs_path path;
2598 struct btrfs_trans_handle *trans;
2599 struct btrfs_dir_item *dir_item;
2600 struct extent_buffer *leaf;
2601 struct btrfs_key key;
2602 struct btrfs_disk_key disk_key;
2603 struct inode_record *dir_rec;
2604 unsigned long name_ptr;
2605 u32 data_size = sizeof(*dir_item) + backref->namelen;
2608 trans = btrfs_start_transaction(root, 1);
2610 return PTR_ERR(trans);
2612 fprintf(stderr, "repairing missing dir index item for inode %llu\n",
2613 (unsigned long long)rec->ino);
2615 btrfs_init_path(&path);
2616 key.objectid = backref->dir;
2617 key.type = BTRFS_DIR_INDEX_KEY;
2618 key.offset = backref->index;
2619 ret = btrfs_insert_empty_item(trans, root, &path, &key, data_size);
2622 leaf = path.nodes[0];
2623 dir_item = btrfs_item_ptr(leaf, path.slots[0], struct btrfs_dir_item);
2625 disk_key.objectid = cpu_to_le64(rec->ino);
2626 disk_key.type = BTRFS_INODE_ITEM_KEY;
2627 disk_key.offset = 0;
2629 btrfs_set_dir_item_key(leaf, dir_item, &disk_key);
2630 btrfs_set_dir_type(leaf, dir_item, imode_to_type(rec->imode));
2631 btrfs_set_dir_data_len(leaf, dir_item, 0);
2632 btrfs_set_dir_name_len(leaf, dir_item, backref->namelen);
2633 name_ptr = (unsigned long)(dir_item + 1);
2634 write_extent_buffer(leaf, backref->name, name_ptr, backref->namelen);
2635 btrfs_mark_buffer_dirty(leaf);
2636 btrfs_release_path(&path);
2637 btrfs_commit_transaction(trans, root);
2639 backref->found_dir_index = 1;
2640 dir_rec = get_inode_rec(inode_cache, backref->dir, 0);
2641 BUG_ON(IS_ERR(dir_rec));
2644 dir_rec->found_size += backref->namelen;
2645 if (dir_rec->found_size == dir_rec->isize &&
2646 (dir_rec->errors & I_ERR_DIR_ISIZE_WRONG))
2647 dir_rec->errors &= ~I_ERR_DIR_ISIZE_WRONG;
2648 if (dir_rec->found_size != dir_rec->isize)
2649 dir_rec->errors |= I_ERR_DIR_ISIZE_WRONG;
2654 static int delete_dir_index(struct btrfs_root *root,
2655 struct inode_backref *backref)
2657 struct btrfs_trans_handle *trans;
2658 struct btrfs_dir_item *di;
2659 struct btrfs_path path;
2662 trans = btrfs_start_transaction(root, 1);
2664 return PTR_ERR(trans);
2666 fprintf(stderr, "Deleting bad dir index [%llu,%u,%llu] root %llu\n",
2667 (unsigned long long)backref->dir,
2668 BTRFS_DIR_INDEX_KEY, (unsigned long long)backref->index,
2669 (unsigned long long)root->objectid);
2671 btrfs_init_path(&path);
2672 di = btrfs_lookup_dir_index(trans, root, &path, backref->dir,
2673 backref->name, backref->namelen,
2674 backref->index, -1);
2677 btrfs_release_path(&path);
2678 btrfs_commit_transaction(trans, root);
2685 ret = btrfs_del_item(trans, root, &path);
2687 ret = btrfs_delete_one_dir_name(trans, root, &path, di);
2689 btrfs_release_path(&path);
2690 btrfs_commit_transaction(trans, root);
2694 static int __create_inode_item(struct btrfs_trans_handle *trans,
2695 struct btrfs_root *root, u64 ino, u64 size,
2696 u64 nbytes, u64 nlink, u32 mode)
2698 struct btrfs_inode_item ii;
2699 time_t now = time(NULL);
2702 btrfs_set_stack_inode_size(&ii, size);
2703 btrfs_set_stack_inode_nbytes(&ii, nbytes);
2704 btrfs_set_stack_inode_nlink(&ii, nlink);
2705 btrfs_set_stack_inode_mode(&ii, mode);
2706 btrfs_set_stack_inode_generation(&ii, trans->transid);
2707 btrfs_set_stack_timespec_nsec(&ii.atime, 0);
2708 btrfs_set_stack_timespec_sec(&ii.ctime, now);
2709 btrfs_set_stack_timespec_nsec(&ii.ctime, 0);
2710 btrfs_set_stack_timespec_sec(&ii.mtime, now);
2711 btrfs_set_stack_timespec_nsec(&ii.mtime, 0);
2712 btrfs_set_stack_timespec_sec(&ii.otime, 0);
2713 btrfs_set_stack_timespec_nsec(&ii.otime, 0);
2715 ret = btrfs_insert_inode(trans, root, ino, &ii);
2718 warning("root %llu inode %llu recreating inode item, this may "
2719 "be incomplete, please check permissions and content after "
2720 "the fsck completes.\n", (unsigned long long)root->objectid,
2721 (unsigned long long)ino);
2726 static int create_inode_item_lowmem(struct btrfs_trans_handle *trans,
2727 struct btrfs_root *root, u64 ino,
2730 u32 mode = (filetype == BTRFS_FT_DIR ? S_IFDIR : S_IFREG) | 0755;
2732 return __create_inode_item(trans, root, ino, 0, 0, 0, mode);
2735 static int create_inode_item(struct btrfs_root *root,
2736 struct inode_record *rec, int root_dir)
2738 struct btrfs_trans_handle *trans;
2744 trans = btrfs_start_transaction(root, 1);
2745 if (IS_ERR(trans)) {
2746 ret = PTR_ERR(trans);
2750 nlink = root_dir ? 1 : rec->found_link;
2751 if (rec->found_dir_item) {
2752 if (rec->found_file_extent)
2753 fprintf(stderr, "root %llu inode %llu has both a dir "
2754 "item and extents, unsure if it is a dir or a "
2755 "regular file so setting it as a directory\n",
2756 (unsigned long long)root->objectid,
2757 (unsigned long long)rec->ino);
2758 mode = S_IFDIR | 0755;
2759 size = rec->found_size;
2760 } else if (!rec->found_dir_item) {
2761 size = rec->extent_end;
2762 mode = S_IFREG | 0755;
2765 ret = __create_inode_item(trans, root, rec->ino, size, rec->nbytes,
2767 btrfs_commit_transaction(trans, root);
2771 static int repair_inode_backrefs(struct btrfs_root *root,
2772 struct inode_record *rec,
2773 struct cache_tree *inode_cache,
2776 struct inode_backref *tmp, *backref;
2777 u64 root_dirid = btrfs_root_dirid(&root->root_item);
2781 list_for_each_entry_safe(backref, tmp, &rec->backrefs, list) {
2782 if (!delete && rec->ino == root_dirid) {
2783 if (!rec->found_inode_item) {
2784 ret = create_inode_item(root, rec, 1);
2791 /* Index 0 for root dir's are special, don't mess with it */
2792 if (rec->ino == root_dirid && backref->index == 0)
2796 ((backref->found_dir_index && !backref->found_inode_ref) ||
2797 (backref->found_dir_index && backref->found_inode_ref &&
2798 (backref->errors & REF_ERR_INDEX_UNMATCH)))) {
2799 ret = delete_dir_index(root, backref);
2803 list_del(&backref->list);
2808 if (!delete && !backref->found_dir_index &&
2809 backref->found_dir_item && backref->found_inode_ref) {
2810 ret = add_missing_dir_index(root, inode_cache, rec,
2815 if (backref->found_dir_item &&
2816 backref->found_dir_index) {
2817 if (!backref->errors &&
2818 backref->found_inode_ref) {
2819 list_del(&backref->list);
2826 if (!delete && (!backref->found_dir_index &&
2827 !backref->found_dir_item &&
2828 backref->found_inode_ref)) {
2829 struct btrfs_trans_handle *trans;
2830 struct btrfs_key location;
2832 ret = check_dir_conflict(root, backref->name,
2838 * let nlink fixing routine to handle it,
2839 * which can do it better.
2844 location.objectid = rec->ino;
2845 location.type = BTRFS_INODE_ITEM_KEY;
2846 location.offset = 0;
2848 trans = btrfs_start_transaction(root, 1);
2849 if (IS_ERR(trans)) {
2850 ret = PTR_ERR(trans);
2853 fprintf(stderr, "adding missing dir index/item pair "
2855 (unsigned long long)rec->ino);
2856 ret = btrfs_insert_dir_item(trans, root, backref->name,
2858 backref->dir, &location,
2859 imode_to_type(rec->imode),
2862 btrfs_commit_transaction(trans, root);
2866 if (!delete && (backref->found_inode_ref &&
2867 backref->found_dir_index &&
2868 backref->found_dir_item &&
2869 !(backref->errors & REF_ERR_INDEX_UNMATCH) &&
2870 !rec->found_inode_item)) {
2871 ret = create_inode_item(root, rec, 0);
2878 return ret ? ret : repaired;
2882 * To determine the file type for nlink/inode_item repair
2884 * Return 0 if file type is found and BTRFS_FT_* is stored into type.
2885 * Return -ENOENT if file type is not found.
2887 static int find_file_type(struct inode_record *rec, u8 *type)
2889 struct inode_backref *backref;
2891 /* For inode item recovered case */
2892 if (rec->found_inode_item) {
2893 *type = imode_to_type(rec->imode);
2897 list_for_each_entry(backref, &rec->backrefs, list) {
2898 if (backref->found_dir_index || backref->found_dir_item) {
2899 *type = backref->filetype;
2907 * To determine the file name for nlink repair
2909 * Return 0 if file name is found, set name and namelen.
2910 * Return -ENOENT if file name is not found.
2912 static int find_file_name(struct inode_record *rec,
2913 char *name, int *namelen)
2915 struct inode_backref *backref;
2917 list_for_each_entry(backref, &rec->backrefs, list) {
2918 if (backref->found_dir_index || backref->found_dir_item ||
2919 backref->found_inode_ref) {
2920 memcpy(name, backref->name, backref->namelen);
2921 *namelen = backref->namelen;
2928 /* Reset the nlink of the inode to the correct one */
2929 static int reset_nlink(struct btrfs_trans_handle *trans,
2930 struct btrfs_root *root,
2931 struct btrfs_path *path,
2932 struct inode_record *rec)
2934 struct inode_backref *backref;
2935 struct inode_backref *tmp;
2936 struct btrfs_key key;
2937 struct btrfs_inode_item *inode_item;
2940 /* We don't believe this either, reset it and iterate backref */
2941 rec->found_link = 0;
2943 /* Remove all backref including the valid ones */
2944 list_for_each_entry_safe(backref, tmp, &rec->backrefs, list) {
2945 ret = btrfs_unlink(trans, root, rec->ino, backref->dir,
2946 backref->index, backref->name,
2947 backref->namelen, 0);
2951 /* remove invalid backref, so it won't be added back */
2952 if (!(backref->found_dir_index &&
2953 backref->found_dir_item &&
2954 backref->found_inode_ref)) {
2955 list_del(&backref->list);
2962 /* Set nlink to 0 */
2963 key.objectid = rec->ino;
2964 key.type = BTRFS_INODE_ITEM_KEY;
2966 ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
2973 inode_item = btrfs_item_ptr(path->nodes[0], path->slots[0],
2974 struct btrfs_inode_item);
2975 btrfs_set_inode_nlink(path->nodes[0], inode_item, 0);
2976 btrfs_mark_buffer_dirty(path->nodes[0]);
2977 btrfs_release_path(path);
2980 * Add back valid inode_ref/dir_item/dir_index,
2981 * add_link() will handle the nlink inc, so new nlink must be correct
2983 list_for_each_entry(backref, &rec->backrefs, list) {
2984 ret = btrfs_add_link(trans, root, rec->ino, backref->dir,
2985 backref->name, backref->namelen,
2986 backref->filetype, &backref->index, 1, 0);
2991 btrfs_release_path(path);
2995 static int get_highest_inode(struct btrfs_trans_handle *trans,
2996 struct btrfs_root *root,
2997 struct btrfs_path *path,
3000 struct btrfs_key key, found_key;
3003 btrfs_init_path(path);
3004 key.objectid = BTRFS_LAST_FREE_OBJECTID;
3006 key.type = BTRFS_INODE_ITEM_KEY;
3007 ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
3009 btrfs_item_key_to_cpu(path->nodes[0], &found_key,
3010 path->slots[0] - 1);
3011 *highest_ino = found_key.objectid;
3014 if (*highest_ino >= BTRFS_LAST_FREE_OBJECTID)
3016 btrfs_release_path(path);
3020 static int repair_inode_nlinks(struct btrfs_trans_handle *trans,
3021 struct btrfs_root *root,
3022 struct btrfs_path *path,
3023 struct inode_record *rec)
3025 char *dir_name = "lost+found";
3026 char namebuf[BTRFS_NAME_LEN] = {0};
3031 int name_recovered = 0;
3032 int type_recovered = 0;
3036 * Get file name and type first before these invalid inode ref
3037 * are deleted by remove_all_invalid_backref()
3039 name_recovered = !find_file_name(rec, namebuf, &namelen);
3040 type_recovered = !find_file_type(rec, &type);
3042 if (!name_recovered) {
3043 printf("Can't get file name for inode %llu, using '%llu' as fallback\n",
3044 rec->ino, rec->ino);
3045 namelen = count_digits(rec->ino);
3046 sprintf(namebuf, "%llu", rec->ino);
3049 if (!type_recovered) {
3050 printf("Can't get file type for inode %llu, using FILE as fallback\n",
3052 type = BTRFS_FT_REG_FILE;
3056 ret = reset_nlink(trans, root, path, rec);
3059 "Failed to reset nlink for inode %llu: %s\n",
3060 rec->ino, strerror(-ret));
3064 if (rec->found_link == 0) {
3065 ret = get_highest_inode(trans, root, path, &lost_found_ino);
3069 ret = btrfs_mkdir(trans, root, dir_name, strlen(dir_name),
3070 BTRFS_FIRST_FREE_OBJECTID, &lost_found_ino,
3073 fprintf(stderr, "Failed to create '%s' dir: %s\n",
3074 dir_name, strerror(-ret));
3077 ret = btrfs_add_link(trans, root, rec->ino, lost_found_ino,
3078 namebuf, namelen, type, NULL, 1, 0);
3080 * Add ".INO" suffix several times to handle case where
3081 * "FILENAME.INO" is already taken by another file.
3083 while (ret == -EEXIST) {
3085 * Conflicting file name, add ".INO" as suffix * +1 for '.'
3087 if (namelen + count_digits(rec->ino) + 1 >
3092 snprintf(namebuf + namelen, BTRFS_NAME_LEN - namelen,
3094 namelen += count_digits(rec->ino) + 1;
3095 ret = btrfs_add_link(trans, root, rec->ino,
3096 lost_found_ino, namebuf,
3097 namelen, type, NULL, 1, 0);
3101 "Failed to link the inode %llu to %s dir: %s\n",
3102 rec->ino, dir_name, strerror(-ret));
3106 * Just increase the found_link, don't actually add the
3107 * backref. This will make things easier and this inode
3108 * record will be freed after the repair is done.
3109 * So fsck will not report problem about this inode.
3112 printf("Moving file '%.*s' to '%s' dir since it has no valid backref\n",
3113 namelen, namebuf, dir_name);
3115 printf("Fixed the nlink of inode %llu\n", rec->ino);
3118 * Clear the flag anyway, or we will loop forever for the same inode
3119 * as it will not be removed from the bad inode list and the dead loop
3122 rec->errors &= ~I_ERR_LINK_COUNT_WRONG;
3123 btrfs_release_path(path);
3128 * Check if there is any normal(reg or prealloc) file extent for given
3130 * This is used to determine the file type when neither its dir_index/item or
3131 * inode_item exists.
3133 * This will *NOT* report error, if any error happens, just consider it does
3134 * not have any normal file extent.
3136 static int find_normal_file_extent(struct btrfs_root *root, u64 ino)
3138 struct btrfs_path path;
3139 struct btrfs_key key;
3140 struct btrfs_key found_key;
3141 struct btrfs_file_extent_item *fi;
3145 btrfs_init_path(&path);
3147 key.type = BTRFS_EXTENT_DATA_KEY;
3150 ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
3155 if (ret && path.slots[0] >= btrfs_header_nritems(path.nodes[0])) {
3156 ret = btrfs_next_leaf(root, &path);
3163 btrfs_item_key_to_cpu(path.nodes[0], &found_key,
3165 if (found_key.objectid != ino ||
3166 found_key.type != BTRFS_EXTENT_DATA_KEY)
3168 fi = btrfs_item_ptr(path.nodes[0], path.slots[0],
3169 struct btrfs_file_extent_item);
3170 type = btrfs_file_extent_type(path.nodes[0], fi);
3171 if (type != BTRFS_FILE_EXTENT_INLINE) {
3177 btrfs_release_path(&path);
3181 static u32 btrfs_type_to_imode(u8 type)
3183 static u32 imode_by_btrfs_type[] = {
3184 [BTRFS_FT_REG_FILE] = S_IFREG,
3185 [BTRFS_FT_DIR] = S_IFDIR,
3186 [BTRFS_FT_CHRDEV] = S_IFCHR,
3187 [BTRFS_FT_BLKDEV] = S_IFBLK,
3188 [BTRFS_FT_FIFO] = S_IFIFO,
3189 [BTRFS_FT_SOCK] = S_IFSOCK,
3190 [BTRFS_FT_SYMLINK] = S_IFLNK,
3193 return imode_by_btrfs_type[(type)];
3196 static int repair_inode_no_item(struct btrfs_trans_handle *trans,
3197 struct btrfs_root *root,
3198 struct btrfs_path *path,
3199 struct inode_record *rec)
3203 int type_recovered = 0;
3206 printf("Trying to rebuild inode:%llu\n", rec->ino);
3208 type_recovered = !find_file_type(rec, &filetype);
3211 * Try to determine inode type if type not found.
3213 * For found regular file extent, it must be FILE.
3214 * For found dir_item/index, it must be DIR.
3216 * For undetermined one, use FILE as fallback.
3219 * 1. If found backref(inode_index/item is already handled) to it,
3221 * Need new inode-inode ref structure to allow search for that.
3223 if (!type_recovered) {
3224 if (rec->found_file_extent &&
3225 find_normal_file_extent(root, rec->ino)) {
3227 filetype = BTRFS_FT_REG_FILE;
3228 } else if (rec->found_dir_item) {
3230 filetype = BTRFS_FT_DIR;
3231 } else if (!list_empty(&rec->orphan_extents)) {
3233 filetype = BTRFS_FT_REG_FILE;
3235 printf("Can't determine the filetype for inode %llu, assume it is a normal file\n",
3238 filetype = BTRFS_FT_REG_FILE;
3242 ret = btrfs_new_inode(trans, root, rec->ino,
3243 mode | btrfs_type_to_imode(filetype));
3248 * Here inode rebuild is done, we only rebuild the inode item,
3249 * don't repair the nlink(like move to lost+found).
3250 * That is the job of nlink repair.
3252 * We just fill the record and return
3254 rec->found_dir_item = 1;
3255 rec->imode = mode | btrfs_type_to_imode(filetype);
3257 rec->errors &= ~I_ERR_NO_INODE_ITEM;
3258 /* Ensure the inode_nlinks repair function will be called */
3259 rec->errors |= I_ERR_LINK_COUNT_WRONG;
3264 static int repair_inode_orphan_extent(struct btrfs_trans_handle *trans,
3265 struct btrfs_root *root,
3266 struct btrfs_path *path,
3267 struct inode_record *rec)
3269 struct orphan_data_extent *orphan;
3270 struct orphan_data_extent *tmp;
3273 list_for_each_entry_safe(orphan, tmp, &rec->orphan_extents, list) {
3275 * Check for conflicting file extents
3277 * Here we don't know whether the extents is compressed or not,
3278 * so we can only assume it not compressed nor data offset,
3279 * and use its disk_len as extent length.
3281 ret = btrfs_get_extent(NULL, root, path, orphan->objectid,
3282 orphan->offset, orphan->disk_len, 0);
3283 btrfs_release_path(path);
3288 "orphan extent (%llu, %llu) conflicts, delete the orphan\n",
3289 orphan->disk_bytenr, orphan->disk_len);
3290 ret = btrfs_free_extent(trans,
3291 root->fs_info->extent_root,
3292 orphan->disk_bytenr, orphan->disk_len,
3293 0, root->objectid, orphan->objectid,
3298 ret = btrfs_insert_file_extent(trans, root, orphan->objectid,
3299 orphan->offset, orphan->disk_bytenr,
3300 orphan->disk_len, orphan->disk_len);
3304 /* Update file size info */
3305 rec->found_size += orphan->disk_len;
3306 if (rec->found_size == rec->nbytes)
3307 rec->errors &= ~I_ERR_FILE_NBYTES_WRONG;
3309 /* Update the file extent hole info too */
3310 ret = del_file_extent_hole(&rec->holes, orphan->offset,
3314 if (RB_EMPTY_ROOT(&rec->holes))
3315 rec->errors &= ~I_ERR_FILE_EXTENT_DISCOUNT;
3317 list_del(&orphan->list);
3320 rec->errors &= ~I_ERR_FILE_EXTENT_ORPHAN;
3325 static int repair_inode_discount_extent(struct btrfs_trans_handle *trans,
3326 struct btrfs_root *root,
3327 struct btrfs_path *path,
3328 struct inode_record *rec)
3330 struct rb_node *node;
3331 struct file_extent_hole *hole;
3335 node = rb_first(&rec->holes);
3339 hole = rb_entry(node, struct file_extent_hole, node);
3340 ret = btrfs_punch_hole(trans, root, rec->ino,
3341 hole->start, hole->len);
3344 ret = del_file_extent_hole(&rec->holes, hole->start,
3348 if (RB_EMPTY_ROOT(&rec->holes))
3349 rec->errors &= ~I_ERR_FILE_EXTENT_DISCOUNT;
3350 node = rb_first(&rec->holes);
3352 /* special case for a file losing all its file extent */
3354 ret = btrfs_punch_hole(trans, root, rec->ino, 0,
3355 round_up(rec->isize,
3356 root->fs_info->sectorsize));
3360 printf("Fixed discount file extents for inode: %llu in root: %llu\n",
3361 rec->ino, root->objectid);
3366 static int try_repair_inode(struct btrfs_root *root, struct inode_record *rec)
3368 struct btrfs_trans_handle *trans;
3369 struct btrfs_path path;
3372 if (!(rec->errors & (I_ERR_DIR_ISIZE_WRONG |
3373 I_ERR_NO_ORPHAN_ITEM |
3374 I_ERR_LINK_COUNT_WRONG |
3375 I_ERR_NO_INODE_ITEM |
3376 I_ERR_FILE_EXTENT_ORPHAN |
3377 I_ERR_FILE_EXTENT_DISCOUNT|
3378 I_ERR_FILE_NBYTES_WRONG)))
3382 * For nlink repair, it may create a dir and add link, so
3383 * 2 for parent(256)'s dir_index and dir_item
3384 * 2 for lost+found dir's inode_item and inode_ref
3385 * 1 for the new inode_ref of the file
3386 * 2 for lost+found dir's dir_index and dir_item for the file
3388 trans = btrfs_start_transaction(root, 7);
3390 return PTR_ERR(trans);
3392 btrfs_init_path(&path);
3393 if (rec->errors & I_ERR_NO_INODE_ITEM)
3394 ret = repair_inode_no_item(trans, root, &path, rec);
3395 if (!ret && rec->errors & I_ERR_FILE_EXTENT_ORPHAN)
3396 ret = repair_inode_orphan_extent(trans, root, &path, rec);
3397 if (!ret && rec->errors & I_ERR_FILE_EXTENT_DISCOUNT)
3398 ret = repair_inode_discount_extent(trans, root, &path, rec);
3399 if (!ret && rec->errors & I_ERR_DIR_ISIZE_WRONG)
3400 ret = repair_inode_isize(trans, root, &path, rec);
3401 if (!ret && rec->errors & I_ERR_NO_ORPHAN_ITEM)
3402 ret = repair_inode_orphan_item(trans, root, &path, rec);
3403 if (!ret && rec->errors & I_ERR_LINK_COUNT_WRONG)
3404 ret = repair_inode_nlinks(trans, root, &path, rec);
3405 if (!ret && rec->errors & I_ERR_FILE_NBYTES_WRONG)
3406 ret = repair_inode_nbytes(trans, root, &path, rec);
3407 btrfs_commit_transaction(trans, root);
3408 btrfs_release_path(&path);
3412 static int check_inode_recs(struct btrfs_root *root,
3413 struct cache_tree *inode_cache)
3415 struct cache_extent *cache;
3416 struct ptr_node *node;
3417 struct inode_record *rec;
3418 struct inode_backref *backref;
3423 u64 root_dirid = btrfs_root_dirid(&root->root_item);
3425 if (btrfs_root_refs(&root->root_item) == 0) {
3426 if (!cache_tree_empty(inode_cache))
3427 fprintf(stderr, "warning line %d\n", __LINE__);
3432 * We need to repair backrefs first because we could change some of the
3433 * errors in the inode recs.
3435 * We also need to go through and delete invalid backrefs first and then
3436 * add the correct ones second. We do this because we may get EEXIST
3437 * when adding back the correct index because we hadn't yet deleted the
3440 * For example, if we were missing a dir index then the directories
3441 * isize would be wrong, so if we fixed the isize to what we thought it
3442 * would be and then fixed the backref we'd still have a invalid fs, so
3443 * we need to add back the dir index and then check to see if the isize
3448 if (stage == 3 && !err)
3451 cache = search_cache_extent(inode_cache, 0);
3452 while (repair && cache) {
3453 node = container_of(cache, struct ptr_node, cache);
3455 cache = next_cache_extent(cache);
3457 /* Need to free everything up and rescan */
3459 remove_cache_extent(inode_cache, &node->cache);
3461 free_inode_rec(rec);
3465 if (list_empty(&rec->backrefs))
3468 ret = repair_inode_backrefs(root, rec, inode_cache,
3482 rec = get_inode_rec(inode_cache, root_dirid, 0);
3483 BUG_ON(IS_ERR(rec));
3485 ret = check_root_dir(rec);
3487 fprintf(stderr, "root %llu root dir %llu error\n",
3488 (unsigned long long)root->root_key.objectid,
3489 (unsigned long long)root_dirid);
3490 print_inode_error(root, rec);
3495 struct btrfs_trans_handle *trans;
3497 trans = btrfs_start_transaction(root, 1);
3498 if (IS_ERR(trans)) {
3499 err = PTR_ERR(trans);
3504 "root %llu missing its root dir, recreating\n",
3505 (unsigned long long)root->objectid);
3507 ret = btrfs_make_root_dir(trans, root, root_dirid);
3510 btrfs_commit_transaction(trans, root);
3514 fprintf(stderr, "root %llu root dir %llu not found\n",
3515 (unsigned long long)root->root_key.objectid,
3516 (unsigned long long)root_dirid);
3520 cache = search_cache_extent(inode_cache, 0);
3523 node = container_of(cache, struct ptr_node, cache);
3525 remove_cache_extent(inode_cache, &node->cache);
3527 if (rec->ino == root_dirid ||
3528 rec->ino == BTRFS_ORPHAN_OBJECTID) {
3529 free_inode_rec(rec);
3533 if (rec->errors & I_ERR_NO_ORPHAN_ITEM) {
3534 ret = check_orphan_item(root, rec->ino);
3536 rec->errors &= ~I_ERR_NO_ORPHAN_ITEM;
3537 if (can_free_inode_rec(rec)) {
3538 free_inode_rec(rec);
3543 if (!rec->found_inode_item)
3544 rec->errors |= I_ERR_NO_INODE_ITEM;
3545 if (rec->found_link != rec->nlink)
3546 rec->errors |= I_ERR_LINK_COUNT_WRONG;
3548 ret = try_repair_inode(root, rec);
3549 if (ret == 0 && can_free_inode_rec(rec)) {
3550 free_inode_rec(rec);
3556 if (!(repair && ret == 0))
3558 print_inode_error(root, rec);
3559 list_for_each_entry(backref, &rec->backrefs, list) {
3560 if (!backref->found_dir_item)
3561 backref->errors |= REF_ERR_NO_DIR_ITEM;
3562 if (!backref->found_dir_index)
3563 backref->errors |= REF_ERR_NO_DIR_INDEX;
3564 if (!backref->found_inode_ref)
3565 backref->errors |= REF_ERR_NO_INODE_REF;
3566 fprintf(stderr, "\tunresolved ref dir %llu index %llu"
3567 " namelen %u name %s filetype %d errors %x",
3568 (unsigned long long)backref->dir,
3569 (unsigned long long)backref->index,
3570 backref->namelen, backref->name,
3571 backref->filetype, backref->errors);
3572 print_ref_error(backref->errors);
3574 free_inode_rec(rec);
3576 return (error > 0) ? -1 : 0;
3579 static struct root_record *get_root_rec(struct cache_tree *root_cache,
3582 struct cache_extent *cache;
3583 struct root_record *rec = NULL;
3586 cache = lookup_cache_extent(root_cache, objectid, 1);
3588 rec = container_of(cache, struct root_record, cache);
3590 rec = calloc(1, sizeof(*rec));
3592 return ERR_PTR(-ENOMEM);
3593 rec->objectid = objectid;
3594 INIT_LIST_HEAD(&rec->backrefs);
3595 rec->cache.start = objectid;
3596 rec->cache.size = 1;
3598 ret = insert_cache_extent(root_cache, &rec->cache);
3600 return ERR_PTR(-EEXIST);
3605 static struct root_backref *get_root_backref(struct root_record *rec,
3606 u64 ref_root, u64 dir, u64 index,
3607 const char *name, int namelen)
3609 struct root_backref *backref;
3611 list_for_each_entry(backref, &rec->backrefs, list) {
3612 if (backref->ref_root != ref_root || backref->dir != dir ||
3613 backref->namelen != namelen)
3615 if (memcmp(name, backref->name, namelen))
3620 backref = calloc(1, sizeof(*backref) + namelen + 1);
3623 backref->ref_root = ref_root;
3625 backref->index = index;
3626 backref->namelen = namelen;
3627 memcpy(backref->name, name, namelen);
3628 backref->name[namelen] = '\0';
3629 list_add_tail(&backref->list, &rec->backrefs);
3633 static void free_root_record(struct cache_extent *cache)
3635 struct root_record *rec;
3636 struct root_backref *backref;
3638 rec = container_of(cache, struct root_record, cache);
3639 while (!list_empty(&rec->backrefs)) {
3640 backref = to_root_backref(rec->backrefs.next);
3641 list_del(&backref->list);
3648 FREE_EXTENT_CACHE_BASED_TREE(root_recs, free_root_record);
3650 static int add_root_backref(struct cache_tree *root_cache,
3651 u64 root_id, u64 ref_root, u64 dir, u64 index,
3652 const char *name, int namelen,
3653 int item_type, int errors)
3655 struct root_record *rec;
3656 struct root_backref *backref;
3658 rec = get_root_rec(root_cache, root_id);
3659 BUG_ON(IS_ERR(rec));
3660 backref = get_root_backref(rec, ref_root, dir, index, name, namelen);
3663 backref->errors |= errors;
3665 if (item_type != BTRFS_DIR_ITEM_KEY) {
3666 if (backref->found_dir_index || backref->found_back_ref ||
3667 backref->found_forward_ref) {
3668 if (backref->index != index)
3669 backref->errors |= REF_ERR_INDEX_UNMATCH;
3671 backref->index = index;
3675 if (item_type == BTRFS_DIR_ITEM_KEY) {
3676 if (backref->found_forward_ref)
3678 backref->found_dir_item = 1;
3679 } else if (item_type == BTRFS_DIR_INDEX_KEY) {
3680 backref->found_dir_index = 1;
3681 } else if (item_type == BTRFS_ROOT_REF_KEY) {
3682 if (backref->found_forward_ref)
3683 backref->errors |= REF_ERR_DUP_ROOT_REF;
3684 else if (backref->found_dir_item)
3686 backref->found_forward_ref = 1;
3687 } else if (item_type == BTRFS_ROOT_BACKREF_KEY) {
3688 if (backref->found_back_ref)
3689 backref->errors |= REF_ERR_DUP_ROOT_BACKREF;
3690 backref->found_back_ref = 1;
3695 if (backref->found_forward_ref && backref->found_dir_item)
3696 backref->reachable = 1;
3700 static int merge_root_recs(struct btrfs_root *root,
3701 struct cache_tree *src_cache,
3702 struct cache_tree *dst_cache)
3704 struct cache_extent *cache;
3705 struct ptr_node *node;
3706 struct inode_record *rec;
3707 struct inode_backref *backref;
3710 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) {
3711 free_inode_recs_tree(src_cache);
3716 cache = search_cache_extent(src_cache, 0);
3719 node = container_of(cache, struct ptr_node, cache);
3721 remove_cache_extent(src_cache, &node->cache);
3724 ret = is_child_root(root, root->objectid, rec->ino);
3730 list_for_each_entry(backref, &rec->backrefs, list) {
3731 BUG_ON(backref->found_inode_ref);
3732 if (backref->found_dir_item)
3733 add_root_backref(dst_cache, rec->ino,
3734 root->root_key.objectid, backref->dir,
3735 backref->index, backref->name,
3736 backref->namelen, BTRFS_DIR_ITEM_KEY,
3738 if (backref->found_dir_index)
3739 add_root_backref(dst_cache, rec->ino,
3740 root->root_key.objectid, backref->dir,
3741 backref->index, backref->name,
3742 backref->namelen, BTRFS_DIR_INDEX_KEY,
3746 free_inode_rec(rec);
3753 static int check_root_refs(struct btrfs_root *root,
3754 struct cache_tree *root_cache)
3756 struct root_record *rec;
3757 struct root_record *ref_root;
3758 struct root_backref *backref;
3759 struct cache_extent *cache;
3765 rec = get_root_rec(root_cache, BTRFS_FS_TREE_OBJECTID);
3766 BUG_ON(IS_ERR(rec));
3769 /* fixme: this can not detect circular references */
3772 cache = search_cache_extent(root_cache, 0);
3776 rec = container_of(cache, struct root_record, cache);
3777 cache = next_cache_extent(cache);
3779 if (rec->found_ref == 0)
3782 list_for_each_entry(backref, &rec->backrefs, list) {
3783 if (!backref->reachable)
3786 ref_root = get_root_rec(root_cache,
3788 BUG_ON(IS_ERR(ref_root));
3789 if (ref_root->found_ref > 0)
3792 backref->reachable = 0;
3794 if (rec->found_ref == 0)
3800 cache = search_cache_extent(root_cache, 0);
3804 rec = container_of(cache, struct root_record, cache);
3805 cache = next_cache_extent(cache);
3807 if (rec->found_ref == 0 &&
3808 rec->objectid >= BTRFS_FIRST_FREE_OBJECTID &&
3809 rec->objectid <= BTRFS_LAST_FREE_OBJECTID) {
3810 ret = check_orphan_item(root->fs_info->tree_root,
3816 * If we don't have a root item then we likely just have
3817 * a dir item in a snapshot for this root but no actual
3818 * ref key or anything so it's meaningless.
3820 if (!rec->found_root_item)
3823 fprintf(stderr, "fs tree %llu not referenced\n",
3824 (unsigned long long)rec->objectid);
3828 if (rec->found_ref > 0 && !rec->found_root_item)
3830 list_for_each_entry(backref, &rec->backrefs, list) {
3831 if (!backref->found_dir_item)
3832 backref->errors |= REF_ERR_NO_DIR_ITEM;
3833 if (!backref->found_dir_index)
3834 backref->errors |= REF_ERR_NO_DIR_INDEX;
3835 if (!backref->found_back_ref)
3836 backref->errors |= REF_ERR_NO_ROOT_BACKREF;
3837 if (!backref->found_forward_ref)
3838 backref->errors |= REF_ERR_NO_ROOT_REF;
3839 if (backref->reachable && backref->errors)
3846 fprintf(stderr, "fs tree %llu refs %u %s\n",
3847 (unsigned long long)rec->objectid, rec->found_ref,
3848 rec->found_root_item ? "" : "not found");
3850 list_for_each_entry(backref, &rec->backrefs, list) {
3851 if (!backref->reachable)
3853 if (!backref->errors && rec->found_root_item)
3855 fprintf(stderr, "\tunresolved ref root %llu dir %llu"
3856 " index %llu namelen %u name %s errors %x\n",
3857 (unsigned long long)backref->ref_root,
3858 (unsigned long long)backref->dir,
3859 (unsigned long long)backref->index,
3860 backref->namelen, backref->name,
3862 print_ref_error(backref->errors);
3865 return errors > 0 ? 1 : 0;
3868 static int process_root_ref(struct extent_buffer *eb, int slot,
3869 struct btrfs_key *key,
3870 struct cache_tree *root_cache)
3876 struct btrfs_root_ref *ref;
3877 char namebuf[BTRFS_NAME_LEN];
3880 ref = btrfs_item_ptr(eb, slot, struct btrfs_root_ref);
3882 dirid = btrfs_root_ref_dirid(eb, ref);
3883 index = btrfs_root_ref_sequence(eb, ref);
3884 name_len = btrfs_root_ref_name_len(eb, ref);
3886 if (name_len <= BTRFS_NAME_LEN) {
3890 len = BTRFS_NAME_LEN;
3891 error = REF_ERR_NAME_TOO_LONG;
3893 read_extent_buffer(eb, namebuf, (unsigned long)(ref + 1), len);
3895 if (key->type == BTRFS_ROOT_REF_KEY) {
3896 add_root_backref(root_cache, key->offset, key->objectid, dirid,
3897 index, namebuf, len, key->type, error);
3899 add_root_backref(root_cache, key->objectid, key->offset, dirid,
3900 index, namebuf, len, key->type, error);
3905 static void free_corrupt_block(struct cache_extent *cache)
3907 struct btrfs_corrupt_block *corrupt;
3909 corrupt = container_of(cache, struct btrfs_corrupt_block, cache);
3913 FREE_EXTENT_CACHE_BASED_TREE(corrupt_blocks, free_corrupt_block);
3916 * Repair the btree of the given root.
3918 * The fix is to remove the node key in corrupt_blocks cache_tree.
3919 * and rebalance the tree.
3920 * After the fix, the btree should be writeable.
3922 static int repair_btree(struct btrfs_root *root,
3923 struct cache_tree *corrupt_blocks)
3925 struct btrfs_trans_handle *trans;
3926 struct btrfs_path path;
3927 struct btrfs_corrupt_block *corrupt;
3928 struct cache_extent *cache;
3929 struct btrfs_key key;
3934 if (cache_tree_empty(corrupt_blocks))
3937 trans = btrfs_start_transaction(root, 1);
3938 if (IS_ERR(trans)) {
3939 ret = PTR_ERR(trans);
3940 fprintf(stderr, "Error starting transaction: %s\n",
3944 btrfs_init_path(&path);
3945 cache = first_cache_extent(corrupt_blocks);
3947 corrupt = container_of(cache, struct btrfs_corrupt_block,
3949 level = corrupt->level;
3950 path.lowest_level = level;
3951 key.objectid = corrupt->key.objectid;
3952 key.type = corrupt->key.type;
3953 key.offset = corrupt->key.offset;
3956 * Here we don't want to do any tree balance, since it may
3957 * cause a balance with corrupted brother leaf/node,
3958 * so ins_len set to 0 here.
3959 * Balance will be done after all corrupt node/leaf is deleted.
3961 ret = btrfs_search_slot(trans, root, &key, &path, 0, 1);
3964 offset = btrfs_node_blockptr(path.nodes[level],
3967 /* Remove the ptr */
3968 ret = btrfs_del_ptr(root, &path, level, path.slots[level]);
3972 * Remove the corresponding extent
3973 * return value is not concerned.
3975 btrfs_release_path(&path);
3976 ret = btrfs_free_extent(trans, root, offset,
3977 root->fs_info->nodesize, 0,
3978 root->root_key.objectid, level - 1, 0);
3979 cache = next_cache_extent(cache);
3982 /* Balance the btree using btrfs_search_slot() */
3983 cache = first_cache_extent(corrupt_blocks);
3985 corrupt = container_of(cache, struct btrfs_corrupt_block,
3987 memcpy(&key, &corrupt->key, sizeof(key));
3988 ret = btrfs_search_slot(trans, root, &key, &path, -1, 1);
3991 /* return will always >0 since it won't find the item */
3993 btrfs_release_path(&path);
3994 cache = next_cache_extent(cache);
3997 btrfs_commit_transaction(trans, root);
3998 btrfs_release_path(&path);
4002 static int check_fs_root(struct btrfs_root *root,
4003 struct cache_tree *root_cache,
4004 struct walk_control *wc)
4010 struct btrfs_path path;
4011 struct shared_node root_node;
4012 struct root_record *rec;
4013 struct btrfs_root_item *root_item = &root->root_item;
4014 struct cache_tree corrupt_blocks;
4015 struct orphan_data_extent *orphan;
4016 struct orphan_data_extent *tmp;
4017 enum btrfs_tree_block_status status;
4018 struct node_refs nrefs;
4021 * Reuse the corrupt_block cache tree to record corrupted tree block
4023 * Unlike the usage in extent tree check, here we do it in a per
4024 * fs/subvol tree base.
4026 cache_tree_init(&corrupt_blocks);
4027 root->fs_info->corrupt_blocks = &corrupt_blocks;
4029 if (root->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID) {
4030 rec = get_root_rec(root_cache, root->root_key.objectid);
4031 BUG_ON(IS_ERR(rec));
4032 if (btrfs_root_refs(root_item) > 0)
4033 rec->found_root_item = 1;
4036 btrfs_init_path(&path);
4037 memset(&root_node, 0, sizeof(root_node));
4038 cache_tree_init(&root_node.root_cache);
4039 cache_tree_init(&root_node.inode_cache);
4040 memset(&nrefs, 0, sizeof(nrefs));
4042 /* Move the orphan extent record to corresponding inode_record */
4043 list_for_each_entry_safe(orphan, tmp,
4044 &root->orphan_data_extents, list) {
4045 struct inode_record *inode;
4047 inode = get_inode_rec(&root_node.inode_cache, orphan->objectid,
4049 BUG_ON(IS_ERR(inode));
4050 inode->errors |= I_ERR_FILE_EXTENT_ORPHAN;
4051 list_move(&orphan->list, &inode->orphan_extents);
4054 level = btrfs_header_level(root->node);
4055 memset(wc->nodes, 0, sizeof(wc->nodes));
4056 wc->nodes[level] = &root_node;
4057 wc->active_node = level;
4058 wc->root_level = level;
4060 /* We may not have checked the root block, lets do that now */
4061 if (btrfs_is_leaf(root->node))
4062 status = btrfs_check_leaf(root, NULL, root->node);
4064 status = btrfs_check_node(root, NULL, root->node);
4065 if (status != BTRFS_TREE_BLOCK_CLEAN)
4068 if (btrfs_root_refs(root_item) > 0 ||
4069 btrfs_disk_key_objectid(&root_item->drop_progress) == 0) {
4070 path.nodes[level] = root->node;
4071 extent_buffer_get(root->node);
4072 path.slots[level] = 0;
4074 struct btrfs_key key;
4075 struct btrfs_disk_key found_key;
4077 btrfs_disk_key_to_cpu(&key, &root_item->drop_progress);
4078 level = root_item->drop_level;
4079 path.lowest_level = level;
4080 if (level > btrfs_header_level(root->node) ||
4081 level >= BTRFS_MAX_LEVEL) {
4082 error("ignoring invalid drop level: %u", level);
4085 wret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
4088 btrfs_node_key(path.nodes[level], &found_key,
4090 WARN_ON(memcmp(&found_key, &root_item->drop_progress,
4091 sizeof(found_key)));
4095 wret = walk_down_tree(root, &path, wc, &level, &nrefs);
4101 wret = walk_up_tree(root, &path, wc, &level);
4108 btrfs_release_path(&path);
4110 if (!cache_tree_empty(&corrupt_blocks)) {
4111 struct cache_extent *cache;
4112 struct btrfs_corrupt_block *corrupt;
4114 printf("The following tree block(s) is corrupted in tree %llu:\n",
4115 root->root_key.objectid);
4116 cache = first_cache_extent(&corrupt_blocks);
4118 corrupt = container_of(cache,
4119 struct btrfs_corrupt_block,
4121 printf("\ttree block bytenr: %llu, level: %d, node key: (%llu, %u, %llu)\n",
4122 cache->start, corrupt->level,
4123 corrupt->key.objectid, corrupt->key.type,
4124 corrupt->key.offset);
4125 cache = next_cache_extent(cache);
4128 printf("Try to repair the btree for root %llu\n",
4129 root->root_key.objectid);
4130 ret = repair_btree(root, &corrupt_blocks);
4132 fprintf(stderr, "Failed to repair btree: %s\n",
4135 printf("Btree for root %llu is fixed\n",
4136 root->root_key.objectid);
4140 err = merge_root_recs(root, &root_node.root_cache, root_cache);
4144 if (root_node.current) {
4145 root_node.current->checked = 1;
4146 maybe_free_inode_rec(&root_node.inode_cache,
4150 err = check_inode_recs(root, &root_node.inode_cache);
4154 free_corrupt_blocks_tree(&corrupt_blocks);
4155 root->fs_info->corrupt_blocks = NULL;
4156 free_orphan_data_extents(&root->orphan_data_extents);
4160 static int fs_root_objectid(u64 objectid)
4162 if (objectid == BTRFS_TREE_RELOC_OBJECTID ||
4163 objectid == BTRFS_DATA_RELOC_TREE_OBJECTID)
4165 return is_fstree(objectid);
4168 static int check_fs_roots(struct btrfs_fs_info *fs_info,
4169 struct cache_tree *root_cache)
4171 struct btrfs_path path;
4172 struct btrfs_key key;
4173 struct walk_control wc;
4174 struct extent_buffer *leaf, *tree_node;
4175 struct btrfs_root *tmp_root;
4176 struct btrfs_root *tree_root = fs_info->tree_root;
4180 if (ctx.progress_enabled) {
4181 ctx.tp = TASK_FS_ROOTS;
4182 task_start(ctx.info);
4186 * Just in case we made any changes to the extent tree that weren't
4187 * reflected into the free space cache yet.
4190 reset_cached_block_groups(fs_info);
4191 memset(&wc, 0, sizeof(wc));
4192 cache_tree_init(&wc.shared);
4193 btrfs_init_path(&path);
4198 key.type = BTRFS_ROOT_ITEM_KEY;
4199 ret = btrfs_search_slot(NULL, tree_root, &key, &path, 0, 0);
4204 tree_node = tree_root->node;
4206 if (tree_node != tree_root->node) {
4207 free_root_recs_tree(root_cache);
4208 btrfs_release_path(&path);
4211 leaf = path.nodes[0];
4212 if (path.slots[0] >= btrfs_header_nritems(leaf)) {
4213 ret = btrfs_next_leaf(tree_root, &path);
4219 leaf = path.nodes[0];
4221 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
4222 if (key.type == BTRFS_ROOT_ITEM_KEY &&
4223 fs_root_objectid(key.objectid)) {
4224 if (key.objectid == BTRFS_TREE_RELOC_OBJECTID) {
4225 tmp_root = btrfs_read_fs_root_no_cache(
4228 key.offset = (u64)-1;
4229 tmp_root = btrfs_read_fs_root(
4232 if (IS_ERR(tmp_root)) {
4236 ret = check_fs_root(tmp_root, root_cache, &wc);
4237 if (ret == -EAGAIN) {
4238 free_root_recs_tree(root_cache);
4239 btrfs_release_path(&path);
4244 if (key.objectid == BTRFS_TREE_RELOC_OBJECTID)
4245 btrfs_free_fs_root(tmp_root);
4246 } else if (key.type == BTRFS_ROOT_REF_KEY ||
4247 key.type == BTRFS_ROOT_BACKREF_KEY) {
4248 process_root_ref(leaf, path.slots[0], &key,
4255 btrfs_release_path(&path);
4257 free_extent_cache_tree(&wc.shared);
4258 if (!cache_tree_empty(&wc.shared))
4259 fprintf(stderr, "warning line %d\n", __LINE__);
4261 task_stop(ctx.info);
4267 * Find the @index according by @ino and name.
4268 * Notice:time efficiency is O(N)
4270 * @root: the root of the fs/file tree
4271 * @index_ret: the index as return value
4272 * @namebuf: the name to match
4273 * @name_len: the length of name to match
4274 * @file_type: the file_type of INODE_ITEM to match
4276 * Returns 0 if found and *@index_ret will be modified with right value
4277 * Returns< 0 not found and *@index_ret will be (u64)-1
4279 static int find_dir_index(struct btrfs_root *root, u64 dirid, u64 location_id,
4280 u64 *index_ret, char *namebuf, u32 name_len,
4283 struct btrfs_path path;
4284 struct extent_buffer *node;
4285 struct btrfs_dir_item *di;
4286 struct btrfs_key key;
4287 struct btrfs_key location;
4288 char name[BTRFS_NAME_LEN] = {0};
4300 /* search from the last index */
4301 key.objectid = dirid;
4302 key.offset = (u64)-1;
4303 key.type = BTRFS_DIR_INDEX_KEY;
4305 btrfs_init_path(&path);
4306 ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
4311 ret = btrfs_previous_item(root, &path, dirid, BTRFS_DIR_INDEX_KEY);
4314 *index_ret = (64)-1;
4317 /* Check whether inode_id/filetype/name match */
4318 node = path.nodes[0];
4319 slot = path.slots[0];
4320 di = btrfs_item_ptr(node, slot, struct btrfs_dir_item);
4321 total = btrfs_item_size_nr(node, slot);
4322 while (cur < total) {
4324 len = btrfs_dir_name_len(node, di);
4325 data_len = btrfs_dir_data_len(node, di);
4327 btrfs_dir_item_key_to_cpu(node, di, &location);
4328 if (location.objectid != location_id ||
4329 location.type != BTRFS_INODE_ITEM_KEY ||
4330 location.offset != 0)
4333 filetype = btrfs_dir_type(node, di);
4334 if (file_type != filetype)
4337 if (len > BTRFS_NAME_LEN)
4338 len = BTRFS_NAME_LEN;
4340 read_extent_buffer(node, name, (unsigned long)(di + 1), len);
4341 if (len != name_len || strncmp(namebuf, name, len))
4344 btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
4345 *index_ret = key.offset;
4349 len += sizeof(*di) + data_len;
4350 di = (struct btrfs_dir_item *)((char *)di + len);
4356 btrfs_release_path(&path);
4361 * Find DIR_ITEM/DIR_INDEX for the given key and check it with the specified
4362 * INODE_REF/INODE_EXTREF match.
4364 * @root: the root of the fs/file tree
4365 * @key: the key of the DIR_ITEM/DIR_INDEX, key->offset will be right
4366 * value while find index
4367 * @location_key: location key of the struct btrfs_dir_item to match
4368 * @name: the name to match
4369 * @namelen: the length of name
4370 * @file_type: the type of file to math
4372 * Return 0 if no error occurred.
4373 * Return DIR_ITEM_MISSING/DIR_INDEX_MISSING if couldn't find
4374 * DIR_ITEM/DIR_INDEX
4375 * Return DIR_ITEM_MISMATCH/DIR_INDEX_MISMATCH if INODE_REF/INODE_EXTREF
4376 * and DIR_ITEM/DIR_INDEX mismatch
4378 static int find_dir_item(struct btrfs_root *root, struct btrfs_key *key,
4379 struct btrfs_key *location_key, char *name,
4380 u32 namelen, u8 file_type)
4382 struct btrfs_path path;
4383 struct extent_buffer *node;
4384 struct btrfs_dir_item *di;
4385 struct btrfs_key location;
4386 char namebuf[BTRFS_NAME_LEN] = {0};
4395 /* get the index by traversing all index */
4396 if (key->type == BTRFS_DIR_INDEX_KEY && key->offset == (u64)-1) {
4397 ret = find_dir_index(root, key->objectid,
4398 location_key->objectid, &key->offset,
4399 name, namelen, file_type);
4401 ret = DIR_INDEX_MISSING;
4405 btrfs_init_path(&path);
4406 ret = btrfs_search_slot(NULL, root, key, &path, 0, 0);
4408 ret = key->type == BTRFS_DIR_ITEM_KEY ? DIR_ITEM_MISSING :
4413 /* Check whether inode_id/filetype/name match */
4414 node = path.nodes[0];
4415 slot = path.slots[0];
4416 di = btrfs_item_ptr(node, slot, struct btrfs_dir_item);
4417 total = btrfs_item_size_nr(node, slot);
4418 while (cur < total) {
4419 ret = key->type == BTRFS_DIR_ITEM_KEY ?
4420 DIR_ITEM_MISMATCH : DIR_INDEX_MISMATCH;
4422 len = btrfs_dir_name_len(node, di);
4423 data_len = btrfs_dir_data_len(node, di);
4425 btrfs_dir_item_key_to_cpu(node, di, &location);
4426 if (location.objectid != location_key->objectid ||
4427 location.type != location_key->type ||
4428 location.offset != location_key->offset)
4431 filetype = btrfs_dir_type(node, di);
4432 if (file_type != filetype)
4435 if (len > BTRFS_NAME_LEN) {
4436 len = BTRFS_NAME_LEN;
4437 warning("root %llu %s[%llu %llu] name too long %u, trimmed",
4439 key->type == BTRFS_DIR_ITEM_KEY ?
4440 "DIR_ITEM" : "DIR_INDEX",
4441 key->objectid, key->offset, len);
4443 read_extent_buffer(node, namebuf, (unsigned long)(di + 1),
4445 if (len != namelen || strncmp(namebuf, name, len))
4451 len += sizeof(*di) + data_len;
4452 di = (struct btrfs_dir_item *)((char *)di + len);
4457 btrfs_release_path(&path);
4462 * Prints inode ref error message
4464 static void print_inode_ref_err(struct btrfs_root *root, struct btrfs_key *key,
4465 u64 index, const char *namebuf, int name_len,
4466 u8 filetype, int err)
4471 /* root dir error */
4472 if (key->objectid == BTRFS_FIRST_FREE_OBJECTID) {
4474 "root %llu root dir shouldn't have INODE REF[%llu %llu] name %s",
4475 root->objectid, key->objectid, key->offset, namebuf);
4480 if (err & (DIR_ITEM_MISMATCH | DIR_ITEM_MISSING))
4481 error("root %llu DIR ITEM[%llu %llu] %s name %s filetype %u",
4482 root->objectid, key->offset,
4483 btrfs_name_hash(namebuf, name_len),
4484 err & DIR_ITEM_MISMATCH ? "mismatch" : "missing",
4486 if (err & (DIR_INDEX_MISMATCH | DIR_INDEX_MISSING))
4487 error("root %llu DIR INDEX[%llu %llu] %s name %s filetype %u",
4488 root->objectid, key->offset, index,
4489 err & DIR_ITEM_MISMATCH ? "mismatch" : "missing",
4494 * Insert the missing inode item.
4496 * Returns 0 means success.
4497 * Returns <0 means error.
4499 static int repair_inode_item_missing(struct btrfs_root *root, u64 ino,
4502 struct btrfs_key key;
4503 struct btrfs_trans_handle *trans;
4504 struct btrfs_path path;
4508 key.type = BTRFS_INODE_ITEM_KEY;
4511 btrfs_init_path(&path);
4512 trans = btrfs_start_transaction(root, 1);
4513 if (IS_ERR(trans)) {
4518 ret = btrfs_search_slot(trans, root, &key, &path, 1, 1);
4519 if (ret < 0 || !ret)
4522 /* insert inode item */
4523 create_inode_item_lowmem(trans, root, ino, filetype);
4526 btrfs_commit_transaction(trans, root);
4529 error("failed to repair root %llu INODE ITEM[%llu] missing",
4530 root->objectid, ino);
4531 btrfs_release_path(&path);
4536 * Traverse the given INODE_REF and call find_dir_item() to find related
4537 * DIR_ITEM/DIR_INDEX.
4539 * @root: the root of the fs/file tree
4540 * @ref_key: the key of the INODE_REF
4541 * @refs: the count of INODE_REF
4542 * @mode: the st_mode of INODE_ITEM
4544 * Return 0 if no error occurred.
4546 static int check_inode_ref(struct btrfs_root *root, struct btrfs_key *ref_key,
4547 struct btrfs_path *path, char *name_ret,
4548 u32 *namelen_ret, u64 *refs, int mode)
4550 struct btrfs_key key;
4551 struct btrfs_key location;
4552 struct btrfs_inode_ref *ref;
4553 struct extent_buffer *node;
4554 char namebuf[BTRFS_NAME_LEN] = {0};
4564 location.objectid = ref_key->objectid;
4565 location.type = BTRFS_INODE_ITEM_KEY;
4566 location.offset = 0;
4567 node = path->nodes[0];
4568 slot = path->slots[0];
4570 ref = btrfs_item_ptr(node, slot, struct btrfs_inode_ref);
4571 total = btrfs_item_size_nr(node, slot);
4574 /* Update inode ref count */
4578 index = btrfs_inode_ref_index(node, ref);
4579 name_len = btrfs_inode_ref_name_len(node, ref);
4580 if (cur + sizeof(*ref) + name_len > total ||
4581 name_len > BTRFS_NAME_LEN) {
4582 warning("root %llu INODE_REF[%llu %llu] name too long",
4583 root->objectid, ref_key->objectid, ref_key->offset);
4585 if (total < cur + sizeof(*ref))
4587 len = min_t(u32, total - cur - sizeof(*ref), BTRFS_NAME_LEN);
4592 read_extent_buffer(node, namebuf, (unsigned long)(ref + 1), len);
4594 /* copy the fisrt name found to name_ret */
4595 if (*refs == 1 && name_ret) {
4596 memcpy(name_ret, namebuf, len);
4600 /* Check root dir ref */
4601 if (ref_key->objectid == BTRFS_FIRST_FREE_OBJECTID) {
4602 if (index != 0 || len != strlen("..") ||
4603 strncmp("..", namebuf, len) ||
4604 ref_key->offset != BTRFS_FIRST_FREE_OBJECTID) {
4605 /* set err bits then repair will delete the ref */
4606 err |= DIR_INDEX_MISSING;
4607 err |= DIR_ITEM_MISSING;
4612 /* Find related DIR_INDEX */
4613 key.objectid = ref_key->offset;
4614 key.type = BTRFS_DIR_INDEX_KEY;
4616 tmp_err |= find_dir_item(root, &key, &location, namebuf, len, mode);
4618 /* Find related dir_item */
4619 key.objectid = ref_key->offset;
4620 key.type = BTRFS_DIR_ITEM_KEY;
4621 key.offset = btrfs_name_hash(namebuf, len);
4622 tmp_err |= find_dir_item(root, &key, &location, namebuf, len, mode);
4625 print_inode_ref_err(root, ref_key, index, namebuf, name_len,
4626 imode_to_type(mode), tmp_err);
4628 len = sizeof(*ref) + name_len;
4629 ref = (struct btrfs_inode_ref *)((char *)ref + len);
4639 * Traverse the given INODE_EXTREF and call find_dir_item() to find related
4640 * DIR_ITEM/DIR_INDEX.
4642 * @root: the root of the fs/file tree
4643 * @ref_key: the key of the INODE_EXTREF
4644 * @refs: the count of INODE_EXTREF
4645 * @mode: the st_mode of INODE_ITEM
4647 * Return 0 if no error occurred.
4649 static int check_inode_extref(struct btrfs_root *root,
4650 struct btrfs_key *ref_key,
4651 struct extent_buffer *node, int slot, u64 *refs,
4654 struct btrfs_key key;
4655 struct btrfs_key location;
4656 struct btrfs_inode_extref *extref;
4657 char namebuf[BTRFS_NAME_LEN] = {0};
4667 location.objectid = ref_key->objectid;
4668 location.type = BTRFS_INODE_ITEM_KEY;
4669 location.offset = 0;
4671 extref = btrfs_item_ptr(node, slot, struct btrfs_inode_extref);
4672 total = btrfs_item_size_nr(node, slot);
4675 /* update inode ref count */
4677 name_len = btrfs_inode_extref_name_len(node, extref);
4678 index = btrfs_inode_extref_index(node, extref);
4679 parent = btrfs_inode_extref_parent(node, extref);
4680 if (name_len <= BTRFS_NAME_LEN) {
4683 len = BTRFS_NAME_LEN;
4684 warning("root %llu INODE_EXTREF[%llu %llu] name too long",
4685 root->objectid, ref_key->objectid, ref_key->offset);
4687 read_extent_buffer(node, namebuf, (unsigned long)(extref + 1), len);
4689 /* Check root dir ref name */
4690 if (index == 0 && strncmp(namebuf, "..", name_len)) {
4691 error("root %llu INODE_EXTREF[%llu %llu] ROOT_DIR name shouldn't be %s",
4692 root->objectid, ref_key->objectid, ref_key->offset,
4694 err |= ROOT_DIR_ERROR;
4697 /* find related dir_index */
4698 key.objectid = parent;
4699 key.type = BTRFS_DIR_INDEX_KEY;
4701 ret = find_dir_item(root, &key, &location, namebuf, len, mode);
4704 /* find related dir_item */
4705 key.objectid = parent;
4706 key.type = BTRFS_DIR_ITEM_KEY;
4707 key.offset = btrfs_name_hash(namebuf, len);
4708 ret = find_dir_item(root, &key, &location, namebuf, len, mode);
4711 len = sizeof(*extref) + name_len;
4712 extref = (struct btrfs_inode_extref *)((char *)extref + len);
4722 * Find INODE_REF/INODE_EXTREF for the given key and check it with the specified
4723 * DIR_ITEM/DIR_INDEX match.
4724 * Return with @index_ret.
4726 * @root: the root of the fs/file tree
4727 * @key: the key of the INODE_REF/INODE_EXTREF
4728 * @name: the name in the INODE_REF/INODE_EXTREF
4729 * @namelen: the length of name in the INODE_REF/INODE_EXTREF
4730 * @index_ret: the index in the INODE_REF/INODE_EXTREF,
4731 * value (64)-1 means do not check index
4732 * @ext_ref: the EXTENDED_IREF feature
4734 * Return 0 if no error occurred.
4735 * Return >0 for error bitmap
4737 static int find_inode_ref(struct btrfs_root *root, struct btrfs_key *key,
4738 char *name, int namelen, u64 *index_ret,
4739 unsigned int ext_ref)
4741 struct btrfs_path path;
4742 struct btrfs_inode_ref *ref;
4743 struct btrfs_inode_extref *extref;
4744 struct extent_buffer *node;
4745 char ref_namebuf[BTRFS_NAME_LEN] = {0};
4758 btrfs_init_path(&path);
4759 ret = btrfs_search_slot(NULL, root, key, &path, 0, 0);
4761 ret = INODE_REF_MISSING;
4765 node = path.nodes[0];
4766 slot = path.slots[0];
4768 ref = btrfs_item_ptr(node, slot, struct btrfs_inode_ref);
4769 total = btrfs_item_size_nr(node, slot);
4771 /* Iterate all entry of INODE_REF */
4772 while (cur < total) {
4773 ret = INODE_REF_MISSING;
4775 ref_namelen = btrfs_inode_ref_name_len(node, ref);
4776 ref_index = btrfs_inode_ref_index(node, ref);
4777 if (*index_ret != (u64)-1 && *index_ret != ref_index)
4780 if (cur + sizeof(*ref) + ref_namelen > total ||
4781 ref_namelen > BTRFS_NAME_LEN) {
4782 warning("root %llu INODE %s[%llu %llu] name too long",
4784 key->type == BTRFS_INODE_REF_KEY ?
4786 key->objectid, key->offset);
4788 if (cur + sizeof(*ref) > total)
4790 len = min_t(u32, total - cur - sizeof(*ref),
4796 read_extent_buffer(node, ref_namebuf, (unsigned long)(ref + 1),
4799 if (len != namelen || strncmp(ref_namebuf, name, len))
4802 *index_ret = ref_index;
4806 len = sizeof(*ref) + ref_namelen;
4807 ref = (struct btrfs_inode_ref *)((char *)ref + len);
4812 /* Skip if not support EXTENDED_IREF feature */
4816 btrfs_release_path(&path);
4817 btrfs_init_path(&path);
4819 dir_id = key->offset;
4820 key->type = BTRFS_INODE_EXTREF_KEY;
4821 key->offset = btrfs_extref_hash(dir_id, name, namelen);
4823 ret = btrfs_search_slot(NULL, root, key, &path, 0, 0);
4825 ret = INODE_REF_MISSING;
4829 node = path.nodes[0];
4830 slot = path.slots[0];
4832 extref = btrfs_item_ptr(node, slot, struct btrfs_inode_extref);
4834 total = btrfs_item_size_nr(node, slot);
4836 /* Iterate all entry of INODE_EXTREF */
4837 while (cur < total) {
4838 ret = INODE_REF_MISSING;
4840 ref_namelen = btrfs_inode_extref_name_len(node, extref);
4841 ref_index = btrfs_inode_extref_index(node, extref);
4842 parent = btrfs_inode_extref_parent(node, extref);
4843 if (*index_ret != (u64)-1 && *index_ret != ref_index)
4846 if (parent != dir_id)
4849 if (ref_namelen <= BTRFS_NAME_LEN) {
4852 len = BTRFS_NAME_LEN;
4853 warning("root %llu INODE %s[%llu %llu] name too long",
4855 key->type == BTRFS_INODE_REF_KEY ?
4857 key->objectid, key->offset);
4859 read_extent_buffer(node, ref_namebuf,
4860 (unsigned long)(extref + 1), len);
4862 if (len != namelen || strncmp(ref_namebuf, name, len))
4865 *index_ret = ref_index;
4870 len = sizeof(*extref) + ref_namelen;
4871 extref = (struct btrfs_inode_extref *)((char *)extref + len);
4876 btrfs_release_path(&path);
4880 static void print_dir_item_err(struct btrfs_root *root, struct btrfs_key *key,
4881 u64 ino, u64 index, const char *namebuf,
4882 int name_len, u8 filetype, int err)
4884 if (err & (DIR_ITEM_MISMATCH | DIR_ITEM_MISSING)) {
4885 error("root %llu DIR ITEM[%llu %llu] name %s filetype %d %s",
4886 root->objectid, key->objectid, key->offset, namebuf,
4888 err & DIR_ITEM_MISMATCH ? "mismath" : "missing");
4891 if (err & (DIR_INDEX_MISMATCH | DIR_INDEX_MISSING)) {
4892 error("root %llu DIR INDEX[%llu %llu] name %s filetype %d %s",
4893 root->objectid, key->objectid, index, namebuf, filetype,
4894 err & DIR_ITEM_MISMATCH ? "mismath" : "missing");
4897 if (err & (INODE_ITEM_MISSING | INODE_ITEM_MISMATCH)) {
4899 "root %llu INODE_ITEM[%llu] index %llu name %s filetype %d %s",
4900 root->objectid, ino, index, namebuf, filetype,
4901 err & INODE_ITEM_MISMATCH ? "mismath" : "missing");
4904 if (err & INODE_REF_MISSING)
4906 "root %llu INODE REF[%llu, %llu] name %s filetype %u missing",
4907 root->objectid, ino, key->objectid, namebuf, filetype);
4912 * Traverse the given DIR_ITEM/DIR_INDEX and check related INODE_ITEM and
4913 * call find_inode_ref() to check related INODE_REF/INODE_EXTREF.
4915 * @root: the root of the fs/file tree
4916 * @key: the key of the INODE_REF/INODE_EXTREF
4918 * @size: the st_size of the INODE_ITEM
4919 * @ext_ref: the EXTENDED_IREF feature
4921 * Return 0 if no error occurred.
4923 static int check_dir_item(struct btrfs_root *root, struct btrfs_key *di_key,
4924 struct btrfs_path *path, u64 *size,
4925 unsigned int ext_ref)
4927 struct btrfs_dir_item *di;
4928 struct btrfs_inode_item *ii;
4929 struct btrfs_key key;
4930 struct btrfs_key location;
4931 struct extent_buffer *node;
4933 char namebuf[BTRFS_NAME_LEN] = {0};
4946 node = path->nodes[0];
4947 slot = path->slots[0];
4949 * For DIR_ITEM set index to (u64)-1, so that find_inode_ref
4950 * ignore index check.
4952 if (di_key->type == BTRFS_DIR_INDEX_KEY)
4953 index = di_key->offset;
4957 di = btrfs_item_ptr(node, slot, struct btrfs_dir_item);
4958 total = btrfs_item_size_nr(node, slot);
4959 memset(namebuf, 0, sizeof(namebuf) / sizeof(*namebuf));
4961 while (cur < total) {
4962 data_len = btrfs_dir_data_len(node, di);
4965 error("root %llu %s[%llu %llu] data_len shouldn't be %u",
4967 di_key->type == BTRFS_DIR_ITEM_KEY ? "DIR_ITEM" : "DIR_INDEX",
4968 di_key->objectid, di_key->offset, data_len);
4970 name_len = btrfs_dir_name_len(node, di);
4971 if (name_len <= BTRFS_NAME_LEN) {
4974 len = BTRFS_NAME_LEN;
4975 warning("root %llu %s[%llu %llu] name too long",
4977 di_key->type == BTRFS_DIR_ITEM_KEY ? "DIR_ITEM" : "DIR_INDEX",
4978 di_key->objectid, di_key->offset);
4980 (*size) += name_len;
4981 read_extent_buffer(node, namebuf, (unsigned long)(di + 1),
4983 filetype = btrfs_dir_type(node, di);
4985 if (di_key->type == BTRFS_DIR_ITEM_KEY &&
4986 di_key->offset != btrfs_name_hash(namebuf, len)) {
4988 error("root %llu DIR_ITEM[%llu %llu] name %s namelen %u filetype %u mismatch with its hash, wanted %llu have %llu",
4989 root->objectid, di_key->objectid, di_key->offset,
4990 namebuf, len, filetype, di_key->offset,
4991 btrfs_name_hash(namebuf, len));
4994 btrfs_dir_item_key_to_cpu(node, di, &location);
4995 /* Ignore related ROOT_ITEM check */
4996 if (location.type == BTRFS_ROOT_ITEM_KEY)
4999 btrfs_release_path(path);
5000 /* Check relative INODE_ITEM(existence/filetype) */
5001 ret = btrfs_search_slot(NULL, root, &location, path, 0, 0);
5003 tmp_err |= INODE_ITEM_MISSING;
5007 ii = btrfs_item_ptr(path->nodes[0], path->slots[0],
5008 struct btrfs_inode_item);
5009 mode = btrfs_inode_mode(path->nodes[0], ii);
5010 if (imode_to_type(mode) != filetype) {
5011 tmp_err |= INODE_ITEM_MISMATCH;
5015 /* Check relative INODE_REF/INODE_EXTREF */
5016 key.objectid = location.objectid;
5017 key.type = BTRFS_INODE_REF_KEY;
5018 key.offset = di_key->objectid;
5019 tmp_err |= find_inode_ref(root, &key, namebuf, len,
5022 /* check relative INDEX/ITEM */
5023 key.objectid = di_key->objectid;
5024 if (key.type == BTRFS_DIR_ITEM_KEY) {
5025 key.type = BTRFS_DIR_INDEX_KEY;
5028 key.type = BTRFS_DIR_ITEM_KEY;
5029 key.offset = btrfs_name_hash(namebuf, name_len);
5032 tmp_err |= find_dir_item(root, &key, &location, namebuf,
5033 name_len, filetype);
5034 /* find_dir_item may find index */
5035 if (key.type == BTRFS_DIR_INDEX_KEY)
5038 btrfs_release_path(path);
5039 print_dir_item_err(root, di_key, location.objectid, index,
5040 namebuf, name_len, filetype, tmp_err);
5042 len = sizeof(*di) + name_len + data_len;
5043 di = (struct btrfs_dir_item *)((char *)di + len);
5046 if (di_key->type == BTRFS_DIR_INDEX_KEY && cur < total) {
5047 error("root %llu DIR_INDEX[%llu %llu] should contain only one entry",
5048 root->objectid, di_key->objectid,
5055 btrfs_release_path(path);
5056 ret = btrfs_search_slot(NULL, root, di_key, path, 0, 0);
5058 err |= ret > 0 ? -ENOENT : ret;
5063 * Check file extent datasum/hole, update the size of the file extents,
5064 * check and update the last offset of the file extent.
5066 * @root: the root of fs/file tree.
5067 * @fkey: the key of the file extent.
5068 * @nodatasum: INODE_NODATASUM feature.
5069 * @size: the sum of all EXTENT_DATA items size for this inode.
5070 * @end: the offset of the last extent.
5072 * Return 0 if no error occurred.
5074 static int check_file_extent(struct btrfs_root *root, struct btrfs_key *fkey,
5075 struct extent_buffer *node, int slot,
5076 unsigned int nodatasum, u64 *size, u64 *end)
5078 struct btrfs_file_extent_item *fi;
5081 u64 extent_num_bytes;
5083 u64 csum_found; /* In byte size, sectorsize aligned */
5084 u64 search_start; /* Logical range start we search for csum */
5085 u64 search_len; /* Logical range len we search for csum */
5086 unsigned int extent_type;
5087 unsigned int is_hole;
5092 fi = btrfs_item_ptr(node, slot, struct btrfs_file_extent_item);
5094 /* Check inline extent */
5095 extent_type = btrfs_file_extent_type(node, fi);
5096 if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
5097 struct btrfs_item *e = btrfs_item_nr(slot);
5098 u32 item_inline_len;
5100 item_inline_len = btrfs_file_extent_inline_item_len(node, e);
5101 extent_num_bytes = btrfs_file_extent_inline_len(node, slot, fi);
5102 compressed = btrfs_file_extent_compression(node, fi);
5103 if (extent_num_bytes == 0) {
5105 "root %llu EXTENT_DATA[%llu %llu] has empty inline extent",
5106 root->objectid, fkey->objectid, fkey->offset);
5107 err |= FILE_EXTENT_ERROR;
5109 if (!compressed && extent_num_bytes != item_inline_len) {
5111 "root %llu EXTENT_DATA[%llu %llu] wrong inline size, have: %llu, expected: %u",
5112 root->objectid, fkey->objectid, fkey->offset,
5113 extent_num_bytes, item_inline_len);
5114 err |= FILE_EXTENT_ERROR;
5116 *end += extent_num_bytes;
5117 *size += extent_num_bytes;
5121 /* Check extent type */
5122 if (extent_type != BTRFS_FILE_EXTENT_REG &&
5123 extent_type != BTRFS_FILE_EXTENT_PREALLOC) {
5124 err |= FILE_EXTENT_ERROR;
5125 error("root %llu EXTENT_DATA[%llu %llu] type bad",
5126 root->objectid, fkey->objectid, fkey->offset);
5130 /* Check REG_EXTENT/PREALLOC_EXTENT */
5131 disk_bytenr = btrfs_file_extent_disk_bytenr(node, fi);
5132 disk_num_bytes = btrfs_file_extent_disk_num_bytes(node, fi);
5133 extent_num_bytes = btrfs_file_extent_num_bytes(node, fi);
5134 extent_offset = btrfs_file_extent_offset(node, fi);
5135 compressed = btrfs_file_extent_compression(node, fi);
5136 is_hole = (disk_bytenr == 0) && (disk_num_bytes == 0);
5139 * Check EXTENT_DATA csum
5141 * For plain (uncompressed) extent, we should only check the range
5142 * we're referring to, as it's possible that part of prealloc extent
5143 * has been written, and has csum:
5145 * |<--- Original large preallocated extent A ---->|
5146 * |<- Prealloc File Extent ->|<- Regular Extent ->|
5149 * For compressed extent, we should check the whole range.
5152 search_start = disk_bytenr + extent_offset;
5153 search_len = extent_num_bytes;
5155 search_start = disk_bytenr;
5156 search_len = disk_num_bytes;
5158 ret = count_csum_range(root, search_start, search_len, &csum_found);
5159 if (csum_found > 0 && nodatasum) {
5160 err |= ODD_CSUM_ITEM;
5161 error("root %llu EXTENT_DATA[%llu %llu] nodatasum shouldn't have datasum",
5162 root->objectid, fkey->objectid, fkey->offset);
5163 } else if (extent_type == BTRFS_FILE_EXTENT_REG && !nodatasum &&
5164 !is_hole && (ret < 0 || csum_found < search_len)) {
5165 err |= CSUM_ITEM_MISSING;
5166 error("root %llu EXTENT_DATA[%llu %llu] csum missing, have: %llu, expected: %llu",
5167 root->objectid, fkey->objectid, fkey->offset,
5168 csum_found, search_len);
5169 } else if (extent_type == BTRFS_FILE_EXTENT_PREALLOC && csum_found > 0) {
5170 err |= ODD_CSUM_ITEM;
5171 error("root %llu EXTENT_DATA[%llu %llu] prealloc shouldn't have csum, but has: %llu",
5172 root->objectid, fkey->objectid, fkey->offset, csum_found);
5175 /* Check EXTENT_DATA hole */
5176 if (!no_holes && *end != fkey->offset) {
5177 err |= FILE_EXTENT_ERROR;
5178 error("root %llu EXTENT_DATA[%llu %llu] interrupt",
5179 root->objectid, fkey->objectid, fkey->offset);
5182 *end += extent_num_bytes;
5184 *size += extent_num_bytes;
5190 * Set inode item nbytes to @nbytes
5192 * Returns 0 on success
5193 * Returns != 0 on error
5195 static int repair_inode_nbytes_lowmem(struct btrfs_root *root,
5196 struct btrfs_path *path,
5197 u64 ino, u64 nbytes)
5199 struct btrfs_trans_handle *trans;
5200 struct btrfs_inode_item *ii;
5201 struct btrfs_key key;
5202 struct btrfs_key research_key;
5206 btrfs_item_key_to_cpu(path->nodes[0], &research_key, path->slots[0]);
5209 key.type = BTRFS_INODE_ITEM_KEY;
5212 trans = btrfs_start_transaction(root, 1);
5213 if (IS_ERR(trans)) {
5214 ret = PTR_ERR(trans);
5219 btrfs_release_path(path);
5220 ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
5228 ii = btrfs_item_ptr(path->nodes[0], path->slots[0],
5229 struct btrfs_inode_item);
5230 btrfs_set_inode_nbytes(path->nodes[0], ii, nbytes);
5231 btrfs_mark_buffer_dirty(path->nodes[0]);
5233 btrfs_commit_transaction(trans, root);
5236 error("failed to set nbytes in inode %llu root %llu",
5237 ino, root->root_key.objectid);
5239 printf("Set nbytes in inode item %llu root %llu\n to %llu", ino,
5240 root->root_key.objectid, nbytes);
5243 btrfs_release_path(path);
5244 ret = btrfs_search_slot(NULL, root, &research_key, path, 0, 0);
5251 * Set directory inode isize to @isize.
5253 * Returns 0 on success.
5254 * Returns != 0 on error.
5256 static int repair_dir_isize_lowmem(struct btrfs_root *root,
5257 struct btrfs_path *path,
5260 struct btrfs_trans_handle *trans;
5261 struct btrfs_inode_item *ii;
5262 struct btrfs_key key;
5263 struct btrfs_key research_key;
5267 btrfs_item_key_to_cpu(path->nodes[0], &research_key, path->slots[0]);
5270 key.type = BTRFS_INODE_ITEM_KEY;
5273 trans = btrfs_start_transaction(root, 1);
5274 if (IS_ERR(trans)) {
5275 ret = PTR_ERR(trans);
5280 btrfs_release_path(path);
5281 ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
5289 ii = btrfs_item_ptr(path->nodes[0], path->slots[0],
5290 struct btrfs_inode_item);
5291 btrfs_set_inode_size(path->nodes[0], ii, isize);
5292 btrfs_mark_buffer_dirty(path->nodes[0]);
5294 btrfs_commit_transaction(trans, root);
5297 error("failed to set isize in inode %llu root %llu",
5298 ino, root->root_key.objectid);
5300 printf("Set isize in inode %llu root %llu to %llu\n",
5301 ino, root->root_key.objectid, isize);
5303 btrfs_release_path(path);
5304 ret = btrfs_search_slot(NULL, root, &research_key, path, 0, 0);
5311 * Wrapper function for btrfs_add_orphan_item().
5313 * Returns 0 on success.
5314 * Returns != 0 on error.
5316 static int repair_inode_orphan_item_lowmem(struct btrfs_root *root,
5317 struct btrfs_path *path, u64 ino)
5319 struct btrfs_trans_handle *trans;
5320 struct btrfs_key research_key;
5324 btrfs_item_key_to_cpu(path->nodes[0], &research_key, path->slots[0]);
5326 trans = btrfs_start_transaction(root, 1);
5327 if (IS_ERR(trans)) {
5328 ret = PTR_ERR(trans);
5333 btrfs_release_path(path);
5334 ret = btrfs_add_orphan_item(trans, root, path, ino);
5336 btrfs_commit_transaction(trans, root);
5339 error("failed to add inode %llu as orphan item root %llu",
5340 ino, root->root_key.objectid);
5342 printf("Added inode %llu as orphan item root %llu\n",
5343 ino, root->root_key.objectid);
5345 btrfs_release_path(path);
5346 ret = btrfs_search_slot(NULL, root, &research_key, path, 0, 0);
5353 * Check INODE_ITEM and related ITEMs (the same inode number)
5354 * 1. check link count
5355 * 2. check inode ref/extref
5356 * 3. check dir item/index
5358 * @ext_ref: the EXTENDED_IREF feature
5360 * Return 0 if no error occurred.
5361 * Return >0 for error or hit the traversal is done(by error bitmap)
5363 static int check_inode_item(struct btrfs_root *root, struct btrfs_path *path,
5364 unsigned int ext_ref)
5366 struct extent_buffer *node;
5367 struct btrfs_inode_item *ii;
5368 struct btrfs_key key;
5377 u64 extent_size = 0;
5379 unsigned int nodatasum;
5383 char namebuf[BTRFS_NAME_LEN] = {0};
5386 node = path->nodes[0];
5387 slot = path->slots[0];
5389 btrfs_item_key_to_cpu(node, &key, slot);
5390 inode_id = key.objectid;
5392 if (inode_id == BTRFS_ORPHAN_OBJECTID) {
5393 ret = btrfs_next_item(root, path);
5399 ii = btrfs_item_ptr(node, slot, struct btrfs_inode_item);
5400 isize = btrfs_inode_size(node, ii);
5401 nbytes = btrfs_inode_nbytes(node, ii);
5402 mode = btrfs_inode_mode(node, ii);
5403 dir = imode_to_type(mode) == BTRFS_FT_DIR;
5404 nlink = btrfs_inode_nlink(node, ii);
5405 nodatasum = btrfs_inode_flags(node, ii) & BTRFS_INODE_NODATASUM;
5408 ret = btrfs_next_item(root, path);
5410 /* out will fill 'err' rusing current statistics */
5412 } else if (ret > 0) {
5417 node = path->nodes[0];
5418 slot = path->slots[0];
5419 btrfs_item_key_to_cpu(node, &key, slot);
5420 if (key.objectid != inode_id)
5424 case BTRFS_INODE_REF_KEY:
5425 ret = check_inode_ref(root, &key, path, namebuf,
5426 &name_len, &refs, mode);
5429 case BTRFS_INODE_EXTREF_KEY:
5430 if (key.type == BTRFS_INODE_EXTREF_KEY && !ext_ref)
5431 warning("root %llu EXTREF[%llu %llu] isn't supported",
5432 root->objectid, key.objectid,
5434 ret = check_inode_extref(root, &key, node, slot, &refs,
5438 case BTRFS_DIR_ITEM_KEY:
5439 case BTRFS_DIR_INDEX_KEY:
5441 warning("root %llu INODE[%llu] mode %u shouldn't have DIR_INDEX[%llu %llu]",
5442 root->objectid, inode_id,
5443 imode_to_type(mode), key.objectid,
5446 ret = check_dir_item(root, &key, path, &size, ext_ref);
5449 case BTRFS_EXTENT_DATA_KEY:
5451 warning("root %llu DIR INODE[%llu] shouldn't EXTENT_DATA[%llu %llu]",
5452 root->objectid, inode_id, key.objectid,
5455 ret = check_file_extent(root, &key, node, slot,
5456 nodatasum, &extent_size,
5460 case BTRFS_XATTR_ITEM_KEY:
5463 error("ITEM[%llu %u %llu] UNKNOWN TYPE",
5464 key.objectid, key.type, key.offset);
5469 /* verify INODE_ITEM nlink/isize/nbytes */
5472 err |= LINK_COUNT_ERROR;
5473 error("root %llu DIR INODE[%llu] shouldn't have more than one link(%llu)",
5474 root->objectid, inode_id, nlink);
5478 * Just a warning, as dir inode nbytes is just an
5479 * instructive value.
5481 if (!IS_ALIGNED(nbytes, root->fs_info->nodesize)) {
5482 warning("root %llu DIR INODE[%llu] nbytes should be aligned to %u",
5483 root->objectid, inode_id,
5484 root->fs_info->nodesize);
5487 if (isize != size) {
5489 ret = repair_dir_isize_lowmem(root, path,
5491 if (!repair || ret) {
5494 "root %llu DIR INODE [%llu] size %llu not equal to %llu",
5495 root->objectid, inode_id, isize, size);
5499 if (nlink != refs) {
5500 err |= LINK_COUNT_ERROR;
5501 error("root %llu INODE[%llu] nlink(%llu) not equal to inode_refs(%llu)",
5502 root->objectid, inode_id, nlink, refs);
5503 } else if (!nlink) {
5505 ret = repair_inode_orphan_item_lowmem(root,
5507 if (!repair || ret) {
5509 error("root %llu INODE[%llu] is orphan item",
5510 root->objectid, inode_id);
5514 if (!nbytes && !no_holes && extent_end < isize) {
5515 err |= NBYTES_ERROR;
5516 error("root %llu INODE[%llu] size (%llu) should have a file extent hole",
5517 root->objectid, inode_id, isize);
5520 if (nbytes != extent_size) {
5522 ret = repair_inode_nbytes_lowmem(root, path,
5523 inode_id, extent_size);
5524 if (!repair || ret) {
5525 err |= NBYTES_ERROR;
5527 "root %llu INODE[%llu] nbytes %llu not equal to extent_size %llu",
5528 root->objectid, inode_id, nbytes,
5538 * Insert the missing inode item and inode ref.
5540 * Normal INODE_ITEM_MISSING and INODE_REF_MISSING are handled in backref * dir.
5541 * Root dir should be handled specially because root dir is the root of fs.
5543 * returns err (>0 or 0) after repair
5545 static int repair_fs_first_inode(struct btrfs_root *root, int err)
5547 struct btrfs_trans_handle *trans;
5548 struct btrfs_key key;
5549 struct btrfs_path path;
5550 int filetype = BTRFS_FT_DIR;
5553 btrfs_init_path(&path);
5555 if (err & INODE_REF_MISSING) {
5556 key.objectid = BTRFS_FIRST_FREE_OBJECTID;
5557 key.type = BTRFS_INODE_REF_KEY;
5558 key.offset = BTRFS_FIRST_FREE_OBJECTID;
5560 trans = btrfs_start_transaction(root, 1);
5561 if (IS_ERR(trans)) {
5562 ret = PTR_ERR(trans);
5566 btrfs_release_path(&path);
5567 ret = btrfs_search_slot(trans, root, &key, &path, 1, 1);
5571 ret = btrfs_insert_inode_ref(trans, root, "..", 2,
5572 BTRFS_FIRST_FREE_OBJECTID,
5573 BTRFS_FIRST_FREE_OBJECTID, 0);
5577 printf("Add INODE_REF[%llu %llu] name %s\n",
5578 BTRFS_FIRST_FREE_OBJECTID, BTRFS_FIRST_FREE_OBJECTID,
5580 err &= ~INODE_REF_MISSING;
5583 error("fail to insert first inode's ref");
5584 btrfs_commit_transaction(trans, root);
5587 if (err & INODE_ITEM_MISSING) {
5588 ret = repair_inode_item_missing(root,
5589 BTRFS_FIRST_FREE_OBJECTID, filetype);
5592 err &= ~INODE_ITEM_MISSING;
5596 error("fail to repair first inode");
5597 btrfs_release_path(&path);
5602 * check first root dir's inode_item and inode_ref
5604 * returns 0 means no error
5605 * returns >0 means error
5606 * returns <0 means fatal error
5608 static int check_fs_first_inode(struct btrfs_root *root, unsigned int ext_ref)
5610 struct btrfs_path path;
5611 struct btrfs_key key;
5612 struct btrfs_inode_item *ii;
5618 key.objectid = BTRFS_FIRST_FREE_OBJECTID;
5619 key.type = BTRFS_INODE_ITEM_KEY;
5622 /* For root being dropped, we don't need to check first inode */
5623 if (btrfs_root_refs(&root->root_item) == 0 &&
5624 btrfs_disk_key_objectid(&root->root_item.drop_progress) >=
5625 BTRFS_FIRST_FREE_OBJECTID)
5628 btrfs_init_path(&path);
5629 ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
5634 err |= INODE_ITEM_MISSING;
5636 ii = btrfs_item_ptr(path.nodes[0], path.slots[0],
5637 struct btrfs_inode_item);
5638 mode = btrfs_inode_mode(path.nodes[0], ii);
5639 if (imode_to_type(mode) != BTRFS_FT_DIR)
5640 err |= INODE_ITEM_MISMATCH;
5643 /* lookup first inode ref */
5644 key.offset = BTRFS_FIRST_FREE_OBJECTID;
5645 key.type = BTRFS_INODE_REF_KEY;
5646 /* special index value */
5649 ret = find_inode_ref(root, &key, "..", strlen(".."), &index, ext_ref);
5655 btrfs_release_path(&path);
5658 err = repair_fs_first_inode(root, err);
5660 if (err & (INODE_ITEM_MISSING | INODE_ITEM_MISMATCH))
5661 error("root dir INODE_ITEM is %s",
5662 err & INODE_ITEM_MISMATCH ? "mismatch" : "missing");
5663 if (err & INODE_REF_MISSING)
5664 error("root dir INODE_REF is missing");
5666 return ret < 0 ? ret : err;
5669 static struct tree_backref *find_tree_backref(struct extent_record *rec,
5670 u64 parent, u64 root)
5672 struct rb_node *node;
5673 struct tree_backref *back = NULL;
5674 struct tree_backref match = {
5681 match.parent = parent;
5682 match.node.full_backref = 1;
5687 node = rb_search(&rec->backref_tree, &match.node.node,
5688 (rb_compare_keys)compare_extent_backref, NULL);
5690 back = to_tree_backref(rb_node_to_extent_backref(node));
5695 static struct data_backref *find_data_backref(struct extent_record *rec,
5696 u64 parent, u64 root,
5697 u64 owner, u64 offset,
5699 u64 disk_bytenr, u64 bytes)
5701 struct rb_node *node;
5702 struct data_backref *back = NULL;
5703 struct data_backref match = {
5710 .found_ref = found_ref,
5711 .disk_bytenr = disk_bytenr,
5715 match.parent = parent;
5716 match.node.full_backref = 1;
5721 node = rb_search(&rec->backref_tree, &match.node.node,
5722 (rb_compare_keys)compare_extent_backref, NULL);
5724 back = to_data_backref(rb_node_to_extent_backref(node));
5729 * Iterate all item on the tree and call check_inode_item() to check.
5731 * @root: the root of the tree to be checked.
5732 * @ext_ref: the EXTENDED_IREF feature
5734 * Return 0 if no error found.
5735 * Return <0 for error.
5737 static int check_fs_root_v2(struct btrfs_root *root, unsigned int ext_ref)
5739 struct btrfs_path path;
5740 struct node_refs nrefs;
5741 struct btrfs_root_item *root_item = &root->root_item;
5747 * We need to manually check the first inode item(256)
5748 * As the following traversal function will only start from
5749 * the first inode item in the leaf, if inode item(256) is missing
5750 * we will just skip it forever.
5752 ret = check_fs_first_inode(root, ext_ref);
5757 memset(&nrefs, 0, sizeof(nrefs));
5758 level = btrfs_header_level(root->node);
5759 btrfs_init_path(&path);
5761 if (btrfs_root_refs(root_item) > 0 ||
5762 btrfs_disk_key_objectid(&root_item->drop_progress) == 0) {
5763 path.nodes[level] = root->node;
5764 path.slots[level] = 0;
5765 extent_buffer_get(root->node);
5767 struct btrfs_key key;
5769 btrfs_disk_key_to_cpu(&key, &root_item->drop_progress);
5770 level = root_item->drop_level;
5771 path.lowest_level = level;
5772 ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
5779 ret = walk_down_tree_v2(root, &path, &level, &nrefs, ext_ref);
5782 /* if ret is negative, walk shall stop */
5788 ret = walk_up_tree_v2(root, &path, &level);
5790 /* Normal exit, reset ret to err */
5797 btrfs_release_path(&path);
5802 * Find the relative ref for root_ref and root_backref.
5804 * @root: the root of the root tree.
5805 * @ref_key: the key of the root ref.
5807 * Return 0 if no error occurred.
5809 static int check_root_ref(struct btrfs_root *root, struct btrfs_key *ref_key,
5810 struct extent_buffer *node, int slot)
5812 struct btrfs_path path;
5813 struct btrfs_key key;
5814 struct btrfs_root_ref *ref;
5815 struct btrfs_root_ref *backref;
5816 char ref_name[BTRFS_NAME_LEN] = {0};
5817 char backref_name[BTRFS_NAME_LEN] = {0};
5823 u32 backref_namelen;
5828 ref = btrfs_item_ptr(node, slot, struct btrfs_root_ref);
5829 ref_dirid = btrfs_root_ref_dirid(node, ref);
5830 ref_seq = btrfs_root_ref_sequence(node, ref);
5831 ref_namelen = btrfs_root_ref_name_len(node, ref);
5833 if (ref_namelen <= BTRFS_NAME_LEN) {
5836 len = BTRFS_NAME_LEN;
5837 warning("%s[%llu %llu] ref_name too long",
5838 ref_key->type == BTRFS_ROOT_REF_KEY ?
5839 "ROOT_REF" : "ROOT_BACKREF", ref_key->objectid,
5842 read_extent_buffer(node, ref_name, (unsigned long)(ref + 1), len);
5844 /* Find relative root_ref */
5845 key.objectid = ref_key->offset;
5846 key.type = BTRFS_ROOT_BACKREF_KEY + BTRFS_ROOT_REF_KEY - ref_key->type;
5847 key.offset = ref_key->objectid;
5849 btrfs_init_path(&path);
5850 ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
5852 err |= ROOT_REF_MISSING;
5853 error("%s[%llu %llu] couldn't find relative ref",
5854 ref_key->type == BTRFS_ROOT_REF_KEY ?
5855 "ROOT_REF" : "ROOT_BACKREF",
5856 ref_key->objectid, ref_key->offset);
5860 backref = btrfs_item_ptr(path.nodes[0], path.slots[0],
5861 struct btrfs_root_ref);
5862 backref_dirid = btrfs_root_ref_dirid(path.nodes[0], backref);
5863 backref_seq = btrfs_root_ref_sequence(path.nodes[0], backref);
5864 backref_namelen = btrfs_root_ref_name_len(path.nodes[0], backref);
5866 if (backref_namelen <= BTRFS_NAME_LEN) {
5867 len = backref_namelen;
5869 len = BTRFS_NAME_LEN;
5870 warning("%s[%llu %llu] ref_name too long",
5871 key.type == BTRFS_ROOT_REF_KEY ?
5872 "ROOT_REF" : "ROOT_BACKREF",
5873 key.objectid, key.offset);
5875 read_extent_buffer(path.nodes[0], backref_name,
5876 (unsigned long)(backref + 1), len);
5878 if (ref_dirid != backref_dirid || ref_seq != backref_seq ||
5879 ref_namelen != backref_namelen ||
5880 strncmp(ref_name, backref_name, len)) {
5881 err |= ROOT_REF_MISMATCH;
5882 error("%s[%llu %llu] mismatch relative ref",
5883 ref_key->type == BTRFS_ROOT_REF_KEY ?
5884 "ROOT_REF" : "ROOT_BACKREF",
5885 ref_key->objectid, ref_key->offset);
5888 btrfs_release_path(&path);
5893 * Check all fs/file tree in low_memory mode.
5895 * 1. for fs tree root item, call check_fs_root_v2()
5896 * 2. for fs tree root ref/backref, call check_root_ref()
5898 * Return 0 if no error occurred.
5900 static int check_fs_roots_v2(struct btrfs_fs_info *fs_info)
5902 struct btrfs_root *tree_root = fs_info->tree_root;
5903 struct btrfs_root *cur_root = NULL;
5904 struct btrfs_path path;
5905 struct btrfs_key key;
5906 struct extent_buffer *node;
5907 unsigned int ext_ref;
5912 ext_ref = btrfs_fs_incompat(fs_info, EXTENDED_IREF);
5914 btrfs_init_path(&path);
5915 key.objectid = BTRFS_FS_TREE_OBJECTID;
5917 key.type = BTRFS_ROOT_ITEM_KEY;
5919 ret = btrfs_search_slot(NULL, tree_root, &key, &path, 0, 0);
5923 } else if (ret > 0) {
5929 node = path.nodes[0];
5930 slot = path.slots[0];
5931 btrfs_item_key_to_cpu(node, &key, slot);
5932 if (key.objectid > BTRFS_LAST_FREE_OBJECTID)
5934 if (key.type == BTRFS_ROOT_ITEM_KEY &&
5935 fs_root_objectid(key.objectid)) {
5936 if (key.objectid == BTRFS_TREE_RELOC_OBJECTID) {
5937 cur_root = btrfs_read_fs_root_no_cache(fs_info,
5940 key.offset = (u64)-1;
5941 cur_root = btrfs_read_fs_root(fs_info, &key);
5944 if (IS_ERR(cur_root)) {
5945 error("Fail to read fs/subvol tree: %lld",
5951 ret = check_fs_root_v2(cur_root, ext_ref);
5954 if (key.objectid == BTRFS_TREE_RELOC_OBJECTID)
5955 btrfs_free_fs_root(cur_root);
5956 } else if (key.type == BTRFS_ROOT_REF_KEY ||
5957 key.type == BTRFS_ROOT_BACKREF_KEY) {
5958 ret = check_root_ref(tree_root, &key, node, slot);
5962 ret = btrfs_next_item(tree_root, &path);
5972 btrfs_release_path(&path);
5976 static int do_check_fs_roots(struct btrfs_fs_info *fs_info,
5977 struct cache_tree *root_cache)
5981 if (!ctx.progress_enabled)
5982 fprintf(stderr, "checking fs roots\n");
5983 if (check_mode == CHECK_MODE_LOWMEM)
5984 ret = check_fs_roots_v2(fs_info);
5986 ret = check_fs_roots(fs_info, root_cache);
5991 static int all_backpointers_checked(struct extent_record *rec, int print_errs)
5993 struct extent_backref *back, *tmp;
5994 struct tree_backref *tback;
5995 struct data_backref *dback;
5999 rbtree_postorder_for_each_entry_safe(back, tmp,
6000 &rec->backref_tree, node) {
6001 if (!back->found_extent_tree) {
6005 if (back->is_data) {
6006 dback = to_data_backref(back);
6007 fprintf(stderr, "Data backref %llu %s %llu"
6008 " owner %llu offset %llu num_refs %lu"
6009 " not found in extent tree\n",
6010 (unsigned long long)rec->start,
6011 back->full_backref ?
6013 back->full_backref ?
6014 (unsigned long long)dback->parent:
6015 (unsigned long long)dback->root,
6016 (unsigned long long)dback->owner,
6017 (unsigned long long)dback->offset,
6018 (unsigned long)dback->num_refs);
6020 tback = to_tree_backref(back);
6021 fprintf(stderr, "Tree backref %llu parent %llu"
6022 " root %llu not found in extent tree\n",
6023 (unsigned long long)rec->start,
6024 (unsigned long long)tback->parent,
6025 (unsigned long long)tback->root);
6028 if (!back->is_data && !back->found_ref) {
6032 tback = to_tree_backref(back);
6033 fprintf(stderr, "Backref %llu %s %llu not referenced back %p\n",
6034 (unsigned long long)rec->start,
6035 back->full_backref ? "parent" : "root",
6036 back->full_backref ?
6037 (unsigned long long)tback->parent :
6038 (unsigned long long)tback->root, back);
6040 if (back->is_data) {
6041 dback = to_data_backref(back);
6042 if (dback->found_ref != dback->num_refs) {
6046 fprintf(stderr, "Incorrect local backref count"
6047 " on %llu %s %llu owner %llu"
6048 " offset %llu found %u wanted %u back %p\n",
6049 (unsigned long long)rec->start,
6050 back->full_backref ?
6052 back->full_backref ?
6053 (unsigned long long)dback->parent:
6054 (unsigned long long)dback->root,
6055 (unsigned long long)dback->owner,
6056 (unsigned long long)dback->offset,
6057 dback->found_ref, dback->num_refs, back);
6059 if (dback->disk_bytenr != rec->start) {
6063 fprintf(stderr, "Backref disk bytenr does not"
6064 " match extent record, bytenr=%llu, "
6065 "ref bytenr=%llu\n",
6066 (unsigned long long)rec->start,
6067 (unsigned long long)dback->disk_bytenr);
6070 if (dback->bytes != rec->nr) {
6074 fprintf(stderr, "Backref bytes do not match "
6075 "extent backref, bytenr=%llu, ref "
6076 "bytes=%llu, backref bytes=%llu\n",
6077 (unsigned long long)rec->start,
6078 (unsigned long long)rec->nr,
6079 (unsigned long long)dback->bytes);
6082 if (!back->is_data) {
6085 dback = to_data_backref(back);
6086 found += dback->found_ref;
6089 if (found != rec->refs) {
6093 fprintf(stderr, "Incorrect global backref count "
6094 "on %llu found %llu wanted %llu\n",
6095 (unsigned long long)rec->start,
6096 (unsigned long long)found,
6097 (unsigned long long)rec->refs);
6103 static void __free_one_backref(struct rb_node *node)
6105 struct extent_backref *back = rb_node_to_extent_backref(node);
6110 static void free_all_extent_backrefs(struct extent_record *rec)
6112 rb_free_nodes(&rec->backref_tree, __free_one_backref);
6115 static void free_extent_record_cache(struct cache_tree *extent_cache)
6117 struct cache_extent *cache;
6118 struct extent_record *rec;
6121 cache = first_cache_extent(extent_cache);
6124 rec = container_of(cache, struct extent_record, cache);
6125 remove_cache_extent(extent_cache, cache);
6126 free_all_extent_backrefs(rec);
6131 static int maybe_free_extent_rec(struct cache_tree *extent_cache,
6132 struct extent_record *rec)
6134 if (rec->content_checked && rec->owner_ref_checked &&
6135 rec->extent_item_refs == rec->refs && rec->refs > 0 &&
6136 rec->num_duplicates == 0 && !all_backpointers_checked(rec, 0) &&
6137 !rec->bad_full_backref && !rec->crossing_stripes &&
6138 !rec->wrong_chunk_type) {
6139 remove_cache_extent(extent_cache, &rec->cache);
6140 free_all_extent_backrefs(rec);
6141 list_del_init(&rec->list);
6147 static int check_owner_ref(struct btrfs_root *root,
6148 struct extent_record *rec,
6149 struct extent_buffer *buf)
6151 struct extent_backref *node, *tmp;
6152 struct tree_backref *back;
6153 struct btrfs_root *ref_root;
6154 struct btrfs_key key;
6155 struct btrfs_path path;
6156 struct extent_buffer *parent;
6161 rbtree_postorder_for_each_entry_safe(node, tmp,
6162 &rec->backref_tree, node) {
6165 if (!node->found_ref)
6167 if (node->full_backref)
6169 back = to_tree_backref(node);
6170 if (btrfs_header_owner(buf) == back->root)
6173 BUG_ON(rec->is_root);
6175 /* try to find the block by search corresponding fs tree */
6176 key.objectid = btrfs_header_owner(buf);
6177 key.type = BTRFS_ROOT_ITEM_KEY;
6178 key.offset = (u64)-1;
6180 ref_root = btrfs_read_fs_root(root->fs_info, &key);
6181 if (IS_ERR(ref_root))
6184 level = btrfs_header_level(buf);
6186 btrfs_item_key_to_cpu(buf, &key, 0);
6188 btrfs_node_key_to_cpu(buf, &key, 0);
6190 btrfs_init_path(&path);
6191 path.lowest_level = level + 1;
6192 ret = btrfs_search_slot(NULL, ref_root, &key, &path, 0, 0);
6196 parent = path.nodes[level + 1];
6197 if (parent && buf->start == btrfs_node_blockptr(parent,
6198 path.slots[level + 1]))
6201 btrfs_release_path(&path);
6202 return found ? 0 : 1;
6205 static int is_extent_tree_record(struct extent_record *rec)
6207 struct extent_backref *node, *tmp;
6208 struct tree_backref *back;
6211 rbtree_postorder_for_each_entry_safe(node, tmp,
6212 &rec->backref_tree, node) {
6215 back = to_tree_backref(node);
6216 if (node->full_backref)
6218 if (back->root == BTRFS_EXTENT_TREE_OBJECTID)
6225 static int record_bad_block_io(struct btrfs_fs_info *info,
6226 struct cache_tree *extent_cache,
6229 struct extent_record *rec;
6230 struct cache_extent *cache;
6231 struct btrfs_key key;
6233 cache = lookup_cache_extent(extent_cache, start, len);
6237 rec = container_of(cache, struct extent_record, cache);
6238 if (!is_extent_tree_record(rec))
6241 btrfs_disk_key_to_cpu(&key, &rec->parent_key);
6242 return btrfs_add_corrupt_extent_record(info, &key, start, len, 0);
6245 static int swap_values(struct btrfs_root *root, struct btrfs_path *path,
6246 struct extent_buffer *buf, int slot)
6248 if (btrfs_header_level(buf)) {
6249 struct btrfs_key_ptr ptr1, ptr2;
6251 read_extent_buffer(buf, &ptr1, btrfs_node_key_ptr_offset(slot),
6252 sizeof(struct btrfs_key_ptr));
6253 read_extent_buffer(buf, &ptr2,
6254 btrfs_node_key_ptr_offset(slot + 1),
6255 sizeof(struct btrfs_key_ptr));
6256 write_extent_buffer(buf, &ptr1,
6257 btrfs_node_key_ptr_offset(slot + 1),
6258 sizeof(struct btrfs_key_ptr));
6259 write_extent_buffer(buf, &ptr2,
6260 btrfs_node_key_ptr_offset(slot),
6261 sizeof(struct btrfs_key_ptr));
6263 struct btrfs_disk_key key;
6264 btrfs_node_key(buf, &key, 0);
6265 btrfs_fixup_low_keys(root, path, &key,
6266 btrfs_header_level(buf) + 1);
6269 struct btrfs_item *item1, *item2;
6270 struct btrfs_key k1, k2;
6271 char *item1_data, *item2_data;
6272 u32 item1_offset, item2_offset, item1_size, item2_size;
6274 item1 = btrfs_item_nr(slot);
6275 item2 = btrfs_item_nr(slot + 1);
6276 btrfs_item_key_to_cpu(buf, &k1, slot);
6277 btrfs_item_key_to_cpu(buf, &k2, slot + 1);
6278 item1_offset = btrfs_item_offset(buf, item1);
6279 item2_offset = btrfs_item_offset(buf, item2);
6280 item1_size = btrfs_item_size(buf, item1);
6281 item2_size = btrfs_item_size(buf, item2);
6283 item1_data = malloc(item1_size);
6286 item2_data = malloc(item2_size);
6292 read_extent_buffer(buf, item1_data, item1_offset, item1_size);
6293 read_extent_buffer(buf, item2_data, item2_offset, item2_size);
6295 write_extent_buffer(buf, item1_data, item2_offset, item2_size);
6296 write_extent_buffer(buf, item2_data, item1_offset, item1_size);
6300 btrfs_set_item_offset(buf, item1, item2_offset);
6301 btrfs_set_item_offset(buf, item2, item1_offset);
6302 btrfs_set_item_size(buf, item1, item2_size);
6303 btrfs_set_item_size(buf, item2, item1_size);
6305 path->slots[0] = slot;
6306 btrfs_set_item_key_unsafe(root, path, &k2);
6307 path->slots[0] = slot + 1;
6308 btrfs_set_item_key_unsafe(root, path, &k1);
6313 static int fix_key_order(struct btrfs_root *root, struct btrfs_path *path)
6315 struct extent_buffer *buf;
6316 struct btrfs_key k1, k2;
6318 int level = path->lowest_level;
6321 buf = path->nodes[level];
6322 for (i = 0; i < btrfs_header_nritems(buf) - 1; i++) {
6324 btrfs_node_key_to_cpu(buf, &k1, i);
6325 btrfs_node_key_to_cpu(buf, &k2, i + 1);
6327 btrfs_item_key_to_cpu(buf, &k1, i);
6328 btrfs_item_key_to_cpu(buf, &k2, i + 1);
6330 if (btrfs_comp_cpu_keys(&k1, &k2) < 0)
6332 ret = swap_values(root, path, buf, i);
6335 btrfs_mark_buffer_dirty(buf);
6341 static int delete_bogus_item(struct btrfs_root *root,
6342 struct btrfs_path *path,
6343 struct extent_buffer *buf, int slot)
6345 struct btrfs_key key;
6346 int nritems = btrfs_header_nritems(buf);
6348 btrfs_item_key_to_cpu(buf, &key, slot);
6350 /* These are all the keys we can deal with missing. */
6351 if (key.type != BTRFS_DIR_INDEX_KEY &&
6352 key.type != BTRFS_EXTENT_ITEM_KEY &&
6353 key.type != BTRFS_METADATA_ITEM_KEY &&
6354 key.type != BTRFS_TREE_BLOCK_REF_KEY &&
6355 key.type != BTRFS_EXTENT_DATA_REF_KEY)
6358 printf("Deleting bogus item [%llu,%u,%llu] at slot %d on block %llu\n",
6359 (unsigned long long)key.objectid, key.type,
6360 (unsigned long long)key.offset, slot, buf->start);
6361 memmove_extent_buffer(buf, btrfs_item_nr_offset(slot),
6362 btrfs_item_nr_offset(slot + 1),
6363 sizeof(struct btrfs_item) *
6364 (nritems - slot - 1));
6365 btrfs_set_header_nritems(buf, nritems - 1);
6367 struct btrfs_disk_key disk_key;
6369 btrfs_item_key(buf, &disk_key, 0);
6370 btrfs_fixup_low_keys(root, path, &disk_key, 1);
6372 btrfs_mark_buffer_dirty(buf);
6376 static int fix_item_offset(struct btrfs_root *root, struct btrfs_path *path)
6378 struct extent_buffer *buf;
6382 /* We should only get this for leaves */
6383 BUG_ON(path->lowest_level);
6384 buf = path->nodes[0];
6386 for (i = 0; i < btrfs_header_nritems(buf); i++) {
6387 unsigned int shift = 0, offset;
6389 if (i == 0 && btrfs_item_end_nr(buf, i) !=
6390 BTRFS_LEAF_DATA_SIZE(root)) {
6391 if (btrfs_item_end_nr(buf, i) >
6392 BTRFS_LEAF_DATA_SIZE(root)) {
6393 ret = delete_bogus_item(root, path, buf, i);
6396 fprintf(stderr, "item is off the end of the "
6397 "leaf, can't fix\n");
6401 shift = BTRFS_LEAF_DATA_SIZE(root) -
6402 btrfs_item_end_nr(buf, i);
6403 } else if (i > 0 && btrfs_item_end_nr(buf, i) !=
6404 btrfs_item_offset_nr(buf, i - 1)) {
6405 if (btrfs_item_end_nr(buf, i) >
6406 btrfs_item_offset_nr(buf, i - 1)) {
6407 ret = delete_bogus_item(root, path, buf, i);
6410 fprintf(stderr, "items overlap, can't fix\n");
6414 shift = btrfs_item_offset_nr(buf, i - 1) -
6415 btrfs_item_end_nr(buf, i);
6420 printf("Shifting item nr %d by %u bytes in block %llu\n",
6421 i, shift, (unsigned long long)buf->start);
6422 offset = btrfs_item_offset_nr(buf, i);
6423 memmove_extent_buffer(buf,
6424 btrfs_leaf_data(buf) + offset + shift,
6425 btrfs_leaf_data(buf) + offset,
6426 btrfs_item_size_nr(buf, i));
6427 btrfs_set_item_offset(buf, btrfs_item_nr(i),
6429 btrfs_mark_buffer_dirty(buf);
6433 * We may have moved things, in which case we want to exit so we don't
6434 * write those changes out. Once we have proper abort functionality in
6435 * progs this can be changed to something nicer.
6442 * Attempt to fix basic block failures. If we can't fix it for whatever reason
6443 * then just return -EIO.
6445 static int try_to_fix_bad_block(struct btrfs_root *root,
6446 struct extent_buffer *buf,
6447 enum btrfs_tree_block_status status)
6449 struct btrfs_trans_handle *trans;
6450 struct ulist *roots;
6451 struct ulist_node *node;
6452 struct btrfs_root *search_root;
6453 struct btrfs_path path;
6454 struct ulist_iterator iter;
6455 struct btrfs_key root_key, key;
6458 if (status != BTRFS_TREE_BLOCK_BAD_KEY_ORDER &&
6459 status != BTRFS_TREE_BLOCK_INVALID_OFFSETS)
6462 ret = btrfs_find_all_roots(NULL, root->fs_info, buf->start, 0, &roots);
6466 btrfs_init_path(&path);
6467 ULIST_ITER_INIT(&iter);
6468 while ((node = ulist_next(roots, &iter))) {
6469 root_key.objectid = node->val;
6470 root_key.type = BTRFS_ROOT_ITEM_KEY;
6471 root_key.offset = (u64)-1;
6473 search_root = btrfs_read_fs_root(root->fs_info, &root_key);
6480 trans = btrfs_start_transaction(search_root, 0);
6481 if (IS_ERR(trans)) {
6482 ret = PTR_ERR(trans);
6486 path.lowest_level = btrfs_header_level(buf);
6487 path.skip_check_block = 1;
6488 if (path.lowest_level)
6489 btrfs_node_key_to_cpu(buf, &key, 0);
6491 btrfs_item_key_to_cpu(buf, &key, 0);
6492 ret = btrfs_search_slot(trans, search_root, &key, &path, 0, 1);
6495 btrfs_commit_transaction(trans, search_root);
6498 if (status == BTRFS_TREE_BLOCK_BAD_KEY_ORDER)
6499 ret = fix_key_order(search_root, &path);
6500 else if (status == BTRFS_TREE_BLOCK_INVALID_OFFSETS)
6501 ret = fix_item_offset(search_root, &path);
6503 btrfs_commit_transaction(trans, search_root);
6506 btrfs_release_path(&path);
6507 btrfs_commit_transaction(trans, search_root);
6510 btrfs_release_path(&path);
6514 static int check_block(struct btrfs_root *root,
6515 struct cache_tree *extent_cache,
6516 struct extent_buffer *buf, u64 flags)
6518 struct extent_record *rec;
6519 struct cache_extent *cache;
6520 struct btrfs_key key;
6521 enum btrfs_tree_block_status status;
6525 cache = lookup_cache_extent(extent_cache, buf->start, buf->len);
6528 rec = container_of(cache, struct extent_record, cache);
6529 rec->generation = btrfs_header_generation(buf);
6531 level = btrfs_header_level(buf);
6532 if (btrfs_header_nritems(buf) > 0) {
6535 btrfs_item_key_to_cpu(buf, &key, 0);
6537 btrfs_node_key_to_cpu(buf, &key, 0);
6539 rec->info_objectid = key.objectid;
6541 rec->info_level = level;
6543 if (btrfs_is_leaf(buf))
6544 status = btrfs_check_leaf(root, &rec->parent_key, buf);
6546 status = btrfs_check_node(root, &rec->parent_key, buf);
6548 if (status != BTRFS_TREE_BLOCK_CLEAN) {
6550 status = try_to_fix_bad_block(root, buf, status);
6551 if (status != BTRFS_TREE_BLOCK_CLEAN) {
6553 fprintf(stderr, "bad block %llu\n",
6554 (unsigned long long)buf->start);
6557 * Signal to callers we need to start the scan over
6558 * again since we'll have cowed blocks.
6563 rec->content_checked = 1;
6564 if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)
6565 rec->owner_ref_checked = 1;
6567 ret = check_owner_ref(root, rec, buf);
6569 rec->owner_ref_checked = 1;
6573 maybe_free_extent_rec(extent_cache, rec);
6578 static struct tree_backref *find_tree_backref(struct extent_record *rec,
6579 u64 parent, u64 root)
6581 struct list_head *cur = rec->backrefs.next;
6582 struct extent_backref *node;
6583 struct tree_backref *back;
6585 while(cur != &rec->backrefs) {
6586 node = to_extent_backref(cur);
6590 back = to_tree_backref(node);
6592 if (!node->full_backref)
6594 if (parent == back->parent)
6597 if (node->full_backref)
6599 if (back->root == root)
6607 static struct tree_backref *alloc_tree_backref(struct extent_record *rec,
6608 u64 parent, u64 root)
6610 struct tree_backref *ref = malloc(sizeof(*ref));
6614 memset(&ref->node, 0, sizeof(ref->node));
6616 ref->parent = parent;
6617 ref->node.full_backref = 1;
6620 ref->node.full_backref = 0;
6627 static struct data_backref *find_data_backref(struct extent_record *rec,
6628 u64 parent, u64 root,
6629 u64 owner, u64 offset,
6631 u64 disk_bytenr, u64 bytes)
6633 struct list_head *cur = rec->backrefs.next;
6634 struct extent_backref *node;
6635 struct data_backref *back;
6637 while(cur != &rec->backrefs) {
6638 node = to_extent_backref(cur);
6642 back = to_data_backref(node);
6644 if (!node->full_backref)
6646 if (parent == back->parent)
6649 if (node->full_backref)
6651 if (back->root == root && back->owner == owner &&
6652 back->offset == offset) {
6653 if (found_ref && node->found_ref &&
6654 (back->bytes != bytes ||
6655 back->disk_bytenr != disk_bytenr))
6665 static struct data_backref *alloc_data_backref(struct extent_record *rec,
6666 u64 parent, u64 root,
6667 u64 owner, u64 offset,
6670 struct data_backref *ref = malloc(sizeof(*ref));
6674 memset(&ref->node, 0, sizeof(ref->node));
6675 ref->node.is_data = 1;
6678 ref->parent = parent;
6681 ref->node.full_backref = 1;
6685 ref->offset = offset;
6686 ref->node.full_backref = 0;
6688 ref->bytes = max_size;
6691 if (max_size > rec->max_size)
6692 rec->max_size = max_size;
6696 /* Check if the type of extent matches with its chunk */
6697 static void check_extent_type(struct extent_record *rec)
6699 struct btrfs_block_group_cache *bg_cache;
6701 bg_cache = btrfs_lookup_first_block_group(global_info, rec->start);
6705 /* data extent, check chunk directly*/
6706 if (!rec->metadata) {
6707 if (!(bg_cache->flags & BTRFS_BLOCK_GROUP_DATA))
6708 rec->wrong_chunk_type = 1;
6712 /* metadata extent, check the obvious case first */
6713 if (!(bg_cache->flags & (BTRFS_BLOCK_GROUP_SYSTEM |
6714 BTRFS_BLOCK_GROUP_METADATA))) {
6715 rec->wrong_chunk_type = 1;
6720 * Check SYSTEM extent, as it's also marked as metadata, we can only
6721 * make sure it's a SYSTEM extent by its backref
6723 if (!RB_EMPTY_ROOT(&rec->backref_tree)) {
6724 struct extent_backref *node;
6725 struct tree_backref *tback;
6728 node = rb_node_to_extent_backref(rb_first(&rec->backref_tree));
6729 if (node->is_data) {
6730 /* tree block shouldn't have data backref */
6731 rec->wrong_chunk_type = 1;
6734 tback = container_of(node, struct tree_backref, node);
6736 if (tback->root == BTRFS_CHUNK_TREE_OBJECTID)
6737 bg_type = BTRFS_BLOCK_GROUP_SYSTEM;
6739 bg_type = BTRFS_BLOCK_GROUP_METADATA;
6740 if (!(bg_cache->flags & bg_type))
6741 rec->wrong_chunk_type = 1;
6746 * Allocate a new extent record, fill default values from @tmpl and insert int
6747 * @extent_cache. Caller is supposed to make sure the [start,nr) is not in
6748 * the cache, otherwise it fails.
6750 static int add_extent_rec_nolookup(struct cache_tree *extent_cache,
6751 struct extent_record *tmpl)
6753 struct extent_record *rec;
6756 BUG_ON(tmpl->max_size == 0);
6757 rec = malloc(sizeof(*rec));
6760 rec->start = tmpl->start;
6761 rec->max_size = tmpl->max_size;
6762 rec->nr = max(tmpl->nr, tmpl->max_size);
6763 rec->found_rec = tmpl->found_rec;
6764 rec->content_checked = tmpl->content_checked;
6765 rec->owner_ref_checked = tmpl->owner_ref_checked;
6766 rec->num_duplicates = 0;
6767 rec->metadata = tmpl->metadata;
6768 rec->flag_block_full_backref = FLAG_UNSET;
6769 rec->bad_full_backref = 0;
6770 rec->crossing_stripes = 0;
6771 rec->wrong_chunk_type = 0;
6772 rec->is_root = tmpl->is_root;
6773 rec->refs = tmpl->refs;
6774 rec->extent_item_refs = tmpl->extent_item_refs;
6775 rec->parent_generation = tmpl->parent_generation;
6776 INIT_LIST_HEAD(&rec->backrefs);
6777 INIT_LIST_HEAD(&rec->dups);
6778 INIT_LIST_HEAD(&rec->list);
6779 rec->backref_tree = RB_ROOT;
6780 memcpy(&rec->parent_key, &tmpl->parent_key, sizeof(tmpl->parent_key));
6781 rec->cache.start = tmpl->start;
6782 rec->cache.size = tmpl->nr;
6783 ret = insert_cache_extent(extent_cache, &rec->cache);
6788 bytes_used += rec->nr;
6791 rec->crossing_stripes = check_crossing_stripes(global_info,
6792 rec->start, global_info->nodesize);
6793 check_extent_type(rec);
6798 * Lookup and modify an extent, some values of @tmpl are interpreted verbatim,
6800 * - refs - if found, increase refs
6801 * - is_root - if found, set
6802 * - content_checked - if found, set
6803 * - owner_ref_checked - if found, set
6805 * If not found, create a new one, initialize and insert.
6807 static int add_extent_rec(struct cache_tree *extent_cache,
6808 struct extent_record *tmpl)
6810 struct extent_record *rec;
6811 struct cache_extent *cache;
6815 cache = lookup_cache_extent(extent_cache, tmpl->start, tmpl->nr);
6817 rec = container_of(cache, struct extent_record, cache);
6821 rec->nr = max(tmpl->nr, tmpl->max_size);
6824 * We need to make sure to reset nr to whatever the extent
6825 * record says was the real size, this way we can compare it to
6828 if (tmpl->found_rec) {
6829 if (tmpl->start != rec->start || rec->found_rec) {
6830 struct extent_record *tmp;
6833 if (list_empty(&rec->list))
6834 list_add_tail(&rec->list,
6835 &duplicate_extents);
6838 * We have to do this song and dance in case we
6839 * find an extent record that falls inside of
6840 * our current extent record but does not have
6841 * the same objectid.
6843 tmp = malloc(sizeof(*tmp));
6846 tmp->start = tmpl->start;
6847 tmp->max_size = tmpl->max_size;
6850 tmp->metadata = tmpl->metadata;
6851 tmp->extent_item_refs = tmpl->extent_item_refs;
6852 INIT_LIST_HEAD(&tmp->list);
6853 list_add_tail(&tmp->list, &rec->dups);
6854 rec->num_duplicates++;
6861 if (tmpl->extent_item_refs && !dup) {
6862 if (rec->extent_item_refs) {
6863 fprintf(stderr, "block %llu rec "
6864 "extent_item_refs %llu, passed %llu\n",
6865 (unsigned long long)tmpl->start,
6866 (unsigned long long)
6867 rec->extent_item_refs,
6868 (unsigned long long)tmpl->extent_item_refs);
6870 rec->extent_item_refs = tmpl->extent_item_refs;
6874 if (tmpl->content_checked)
6875 rec->content_checked = 1;
6876 if (tmpl->owner_ref_checked)
6877 rec->owner_ref_checked = 1;
6878 memcpy(&rec->parent_key, &tmpl->parent_key,
6879 sizeof(tmpl->parent_key));
6880 if (tmpl->parent_generation)
6881 rec->parent_generation = tmpl->parent_generation;
6882 if (rec->max_size < tmpl->max_size)
6883 rec->max_size = tmpl->max_size;
6886 * A metadata extent can't cross stripe_len boundary, otherwise
6887 * kernel scrub won't be able to handle it.
6888 * As now stripe_len is fixed to BTRFS_STRIPE_LEN, just check
6892 rec->crossing_stripes = check_crossing_stripes(
6893 global_info, rec->start,
6894 global_info->nodesize);
6895 check_extent_type(rec);
6896 maybe_free_extent_rec(extent_cache, rec);
6900 ret = add_extent_rec_nolookup(extent_cache, tmpl);
6905 static int add_tree_backref(struct cache_tree *extent_cache, u64 bytenr,
6906 u64 parent, u64 root, int found_ref)
6908 struct extent_record *rec;
6909 struct tree_backref *back;
6910 struct cache_extent *cache;
6912 bool insert = false;
6914 cache = lookup_cache_extent(extent_cache, bytenr, 1);
6916 struct extent_record tmpl;
6918 memset(&tmpl, 0, sizeof(tmpl));
6919 tmpl.start = bytenr;
6924 ret = add_extent_rec_nolookup(extent_cache, &tmpl);
6928 /* really a bug in cache_extent implement now */
6929 cache = lookup_cache_extent(extent_cache, bytenr, 1);
6934 rec = container_of(cache, struct extent_record, cache);
6935 if (rec->start != bytenr) {
6937 * Several cause, from unaligned bytenr to over lapping extents
6942 back = find_tree_backref(rec, parent, root);
6944 back = alloc_tree_backref(rec, parent, root);
6951 if (back->node.found_ref) {
6952 fprintf(stderr, "Extent back ref already exists "
6953 "for %llu parent %llu root %llu \n",
6954 (unsigned long long)bytenr,
6955 (unsigned long long)parent,
6956 (unsigned long long)root);
6958 back->node.found_ref = 1;
6960 if (back->node.found_extent_tree) {
6961 fprintf(stderr, "Extent back ref already exists "
6962 "for %llu parent %llu root %llu \n",
6963 (unsigned long long)bytenr,
6964 (unsigned long long)parent,
6965 (unsigned long long)root);
6967 back->node.found_extent_tree = 1;
6970 WARN_ON(rb_insert(&rec->backref_tree, &back->node.node,
6971 compare_extent_backref));
6972 check_extent_type(rec);
6973 maybe_free_extent_rec(extent_cache, rec);
6977 static int add_data_backref(struct cache_tree *extent_cache, u64 bytenr,
6978 u64 parent, u64 root, u64 owner, u64 offset,
6979 u32 num_refs, int found_ref, u64 max_size)
6981 struct extent_record *rec;
6982 struct data_backref *back;
6983 struct cache_extent *cache;
6985 bool insert = false;
6987 cache = lookup_cache_extent(extent_cache, bytenr, 1);
6989 struct extent_record tmpl;
6991 memset(&tmpl, 0, sizeof(tmpl));
6992 tmpl.start = bytenr;
6994 tmpl.max_size = max_size;
6996 ret = add_extent_rec_nolookup(extent_cache, &tmpl);
7000 cache = lookup_cache_extent(extent_cache, bytenr, 1);
7005 rec = container_of(cache, struct extent_record, cache);
7006 if (rec->max_size < max_size)
7007 rec->max_size = max_size;
7010 * If found_ref is set then max_size is the real size and must match the
7011 * existing refs. So if we have already found a ref then we need to
7012 * make sure that this ref matches the existing one, otherwise we need
7013 * to add a new backref so we can notice that the backrefs don't match
7014 * and we need to figure out who is telling the truth. This is to
7015 * account for that awful fsync bug I introduced where we'd end up with
7016 * a btrfs_file_extent_item that would have its length include multiple
7017 * prealloc extents or point inside of a prealloc extent.
7019 back = find_data_backref(rec, parent, root, owner, offset, found_ref,
7022 back = alloc_data_backref(rec, parent, root, owner, offset,
7029 BUG_ON(num_refs != 1);
7030 if (back->node.found_ref)
7031 BUG_ON(back->bytes != max_size);
7032 back->node.found_ref = 1;
7033 back->found_ref += 1;
7034 if (back->bytes != max_size || back->disk_bytenr != bytenr) {
7035 back->bytes = max_size;
7036 back->disk_bytenr = bytenr;
7038 /* Need to reinsert if not already in the tree */
7040 rb_erase(&back->node.node, &rec->backref_tree);
7045 rec->content_checked = 1;
7046 rec->owner_ref_checked = 1;
7048 if (back->node.found_extent_tree) {
7049 fprintf(stderr, "Extent back ref already exists "
7050 "for %llu parent %llu root %llu "
7051 "owner %llu offset %llu num_refs %lu\n",
7052 (unsigned long long)bytenr,
7053 (unsigned long long)parent,
7054 (unsigned long long)root,
7055 (unsigned long long)owner,
7056 (unsigned long long)offset,
7057 (unsigned long)num_refs);
7059 back->num_refs = num_refs;
7060 back->node.found_extent_tree = 1;
7063 WARN_ON(rb_insert(&rec->backref_tree, &back->node.node,
7064 compare_extent_backref));
7066 maybe_free_extent_rec(extent_cache, rec);
7070 static int add_pending(struct cache_tree *pending,
7071 struct cache_tree *seen, u64 bytenr, u32 size)
7074 ret = add_cache_extent(seen, bytenr, size);
7077 add_cache_extent(pending, bytenr, size);
7081 static int pick_next_pending(struct cache_tree *pending,
7082 struct cache_tree *reada,
7083 struct cache_tree *nodes,
7084 u64 last, struct block_info *bits, int bits_nr,
7087 unsigned long node_start = last;
7088 struct cache_extent *cache;
7091 cache = search_cache_extent(reada, 0);
7093 bits[0].start = cache->start;
7094 bits[0].size = cache->size;
7099 if (node_start > 32768)
7100 node_start -= 32768;
7102 cache = search_cache_extent(nodes, node_start);
7104 cache = search_cache_extent(nodes, 0);
7107 cache = search_cache_extent(pending, 0);
7112 bits[ret].start = cache->start;
7113 bits[ret].size = cache->size;
7114 cache = next_cache_extent(cache);
7116 } while (cache && ret < bits_nr);
7122 bits[ret].start = cache->start;
7123 bits[ret].size = cache->size;
7124 cache = next_cache_extent(cache);
7126 } while (cache && ret < bits_nr);
7128 if (bits_nr - ret > 8) {
7129 u64 lookup = bits[0].start + bits[0].size;
7130 struct cache_extent *next;
7131 next = search_cache_extent(pending, lookup);
7133 if (next->start - lookup > 32768)
7135 bits[ret].start = next->start;
7136 bits[ret].size = next->size;
7137 lookup = next->start + next->size;
7141 next = next_cache_extent(next);
7149 static void free_chunk_record(struct cache_extent *cache)
7151 struct chunk_record *rec;
7153 rec = container_of(cache, struct chunk_record, cache);
7154 list_del_init(&rec->list);
7155 list_del_init(&rec->dextents);
7159 void free_chunk_cache_tree(struct cache_tree *chunk_cache)
7161 cache_tree_free_extents(chunk_cache, free_chunk_record);
7164 static void free_device_record(struct rb_node *node)
7166 struct device_record *rec;
7168 rec = container_of(node, struct device_record, node);
7172 FREE_RB_BASED_TREE(device_cache, free_device_record);
7174 int insert_block_group_record(struct block_group_tree *tree,
7175 struct block_group_record *bg_rec)
7179 ret = insert_cache_extent(&tree->tree, &bg_rec->cache);
7183 list_add_tail(&bg_rec->list, &tree->block_groups);
7187 static void free_block_group_record(struct cache_extent *cache)
7189 struct block_group_record *rec;
7191 rec = container_of(cache, struct block_group_record, cache);
7192 list_del_init(&rec->list);
7196 void free_block_group_tree(struct block_group_tree *tree)
7198 cache_tree_free_extents(&tree->tree, free_block_group_record);
7201 int insert_device_extent_record(struct device_extent_tree *tree,
7202 struct device_extent_record *de_rec)
7207 * Device extent is a bit different from the other extents, because
7208 * the extents which belong to the different devices may have the
7209 * same start and size, so we need use the special extent cache
7210 * search/insert functions.
7212 ret = insert_cache_extent2(&tree->tree, &de_rec->cache);
7216 list_add_tail(&de_rec->chunk_list, &tree->no_chunk_orphans);
7217 list_add_tail(&de_rec->device_list, &tree->no_device_orphans);
7221 static void free_device_extent_record(struct cache_extent *cache)
7223 struct device_extent_record *rec;
7225 rec = container_of(cache, struct device_extent_record, cache);
7226 if (!list_empty(&rec->chunk_list))
7227 list_del_init(&rec->chunk_list);
7228 if (!list_empty(&rec->device_list))
7229 list_del_init(&rec->device_list);
7233 void free_device_extent_tree(struct device_extent_tree *tree)
7235 cache_tree_free_extents(&tree->tree, free_device_extent_record);
7238 #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
7239 static int process_extent_ref_v0(struct cache_tree *extent_cache,
7240 struct extent_buffer *leaf, int slot)
7242 struct btrfs_extent_ref_v0 *ref0;
7243 struct btrfs_key key;
7246 btrfs_item_key_to_cpu(leaf, &key, slot);
7247 ref0 = btrfs_item_ptr(leaf, slot, struct btrfs_extent_ref_v0);
7248 if (btrfs_ref_objectid_v0(leaf, ref0) < BTRFS_FIRST_FREE_OBJECTID) {
7249 ret = add_tree_backref(extent_cache, key.objectid, key.offset,
7252 ret = add_data_backref(extent_cache, key.objectid, key.offset,
7253 0, 0, 0, btrfs_ref_count_v0(leaf, ref0), 0, 0);
7259 struct chunk_record *btrfs_new_chunk_record(struct extent_buffer *leaf,
7260 struct btrfs_key *key,
7263 struct btrfs_chunk *ptr;
7264 struct chunk_record *rec;
7267 ptr = btrfs_item_ptr(leaf, slot, struct btrfs_chunk);
7268 num_stripes = btrfs_chunk_num_stripes(leaf, ptr);
7270 rec = calloc(1, btrfs_chunk_record_size(num_stripes));
7272 fprintf(stderr, "memory allocation failed\n");
7276 INIT_LIST_HEAD(&rec->list);
7277 INIT_LIST_HEAD(&rec->dextents);
7280 rec->cache.start = key->offset;
7281 rec->cache.size = btrfs_chunk_length(leaf, ptr);
7283 rec->generation = btrfs_header_generation(leaf);
7285 rec->objectid = key->objectid;
7286 rec->type = key->type;
7287 rec->offset = key->offset;
7289 rec->length = rec->cache.size;
7290 rec->owner = btrfs_chunk_owner(leaf, ptr);
7291 rec->stripe_len = btrfs_chunk_stripe_len(leaf, ptr);
7292 rec->type_flags = btrfs_chunk_type(leaf, ptr);
7293 rec->io_width = btrfs_chunk_io_width(leaf, ptr);
7294 rec->io_align = btrfs_chunk_io_align(leaf, ptr);
7295 rec->sector_size = btrfs_chunk_sector_size(leaf, ptr);
7296 rec->num_stripes = num_stripes;
7297 rec->sub_stripes = btrfs_chunk_sub_stripes(leaf, ptr);
7299 for (i = 0; i < rec->num_stripes; ++i) {
7300 rec->stripes[i].devid =
7301 btrfs_stripe_devid_nr(leaf, ptr, i);
7302 rec->stripes[i].offset =
7303 btrfs_stripe_offset_nr(leaf, ptr, i);
7304 read_extent_buffer(leaf, rec->stripes[i].dev_uuid,
7305 (unsigned long)btrfs_stripe_dev_uuid_nr(ptr, i),
7312 static int process_chunk_item(struct cache_tree *chunk_cache,
7313 struct btrfs_key *key, struct extent_buffer *eb,
7316 struct chunk_record *rec;
7317 struct btrfs_chunk *chunk;
7320 chunk = btrfs_item_ptr(eb, slot, struct btrfs_chunk);
7322 * Do extra check for this chunk item,
7324 * It's still possible one can craft a leaf with CHUNK_ITEM, with
7325 * wrong onwer(3) out of chunk tree, to pass both chunk tree check
7326 * and owner<->key_type check.
7328 ret = btrfs_check_chunk_valid(global_info, eb, chunk, slot,
7331 error("chunk(%llu, %llu) is not valid, ignore it",
7332 key->offset, btrfs_chunk_length(eb, chunk));
7335 rec = btrfs_new_chunk_record(eb, key, slot);
7336 ret = insert_cache_extent(chunk_cache, &rec->cache);
7338 fprintf(stderr, "Chunk[%llu, %llu] existed.\n",
7339 rec->offset, rec->length);
7346 static int process_device_item(struct rb_root *dev_cache,
7347 struct btrfs_key *key, struct extent_buffer *eb, int slot)
7349 struct btrfs_dev_item *ptr;
7350 struct device_record *rec;
7353 ptr = btrfs_item_ptr(eb,
7354 slot, struct btrfs_dev_item);
7356 rec = malloc(sizeof(*rec));
7358 fprintf(stderr, "memory allocation failed\n");
7362 rec->devid = key->offset;
7363 rec->generation = btrfs_header_generation(eb);
7365 rec->objectid = key->objectid;
7366 rec->type = key->type;
7367 rec->offset = key->offset;
7369 rec->devid = btrfs_device_id(eb, ptr);
7370 rec->total_byte = btrfs_device_total_bytes(eb, ptr);
7371 rec->byte_used = btrfs_device_bytes_used(eb, ptr);
7373 ret = rb_insert(dev_cache, &rec->node, device_record_compare);
7375 fprintf(stderr, "Device[%llu] existed.\n", rec->devid);
7382 struct block_group_record *
7383 btrfs_new_block_group_record(struct extent_buffer *leaf, struct btrfs_key *key,
7386 struct btrfs_block_group_item *ptr;
7387 struct block_group_record *rec;
7389 rec = calloc(1, sizeof(*rec));
7391 fprintf(stderr, "memory allocation failed\n");
7395 rec->cache.start = key->objectid;
7396 rec->cache.size = key->offset;
7398 rec->generation = btrfs_header_generation(leaf);
7400 rec->objectid = key->objectid;
7401 rec->type = key->type;
7402 rec->offset = key->offset;
7404 ptr = btrfs_item_ptr(leaf, slot, struct btrfs_block_group_item);
7405 rec->flags = btrfs_disk_block_group_flags(leaf, ptr);
7407 INIT_LIST_HEAD(&rec->list);
7412 static int process_block_group_item(struct block_group_tree *block_group_cache,
7413 struct btrfs_key *key,
7414 struct extent_buffer *eb, int slot)
7416 struct block_group_record *rec;
7419 rec = btrfs_new_block_group_record(eb, key, slot);
7420 ret = insert_block_group_record(block_group_cache, rec);
7422 fprintf(stderr, "Block Group[%llu, %llu] existed.\n",
7423 rec->objectid, rec->offset);
7430 struct device_extent_record *
7431 btrfs_new_device_extent_record(struct extent_buffer *leaf,
7432 struct btrfs_key *key, int slot)
7434 struct device_extent_record *rec;
7435 struct btrfs_dev_extent *ptr;
7437 rec = calloc(1, sizeof(*rec));
7439 fprintf(stderr, "memory allocation failed\n");
7443 rec->cache.objectid = key->objectid;
7444 rec->cache.start = key->offset;
7446 rec->generation = btrfs_header_generation(leaf);
7448 rec->objectid = key->objectid;
7449 rec->type = key->type;
7450 rec->offset = key->offset;
7452 ptr = btrfs_item_ptr(leaf, slot, struct btrfs_dev_extent);
7453 rec->chunk_objecteid =
7454 btrfs_dev_extent_chunk_objectid(leaf, ptr);
7456 btrfs_dev_extent_chunk_offset(leaf, ptr);
7457 rec->length = btrfs_dev_extent_length(leaf, ptr);
7458 rec->cache.size = rec->length;
7460 INIT_LIST_HEAD(&rec->chunk_list);
7461 INIT_LIST_HEAD(&rec->device_list);
7467 process_device_extent_item(struct device_extent_tree *dev_extent_cache,
7468 struct btrfs_key *key, struct extent_buffer *eb,
7471 struct device_extent_record *rec;
7474 rec = btrfs_new_device_extent_record(eb, key, slot);
7475 ret = insert_device_extent_record(dev_extent_cache, rec);
7478 "Device extent[%llu, %llu, %llu] existed.\n",
7479 rec->objectid, rec->offset, rec->length);
7486 static int process_extent_item(struct btrfs_root *root,
7487 struct cache_tree *extent_cache,
7488 struct extent_buffer *eb, int slot)
7490 struct btrfs_extent_item *ei;
7491 struct btrfs_extent_inline_ref *iref;
7492 struct btrfs_extent_data_ref *dref;
7493 struct btrfs_shared_data_ref *sref;
7494 struct btrfs_key key;
7495 struct extent_record tmpl;
7500 u32 item_size = btrfs_item_size_nr(eb, slot);
7506 btrfs_item_key_to_cpu(eb, &key, slot);
7508 if (key.type == BTRFS_METADATA_ITEM_KEY) {
7510 num_bytes = root->fs_info->nodesize;
7512 num_bytes = key.offset;
7515 if (!IS_ALIGNED(key.objectid, root->fs_info->sectorsize)) {
7516 error("ignoring invalid extent, bytenr %llu is not aligned to %u",
7517 key.objectid, root->fs_info->sectorsize);
7520 if (item_size < sizeof(*ei)) {
7521 #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
7522 struct btrfs_extent_item_v0 *ei0;
7523 BUG_ON(item_size != sizeof(*ei0));
7524 ei0 = btrfs_item_ptr(eb, slot, struct btrfs_extent_item_v0);
7525 refs = btrfs_extent_refs_v0(eb, ei0);
7529 memset(&tmpl, 0, sizeof(tmpl));
7530 tmpl.start = key.objectid;
7531 tmpl.nr = num_bytes;
7532 tmpl.extent_item_refs = refs;
7533 tmpl.metadata = metadata;
7535 tmpl.max_size = num_bytes;
7537 return add_extent_rec(extent_cache, &tmpl);
7540 ei = btrfs_item_ptr(eb, slot, struct btrfs_extent_item);
7541 refs = btrfs_extent_refs(eb, ei);
7542 if (btrfs_extent_flags(eb, ei) & BTRFS_EXTENT_FLAG_TREE_BLOCK)
7546 if (metadata && num_bytes != root->fs_info->nodesize) {
7547 error("ignore invalid metadata extent, length %llu does not equal to %u",
7548 num_bytes, root->fs_info->nodesize);
7551 if (!metadata && !IS_ALIGNED(num_bytes, root->fs_info->sectorsize)) {
7552 error("ignore invalid data extent, length %llu is not aligned to %u",
7553 num_bytes, root->fs_info->sectorsize);
7557 memset(&tmpl, 0, sizeof(tmpl));
7558 tmpl.start = key.objectid;
7559 tmpl.nr = num_bytes;
7560 tmpl.extent_item_refs = refs;
7561 tmpl.metadata = metadata;
7563 tmpl.max_size = num_bytes;
7564 add_extent_rec(extent_cache, &tmpl);
7566 ptr = (unsigned long)(ei + 1);
7567 if (btrfs_extent_flags(eb, ei) & BTRFS_EXTENT_FLAG_TREE_BLOCK &&
7568 key.type == BTRFS_EXTENT_ITEM_KEY)
7569 ptr += sizeof(struct btrfs_tree_block_info);
7571 end = (unsigned long)ei + item_size;
7573 iref = (struct btrfs_extent_inline_ref *)ptr;
7574 type = btrfs_extent_inline_ref_type(eb, iref);
7575 offset = btrfs_extent_inline_ref_offset(eb, iref);
7577 case BTRFS_TREE_BLOCK_REF_KEY:
7578 ret = add_tree_backref(extent_cache, key.objectid,
7582 "add_tree_backref failed (extent items tree block): %s",
7585 case BTRFS_SHARED_BLOCK_REF_KEY:
7586 ret = add_tree_backref(extent_cache, key.objectid,
7590 "add_tree_backref failed (extent items shared block): %s",
7593 case BTRFS_EXTENT_DATA_REF_KEY:
7594 dref = (struct btrfs_extent_data_ref *)(&iref->offset);
7595 add_data_backref(extent_cache, key.objectid, 0,
7596 btrfs_extent_data_ref_root(eb, dref),
7597 btrfs_extent_data_ref_objectid(eb,
7599 btrfs_extent_data_ref_offset(eb, dref),
7600 btrfs_extent_data_ref_count(eb, dref),
7603 case BTRFS_SHARED_DATA_REF_KEY:
7604 sref = (struct btrfs_shared_data_ref *)(iref + 1);
7605 add_data_backref(extent_cache, key.objectid, offset,
7607 btrfs_shared_data_ref_count(eb, sref),
7611 fprintf(stderr, "corrupt extent record: key %Lu %u %Lu\n",
7612 key.objectid, key.type, num_bytes);
7615 ptr += btrfs_extent_inline_ref_size(type);
7622 static int check_cache_range(struct btrfs_root *root,
7623 struct btrfs_block_group_cache *cache,
7624 u64 offset, u64 bytes)
7626 struct btrfs_free_space *entry;
7632 for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) {
7633 bytenr = btrfs_sb_offset(i);
7634 ret = btrfs_rmap_block(root->fs_info,
7635 cache->key.objectid, bytenr, 0,
7636 &logical, &nr, &stripe_len);
7641 if (logical[nr] + stripe_len <= offset)
7643 if (offset + bytes <= logical[nr])
7645 if (logical[nr] == offset) {
7646 if (stripe_len >= bytes) {
7650 bytes -= stripe_len;
7651 offset += stripe_len;
7652 } else if (logical[nr] < offset) {
7653 if (logical[nr] + stripe_len >=
7658 bytes = (offset + bytes) -
7659 (logical[nr] + stripe_len);
7660 offset = logical[nr] + stripe_len;
7663 * Could be tricky, the super may land in the
7664 * middle of the area we're checking. First
7665 * check the easiest case, it's at the end.
7667 if (logical[nr] + stripe_len >=
7669 bytes = logical[nr] - offset;
7673 /* Check the left side */
7674 ret = check_cache_range(root, cache,
7676 logical[nr] - offset);
7682 /* Now we continue with the right side */
7683 bytes = (offset + bytes) -
7684 (logical[nr] + stripe_len);
7685 offset = logical[nr] + stripe_len;
7692 entry = btrfs_find_free_space(cache->free_space_ctl, offset, bytes);
7694 fprintf(stderr, "There is no free space entry for %Lu-%Lu\n",
7695 offset, offset+bytes);
7699 if (entry->offset != offset) {
7700 fprintf(stderr, "Wanted offset %Lu, found %Lu\n", offset,
7705 if (entry->bytes != bytes) {
7706 fprintf(stderr, "Wanted bytes %Lu, found %Lu for off %Lu\n",
7707 bytes, entry->bytes, offset);
7711 unlink_free_space(cache->free_space_ctl, entry);
7716 static int verify_space_cache(struct btrfs_root *root,
7717 struct btrfs_block_group_cache *cache)
7719 struct btrfs_path path;
7720 struct extent_buffer *leaf;
7721 struct btrfs_key key;
7725 root = root->fs_info->extent_root;
7727 last = max_t(u64, cache->key.objectid, BTRFS_SUPER_INFO_OFFSET);
7729 btrfs_init_path(&path);
7730 key.objectid = last;
7732 key.type = BTRFS_EXTENT_ITEM_KEY;
7733 ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
7738 if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) {
7739 ret = btrfs_next_leaf(root, &path);
7747 leaf = path.nodes[0];
7748 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
7749 if (key.objectid >= cache->key.offset + cache->key.objectid)
7751 if (key.type != BTRFS_EXTENT_ITEM_KEY &&
7752 key.type != BTRFS_METADATA_ITEM_KEY) {
7757 if (last == key.objectid) {
7758 if (key.type == BTRFS_EXTENT_ITEM_KEY)
7759 last = key.objectid + key.offset;
7761 last = key.objectid + root->fs_info->nodesize;
7766 ret = check_cache_range(root, cache, last,
7767 key.objectid - last);
7770 if (key.type == BTRFS_EXTENT_ITEM_KEY)
7771 last = key.objectid + key.offset;
7773 last = key.objectid + root->fs_info->nodesize;
7777 if (last < cache->key.objectid + cache->key.offset)
7778 ret = check_cache_range(root, cache, last,
7779 cache->key.objectid +
7780 cache->key.offset - last);
7783 btrfs_release_path(&path);
7786 !RB_EMPTY_ROOT(&cache->free_space_ctl->free_space_offset)) {
7787 fprintf(stderr, "There are still entries left in the space "
7795 static int check_space_cache(struct btrfs_root *root)
7797 struct btrfs_block_group_cache *cache;
7798 u64 start = BTRFS_SUPER_INFO_OFFSET + BTRFS_SUPER_INFO_SIZE;
7802 if (btrfs_super_cache_generation(root->fs_info->super_copy) != -1ULL &&
7803 btrfs_super_generation(root->fs_info->super_copy) !=
7804 btrfs_super_cache_generation(root->fs_info->super_copy)) {
7805 printf("cache and super generation don't match, space cache "
7806 "will be invalidated\n");
7810 if (ctx.progress_enabled) {
7811 ctx.tp = TASK_FREE_SPACE;
7812 task_start(ctx.info);
7816 cache = btrfs_lookup_first_block_group(root->fs_info, start);
7820 start = cache->key.objectid + cache->key.offset;
7821 if (!cache->free_space_ctl) {
7822 if (btrfs_init_free_space_ctl(cache,
7823 root->fs_info->sectorsize)) {
7828 btrfs_remove_free_space_cache(cache);
7831 if (btrfs_fs_compat_ro(root->fs_info, FREE_SPACE_TREE)) {
7832 ret = exclude_super_stripes(root, cache);
7834 fprintf(stderr, "could not exclude super stripes: %s\n",
7839 ret = load_free_space_tree(root->fs_info, cache);
7840 free_excluded_extents(root, cache);
7842 fprintf(stderr, "could not load free space tree: %s\n",
7849 ret = load_free_space_cache(root->fs_info, cache);
7854 ret = verify_space_cache(root, cache);
7856 fprintf(stderr, "cache appears valid but isn't %Lu\n",
7857 cache->key.objectid);
7862 task_stop(ctx.info);
7864 return error ? -EINVAL : 0;
7867 static int check_extent_csums(struct btrfs_root *root, u64 bytenr,
7868 u64 num_bytes, unsigned long leaf_offset,
7869 struct extent_buffer *eb) {
7871 struct btrfs_fs_info *fs_info = root->fs_info;
7873 u16 csum_size = btrfs_super_csum_size(fs_info->super_copy);
7875 unsigned long csum_offset;
7879 u64 data_checked = 0;
7885 if (num_bytes % fs_info->sectorsize)
7888 data = malloc(num_bytes);
7892 while (offset < num_bytes) {
7895 read_len = num_bytes - offset;
7896 /* read as much space once a time */
7897 ret = read_extent_data(fs_info, data + offset,
7898 bytenr + offset, &read_len, mirror);
7902 /* verify every 4k data's checksum */
7903 while (data_checked < read_len) {
7905 tmp = offset + data_checked;
7907 csum = btrfs_csum_data((char *)data + tmp,
7908 csum, fs_info->sectorsize);
7909 btrfs_csum_final(csum, (u8 *)&csum);
7911 csum_offset = leaf_offset +
7912 tmp / fs_info->sectorsize * csum_size;
7913 read_extent_buffer(eb, (char *)&csum_expected,
7914 csum_offset, csum_size);
7915 /* try another mirror */
7916 if (csum != csum_expected) {
7917 fprintf(stderr, "mirror %d bytenr %llu csum %u expected csum %u\n",
7918 mirror, bytenr + tmp,
7919 csum, csum_expected);
7920 num_copies = btrfs_num_copies(root->fs_info,
7922 if (mirror < num_copies - 1) {
7927 data_checked += fs_info->sectorsize;
7936 static int check_extent_exists(struct btrfs_root *root, u64 bytenr,
7939 struct btrfs_path path;
7940 struct extent_buffer *leaf;
7941 struct btrfs_key key;
7944 btrfs_init_path(&path);
7945 key.objectid = bytenr;
7946 key.type = BTRFS_EXTENT_ITEM_KEY;
7947 key.offset = (u64)-1;
7950 ret = btrfs_search_slot(NULL, root->fs_info->extent_root, &key, &path,
7953 fprintf(stderr, "Error looking up extent record %d\n", ret);
7954 btrfs_release_path(&path);
7957 if (path.slots[0] > 0) {
7960 ret = btrfs_prev_leaf(root, &path);
7963 } else if (ret > 0) {
7970 btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
7973 * Block group items come before extent items if they have the same
7974 * bytenr, so walk back one more just in case. Dear future traveller,
7975 * first congrats on mastering time travel. Now if it's not too much
7976 * trouble could you go back to 2006 and tell Chris to make the
7977 * BLOCK_GROUP_ITEM_KEY (and BTRFS_*_REF_KEY) lower than the
7978 * EXTENT_ITEM_KEY please?
7980 while (key.type > BTRFS_EXTENT_ITEM_KEY) {
7981 if (path.slots[0] > 0) {
7984 ret = btrfs_prev_leaf(root, &path);
7987 } else if (ret > 0) {
7992 btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
7996 if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) {
7997 ret = btrfs_next_leaf(root, &path);
7999 fprintf(stderr, "Error going to next leaf "
8001 btrfs_release_path(&path);
8007 leaf = path.nodes[0];
8008 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
8009 if (key.type != BTRFS_EXTENT_ITEM_KEY) {
8013 if (key.objectid + key.offset < bytenr) {
8017 if (key.objectid > bytenr + num_bytes)
8020 if (key.objectid == bytenr) {
8021 if (key.offset >= num_bytes) {
8025 num_bytes -= key.offset;
8026 bytenr += key.offset;
8027 } else if (key.objectid < bytenr) {
8028 if (key.objectid + key.offset >= bytenr + num_bytes) {
8032 num_bytes = (bytenr + num_bytes) -
8033 (key.objectid + key.offset);
8034 bytenr = key.objectid + key.offset;
8036 if (key.objectid + key.offset < bytenr + num_bytes) {
8037 u64 new_start = key.objectid + key.offset;
8038 u64 new_bytes = bytenr + num_bytes - new_start;
8041 * Weird case, the extent is in the middle of
8042 * our range, we'll have to search one side
8043 * and then the other. Not sure if this happens
8044 * in real life, but no harm in coding it up
8045 * anyway just in case.
8047 btrfs_release_path(&path);
8048 ret = check_extent_exists(root, new_start,
8051 fprintf(stderr, "Right section didn't "
8055 num_bytes = key.objectid - bytenr;
8058 num_bytes = key.objectid - bytenr;
8065 if (num_bytes && !ret) {
8066 fprintf(stderr, "There are no extents for csum range "
8067 "%Lu-%Lu\n", bytenr, bytenr+num_bytes);
8071 btrfs_release_path(&path);
8075 static int check_csums(struct btrfs_root *root)
8077 struct btrfs_path path;
8078 struct extent_buffer *leaf;
8079 struct btrfs_key key;
8080 u64 offset = 0, num_bytes = 0;
8081 u16 csum_size = btrfs_super_csum_size(root->fs_info->super_copy);
8085 unsigned long leaf_offset;
8087 root = root->fs_info->csum_root;
8088 if (!extent_buffer_uptodate(root->node)) {
8089 fprintf(stderr, "No valid csum tree found\n");
8093 btrfs_init_path(&path);
8094 key.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
8095 key.type = BTRFS_EXTENT_CSUM_KEY;
8097 ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
8099 fprintf(stderr, "Error searching csum tree %d\n", ret);
8100 btrfs_release_path(&path);
8104 if (ret > 0 && path.slots[0])
8109 if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) {
8110 ret = btrfs_next_leaf(root, &path);
8112 fprintf(stderr, "Error going to next leaf "
8119 leaf = path.nodes[0];
8121 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
8122 if (key.type != BTRFS_EXTENT_CSUM_KEY) {
8127 data_len = (btrfs_item_size_nr(leaf, path.slots[0]) /
8128 csum_size) * root->fs_info->sectorsize;
8129 if (!check_data_csum)
8130 goto skip_csum_check;
8131 leaf_offset = btrfs_item_ptr_offset(leaf, path.slots[0]);
8132 ret = check_extent_csums(root, key.offset, data_len,
8138 offset = key.offset;
8139 } else if (key.offset != offset + num_bytes) {
8140 ret = check_extent_exists(root, offset, num_bytes);
8142 fprintf(stderr, "Csum exists for %Lu-%Lu but "
8143 "there is no extent record\n",
8144 offset, offset+num_bytes);
8147 offset = key.offset;
8150 num_bytes += data_len;
8154 btrfs_release_path(&path);
8158 static int is_dropped_key(struct btrfs_key *key,
8159 struct btrfs_key *drop_key) {
8160 if (key->objectid < drop_key->objectid)
8162 else if (key->objectid == drop_key->objectid) {
8163 if (key->type < drop_key->type)
8165 else if (key->type == drop_key->type) {
8166 if (key->offset < drop_key->offset)
8174 * Here are the rules for FULL_BACKREF.
8176 * 1) If BTRFS_HEADER_FLAG_RELOC is set then we have FULL_BACKREF set.
8177 * 2) If btrfs_header_owner(buf) no longer points to buf then we have
8179 * 3) We cowed the block walking down a reloc tree. This is impossible to tell
8180 * if it happened after the relocation occurred since we'll have dropped the
8181 * reloc root, so it's entirely possible to have FULL_BACKREF set on buf and
8182 * have no real way to know for sure.
8184 * We process the blocks one root at a time, and we start from the lowest root
8185 * objectid and go to the highest. So we can just lookup the owner backref for
8186 * the record and if we don't find it then we know it doesn't exist and we have
8189 * FIXME: if we ever start reclaiming root objectid's then we need to fix this
8190 * assumption and simply indicate that we _think_ that the FULL BACKREF needs to
8191 * be set or not and then we can check later once we've gathered all the refs.
8193 static int calc_extent_flag(struct cache_tree *extent_cache,
8194 struct extent_buffer *buf,
8195 struct root_item_record *ri,
8198 struct extent_record *rec;
8199 struct cache_extent *cache;
8200 struct tree_backref *tback;
8203 cache = lookup_cache_extent(extent_cache, buf->start, 1);
8204 /* we have added this extent before */
8208 rec = container_of(cache, struct extent_record, cache);
8211 * Except file/reloc tree, we can not have
8214 if (ri->objectid < BTRFS_FIRST_FREE_OBJECTID)
8219 if (buf->start == ri->bytenr)
8222 if (btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC))
8225 owner = btrfs_header_owner(buf);
8226 if (owner == ri->objectid)
8229 tback = find_tree_backref(rec, 0, owner);
8234 if (rec->flag_block_full_backref != FLAG_UNSET &&
8235 rec->flag_block_full_backref != 0)
8236 rec->bad_full_backref = 1;
8239 *flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
8240 if (rec->flag_block_full_backref != FLAG_UNSET &&
8241 rec->flag_block_full_backref != 1)
8242 rec->bad_full_backref = 1;
8246 static void report_mismatch_key_root(u8 key_type, u64 rootid)
8248 fprintf(stderr, "Invalid key type(");
8249 print_key_type(stderr, 0, key_type);
8250 fprintf(stderr, ") found in root(");
8251 print_objectid(stderr, rootid, 0);
8252 fprintf(stderr, ")\n");
8256 * Check if the key is valid with its extent buffer.
8258 * This is a early check in case invalid key exists in a extent buffer
8259 * This is not comprehensive yet, but should prevent wrong key/item passed
8262 static int check_type_with_root(u64 rootid, u8 key_type)
8265 /* Only valid in chunk tree */
8266 case BTRFS_DEV_ITEM_KEY:
8267 case BTRFS_CHUNK_ITEM_KEY:
8268 if (rootid != BTRFS_CHUNK_TREE_OBJECTID)
8271 /* valid in csum and log tree */
8272 case BTRFS_CSUM_TREE_OBJECTID:
8273 if (!(rootid == BTRFS_TREE_LOG_OBJECTID ||
8277 case BTRFS_EXTENT_ITEM_KEY:
8278 case BTRFS_METADATA_ITEM_KEY:
8279 case BTRFS_BLOCK_GROUP_ITEM_KEY:
8280 if (rootid != BTRFS_EXTENT_TREE_OBJECTID)
8283 case BTRFS_ROOT_ITEM_KEY:
8284 if (rootid != BTRFS_ROOT_TREE_OBJECTID)
8287 case BTRFS_DEV_EXTENT_KEY:
8288 if (rootid != BTRFS_DEV_TREE_OBJECTID)
8294 report_mismatch_key_root(key_type, rootid);
8298 static int run_next_block(struct btrfs_root *root,
8299 struct block_info *bits,
8302 struct cache_tree *pending,
8303 struct cache_tree *seen,
8304 struct cache_tree *reada,
8305 struct cache_tree *nodes,
8306 struct cache_tree *extent_cache,
8307 struct cache_tree *chunk_cache,
8308 struct rb_root *dev_cache,
8309 struct block_group_tree *block_group_cache,
8310 struct device_extent_tree *dev_extent_cache,
8311 struct root_item_record *ri)
8313 struct btrfs_fs_info *fs_info = root->fs_info;
8314 struct extent_buffer *buf;
8315 struct extent_record *rec = NULL;
8326 struct btrfs_key key;
8327 struct cache_extent *cache;
8330 nritems = pick_next_pending(pending, reada, nodes, *last, bits,
8331 bits_nr, &reada_bits);
8336 for(i = 0; i < nritems; i++) {
8337 ret = add_cache_extent(reada, bits[i].start,
8342 /* fixme, get the parent transid */
8343 readahead_tree_block(fs_info, bits[i].start, 0);
8346 *last = bits[0].start;
8347 bytenr = bits[0].start;
8348 size = bits[0].size;
8350 cache = lookup_cache_extent(pending, bytenr, size);
8352 remove_cache_extent(pending, cache);
8355 cache = lookup_cache_extent(reada, bytenr, size);
8357 remove_cache_extent(reada, cache);
8360 cache = lookup_cache_extent(nodes, bytenr, size);
8362 remove_cache_extent(nodes, cache);
8365 cache = lookup_cache_extent(extent_cache, bytenr, size);
8367 rec = container_of(cache, struct extent_record, cache);
8368 gen = rec->parent_generation;
8371 /* fixme, get the real parent transid */
8372 buf = read_tree_block(root->fs_info, bytenr, gen);
8373 if (!extent_buffer_uptodate(buf)) {
8374 record_bad_block_io(root->fs_info,
8375 extent_cache, bytenr, size);
8379 nritems = btrfs_header_nritems(buf);
8382 if (!init_extent_tree) {
8383 ret = btrfs_lookup_extent_info(NULL, root, bytenr,
8384 btrfs_header_level(buf), 1, NULL,
8387 ret = calc_extent_flag(extent_cache, buf, ri, &flags);
8389 fprintf(stderr, "Couldn't calc extent flags\n");
8390 flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
8395 ret = calc_extent_flag(extent_cache, buf, ri, &flags);
8397 fprintf(stderr, "Couldn't calc extent flags\n");
8398 flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
8402 if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF) {
8404 ri->objectid != BTRFS_TREE_RELOC_OBJECTID &&
8405 ri->objectid == btrfs_header_owner(buf)) {
8407 * Ok we got to this block from it's original owner and
8408 * we have FULL_BACKREF set. Relocation can leave
8409 * converted blocks over so this is altogether possible,
8410 * however it's not possible if the generation > the
8411 * last snapshot, so check for this case.
8413 if (!btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC) &&
8414 btrfs_header_generation(buf) > ri->last_snapshot) {
8415 flags &= ~BTRFS_BLOCK_FLAG_FULL_BACKREF;
8416 rec->bad_full_backref = 1;
8421 (ri->objectid == BTRFS_TREE_RELOC_OBJECTID ||
8422 btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC))) {
8423 flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
8424 rec->bad_full_backref = 1;
8428 if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF) {
8429 rec->flag_block_full_backref = 1;
8433 rec->flag_block_full_backref = 0;
8435 owner = btrfs_header_owner(buf);
8438 ret = check_block(root, extent_cache, buf, flags);
8442 if (btrfs_is_leaf(buf)) {
8443 btree_space_waste += btrfs_leaf_free_space(root, buf);
8444 for (i = 0; i < nritems; i++) {
8445 struct btrfs_file_extent_item *fi;
8446 btrfs_item_key_to_cpu(buf, &key, i);
8448 * Check key type against the leaf owner.
8449 * Could filter quite a lot of early error if
8452 if (check_type_with_root(btrfs_header_owner(buf),
8454 fprintf(stderr, "ignoring invalid key\n");
8457 if (key.type == BTRFS_EXTENT_ITEM_KEY) {
8458 process_extent_item(root, extent_cache, buf,
8462 if (key.type == BTRFS_METADATA_ITEM_KEY) {
8463 process_extent_item(root, extent_cache, buf,
8467 if (key.type == BTRFS_EXTENT_CSUM_KEY) {
8469 btrfs_item_size_nr(buf, i);
8472 if (key.type == BTRFS_CHUNK_ITEM_KEY) {
8473 process_chunk_item(chunk_cache, &key, buf, i);
8476 if (key.type == BTRFS_DEV_ITEM_KEY) {
8477 process_device_item(dev_cache, &key, buf, i);
8480 if (key.type == BTRFS_BLOCK_GROUP_ITEM_KEY) {
8481 process_block_group_item(block_group_cache,
8485 if (key.type == BTRFS_DEV_EXTENT_KEY) {
8486 process_device_extent_item(dev_extent_cache,
8491 if (key.type == BTRFS_EXTENT_REF_V0_KEY) {
8492 #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
8493 process_extent_ref_v0(extent_cache, buf, i);
8500 if (key.type == BTRFS_TREE_BLOCK_REF_KEY) {
8501 ret = add_tree_backref(extent_cache,
8502 key.objectid, 0, key.offset, 0);
8505 "add_tree_backref failed (leaf tree block): %s",
8509 if (key.type == BTRFS_SHARED_BLOCK_REF_KEY) {
8510 ret = add_tree_backref(extent_cache,
8511 key.objectid, key.offset, 0, 0);
8514 "add_tree_backref failed (leaf shared block): %s",
8518 if (key.type == BTRFS_EXTENT_DATA_REF_KEY) {
8519 struct btrfs_extent_data_ref *ref;
8520 ref = btrfs_item_ptr(buf, i,
8521 struct btrfs_extent_data_ref);
8522 add_data_backref(extent_cache,
8524 btrfs_extent_data_ref_root(buf, ref),
8525 btrfs_extent_data_ref_objectid(buf,
8527 btrfs_extent_data_ref_offset(buf, ref),
8528 btrfs_extent_data_ref_count(buf, ref),
8529 0, root->fs_info->sectorsize);
8532 if (key.type == BTRFS_SHARED_DATA_REF_KEY) {
8533 struct btrfs_shared_data_ref *ref;
8534 ref = btrfs_item_ptr(buf, i,
8535 struct btrfs_shared_data_ref);
8536 add_data_backref(extent_cache,
8537 key.objectid, key.offset, 0, 0, 0,
8538 btrfs_shared_data_ref_count(buf, ref),
8539 0, root->fs_info->sectorsize);
8542 if (key.type == BTRFS_ORPHAN_ITEM_KEY) {
8543 struct bad_item *bad;
8545 if (key.objectid == BTRFS_ORPHAN_OBJECTID)
8549 bad = malloc(sizeof(struct bad_item));
8552 INIT_LIST_HEAD(&bad->list);
8553 memcpy(&bad->key, &key,
8554 sizeof(struct btrfs_key));
8555 bad->root_id = owner;
8556 list_add_tail(&bad->list, &delete_items);
8559 if (key.type != BTRFS_EXTENT_DATA_KEY)
8561 fi = btrfs_item_ptr(buf, i,
8562 struct btrfs_file_extent_item);
8563 if (btrfs_file_extent_type(buf, fi) ==
8564 BTRFS_FILE_EXTENT_INLINE)
8566 if (btrfs_file_extent_disk_bytenr(buf, fi) == 0)
8569 data_bytes_allocated +=
8570 btrfs_file_extent_disk_num_bytes(buf, fi);
8571 if (data_bytes_allocated < root->fs_info->sectorsize) {
8574 data_bytes_referenced +=
8575 btrfs_file_extent_num_bytes(buf, fi);
8576 add_data_backref(extent_cache,
8577 btrfs_file_extent_disk_bytenr(buf, fi),
8578 parent, owner, key.objectid, key.offset -
8579 btrfs_file_extent_offset(buf, fi), 1, 1,
8580 btrfs_file_extent_disk_num_bytes(buf, fi));
8584 struct btrfs_key first_key;
8586 first_key.objectid = 0;
8589 btrfs_item_key_to_cpu(buf, &first_key, 0);
8590 level = btrfs_header_level(buf);
8591 for (i = 0; i < nritems; i++) {
8592 struct extent_record tmpl;
8594 ptr = btrfs_node_blockptr(buf, i);
8595 size = root->fs_info->nodesize;
8596 btrfs_node_key_to_cpu(buf, &key, i);
8598 if ((level == ri->drop_level)
8599 && is_dropped_key(&key, &ri->drop_key)) {
8604 memset(&tmpl, 0, sizeof(tmpl));
8605 btrfs_cpu_key_to_disk(&tmpl.parent_key, &key);
8606 tmpl.parent_generation = btrfs_node_ptr_generation(buf, i);
8611 tmpl.max_size = size;
8612 ret = add_extent_rec(extent_cache, &tmpl);
8616 ret = add_tree_backref(extent_cache, ptr, parent,
8620 "add_tree_backref failed (non-leaf block): %s",
8626 add_pending(nodes, seen, ptr, size);
8628 add_pending(pending, seen, ptr, size);
8631 btree_space_waste += (BTRFS_NODEPTRS_PER_BLOCK(root) -
8632 nritems) * sizeof(struct btrfs_key_ptr);
8634 total_btree_bytes += buf->len;
8635 if (fs_root_objectid(btrfs_header_owner(buf)))
8636 total_fs_tree_bytes += buf->len;
8637 if (btrfs_header_owner(buf) == BTRFS_EXTENT_TREE_OBJECTID)
8638 total_extent_tree_bytes += buf->len;
8640 free_extent_buffer(buf);
8644 static int add_root_to_pending(struct extent_buffer *buf,
8645 struct cache_tree *extent_cache,
8646 struct cache_tree *pending,
8647 struct cache_tree *seen,
8648 struct cache_tree *nodes,
8651 struct extent_record tmpl;
8654 if (btrfs_header_level(buf) > 0)
8655 add_pending(nodes, seen, buf->start, buf->len);
8657 add_pending(pending, seen, buf->start, buf->len);
8659 memset(&tmpl, 0, sizeof(tmpl));
8660 tmpl.start = buf->start;
8665 tmpl.max_size = buf->len;
8666 add_extent_rec(extent_cache, &tmpl);
8668 if (objectid == BTRFS_TREE_RELOC_OBJECTID ||
8669 btrfs_header_backref_rev(buf) < BTRFS_MIXED_BACKREF_REV)
8670 ret = add_tree_backref(extent_cache, buf->start, buf->start,
8673 ret = add_tree_backref(extent_cache, buf->start, 0, objectid,
8678 /* as we fix the tree, we might be deleting blocks that
8679 * we're tracking for repair. This hook makes sure we
8680 * remove any backrefs for blocks as we are fixing them.
8682 static int free_extent_hook(struct btrfs_trans_handle *trans,
8683 struct btrfs_root *root,
8684 u64 bytenr, u64 num_bytes, u64 parent,
8685 u64 root_objectid, u64 owner, u64 offset,
8688 struct extent_record *rec;
8689 struct cache_extent *cache;
8691 struct cache_tree *extent_cache = root->fs_info->fsck_extent_cache;
8693 is_data = owner >= BTRFS_FIRST_FREE_OBJECTID;
8694 cache = lookup_cache_extent(extent_cache, bytenr, num_bytes);
8698 rec = container_of(cache, struct extent_record, cache);
8700 struct data_backref *back;
8701 back = find_data_backref(rec, parent, root_objectid, owner,
8702 offset, 1, bytenr, num_bytes);
8705 if (back->node.found_ref) {
8706 back->found_ref -= refs_to_drop;
8708 rec->refs -= refs_to_drop;
8710 if (back->node.found_extent_tree) {
8711 back->num_refs -= refs_to_drop;
8712 if (rec->extent_item_refs)
8713 rec->extent_item_refs -= refs_to_drop;
8715 if (back->found_ref == 0)
8716 back->node.found_ref = 0;
8717 if (back->num_refs == 0)
8718 back->node.found_extent_tree = 0;
8720 if (!back->node.found_extent_tree && back->node.found_ref) {
8721 rb_erase(&back->node.node, &rec->backref_tree);
8725 struct tree_backref *back;
8726 back = find_tree_backref(rec, parent, root_objectid);
8729 if (back->node.found_ref) {
8732 back->node.found_ref = 0;
8734 if (back->node.found_extent_tree) {
8735 if (rec->extent_item_refs)
8736 rec->extent_item_refs--;
8737 back->node.found_extent_tree = 0;
8739 if (!back->node.found_extent_tree && back->node.found_ref) {
8740 rb_erase(&back->node.node, &rec->backref_tree);
8744 maybe_free_extent_rec(extent_cache, rec);
8749 static int delete_extent_records(struct btrfs_trans_handle *trans,
8750 struct btrfs_root *root,
8751 struct btrfs_path *path,
8754 struct btrfs_key key;
8755 struct btrfs_key found_key;
8756 struct extent_buffer *leaf;
8761 key.objectid = bytenr;
8763 key.offset = (u64)-1;
8766 ret = btrfs_search_slot(trans, root->fs_info->extent_root,
8773 if (path->slots[0] == 0)
8779 leaf = path->nodes[0];
8780 slot = path->slots[0];
8782 btrfs_item_key_to_cpu(leaf, &found_key, slot);
8783 if (found_key.objectid != bytenr)
8786 if (found_key.type != BTRFS_EXTENT_ITEM_KEY &&
8787 found_key.type != BTRFS_METADATA_ITEM_KEY &&
8788 found_key.type != BTRFS_TREE_BLOCK_REF_KEY &&
8789 found_key.type != BTRFS_EXTENT_DATA_REF_KEY &&
8790 found_key.type != BTRFS_EXTENT_REF_V0_KEY &&
8791 found_key.type != BTRFS_SHARED_BLOCK_REF_KEY &&
8792 found_key.type != BTRFS_SHARED_DATA_REF_KEY) {
8793 btrfs_release_path(path);
8794 if (found_key.type == 0) {
8795 if (found_key.offset == 0)
8797 key.offset = found_key.offset - 1;
8798 key.type = found_key.type;
8800 key.type = found_key.type - 1;
8801 key.offset = (u64)-1;
8805 fprintf(stderr, "repair deleting extent record: key %Lu %u %Lu\n",
8806 found_key.objectid, found_key.type, found_key.offset);
8808 ret = btrfs_del_item(trans, root->fs_info->extent_root, path);
8811 btrfs_release_path(path);
8813 if (found_key.type == BTRFS_EXTENT_ITEM_KEY ||
8814 found_key.type == BTRFS_METADATA_ITEM_KEY) {
8815 u64 bytes = (found_key.type == BTRFS_EXTENT_ITEM_KEY) ?
8816 found_key.offset : root->fs_info->nodesize;
8818 ret = btrfs_update_block_group(trans, root, bytenr,
8825 btrfs_release_path(path);
8830 * for a single backref, this will allocate a new extent
8831 * and add the backref to it.
8833 static int record_extent(struct btrfs_trans_handle *trans,
8834 struct btrfs_fs_info *info,
8835 struct btrfs_path *path,
8836 struct extent_record *rec,
8837 struct extent_backref *back,
8838 int allocated, u64 flags)
8841 struct btrfs_root *extent_root = info->extent_root;
8842 struct extent_buffer *leaf;
8843 struct btrfs_key ins_key;
8844 struct btrfs_extent_item *ei;
8845 struct data_backref *dback;
8846 struct btrfs_tree_block_info *bi;
8849 rec->max_size = max_t(u64, rec->max_size,
8853 u32 item_size = sizeof(*ei);
8856 item_size += sizeof(*bi);
8858 ins_key.objectid = rec->start;
8859 ins_key.offset = rec->max_size;
8860 ins_key.type = BTRFS_EXTENT_ITEM_KEY;
8862 ret = btrfs_insert_empty_item(trans, extent_root, path,
8863 &ins_key, item_size);
8867 leaf = path->nodes[0];
8868 ei = btrfs_item_ptr(leaf, path->slots[0],
8869 struct btrfs_extent_item);
8871 btrfs_set_extent_refs(leaf, ei, 0);
8872 btrfs_set_extent_generation(leaf, ei, rec->generation);
8874 if (back->is_data) {
8875 btrfs_set_extent_flags(leaf, ei,
8876 BTRFS_EXTENT_FLAG_DATA);
8878 struct btrfs_disk_key copy_key;;
8880 bi = (struct btrfs_tree_block_info *)(ei + 1);
8881 memset_extent_buffer(leaf, 0, (unsigned long)bi,
8884 btrfs_set_disk_key_objectid(©_key,
8885 rec->info_objectid);
8886 btrfs_set_disk_key_type(©_key, 0);
8887 btrfs_set_disk_key_offset(©_key, 0);
8889 btrfs_set_tree_block_level(leaf, bi, rec->info_level);
8890 btrfs_set_tree_block_key(leaf, bi, ©_key);
8892 btrfs_set_extent_flags(leaf, ei,
8893 BTRFS_EXTENT_FLAG_TREE_BLOCK | flags);
8896 btrfs_mark_buffer_dirty(leaf);
8897 ret = btrfs_update_block_group(trans, extent_root, rec->start,
8898 rec->max_size, 1, 0);
8901 btrfs_release_path(path);
8904 if (back->is_data) {
8908 dback = to_data_backref(back);
8909 if (back->full_backref)
8910 parent = dback->parent;
8914 for (i = 0; i < dback->found_ref; i++) {
8915 /* if parent != 0, we're doing a full backref
8916 * passing BTRFS_FIRST_FREE_OBJECTID as the owner
8917 * just makes the backref allocator create a data
8920 ret = btrfs_inc_extent_ref(trans, info->extent_root,
8921 rec->start, rec->max_size,
8925 BTRFS_FIRST_FREE_OBJECTID :
8931 fprintf(stderr, "adding new data backref"
8932 " on %llu %s %llu owner %llu"
8933 " offset %llu found %d\n",
8934 (unsigned long long)rec->start,
8935 back->full_backref ?
8937 back->full_backref ?
8938 (unsigned long long)parent :
8939 (unsigned long long)dback->root,
8940 (unsigned long long)dback->owner,
8941 (unsigned long long)dback->offset,
8945 struct tree_backref *tback;
8947 tback = to_tree_backref(back);
8948 if (back->full_backref)
8949 parent = tback->parent;
8953 ret = btrfs_inc_extent_ref(trans, info->extent_root,
8954 rec->start, rec->max_size,
8955 parent, tback->root, 0, 0);
8956 fprintf(stderr, "adding new tree backref on "
8957 "start %llu len %llu parent %llu root %llu\n",
8958 rec->start, rec->max_size, parent, tback->root);
8961 btrfs_release_path(path);
8965 static struct extent_entry *find_entry(struct list_head *entries,
8966 u64 bytenr, u64 bytes)
8968 struct extent_entry *entry = NULL;
8970 list_for_each_entry(entry, entries, list) {
8971 if (entry->bytenr == bytenr && entry->bytes == bytes)
8978 static struct extent_entry *find_most_right_entry(struct list_head *entries)
8980 struct extent_entry *entry, *best = NULL, *prev = NULL;
8982 list_for_each_entry(entry, entries, list) {
8984 * If there are as many broken entries as entries then we know
8985 * not to trust this particular entry.
8987 if (entry->broken == entry->count)
8991 * Special case, when there are only two entries and 'best' is
9001 * If our current entry == best then we can't be sure our best
9002 * is really the best, so we need to keep searching.
9004 if (best && best->count == entry->count) {
9010 /* Prev == entry, not good enough, have to keep searching */
9011 if (!prev->broken && prev->count == entry->count)
9015 best = (prev->count > entry->count) ? prev : entry;
9016 else if (best->count < entry->count)
9024 static int repair_ref(struct btrfs_fs_info *info, struct btrfs_path *path,
9025 struct data_backref *dback, struct extent_entry *entry)
9027 struct btrfs_trans_handle *trans;
9028 struct btrfs_root *root;
9029 struct btrfs_file_extent_item *fi;
9030 struct extent_buffer *leaf;
9031 struct btrfs_key key;
9035 key.objectid = dback->root;
9036 key.type = BTRFS_ROOT_ITEM_KEY;
9037 key.offset = (u64)-1;
9038 root = btrfs_read_fs_root(info, &key);
9040 fprintf(stderr, "Couldn't find root for our ref\n");
9045 * The backref points to the original offset of the extent if it was
9046 * split, so we need to search down to the offset we have and then walk
9047 * forward until we find the backref we're looking for.
9049 key.objectid = dback->owner;
9050 key.type = BTRFS_EXTENT_DATA_KEY;
9051 key.offset = dback->offset;
9052 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
9054 fprintf(stderr, "Error looking up ref %d\n", ret);
9059 if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) {
9060 ret = btrfs_next_leaf(root, path);
9062 fprintf(stderr, "Couldn't find our ref, next\n");
9066 leaf = path->nodes[0];
9067 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
9068 if (key.objectid != dback->owner ||
9069 key.type != BTRFS_EXTENT_DATA_KEY) {
9070 fprintf(stderr, "Couldn't find our ref, search\n");
9073 fi = btrfs_item_ptr(leaf, path->slots[0],
9074 struct btrfs_file_extent_item);
9075 bytenr = btrfs_file_extent_disk_bytenr(leaf, fi);
9076 bytes = btrfs_file_extent_disk_num_bytes(leaf, fi);
9078 if (bytenr == dback->disk_bytenr && bytes == dback->bytes)
9083 btrfs_release_path(path);
9085 trans = btrfs_start_transaction(root, 1);
9087 return PTR_ERR(trans);
9090 * Ok we have the key of the file extent we want to fix, now we can cow
9091 * down to the thing and fix it.
9093 ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
9095 fprintf(stderr, "Error cowing down to ref [%Lu, %u, %Lu]: %d\n",
9096 key.objectid, key.type, key.offset, ret);
9100 fprintf(stderr, "Well that's odd, we just found this key "
9101 "[%Lu, %u, %Lu]\n", key.objectid, key.type,
9106 leaf = path->nodes[0];
9107 fi = btrfs_item_ptr(leaf, path->slots[0],
9108 struct btrfs_file_extent_item);
9110 if (btrfs_file_extent_compression(leaf, fi) &&
9111 dback->disk_bytenr != entry->bytenr) {
9112 fprintf(stderr, "Ref doesn't match the record start and is "
9113 "compressed, please take a btrfs-image of this file "
9114 "system and send it to a btrfs developer so they can "
9115 "complete this functionality for bytenr %Lu\n",
9116 dback->disk_bytenr);
9121 if (dback->node.broken && dback->disk_bytenr != entry->bytenr) {
9122 btrfs_set_file_extent_disk_bytenr(leaf, fi, entry->bytenr);
9123 } else if (dback->disk_bytenr > entry->bytenr) {
9124 u64 off_diff, offset;
9126 off_diff = dback->disk_bytenr - entry->bytenr;
9127 offset = btrfs_file_extent_offset(leaf, fi);
9128 if (dback->disk_bytenr + offset +
9129 btrfs_file_extent_num_bytes(leaf, fi) >
9130 entry->bytenr + entry->bytes) {
9131 fprintf(stderr, "Ref is past the entry end, please "
9132 "take a btrfs-image of this file system and "
9133 "send it to a btrfs developer, ref %Lu\n",
9134 dback->disk_bytenr);
9139 btrfs_set_file_extent_disk_bytenr(leaf, fi, entry->bytenr);
9140 btrfs_set_file_extent_offset(leaf, fi, offset);
9141 } else if (dback->disk_bytenr < entry->bytenr) {
9144 offset = btrfs_file_extent_offset(leaf, fi);
9145 if (dback->disk_bytenr + offset < entry->bytenr) {
9146 fprintf(stderr, "Ref is before the entry start, please"
9147 " take a btrfs-image of this file system and "
9148 "send it to a btrfs developer, ref %Lu\n",
9149 dback->disk_bytenr);
9154 offset += dback->disk_bytenr;
9155 offset -= entry->bytenr;
9156 btrfs_set_file_extent_disk_bytenr(leaf, fi, entry->bytenr);
9157 btrfs_set_file_extent_offset(leaf, fi, offset);
9160 btrfs_set_file_extent_disk_num_bytes(leaf, fi, entry->bytes);
9163 * Chances are if disk_num_bytes were wrong then so is ram_bytes, but
9164 * only do this if we aren't using compression, otherwise it's a
9167 if (!btrfs_file_extent_compression(leaf, fi))
9168 btrfs_set_file_extent_ram_bytes(leaf, fi, entry->bytes);
9170 printf("ram bytes may be wrong?\n");
9171 btrfs_mark_buffer_dirty(leaf);
9173 err = btrfs_commit_transaction(trans, root);
9174 btrfs_release_path(path);
9175 return ret ? ret : err;
9178 static int verify_backrefs(struct btrfs_fs_info *info, struct btrfs_path *path,
9179 struct extent_record *rec)
9181 struct extent_backref *back, *tmp;
9182 struct data_backref *dback;
9183 struct extent_entry *entry, *best = NULL;
9186 int broken_entries = 0;
9191 * Metadata is easy and the backrefs should always agree on bytenr and
9192 * size, if not we've got bigger issues.
9197 rbtree_postorder_for_each_entry_safe(back, tmp,
9198 &rec->backref_tree, node) {
9199 if (back->full_backref || !back->is_data)
9202 dback = to_data_backref(back);
9205 * We only pay attention to backrefs that we found a real
9208 if (dback->found_ref == 0)
9212 * For now we only catch when the bytes don't match, not the
9213 * bytenr. We can easily do this at the same time, but I want
9214 * to have a fs image to test on before we just add repair
9215 * functionality willy-nilly so we know we won't screw up the
9219 entry = find_entry(&entries, dback->disk_bytenr,
9222 entry = malloc(sizeof(struct extent_entry));
9227 memset(entry, 0, sizeof(*entry));
9228 entry->bytenr = dback->disk_bytenr;
9229 entry->bytes = dback->bytes;
9230 list_add_tail(&entry->list, &entries);
9235 * If we only have on entry we may think the entries agree when
9236 * in reality they don't so we have to do some extra checking.
9238 if (dback->disk_bytenr != rec->start ||
9239 dback->bytes != rec->nr || back->broken)
9250 /* Yay all the backrefs agree, carry on good sir */
9251 if (nr_entries <= 1 && !mismatch)
9254 fprintf(stderr, "attempting to repair backref discrepency for bytenr "
9255 "%Lu\n", rec->start);
9258 * First we want to see if the backrefs can agree amongst themselves who
9259 * is right, so figure out which one of the entries has the highest
9262 best = find_most_right_entry(&entries);
9265 * Ok so we may have an even split between what the backrefs think, so
9266 * this is where we use the extent ref to see what it thinks.
9269 entry = find_entry(&entries, rec->start, rec->nr);
9270 if (!entry && (!broken_entries || !rec->found_rec)) {
9271 fprintf(stderr, "Backrefs don't agree with each other "
9272 "and extent record doesn't agree with anybody,"
9273 " so we can't fix bytenr %Lu bytes %Lu\n",
9274 rec->start, rec->nr);
9277 } else if (!entry) {
9279 * Ok our backrefs were broken, we'll assume this is the
9280 * correct value and add an entry for this range.
9282 entry = malloc(sizeof(struct extent_entry));
9287 memset(entry, 0, sizeof(*entry));
9288 entry->bytenr = rec->start;
9289 entry->bytes = rec->nr;
9290 list_add_tail(&entry->list, &entries);
9294 best = find_most_right_entry(&entries);
9296 fprintf(stderr, "Backrefs and extent record evenly "
9297 "split on who is right, this is going to "
9298 "require user input to fix bytenr %Lu bytes "
9299 "%Lu\n", rec->start, rec->nr);
9306 * I don't think this can happen currently as we'll abort() if we catch
9307 * this case higher up, but in case somebody removes that we still can't
9308 * deal with it properly here yet, so just bail out of that's the case.
9310 if (best->bytenr != rec->start) {
9311 fprintf(stderr, "Extent start and backref starts don't match, "
9312 "please use btrfs-image on this file system and send "
9313 "it to a btrfs developer so they can make fsck fix "
9314 "this particular case. bytenr is %Lu, bytes is %Lu\n",
9315 rec->start, rec->nr);
9321 * Ok great we all agreed on an extent record, let's go find the real
9322 * references and fix up the ones that don't match.
9324 rbtree_postorder_for_each_entry_safe(back, tmp,
9325 &rec->backref_tree, node) {
9326 if (back->full_backref || !back->is_data)
9329 dback = to_data_backref(back);
9332 * Still ignoring backrefs that don't have a real ref attached
9335 if (dback->found_ref == 0)
9338 if (dback->bytes == best->bytes &&
9339 dback->disk_bytenr == best->bytenr)
9342 ret = repair_ref(info, path, dback, best);
9348 * Ok we messed with the actual refs, which means we need to drop our
9349 * entire cache and go back and rescan. I know this is a huge pain and
9350 * adds a lot of extra work, but it's the only way to be safe. Once all
9351 * the backrefs agree we may not need to do anything to the extent
9356 while (!list_empty(&entries)) {
9357 entry = list_entry(entries.next, struct extent_entry, list);
9358 list_del_init(&entry->list);
9364 static int process_duplicates(struct cache_tree *extent_cache,
9365 struct extent_record *rec)
9367 struct extent_record *good, *tmp;
9368 struct cache_extent *cache;
9372 * If we found a extent record for this extent then return, or if we
9373 * have more than one duplicate we are likely going to need to delete
9376 if (rec->found_rec || rec->num_duplicates > 1)
9379 /* Shouldn't happen but just in case */
9380 BUG_ON(!rec->num_duplicates);
9383 * So this happens if we end up with a backref that doesn't match the
9384 * actual extent entry. So either the backref is bad or the extent
9385 * entry is bad. Either way we want to have the extent_record actually
9386 * reflect what we found in the extent_tree, so we need to take the
9387 * duplicate out and use that as the extent_record since the only way we
9388 * get a duplicate is if we find a real life BTRFS_EXTENT_ITEM_KEY.
9390 remove_cache_extent(extent_cache, &rec->cache);
9392 good = to_extent_record(rec->dups.next);
9393 list_del_init(&good->list);
9394 INIT_LIST_HEAD(&good->backrefs);
9395 INIT_LIST_HEAD(&good->dups);
9396 good->cache.start = good->start;
9397 good->cache.size = good->nr;
9398 good->content_checked = 0;
9399 good->owner_ref_checked = 0;
9400 good->num_duplicates = 0;
9401 good->refs = rec->refs;
9402 list_splice_init(&rec->backrefs, &good->backrefs);
9404 cache = lookup_cache_extent(extent_cache, good->start,
9408 tmp = container_of(cache, struct extent_record, cache);
9411 * If we find another overlapping extent and it's found_rec is
9412 * set then it's a duplicate and we need to try and delete
9415 if (tmp->found_rec || tmp->num_duplicates > 0) {
9416 if (list_empty(&good->list))
9417 list_add_tail(&good->list,
9418 &duplicate_extents);
9419 good->num_duplicates += tmp->num_duplicates + 1;
9420 list_splice_init(&tmp->dups, &good->dups);
9421 list_del_init(&tmp->list);
9422 list_add_tail(&tmp->list, &good->dups);
9423 remove_cache_extent(extent_cache, &tmp->cache);
9428 * Ok we have another non extent item backed extent rec, so lets
9429 * just add it to this extent and carry on like we did above.
9431 good->refs += tmp->refs;
9432 list_splice_init(&tmp->backrefs, &good->backrefs);
9433 remove_cache_extent(extent_cache, &tmp->cache);
9436 ret = insert_cache_extent(extent_cache, &good->cache);
9439 return good->num_duplicates ? 0 : 1;
9442 static int delete_duplicate_records(struct btrfs_root *root,
9443 struct extent_record *rec)
9445 struct btrfs_trans_handle *trans;
9446 LIST_HEAD(delete_list);
9447 struct btrfs_path path;
9448 struct extent_record *tmp, *good, *n;
9451 struct btrfs_key key;
9453 btrfs_init_path(&path);
9456 /* Find the record that covers all of the duplicates. */
9457 list_for_each_entry(tmp, &rec->dups, list) {
9458 if (good->start < tmp->start)
9460 if (good->nr > tmp->nr)
9463 if (tmp->start + tmp->nr < good->start + good->nr) {
9464 fprintf(stderr, "Ok we have overlapping extents that "
9465 "aren't completely covered by each other, this "
9466 "is going to require more careful thought. "
9467 "The extents are [%Lu-%Lu] and [%Lu-%Lu]\n",
9468 tmp->start, tmp->nr, good->start, good->nr);
9475 list_add_tail(&rec->list, &delete_list);
9477 list_for_each_entry_safe(tmp, n, &rec->dups, list) {
9480 list_move_tail(&tmp->list, &delete_list);
9483 root = root->fs_info->extent_root;
9484 trans = btrfs_start_transaction(root, 1);
9485 if (IS_ERR(trans)) {
9486 ret = PTR_ERR(trans);
9490 list_for_each_entry(tmp, &delete_list, list) {
9491 if (tmp->found_rec == 0)
9493 key.objectid = tmp->start;
9494 key.type = BTRFS_EXTENT_ITEM_KEY;
9495 key.offset = tmp->nr;
9497 /* Shouldn't happen but just in case */
9498 if (tmp->metadata) {
9499 fprintf(stderr, "Well this shouldn't happen, extent "
9500 "record overlaps but is metadata? "
9501 "[%Lu, %Lu]\n", tmp->start, tmp->nr);
9505 ret = btrfs_search_slot(trans, root, &key, &path, -1, 1);
9511 ret = btrfs_del_item(trans, root, &path);
9514 btrfs_release_path(&path);
9517 err = btrfs_commit_transaction(trans, root);
9521 while (!list_empty(&delete_list)) {
9522 tmp = to_extent_record(delete_list.next);
9523 list_del_init(&tmp->list);
9529 while (!list_empty(&rec->dups)) {
9530 tmp = to_extent_record(rec->dups.next);
9531 list_del_init(&tmp->list);
9535 btrfs_release_path(&path);
9537 if (!ret && !nr_del)
9538 rec->num_duplicates = 0;
9540 return ret ? ret : nr_del;
9543 static int find_possible_backrefs(struct btrfs_fs_info *info,
9544 struct btrfs_path *path,
9545 struct cache_tree *extent_cache,
9546 struct extent_record *rec)
9548 struct btrfs_root *root;
9549 struct extent_backref *back, *tmp;
9550 struct data_backref *dback;
9551 struct cache_extent *cache;
9552 struct btrfs_file_extent_item *fi;
9553 struct btrfs_key key;
9557 rbtree_postorder_for_each_entry_safe(back, tmp,
9558 &rec->backref_tree, node) {
9559 /* Don't care about full backrefs (poor unloved backrefs) */
9560 if (back->full_backref || !back->is_data)
9563 dback = to_data_backref(back);
9565 /* We found this one, we don't need to do a lookup */
9566 if (dback->found_ref)
9569 key.objectid = dback->root;
9570 key.type = BTRFS_ROOT_ITEM_KEY;
9571 key.offset = (u64)-1;
9573 root = btrfs_read_fs_root(info, &key);
9575 /* No root, definitely a bad ref, skip */
9576 if (IS_ERR(root) && PTR_ERR(root) == -ENOENT)
9578 /* Other err, exit */
9580 return PTR_ERR(root);
9582 key.objectid = dback->owner;
9583 key.type = BTRFS_EXTENT_DATA_KEY;
9584 key.offset = dback->offset;
9585 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
9587 btrfs_release_path(path);
9590 /* Didn't find it, we can carry on */
9595 fi = btrfs_item_ptr(path->nodes[0], path->slots[0],
9596 struct btrfs_file_extent_item);
9597 bytenr = btrfs_file_extent_disk_bytenr(path->nodes[0], fi);
9598 bytes = btrfs_file_extent_disk_num_bytes(path->nodes[0], fi);
9599 btrfs_release_path(path);
9600 cache = lookup_cache_extent(extent_cache, bytenr, 1);
9602 struct extent_record *tmp;
9603 tmp = container_of(cache, struct extent_record, cache);
9606 * If we found an extent record for the bytenr for this
9607 * particular backref then we can't add it to our
9608 * current extent record. We only want to add backrefs
9609 * that don't have a corresponding extent item in the
9610 * extent tree since they likely belong to this record
9611 * and we need to fix it if it doesn't match bytenrs.
9617 dback->found_ref += 1;
9618 dback->disk_bytenr = bytenr;
9619 dback->bytes = bytes;
9622 * Set this so the verify backref code knows not to trust the
9623 * values in this backref.
9632 * Record orphan data ref into corresponding root.
9634 * Return 0 if the extent item contains data ref and recorded.
9635 * Return 1 if the extent item contains no useful data ref
9636 * On that case, it may contains only shared_dataref or metadata backref
9637 * or the file extent exists(this should be handled by the extent bytenr
9639 * Return <0 if something goes wrong.
9641 static int record_orphan_data_extents(struct btrfs_fs_info *fs_info,
9642 struct extent_record *rec)
9644 struct btrfs_key key;
9645 struct btrfs_root *dest_root;
9646 struct extent_backref *back, *tmp;
9647 struct data_backref *dback;
9648 struct orphan_data_extent *orphan;
9649 struct btrfs_path path;
9650 int recorded_data_ref = 0;
9655 btrfs_init_path(&path);
9656 rbtree_postorder_for_each_entry_safe(back, tmp,
9657 &rec->backref_tree, node) {
9658 if (back->full_backref || !back->is_data ||
9659 !back->found_extent_tree)
9661 dback = to_data_backref(back);
9662 if (dback->found_ref)
9664 key.objectid = dback->root;
9665 key.type = BTRFS_ROOT_ITEM_KEY;
9666 key.offset = (u64)-1;
9668 dest_root = btrfs_read_fs_root(fs_info, &key);
9670 /* For non-exist root we just skip it */
9671 if (IS_ERR(dest_root) || !dest_root)
9674 key.objectid = dback->owner;
9675 key.type = BTRFS_EXTENT_DATA_KEY;
9676 key.offset = dback->offset;
9678 ret = btrfs_search_slot(NULL, dest_root, &key, &path, 0, 0);
9679 btrfs_release_path(&path);
9681 * For ret < 0, it's OK since the fs-tree may be corrupted,
9682 * we need to record it for inode/file extent rebuild.
9683 * For ret > 0, we record it only for file extent rebuild.
9684 * For ret == 0, the file extent exists but only bytenr
9685 * mismatch, let the original bytenr fix routine to handle,
9691 orphan = malloc(sizeof(*orphan));
9696 INIT_LIST_HEAD(&orphan->list);
9697 orphan->root = dback->root;
9698 orphan->objectid = dback->owner;
9699 orphan->offset = dback->offset;
9700 orphan->disk_bytenr = rec->cache.start;
9701 orphan->disk_len = rec->cache.size;
9702 list_add(&dest_root->orphan_data_extents, &orphan->list);
9703 recorded_data_ref = 1;
9706 btrfs_release_path(&path);
9708 return !recorded_data_ref;
9714 * when an incorrect extent item is found, this will delete
9715 * all of the existing entries for it and recreate them
9716 * based on what the tree scan found.
9718 static int fixup_extent_refs(struct btrfs_fs_info *info,
9719 struct cache_tree *extent_cache,
9720 struct extent_record *rec)
9722 struct btrfs_trans_handle *trans = NULL;
9724 struct btrfs_path path;
9725 struct cache_extent *cache;
9726 struct extent_backref *back, *tmp;
9730 if (rec->flag_block_full_backref)
9731 flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
9733 btrfs_init_path(&path);
9734 if (rec->refs != rec->extent_item_refs && !rec->metadata) {
9736 * Sometimes the backrefs themselves are so broken they don't
9737 * get attached to any meaningful rec, so first go back and
9738 * check any of our backrefs that we couldn't find and throw
9739 * them into the list if we find the backref so that
9740 * verify_backrefs can figure out what to do.
9742 ret = find_possible_backrefs(info, &path, extent_cache, rec);
9747 /* step one, make sure all of the backrefs agree */
9748 ret = verify_backrefs(info, &path, rec);
9752 trans = btrfs_start_transaction(info->extent_root, 1);
9753 if (IS_ERR(trans)) {
9754 ret = PTR_ERR(trans);
9758 /* step two, delete all the existing records */
9759 ret = delete_extent_records(trans, info->extent_root, &path,
9765 /* was this block corrupt? If so, don't add references to it */
9766 cache = lookup_cache_extent(info->corrupt_blocks,
9767 rec->start, rec->max_size);
9773 /* step three, recreate all the refs we did find */
9774 rbtree_postorder_for_each_entry_safe(back, tmp,
9775 &rec->backref_tree, node) {
9777 * if we didn't find any references, don't create a
9780 if (!back->found_ref)
9783 rec->bad_full_backref = 0;
9784 ret = record_extent(trans, info, &path, rec, back, allocated, flags);
9792 int err = btrfs_commit_transaction(trans, info->extent_root);
9798 fprintf(stderr, "Repaired extent references for %llu\n",
9799 (unsigned long long)rec->start);
9801 btrfs_release_path(&path);
9805 static int fixup_extent_flags(struct btrfs_fs_info *fs_info,
9806 struct extent_record *rec)
9808 struct btrfs_trans_handle *trans;
9809 struct btrfs_root *root = fs_info->extent_root;
9810 struct btrfs_path path;
9811 struct btrfs_extent_item *ei;
9812 struct btrfs_key key;
9816 key.objectid = rec->start;
9817 if (rec->metadata) {
9818 key.type = BTRFS_METADATA_ITEM_KEY;
9819 key.offset = rec->info_level;
9821 key.type = BTRFS_EXTENT_ITEM_KEY;
9822 key.offset = rec->max_size;
9825 trans = btrfs_start_transaction(root, 0);
9827 return PTR_ERR(trans);
9829 btrfs_init_path(&path);
9830 ret = btrfs_search_slot(trans, root, &key, &path, 0, 1);
9832 btrfs_release_path(&path);
9833 btrfs_commit_transaction(trans, root);
9836 fprintf(stderr, "Didn't find extent for %llu\n",
9837 (unsigned long long)rec->start);
9838 btrfs_release_path(&path);
9839 btrfs_commit_transaction(trans, root);
9843 ei = btrfs_item_ptr(path.nodes[0], path.slots[0],
9844 struct btrfs_extent_item);
9845 flags = btrfs_extent_flags(path.nodes[0], ei);
9846 if (rec->flag_block_full_backref) {
9847 fprintf(stderr, "setting full backref on %llu\n",
9848 (unsigned long long)key.objectid);
9849 flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
9851 fprintf(stderr, "clearing full backref on %llu\n",
9852 (unsigned long long)key.objectid);
9853 flags &= ~BTRFS_BLOCK_FLAG_FULL_BACKREF;
9855 btrfs_set_extent_flags(path.nodes[0], ei, flags);
9856 btrfs_mark_buffer_dirty(path.nodes[0]);
9857 btrfs_release_path(&path);
9858 ret = btrfs_commit_transaction(trans, root);
9860 fprintf(stderr, "Repaired extent flags for %llu\n",
9861 (unsigned long long)rec->start);
9866 /* right now we only prune from the extent allocation tree */
9867 static int prune_one_block(struct btrfs_trans_handle *trans,
9868 struct btrfs_fs_info *info,
9869 struct btrfs_corrupt_block *corrupt)
9872 struct btrfs_path path;
9873 struct extent_buffer *eb;
9877 int level = corrupt->level + 1;
9879 btrfs_init_path(&path);
9881 /* we want to stop at the parent to our busted block */
9882 path.lowest_level = level;
9884 ret = btrfs_search_slot(trans, info->extent_root,
9885 &corrupt->key, &path, -1, 1);
9890 eb = path.nodes[level];
9897 * hopefully the search gave us the block we want to prune,
9898 * lets try that first
9900 slot = path.slots[level];
9901 found = btrfs_node_blockptr(eb, slot);
9902 if (found == corrupt->cache.start)
9905 nritems = btrfs_header_nritems(eb);
9907 /* the search failed, lets scan this node and hope we find it */
9908 for (slot = 0; slot < nritems; slot++) {
9909 found = btrfs_node_blockptr(eb, slot);
9910 if (found == corrupt->cache.start)
9914 * we couldn't find the bad block. TODO, search all the nodes for pointers
9917 if (eb == info->extent_root->node) {
9922 btrfs_release_path(&path);
9927 printk("deleting pointer to block %Lu\n", corrupt->cache.start);
9928 ret = btrfs_del_ptr(info->extent_root, &path, level, slot);
9931 btrfs_release_path(&path);
9935 static int prune_corrupt_blocks(struct btrfs_fs_info *info)
9937 struct btrfs_trans_handle *trans = NULL;
9938 struct cache_extent *cache;
9939 struct btrfs_corrupt_block *corrupt;
9942 cache = search_cache_extent(info->corrupt_blocks, 0);
9946 trans = btrfs_start_transaction(info->extent_root, 1);
9948 return PTR_ERR(trans);
9950 corrupt = container_of(cache, struct btrfs_corrupt_block, cache);
9951 prune_one_block(trans, info, corrupt);
9952 remove_cache_extent(info->corrupt_blocks, cache);
9955 return btrfs_commit_transaction(trans, info->extent_root);
9959 static void reset_cached_block_groups(struct btrfs_fs_info *fs_info)
9961 struct btrfs_block_group_cache *cache;
9966 ret = find_first_extent_bit(&fs_info->free_space_cache, 0,
9967 &start, &end, EXTENT_DIRTY);
9970 clear_extent_dirty(&fs_info->free_space_cache, start, end);
9975 cache = btrfs_lookup_first_block_group(fs_info, start);
9980 start = cache->key.objectid + cache->key.offset;
9984 static int check_extent_refs(struct btrfs_root *root,
9985 struct cache_tree *extent_cache)
9987 struct extent_record *rec;
9988 struct cache_extent *cache;
9994 * if we're doing a repair, we have to make sure
9995 * we don't allocate from the problem extents.
9996 * In the worst case, this will be all the
9999 cache = search_cache_extent(extent_cache, 0);
10001 rec = container_of(cache, struct extent_record, cache);
10002 set_extent_dirty(root->fs_info->excluded_extents,
10004 rec->start + rec->max_size - 1);
10005 cache = next_cache_extent(cache);
10008 /* pin down all the corrupted blocks too */
10009 cache = search_cache_extent(root->fs_info->corrupt_blocks, 0);
10011 set_extent_dirty(root->fs_info->excluded_extents,
10013 cache->start + cache->size - 1);
10014 cache = next_cache_extent(cache);
10016 prune_corrupt_blocks(root->fs_info);
10017 reset_cached_block_groups(root->fs_info);
10020 reset_cached_block_groups(root->fs_info);
10023 * We need to delete any duplicate entries we find first otherwise we
10024 * could mess up the extent tree when we have backrefs that actually
10025 * belong to a different extent item and not the weird duplicate one.
10027 while (repair && !list_empty(&duplicate_extents)) {
10028 rec = to_extent_record(duplicate_extents.next);
10029 list_del_init(&rec->list);
10031 /* Sometimes we can find a backref before we find an actual
10032 * extent, so we need to process it a little bit to see if there
10033 * truly are multiple EXTENT_ITEM_KEY's for the same range, or
10034 * if this is a backref screwup. If we need to delete stuff
10035 * process_duplicates() will return 0, otherwise it will return
10038 if (process_duplicates(extent_cache, rec))
10040 ret = delete_duplicate_records(root, rec);
10044 * delete_duplicate_records will return the number of entries
10045 * deleted, so if it's greater than 0 then we know we actually
10046 * did something and we need to remove.
10059 cache = search_cache_extent(extent_cache, 0);
10062 rec = container_of(cache, struct extent_record, cache);
10063 if (rec->num_duplicates) {
10064 fprintf(stderr, "extent item %llu has multiple extent "
10065 "items\n", (unsigned long long)rec->start);
10069 if (rec->refs != rec->extent_item_refs) {
10070 fprintf(stderr, "ref mismatch on [%llu %llu] ",
10071 (unsigned long long)rec->start,
10072 (unsigned long long)rec->nr);
10073 fprintf(stderr, "extent item %llu, found %llu\n",
10074 (unsigned long long)rec->extent_item_refs,
10075 (unsigned long long)rec->refs);
10076 ret = record_orphan_data_extents(root->fs_info, rec);
10082 if (all_backpointers_checked(rec, 1)) {
10083 fprintf(stderr, "backpointer mismatch on [%llu %llu]\n",
10084 (unsigned long long)rec->start,
10085 (unsigned long long)rec->nr);
10089 if (!rec->owner_ref_checked) {
10090 fprintf(stderr, "owner ref check failed [%llu %llu]\n",
10091 (unsigned long long)rec->start,
10092 (unsigned long long)rec->nr);
10097 if (repair && fix) {
10098 ret = fixup_extent_refs(root->fs_info, extent_cache, rec);
10104 if (rec->bad_full_backref) {
10105 fprintf(stderr, "bad full backref, on [%llu]\n",
10106 (unsigned long long)rec->start);
10108 ret = fixup_extent_flags(root->fs_info, rec);
10116 * Although it's not a extent ref's problem, we reuse this
10117 * routine for error reporting.
10118 * No repair function yet.
10120 if (rec->crossing_stripes) {
10122 "bad metadata [%llu, %llu) crossing stripe boundary\n",
10123 rec->start, rec->start + rec->max_size);
10127 if (rec->wrong_chunk_type) {
10129 "bad extent [%llu, %llu), type mismatch with chunk\n",
10130 rec->start, rec->start + rec->max_size);
10134 remove_cache_extent(extent_cache, cache);
10135 free_all_extent_backrefs(rec);
10136 if (!init_extent_tree && repair && (!cur_err || fix))
10137 clear_extent_dirty(root->fs_info->excluded_extents,
10139 rec->start + rec->max_size - 1);
10144 if (ret && ret != -EAGAIN) {
10145 fprintf(stderr, "failed to repair damaged filesystem, aborting\n");
10148 struct btrfs_trans_handle *trans;
10150 root = root->fs_info->extent_root;
10151 trans = btrfs_start_transaction(root, 1);
10152 if (IS_ERR(trans)) {
10153 ret = PTR_ERR(trans);
10157 ret = btrfs_fix_block_accounting(trans, root);
10160 ret = btrfs_commit_transaction(trans, root);
10169 u64 calc_stripe_length(u64 type, u64 length, int num_stripes)
10173 if (type & BTRFS_BLOCK_GROUP_RAID0) {
10174 stripe_size = length;
10175 stripe_size /= num_stripes;
10176 } else if (type & BTRFS_BLOCK_GROUP_RAID10) {
10177 stripe_size = length * 2;
10178 stripe_size /= num_stripes;
10179 } else if (type & BTRFS_BLOCK_GROUP_RAID5) {
10180 stripe_size = length;
10181 stripe_size /= (num_stripes - 1);
10182 } else if (type & BTRFS_BLOCK_GROUP_RAID6) {
10183 stripe_size = length;
10184 stripe_size /= (num_stripes - 2);
10186 stripe_size = length;
10188 return stripe_size;
10192 * Check the chunk with its block group/dev list ref:
10193 * Return 0 if all refs seems valid.
10194 * Return 1 if part of refs seems valid, need later check for rebuild ref
10195 * like missing block group and needs to search extent tree to rebuild them.
10196 * Return -1 if essential refs are missing and unable to rebuild.
10198 static int check_chunk_refs(struct chunk_record *chunk_rec,
10199 struct block_group_tree *block_group_cache,
10200 struct device_extent_tree *dev_extent_cache,
10203 struct cache_extent *block_group_item;
10204 struct block_group_record *block_group_rec;
10205 struct cache_extent *dev_extent_item;
10206 struct device_extent_record *dev_extent_rec;
10210 int metadump_v2 = 0;
10214 block_group_item = lookup_cache_extent(&block_group_cache->tree,
10216 chunk_rec->length);
10217 if (block_group_item) {
10218 block_group_rec = container_of(block_group_item,
10219 struct block_group_record,
10221 if (chunk_rec->length != block_group_rec->offset ||
10222 chunk_rec->offset != block_group_rec->objectid ||
10224 chunk_rec->type_flags != block_group_rec->flags)) {
10227 "Chunk[%llu, %u, %llu]: length(%llu), offset(%llu), type(%llu) mismatch with block group[%llu, %u, %llu]: offset(%llu), objectid(%llu), flags(%llu)\n",
10228 chunk_rec->objectid,
10233 chunk_rec->type_flags,
10234 block_group_rec->objectid,
10235 block_group_rec->type,
10236 block_group_rec->offset,
10237 block_group_rec->offset,
10238 block_group_rec->objectid,
10239 block_group_rec->flags);
10242 list_del_init(&block_group_rec->list);
10243 chunk_rec->bg_rec = block_group_rec;
10248 "Chunk[%llu, %u, %llu]: length(%llu), offset(%llu), type(%llu) is not found in block group\n",
10249 chunk_rec->objectid,
10254 chunk_rec->type_flags);
10261 length = calc_stripe_length(chunk_rec->type_flags, chunk_rec->length,
10262 chunk_rec->num_stripes);
10263 for (i = 0; i < chunk_rec->num_stripes; ++i) {
10264 devid = chunk_rec->stripes[i].devid;
10265 offset = chunk_rec->stripes[i].offset;
10266 dev_extent_item = lookup_cache_extent2(&dev_extent_cache->tree,
10267 devid, offset, length);
10268 if (dev_extent_item) {
10269 dev_extent_rec = container_of(dev_extent_item,
10270 struct device_extent_record,
10272 if (dev_extent_rec->objectid != devid ||
10273 dev_extent_rec->offset != offset ||
10274 dev_extent_rec->chunk_offset != chunk_rec->offset ||
10275 dev_extent_rec->length != length) {
10278 "Chunk[%llu, %u, %llu] stripe[%llu, %llu] dismatch dev extent[%llu, %llu, %llu]\n",
10279 chunk_rec->objectid,
10282 chunk_rec->stripes[i].devid,
10283 chunk_rec->stripes[i].offset,
10284 dev_extent_rec->objectid,
10285 dev_extent_rec->offset,
10286 dev_extent_rec->length);
10289 list_move(&dev_extent_rec->chunk_list,
10290 &chunk_rec->dextents);
10295 "Chunk[%llu, %u, %llu] stripe[%llu, %llu] is not found in dev extent\n",
10296 chunk_rec->objectid,
10299 chunk_rec->stripes[i].devid,
10300 chunk_rec->stripes[i].offset);
10307 /* check btrfs_chunk -> btrfs_dev_extent / btrfs_block_group_item */
10308 int check_chunks(struct cache_tree *chunk_cache,
10309 struct block_group_tree *block_group_cache,
10310 struct device_extent_tree *dev_extent_cache,
10311 struct list_head *good, struct list_head *bad,
10312 struct list_head *rebuild, int silent)
10314 struct cache_extent *chunk_item;
10315 struct chunk_record *chunk_rec;
10316 struct block_group_record *bg_rec;
10317 struct device_extent_record *dext_rec;
10321 chunk_item = first_cache_extent(chunk_cache);
10322 while (chunk_item) {
10323 chunk_rec = container_of(chunk_item, struct chunk_record,
10325 err = check_chunk_refs(chunk_rec, block_group_cache,
10326 dev_extent_cache, silent);
10329 if (err == 0 && good)
10330 list_add_tail(&chunk_rec->list, good);
10331 if (err > 0 && rebuild)
10332 list_add_tail(&chunk_rec->list, rebuild);
10333 if (err < 0 && bad)
10334 list_add_tail(&chunk_rec->list, bad);
10335 chunk_item = next_cache_extent(chunk_item);
10338 list_for_each_entry(bg_rec, &block_group_cache->block_groups, list) {
10341 "Block group[%llu, %llu] (flags = %llu) didn't find the relative chunk.\n",
10349 list_for_each_entry(dext_rec, &dev_extent_cache->no_chunk_orphans,
10353 "Device extent[%llu, %llu, %llu] didn't find the relative chunk.\n",
10354 dext_rec->objectid,
10364 static int check_device_used(struct device_record *dev_rec,
10365 struct device_extent_tree *dext_cache)
10367 struct cache_extent *cache;
10368 struct device_extent_record *dev_extent_rec;
10369 u64 total_byte = 0;
10371 cache = search_cache_extent2(&dext_cache->tree, dev_rec->devid, 0);
10373 dev_extent_rec = container_of(cache,
10374 struct device_extent_record,
10376 if (dev_extent_rec->objectid != dev_rec->devid)
10379 list_del_init(&dev_extent_rec->device_list);
10380 total_byte += dev_extent_rec->length;
10381 cache = next_cache_extent(cache);
10384 if (total_byte != dev_rec->byte_used) {
10386 "Dev extent's total-byte(%llu) is not equal to byte-used(%llu) in dev[%llu, %u, %llu]\n",
10387 total_byte, dev_rec->byte_used, dev_rec->objectid,
10388 dev_rec->type, dev_rec->offset);
10395 /* check btrfs_dev_item -> btrfs_dev_extent */
10396 static int check_devices(struct rb_root *dev_cache,
10397 struct device_extent_tree *dev_extent_cache)
10399 struct rb_node *dev_node;
10400 struct device_record *dev_rec;
10401 struct device_extent_record *dext_rec;
10405 dev_node = rb_first(dev_cache);
10407 dev_rec = container_of(dev_node, struct device_record, node);
10408 err = check_device_used(dev_rec, dev_extent_cache);
10412 dev_node = rb_next(dev_node);
10414 list_for_each_entry(dext_rec, &dev_extent_cache->no_device_orphans,
10417 "Device extent[%llu, %llu, %llu] didn't find its device.\n",
10418 dext_rec->objectid, dext_rec->offset, dext_rec->length);
10425 static int add_root_item_to_list(struct list_head *head,
10426 u64 objectid, u64 bytenr, u64 last_snapshot,
10427 u8 level, u8 drop_level,
10428 struct btrfs_key *drop_key)
10431 struct root_item_record *ri_rec;
10432 ri_rec = malloc(sizeof(*ri_rec));
10435 ri_rec->bytenr = bytenr;
10436 ri_rec->objectid = objectid;
10437 ri_rec->level = level;
10438 ri_rec->drop_level = drop_level;
10439 ri_rec->last_snapshot = last_snapshot;
10441 memcpy(&ri_rec->drop_key, drop_key, sizeof(*drop_key));
10442 list_add_tail(&ri_rec->list, head);
10447 static void free_root_item_list(struct list_head *list)
10449 struct root_item_record *ri_rec;
10451 while (!list_empty(list)) {
10452 ri_rec = list_first_entry(list, struct root_item_record,
10454 list_del_init(&ri_rec->list);
10459 static int deal_root_from_list(struct list_head *list,
10460 struct btrfs_root *root,
10461 struct block_info *bits,
10463 struct cache_tree *pending,
10464 struct cache_tree *seen,
10465 struct cache_tree *reada,
10466 struct cache_tree *nodes,
10467 struct cache_tree *extent_cache,
10468 struct cache_tree *chunk_cache,
10469 struct rb_root *dev_cache,
10470 struct block_group_tree *block_group_cache,
10471 struct device_extent_tree *dev_extent_cache)
10476 while (!list_empty(list)) {
10477 struct root_item_record *rec;
10478 struct extent_buffer *buf;
10479 rec = list_entry(list->next,
10480 struct root_item_record, list);
10482 buf = read_tree_block(root->fs_info, rec->bytenr, 0);
10483 if (!extent_buffer_uptodate(buf)) {
10484 free_extent_buffer(buf);
10488 ret = add_root_to_pending(buf, extent_cache, pending,
10489 seen, nodes, rec->objectid);
10493 * To rebuild extent tree, we need deal with snapshot
10494 * one by one, otherwise we deal with node firstly which
10495 * can maximize readahead.
10498 ret = run_next_block(root, bits, bits_nr, &last,
10499 pending, seen, reada, nodes,
10500 extent_cache, chunk_cache,
10501 dev_cache, block_group_cache,
10502 dev_extent_cache, rec);
10506 free_extent_buffer(buf);
10507 list_del(&rec->list);
10513 ret = run_next_block(root, bits, bits_nr, &last, pending, seen,
10514 reada, nodes, extent_cache, chunk_cache,
10515 dev_cache, block_group_cache,
10516 dev_extent_cache, NULL);
10526 static int check_chunks_and_extents(struct btrfs_fs_info *fs_info)
10528 struct rb_root dev_cache;
10529 struct cache_tree chunk_cache;
10530 struct block_group_tree block_group_cache;
10531 struct device_extent_tree dev_extent_cache;
10532 struct cache_tree extent_cache;
10533 struct cache_tree seen;
10534 struct cache_tree pending;
10535 struct cache_tree reada;
10536 struct cache_tree nodes;
10537 struct extent_io_tree excluded_extents;
10538 struct cache_tree corrupt_blocks;
10539 struct btrfs_path path;
10540 struct btrfs_key key;
10541 struct btrfs_key found_key;
10543 struct block_info *bits;
10545 struct extent_buffer *leaf;
10547 struct btrfs_root_item ri;
10548 struct list_head dropping_trees;
10549 struct list_head normal_trees;
10550 struct btrfs_root *root1;
10551 struct btrfs_root *root;
10555 root = fs_info->fs_root;
10556 dev_cache = RB_ROOT;
10557 cache_tree_init(&chunk_cache);
10558 block_group_tree_init(&block_group_cache);
10559 device_extent_tree_init(&dev_extent_cache);
10561 cache_tree_init(&extent_cache);
10562 cache_tree_init(&seen);
10563 cache_tree_init(&pending);
10564 cache_tree_init(&nodes);
10565 cache_tree_init(&reada);
10566 cache_tree_init(&corrupt_blocks);
10567 extent_io_tree_init(&excluded_extents);
10568 INIT_LIST_HEAD(&dropping_trees);
10569 INIT_LIST_HEAD(&normal_trees);
10572 fs_info->excluded_extents = &excluded_extents;
10573 fs_info->fsck_extent_cache = &extent_cache;
10574 fs_info->free_extent_hook = free_extent_hook;
10575 fs_info->corrupt_blocks = &corrupt_blocks;
10579 bits = malloc(bits_nr * sizeof(struct block_info));
10585 if (ctx.progress_enabled) {
10586 ctx.tp = TASK_EXTENTS;
10587 task_start(ctx.info);
10591 root1 = fs_info->tree_root;
10592 level = btrfs_header_level(root1->node);
10593 ret = add_root_item_to_list(&normal_trees, root1->root_key.objectid,
10594 root1->node->start, 0, level, 0, NULL);
10597 root1 = fs_info->chunk_root;
10598 level = btrfs_header_level(root1->node);
10599 ret = add_root_item_to_list(&normal_trees, root1->root_key.objectid,
10600 root1->node->start, 0, level, 0, NULL);
10603 btrfs_init_path(&path);
10606 key.type = BTRFS_ROOT_ITEM_KEY;
10607 ret = btrfs_search_slot(NULL, fs_info->tree_root, &key, &path, 0, 0);
10611 leaf = path.nodes[0];
10612 slot = path.slots[0];
10613 if (slot >= btrfs_header_nritems(path.nodes[0])) {
10614 ret = btrfs_next_leaf(root, &path);
10617 leaf = path.nodes[0];
10618 slot = path.slots[0];
10620 btrfs_item_key_to_cpu(leaf, &found_key, path.slots[0]);
10621 if (found_key.type == BTRFS_ROOT_ITEM_KEY) {
10622 unsigned long offset;
10625 offset = btrfs_item_ptr_offset(leaf, path.slots[0]);
10626 read_extent_buffer(leaf, &ri, offset, sizeof(ri));
10627 last_snapshot = btrfs_root_last_snapshot(&ri);
10628 if (btrfs_disk_key_objectid(&ri.drop_progress) == 0) {
10629 level = btrfs_root_level(&ri);
10630 ret = add_root_item_to_list(&normal_trees,
10631 found_key.objectid,
10632 btrfs_root_bytenr(&ri),
10633 last_snapshot, level,
10638 level = btrfs_root_level(&ri);
10639 objectid = found_key.objectid;
10640 btrfs_disk_key_to_cpu(&found_key,
10641 &ri.drop_progress);
10642 ret = add_root_item_to_list(&dropping_trees,
10644 btrfs_root_bytenr(&ri),
10645 last_snapshot, level,
10646 ri.drop_level, &found_key);
10653 btrfs_release_path(&path);
10656 * check_block can return -EAGAIN if it fixes something, please keep
10657 * this in mind when dealing with return values from these functions, if
10658 * we get -EAGAIN we want to fall through and restart the loop.
10660 ret = deal_root_from_list(&normal_trees, root, bits, bits_nr, &pending,
10661 &seen, &reada, &nodes, &extent_cache,
10662 &chunk_cache, &dev_cache, &block_group_cache,
10663 &dev_extent_cache);
10665 if (ret == -EAGAIN)
10669 ret = deal_root_from_list(&dropping_trees, root, bits, bits_nr,
10670 &pending, &seen, &reada, &nodes,
10671 &extent_cache, &chunk_cache, &dev_cache,
10672 &block_group_cache, &dev_extent_cache);
10674 if (ret == -EAGAIN)
10679 ret = check_chunks(&chunk_cache, &block_group_cache,
10680 &dev_extent_cache, NULL, NULL, NULL, 0);
10682 if (ret == -EAGAIN)
10687 ret = check_extent_refs(root, &extent_cache);
10689 if (ret == -EAGAIN)
10694 ret = check_devices(&dev_cache, &dev_extent_cache);
10699 task_stop(ctx.info);
10701 free_corrupt_blocks_tree(fs_info->corrupt_blocks);
10702 extent_io_tree_cleanup(&excluded_extents);
10703 fs_info->fsck_extent_cache = NULL;
10704 fs_info->free_extent_hook = NULL;
10705 fs_info->corrupt_blocks = NULL;
10706 fs_info->excluded_extents = NULL;
10709 free_chunk_cache_tree(&chunk_cache);
10710 free_device_cache_tree(&dev_cache);
10711 free_block_group_tree(&block_group_cache);
10712 free_device_extent_tree(&dev_extent_cache);
10713 free_extent_cache_tree(&seen);
10714 free_extent_cache_tree(&pending);
10715 free_extent_cache_tree(&reada);
10716 free_extent_cache_tree(&nodes);
10717 free_root_item_list(&normal_trees);
10718 free_root_item_list(&dropping_trees);
10721 free_corrupt_blocks_tree(fs_info->corrupt_blocks);
10722 free_extent_cache_tree(&seen);
10723 free_extent_cache_tree(&pending);
10724 free_extent_cache_tree(&reada);
10725 free_extent_cache_tree(&nodes);
10726 free_chunk_cache_tree(&chunk_cache);
10727 free_block_group_tree(&block_group_cache);
10728 free_device_cache_tree(&dev_cache);
10729 free_device_extent_tree(&dev_extent_cache);
10730 free_extent_record_cache(&extent_cache);
10731 free_root_item_list(&normal_trees);
10732 free_root_item_list(&dropping_trees);
10733 extent_io_tree_cleanup(&excluded_extents);
10738 * Check backrefs of a tree block given by @bytenr or @eb.
10740 * @root: the root containing the @bytenr or @eb
10741 * @eb: tree block extent buffer, can be NULL
10742 * @bytenr: bytenr of the tree block to search
10743 * @level: tree level of the tree block
10744 * @owner: owner of the tree block
10746 * Return >0 for any error found and output error message
10747 * Return 0 for no error found
10749 static int check_tree_block_ref(struct btrfs_root *root,
10750 struct extent_buffer *eb, u64 bytenr,
10751 int level, u64 owner)
10753 struct btrfs_key key;
10754 struct btrfs_root *extent_root = root->fs_info->extent_root;
10755 struct btrfs_path path;
10756 struct btrfs_extent_item *ei;
10757 struct btrfs_extent_inline_ref *iref;
10758 struct extent_buffer *leaf;
10764 u32 nodesize = root->fs_info->nodesize;
10767 int tree_reloc_root = 0;
10772 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID &&
10773 btrfs_header_bytenr(root->node) == bytenr)
10774 tree_reloc_root = 1;
10776 btrfs_init_path(&path);
10777 key.objectid = bytenr;
10778 if (btrfs_fs_incompat(root->fs_info, SKINNY_METADATA))
10779 key.type = BTRFS_METADATA_ITEM_KEY;
10781 key.type = BTRFS_EXTENT_ITEM_KEY;
10782 key.offset = (u64)-1;
10784 /* Search for the backref in extent tree */
10785 ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0);
10787 err |= BACKREF_MISSING;
10790 ret = btrfs_previous_extent_item(extent_root, &path, bytenr);
10792 err |= BACKREF_MISSING;
10796 leaf = path.nodes[0];
10797 slot = path.slots[0];
10798 btrfs_item_key_to_cpu(leaf, &key, slot);
10800 ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
10802 if (key.type == BTRFS_METADATA_ITEM_KEY) {
10803 skinny_level = (int)key.offset;
10804 iref = (struct btrfs_extent_inline_ref *)(ei + 1);
10806 struct btrfs_tree_block_info *info;
10808 info = (struct btrfs_tree_block_info *)(ei + 1);
10809 skinny_level = btrfs_tree_block_level(leaf, info);
10810 iref = (struct btrfs_extent_inline_ref *)(info + 1);
10817 if (!(btrfs_extent_flags(leaf, ei) &
10818 BTRFS_EXTENT_FLAG_TREE_BLOCK)) {
10820 "extent[%llu %u] backref type mismatch, missing bit: %llx",
10821 key.objectid, nodesize,
10822 BTRFS_EXTENT_FLAG_TREE_BLOCK);
10823 err = BACKREF_MISMATCH;
10825 header_gen = btrfs_header_generation(eb);
10826 extent_gen = btrfs_extent_generation(leaf, ei);
10827 if (header_gen != extent_gen) {
10829 "extent[%llu %u] backref generation mismatch, wanted: %llu, have: %llu",
10830 key.objectid, nodesize, header_gen,
10832 err = BACKREF_MISMATCH;
10834 if (level != skinny_level) {
10836 "extent[%llu %u] level mismatch, wanted: %u, have: %u",
10837 key.objectid, nodesize, level, skinny_level);
10838 err = BACKREF_MISMATCH;
10840 if (!is_fstree(owner) && btrfs_extent_refs(leaf, ei) != 1) {
10842 "extent[%llu %u] is referred by other roots than %llu",
10843 key.objectid, nodesize, root->objectid);
10844 err = BACKREF_MISMATCH;
10849 * Iterate the extent/metadata item to find the exact backref
10851 item_size = btrfs_item_size_nr(leaf, slot);
10852 ptr = (unsigned long)iref;
10853 end = (unsigned long)ei + item_size;
10854 while (ptr < end) {
10855 iref = (struct btrfs_extent_inline_ref *)ptr;
10856 type = btrfs_extent_inline_ref_type(leaf, iref);
10857 offset = btrfs_extent_inline_ref_offset(leaf, iref);
10859 if (type == BTRFS_TREE_BLOCK_REF_KEY &&
10860 (offset == root->objectid || offset == owner)) {
10862 } else if (type == BTRFS_SHARED_BLOCK_REF_KEY) {
10864 * Backref of tree reloc root points to itself, no need
10865 * to check backref any more.
10867 if (tree_reloc_root)
10870 /* Check if the backref points to valid referencer */
10871 found_ref = !check_tree_block_ref(root, NULL,
10872 offset, level + 1, owner);
10877 ptr += btrfs_extent_inline_ref_size(type);
10881 * Inlined extent item doesn't have what we need, check
10882 * TREE_BLOCK_REF_KEY
10885 btrfs_release_path(&path);
10886 key.objectid = bytenr;
10887 key.type = BTRFS_TREE_BLOCK_REF_KEY;
10888 key.offset = root->objectid;
10890 ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0);
10895 err |= BACKREF_MISSING;
10897 btrfs_release_path(&path);
10898 if (eb && (err & BACKREF_MISSING))
10899 error("extent[%llu %u] backref lost (owner: %llu, level: %u)",
10900 bytenr, nodesize, owner, level);
10905 * Check EXTENT_DATA item, mainly for its dbackref in extent tree
10907 * Return >0 any error found and output error message
10908 * Return 0 for no error found
10910 static int check_extent_data_item(struct btrfs_root *root,
10911 struct extent_buffer *eb, int slot)
10913 struct btrfs_file_extent_item *fi;
10914 struct btrfs_path path;
10915 struct btrfs_root *extent_root = root->fs_info->extent_root;
10916 struct btrfs_key fi_key;
10917 struct btrfs_key dbref_key;
10918 struct extent_buffer *leaf;
10919 struct btrfs_extent_item *ei;
10920 struct btrfs_extent_inline_ref *iref;
10921 struct btrfs_extent_data_ref *dref;
10924 u64 disk_num_bytes;
10925 u64 extent_num_bytes;
10932 int found_dbackref = 0;
10936 btrfs_item_key_to_cpu(eb, &fi_key, slot);
10937 fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
10939 /* Nothing to check for hole and inline data extents */
10940 if (btrfs_file_extent_type(eb, fi) == BTRFS_FILE_EXTENT_INLINE ||
10941 btrfs_file_extent_disk_bytenr(eb, fi) == 0)
10944 disk_bytenr = btrfs_file_extent_disk_bytenr(eb, fi);
10945 disk_num_bytes = btrfs_file_extent_disk_num_bytes(eb, fi);
10946 extent_num_bytes = btrfs_file_extent_num_bytes(eb, fi);
10948 /* Check unaligned disk_num_bytes and num_bytes */
10949 if (!IS_ALIGNED(disk_num_bytes, root->fs_info->sectorsize)) {
10951 "file extent [%llu, %llu] has unaligned disk num bytes: %llu, should be aligned to %u",
10952 fi_key.objectid, fi_key.offset, disk_num_bytes,
10953 root->fs_info->sectorsize);
10954 err |= BYTES_UNALIGNED;
10956 data_bytes_allocated += disk_num_bytes;
10958 if (!IS_ALIGNED(extent_num_bytes, root->fs_info->sectorsize)) {
10960 "file extent [%llu, %llu] has unaligned num bytes: %llu, should be aligned to %u",
10961 fi_key.objectid, fi_key.offset, extent_num_bytes,
10962 root->fs_info->sectorsize);
10963 err |= BYTES_UNALIGNED;
10965 data_bytes_referenced += extent_num_bytes;
10967 owner = btrfs_header_owner(eb);
10969 /* Check the extent item of the file extent in extent tree */
10970 btrfs_init_path(&path);
10971 dbref_key.objectid = btrfs_file_extent_disk_bytenr(eb, fi);
10972 dbref_key.type = BTRFS_EXTENT_ITEM_KEY;
10973 dbref_key.offset = btrfs_file_extent_disk_num_bytes(eb, fi);
10975 ret = btrfs_search_slot(NULL, extent_root, &dbref_key, &path, 0, 0);
10979 leaf = path.nodes[0];
10980 slot = path.slots[0];
10981 ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
10983 extent_flags = btrfs_extent_flags(leaf, ei);
10985 if (!(extent_flags & BTRFS_EXTENT_FLAG_DATA)) {
10987 "extent[%llu %llu] backref type mismatch, wanted bit: %llx",
10988 disk_bytenr, disk_num_bytes,
10989 BTRFS_EXTENT_FLAG_DATA);
10990 err |= BACKREF_MISMATCH;
10993 /* Check data backref inside that extent item */
10994 item_size = btrfs_item_size_nr(leaf, path.slots[0]);
10995 iref = (struct btrfs_extent_inline_ref *)(ei + 1);
10996 ptr = (unsigned long)iref;
10997 end = (unsigned long)ei + item_size;
10998 while (ptr < end) {
10999 iref = (struct btrfs_extent_inline_ref *)ptr;
11000 type = btrfs_extent_inline_ref_type(leaf, iref);
11001 dref = (struct btrfs_extent_data_ref *)(&iref->offset);
11003 if (type == BTRFS_EXTENT_DATA_REF_KEY) {
11004 ref_root = btrfs_extent_data_ref_root(leaf, dref);
11005 if (ref_root == owner || ref_root == root->objectid)
11006 found_dbackref = 1;
11007 } else if (type == BTRFS_SHARED_DATA_REF_KEY) {
11008 found_dbackref = !check_tree_block_ref(root, NULL,
11009 btrfs_extent_inline_ref_offset(leaf, iref),
11013 if (found_dbackref)
11015 ptr += btrfs_extent_inline_ref_size(type);
11018 if (!found_dbackref) {
11019 btrfs_release_path(&path);
11021 /* Didn't find inlined data backref, try EXTENT_DATA_REF_KEY */
11022 dbref_key.objectid = btrfs_file_extent_disk_bytenr(eb, fi);
11023 dbref_key.type = BTRFS_EXTENT_DATA_REF_KEY;
11024 dbref_key.offset = hash_extent_data_ref(root->objectid,
11025 fi_key.objectid, fi_key.offset);
11027 ret = btrfs_search_slot(NULL, root->fs_info->extent_root,
11028 &dbref_key, &path, 0, 0);
11030 found_dbackref = 1;
11034 btrfs_release_path(&path);
11037 * Neither inlined nor EXTENT_DATA_REF found, try
11038 * SHARED_DATA_REF as last chance.
11040 dbref_key.objectid = disk_bytenr;
11041 dbref_key.type = BTRFS_SHARED_DATA_REF_KEY;
11042 dbref_key.offset = eb->start;
11044 ret = btrfs_search_slot(NULL, root->fs_info->extent_root,
11045 &dbref_key, &path, 0, 0);
11047 found_dbackref = 1;
11053 if (!found_dbackref)
11054 err |= BACKREF_MISSING;
11055 btrfs_release_path(&path);
11056 if (err & BACKREF_MISSING) {
11057 error("data extent[%llu %llu] backref lost",
11058 disk_bytenr, disk_num_bytes);
11064 * Get real tree block level for the case like shared block
11065 * Return >= 0 as tree level
11066 * Return <0 for error
11068 static int query_tree_block_level(struct btrfs_fs_info *fs_info, u64 bytenr)
11070 struct extent_buffer *eb;
11071 struct btrfs_path path;
11072 struct btrfs_key key;
11073 struct btrfs_extent_item *ei;
11080 /* Search extent tree for extent generation and level */
11081 key.objectid = bytenr;
11082 key.type = BTRFS_METADATA_ITEM_KEY;
11083 key.offset = (u64)-1;
11085 btrfs_init_path(&path);
11086 ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, &path, 0, 0);
11089 ret = btrfs_previous_extent_item(fs_info->extent_root, &path, bytenr);
11097 btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
11098 ei = btrfs_item_ptr(path.nodes[0], path.slots[0],
11099 struct btrfs_extent_item);
11100 flags = btrfs_extent_flags(path.nodes[0], ei);
11101 if (!(flags & BTRFS_EXTENT_FLAG_TREE_BLOCK)) {
11106 /* Get transid for later read_tree_block() check */
11107 transid = btrfs_extent_generation(path.nodes[0], ei);
11109 /* Get backref level as one source */
11110 if (key.type == BTRFS_METADATA_ITEM_KEY) {
11111 backref_level = key.offset;
11113 struct btrfs_tree_block_info *info;
11115 info = (struct btrfs_tree_block_info *)(ei + 1);
11116 backref_level = btrfs_tree_block_level(path.nodes[0], info);
11118 btrfs_release_path(&path);
11120 /* Get level from tree block as an alternative source */
11121 eb = read_tree_block(fs_info, bytenr, transid);
11122 if (!extent_buffer_uptodate(eb)) {
11123 free_extent_buffer(eb);
11126 header_level = btrfs_header_level(eb);
11127 free_extent_buffer(eb);
11129 if (header_level != backref_level)
11131 return header_level;
11134 btrfs_release_path(&path);
11139 * Check if a tree block backref is valid (points to a valid tree block)
11140 * if level == -1, level will be resolved
11141 * Return >0 for any error found and print error message
11143 static int check_tree_block_backref(struct btrfs_fs_info *fs_info, u64 root_id,
11144 u64 bytenr, int level)
11146 struct btrfs_root *root;
11147 struct btrfs_key key;
11148 struct btrfs_path path;
11149 struct extent_buffer *eb;
11150 struct extent_buffer *node;
11151 u32 nodesize = btrfs_super_nodesize(fs_info->super_copy);
11155 /* Query level for level == -1 special case */
11157 level = query_tree_block_level(fs_info, bytenr);
11159 err |= REFERENCER_MISSING;
11163 key.objectid = root_id;
11164 key.type = BTRFS_ROOT_ITEM_KEY;
11165 key.offset = (u64)-1;
11167 root = btrfs_read_fs_root(fs_info, &key);
11168 if (IS_ERR(root)) {
11169 err |= REFERENCER_MISSING;
11173 /* Read out the tree block to get item/node key */
11174 eb = read_tree_block(fs_info, bytenr, 0);
11175 if (!extent_buffer_uptodate(eb)) {
11176 err |= REFERENCER_MISSING;
11177 free_extent_buffer(eb);
11181 /* Empty tree, no need to check key */
11182 if (!btrfs_header_nritems(eb) && !level) {
11183 free_extent_buffer(eb);
11188 btrfs_node_key_to_cpu(eb, &key, 0);
11190 btrfs_item_key_to_cpu(eb, &key, 0);
11192 free_extent_buffer(eb);
11194 btrfs_init_path(&path);
11195 path.lowest_level = level;
11196 /* Search with the first key, to ensure we can reach it */
11197 ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
11199 err |= REFERENCER_MISSING;
11203 node = path.nodes[level];
11204 if (btrfs_header_bytenr(node) != bytenr) {
11206 "extent [%llu %d] referencer bytenr mismatch, wanted: %llu, have: %llu",
11207 bytenr, nodesize, bytenr,
11208 btrfs_header_bytenr(node));
11209 err |= REFERENCER_MISMATCH;
11211 if (btrfs_header_level(node) != level) {
11213 "extent [%llu %d] referencer level mismatch, wanted: %d, have: %d",
11214 bytenr, nodesize, level,
11215 btrfs_header_level(node));
11216 err |= REFERENCER_MISMATCH;
11220 btrfs_release_path(&path);
11222 if (err & REFERENCER_MISSING) {
11224 error("extent [%llu %d] lost referencer (owner: %llu)",
11225 bytenr, nodesize, root_id);
11228 "extent [%llu %d] lost referencer (owner: %llu, level: %u)",
11229 bytenr, nodesize, root_id, level);
11236 * Check if tree block @eb is tree reloc root.
11237 * Return 0 if it's not or any problem happens
11238 * Return 1 if it's a tree reloc root
11240 static int is_tree_reloc_root(struct btrfs_fs_info *fs_info,
11241 struct extent_buffer *eb)
11243 struct btrfs_root *tree_reloc_root;
11244 struct btrfs_key key;
11245 u64 bytenr = btrfs_header_bytenr(eb);
11246 u64 owner = btrfs_header_owner(eb);
11249 key.objectid = BTRFS_TREE_RELOC_OBJECTID;
11250 key.offset = owner;
11251 key.type = BTRFS_ROOT_ITEM_KEY;
11253 tree_reloc_root = btrfs_read_fs_root_no_cache(fs_info, &key);
11254 if (IS_ERR(tree_reloc_root))
11257 if (bytenr == btrfs_header_bytenr(tree_reloc_root->node))
11259 btrfs_free_fs_root(tree_reloc_root);
11264 * Check referencer for shared block backref
11265 * If level == -1, this function will resolve the level.
11267 static int check_shared_block_backref(struct btrfs_fs_info *fs_info,
11268 u64 parent, u64 bytenr, int level)
11270 struct extent_buffer *eb;
11272 int found_parent = 0;
11275 eb = read_tree_block(fs_info, parent, 0);
11276 if (!extent_buffer_uptodate(eb))
11280 level = query_tree_block_level(fs_info, bytenr);
11284 /* It's possible it's a tree reloc root */
11285 if (parent == bytenr) {
11286 if (is_tree_reloc_root(fs_info, eb))
11291 if (level + 1 != btrfs_header_level(eb))
11294 nr = btrfs_header_nritems(eb);
11295 for (i = 0; i < nr; i++) {
11296 if (bytenr == btrfs_node_blockptr(eb, i)) {
11302 free_extent_buffer(eb);
11303 if (!found_parent) {
11305 "shared extent[%llu %u] lost its parent (parent: %llu, level: %u)",
11306 bytenr, fs_info->nodesize, parent, level);
11307 return REFERENCER_MISSING;
11313 * Check referencer for normal (inlined) data ref
11314 * If len == 0, it will be resolved by searching in extent tree
11316 static int check_extent_data_backref(struct btrfs_fs_info *fs_info,
11317 u64 root_id, u64 objectid, u64 offset,
11318 u64 bytenr, u64 len, u32 count)
11320 struct btrfs_root *root;
11321 struct btrfs_root *extent_root = fs_info->extent_root;
11322 struct btrfs_key key;
11323 struct btrfs_path path;
11324 struct extent_buffer *leaf;
11325 struct btrfs_file_extent_item *fi;
11326 u32 found_count = 0;
11331 key.objectid = bytenr;
11332 key.type = BTRFS_EXTENT_ITEM_KEY;
11333 key.offset = (u64)-1;
11335 btrfs_init_path(&path);
11336 ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0);
11339 ret = btrfs_previous_extent_item(extent_root, &path, bytenr);
11342 btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
11343 if (key.objectid != bytenr ||
11344 key.type != BTRFS_EXTENT_ITEM_KEY)
11347 btrfs_release_path(&path);
11349 key.objectid = root_id;
11350 key.type = BTRFS_ROOT_ITEM_KEY;
11351 key.offset = (u64)-1;
11352 btrfs_init_path(&path);
11354 root = btrfs_read_fs_root(fs_info, &key);
11358 key.objectid = objectid;
11359 key.type = BTRFS_EXTENT_DATA_KEY;
11361 * It can be nasty as data backref offset is
11362 * file offset - file extent offset, which is smaller or
11363 * equal to original backref offset. The only special case is
11364 * overflow. So we need to special check and do further search.
11366 key.offset = offset & (1ULL << 63) ? 0 : offset;
11368 ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
11373 * Search afterwards to get correct one
11374 * NOTE: As we must do a comprehensive check on the data backref to
11375 * make sure the dref count also matches, we must iterate all file
11376 * extents for that inode.
11379 leaf = path.nodes[0];
11380 slot = path.slots[0];
11382 if (slot >= btrfs_header_nritems(leaf))
11384 btrfs_item_key_to_cpu(leaf, &key, slot);
11385 if (key.objectid != objectid || key.type != BTRFS_EXTENT_DATA_KEY)
11387 fi = btrfs_item_ptr(leaf, slot, struct btrfs_file_extent_item);
11389 * Except normal disk bytenr and disk num bytes, we still
11390 * need to do extra check on dbackref offset as
11391 * dbackref offset = file_offset - file_extent_offset
11393 if (btrfs_file_extent_disk_bytenr(leaf, fi) == bytenr &&
11394 btrfs_file_extent_disk_num_bytes(leaf, fi) == len &&
11395 (u64)(key.offset - btrfs_file_extent_offset(leaf, fi)) ==
11400 ret = btrfs_next_item(root, &path);
11405 btrfs_release_path(&path);
11406 if (found_count != count) {
11408 "extent[%llu, %llu] referencer count mismatch (root: %llu, owner: %llu, offset: %llu) wanted: %u, have: %u",
11409 bytenr, len, root_id, objectid, offset, count, found_count);
11410 return REFERENCER_MISSING;
11416 * Check if the referencer of a shared data backref exists
11418 static int check_shared_data_backref(struct btrfs_fs_info *fs_info,
11419 u64 parent, u64 bytenr)
11421 struct extent_buffer *eb;
11422 struct btrfs_key key;
11423 struct btrfs_file_extent_item *fi;
11425 int found_parent = 0;
11428 eb = read_tree_block(fs_info, parent, 0);
11429 if (!extent_buffer_uptodate(eb))
11432 nr = btrfs_header_nritems(eb);
11433 for (i = 0; i < nr; i++) {
11434 btrfs_item_key_to_cpu(eb, &key, i);
11435 if (key.type != BTRFS_EXTENT_DATA_KEY)
11438 fi = btrfs_item_ptr(eb, i, struct btrfs_file_extent_item);
11439 if (btrfs_file_extent_type(eb, fi) == BTRFS_FILE_EXTENT_INLINE)
11442 if (btrfs_file_extent_disk_bytenr(eb, fi) == bytenr) {
11449 free_extent_buffer(eb);
11450 if (!found_parent) {
11451 error("shared extent %llu referencer lost (parent: %llu)",
11453 return REFERENCER_MISSING;
11459 * This function will check a given extent item, including its backref and
11460 * itself (like crossing stripe boundary and type)
11462 * Since we don't use extent_record anymore, introduce new error bit
11464 static int check_extent_item(struct btrfs_fs_info *fs_info,
11465 struct extent_buffer *eb, int slot)
11467 struct btrfs_extent_item *ei;
11468 struct btrfs_extent_inline_ref *iref;
11469 struct btrfs_extent_data_ref *dref;
11473 u32 nodesize = btrfs_super_nodesize(fs_info->super_copy);
11474 u32 item_size = btrfs_item_size_nr(eb, slot);
11479 struct btrfs_key key;
11483 btrfs_item_key_to_cpu(eb, &key, slot);
11484 if (key.type == BTRFS_EXTENT_ITEM_KEY)
11485 bytes_used += key.offset;
11487 bytes_used += nodesize;
11489 if (item_size < sizeof(*ei)) {
11491 * COMPAT_EXTENT_TREE_V0 case, but it's already a super
11492 * old thing when on disk format is still un-determined.
11493 * No need to care about it anymore
11495 error("unsupported COMPAT_EXTENT_TREE_V0 detected");
11499 ei = btrfs_item_ptr(eb, slot, struct btrfs_extent_item);
11500 flags = btrfs_extent_flags(eb, ei);
11502 if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK)
11504 if (metadata && check_crossing_stripes(global_info, key.objectid,
11506 error("bad metadata [%llu, %llu) crossing stripe boundary",
11507 key.objectid, key.objectid + nodesize);
11508 err |= CROSSING_STRIPE_BOUNDARY;
11511 ptr = (unsigned long)(ei + 1);
11513 if (metadata && key.type == BTRFS_EXTENT_ITEM_KEY) {
11514 /* Old EXTENT_ITEM metadata */
11515 struct btrfs_tree_block_info *info;
11517 info = (struct btrfs_tree_block_info *)ptr;
11518 level = btrfs_tree_block_level(eb, info);
11519 ptr += sizeof(struct btrfs_tree_block_info);
11521 /* New METADATA_ITEM */
11522 level = key.offset;
11524 end = (unsigned long)ei + item_size;
11527 /* Reached extent item end normally */
11531 /* Beyond extent item end, wrong item size */
11533 err |= ITEM_SIZE_MISMATCH;
11534 error("extent item at bytenr %llu slot %d has wrong size",
11539 /* Now check every backref in this extent item */
11540 iref = (struct btrfs_extent_inline_ref *)ptr;
11541 type = btrfs_extent_inline_ref_type(eb, iref);
11542 offset = btrfs_extent_inline_ref_offset(eb, iref);
11544 case BTRFS_TREE_BLOCK_REF_KEY:
11545 ret = check_tree_block_backref(fs_info, offset, key.objectid,
11549 case BTRFS_SHARED_BLOCK_REF_KEY:
11550 ret = check_shared_block_backref(fs_info, offset, key.objectid,
11554 case BTRFS_EXTENT_DATA_REF_KEY:
11555 dref = (struct btrfs_extent_data_ref *)(&iref->offset);
11556 ret = check_extent_data_backref(fs_info,
11557 btrfs_extent_data_ref_root(eb, dref),
11558 btrfs_extent_data_ref_objectid(eb, dref),
11559 btrfs_extent_data_ref_offset(eb, dref),
11560 key.objectid, key.offset,
11561 btrfs_extent_data_ref_count(eb, dref));
11564 case BTRFS_SHARED_DATA_REF_KEY:
11565 ret = check_shared_data_backref(fs_info, offset, key.objectid);
11569 error("extent[%llu %d %llu] has unknown ref type: %d",
11570 key.objectid, key.type, key.offset, type);
11571 err |= UNKNOWN_TYPE;
11575 ptr += btrfs_extent_inline_ref_size(type);
11583 * Check if a dev extent item is referred correctly by its chunk
11585 static int check_dev_extent_item(struct btrfs_fs_info *fs_info,
11586 struct extent_buffer *eb, int slot)
11588 struct btrfs_root *chunk_root = fs_info->chunk_root;
11589 struct btrfs_dev_extent *ptr;
11590 struct btrfs_path path;
11591 struct btrfs_key chunk_key;
11592 struct btrfs_key devext_key;
11593 struct btrfs_chunk *chunk;
11594 struct extent_buffer *l;
11598 int found_chunk = 0;
11601 btrfs_item_key_to_cpu(eb, &devext_key, slot);
11602 ptr = btrfs_item_ptr(eb, slot, struct btrfs_dev_extent);
11603 length = btrfs_dev_extent_length(eb, ptr);
11605 chunk_key.objectid = btrfs_dev_extent_chunk_objectid(eb, ptr);
11606 chunk_key.type = BTRFS_CHUNK_ITEM_KEY;
11607 chunk_key.offset = btrfs_dev_extent_chunk_offset(eb, ptr);
11609 btrfs_init_path(&path);
11610 ret = btrfs_search_slot(NULL, chunk_root, &chunk_key, &path, 0, 0);
11615 chunk = btrfs_item_ptr(l, path.slots[0], struct btrfs_chunk);
11616 ret = btrfs_check_chunk_valid(fs_info, l, chunk, path.slots[0],
11621 if (btrfs_stripe_length(fs_info, l, chunk) != length)
11624 num_stripes = btrfs_chunk_num_stripes(l, chunk);
11625 for (i = 0; i < num_stripes; i++) {
11626 u64 devid = btrfs_stripe_devid_nr(l, chunk, i);
11627 u64 offset = btrfs_stripe_offset_nr(l, chunk, i);
11629 if (devid == devext_key.objectid &&
11630 offset == devext_key.offset) {
11636 btrfs_release_path(&path);
11637 if (!found_chunk) {
11639 "device extent[%llu, %llu, %llu] did not find the related chunk",
11640 devext_key.objectid, devext_key.offset, length);
11641 return REFERENCER_MISSING;
11647 * Check if the used space is correct with the dev item
11649 static int check_dev_item(struct btrfs_fs_info *fs_info,
11650 struct extent_buffer *eb, int slot)
11652 struct btrfs_root *dev_root = fs_info->dev_root;
11653 struct btrfs_dev_item *dev_item;
11654 struct btrfs_path path;
11655 struct btrfs_key key;
11656 struct btrfs_dev_extent *ptr;
11662 dev_item = btrfs_item_ptr(eb, slot, struct btrfs_dev_item);
11663 dev_id = btrfs_device_id(eb, dev_item);
11664 used = btrfs_device_bytes_used(eb, dev_item);
11666 key.objectid = dev_id;
11667 key.type = BTRFS_DEV_EXTENT_KEY;
11670 btrfs_init_path(&path);
11671 ret = btrfs_search_slot(NULL, dev_root, &key, &path, 0, 0);
11673 btrfs_item_key_to_cpu(eb, &key, slot);
11674 error("cannot find any related dev extent for dev[%llu, %u, %llu]",
11675 key.objectid, key.type, key.offset);
11676 btrfs_release_path(&path);
11677 return REFERENCER_MISSING;
11680 /* Iterate dev_extents to calculate the used space of a device */
11682 if (path.slots[0] >= btrfs_header_nritems(path.nodes[0]))
11685 btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
11686 if (key.objectid > dev_id)
11688 if (key.type != BTRFS_DEV_EXTENT_KEY || key.objectid != dev_id)
11691 ptr = btrfs_item_ptr(path.nodes[0], path.slots[0],
11692 struct btrfs_dev_extent);
11693 total += btrfs_dev_extent_length(path.nodes[0], ptr);
11695 ret = btrfs_next_item(dev_root, &path);
11699 btrfs_release_path(&path);
11701 if (used != total) {
11702 btrfs_item_key_to_cpu(eb, &key, slot);
11704 "Dev extent's total-byte %llu is not equal to bytes-used %llu in dev[%llu, %u, %llu]",
11705 total, used, BTRFS_ROOT_TREE_OBJECTID,
11706 BTRFS_DEV_EXTENT_KEY, dev_id);
11707 return ACCOUNTING_MISMATCH;
11713 * Check a block group item with its referener (chunk) and its used space
11714 * with extent/metadata item
11716 static int check_block_group_item(struct btrfs_fs_info *fs_info,
11717 struct extent_buffer *eb, int slot)
11719 struct btrfs_root *extent_root = fs_info->extent_root;
11720 struct btrfs_root *chunk_root = fs_info->chunk_root;
11721 struct btrfs_block_group_item *bi;
11722 struct btrfs_block_group_item bg_item;
11723 struct btrfs_path path;
11724 struct btrfs_key bg_key;
11725 struct btrfs_key chunk_key;
11726 struct btrfs_key extent_key;
11727 struct btrfs_chunk *chunk;
11728 struct extent_buffer *leaf;
11729 struct btrfs_extent_item *ei;
11730 u32 nodesize = btrfs_super_nodesize(fs_info->super_copy);
11738 btrfs_item_key_to_cpu(eb, &bg_key, slot);
11739 bi = btrfs_item_ptr(eb, slot, struct btrfs_block_group_item);
11740 read_extent_buffer(eb, &bg_item, (unsigned long)bi, sizeof(bg_item));
11741 used = btrfs_block_group_used(&bg_item);
11742 bg_flags = btrfs_block_group_flags(&bg_item);
11744 chunk_key.objectid = BTRFS_FIRST_CHUNK_TREE_OBJECTID;
11745 chunk_key.type = BTRFS_CHUNK_ITEM_KEY;
11746 chunk_key.offset = bg_key.objectid;
11748 btrfs_init_path(&path);
11749 /* Search for the referencer chunk */
11750 ret = btrfs_search_slot(NULL, chunk_root, &chunk_key, &path, 0, 0);
11753 "block group[%llu %llu] did not find the related chunk item",
11754 bg_key.objectid, bg_key.offset);
11755 err |= REFERENCER_MISSING;
11757 chunk = btrfs_item_ptr(path.nodes[0], path.slots[0],
11758 struct btrfs_chunk);
11759 if (btrfs_chunk_length(path.nodes[0], chunk) !=
11762 "block group[%llu %llu] related chunk item length does not match",
11763 bg_key.objectid, bg_key.offset);
11764 err |= REFERENCER_MISMATCH;
11767 btrfs_release_path(&path);
11769 /* Search from the block group bytenr */
11770 extent_key.objectid = bg_key.objectid;
11771 extent_key.type = 0;
11772 extent_key.offset = 0;
11774 btrfs_init_path(&path);
11775 ret = btrfs_search_slot(NULL, extent_root, &extent_key, &path, 0, 0);
11779 /* Iterate extent tree to account used space */
11781 leaf = path.nodes[0];
11783 /* Search slot can point to the last item beyond leaf nritems */
11784 if (path.slots[0] >= btrfs_header_nritems(leaf))
11787 btrfs_item_key_to_cpu(leaf, &extent_key, path.slots[0]);
11788 if (extent_key.objectid >= bg_key.objectid + bg_key.offset)
11791 if (extent_key.type != BTRFS_METADATA_ITEM_KEY &&
11792 extent_key.type != BTRFS_EXTENT_ITEM_KEY)
11794 if (extent_key.objectid < bg_key.objectid)
11797 if (extent_key.type == BTRFS_METADATA_ITEM_KEY)
11800 total += extent_key.offset;
11802 ei = btrfs_item_ptr(leaf, path.slots[0],
11803 struct btrfs_extent_item);
11804 flags = btrfs_extent_flags(leaf, ei);
11805 if (flags & BTRFS_EXTENT_FLAG_DATA) {
11806 if (!(bg_flags & BTRFS_BLOCK_GROUP_DATA)) {
11808 "bad extent[%llu, %llu) type mismatch with chunk",
11809 extent_key.objectid,
11810 extent_key.objectid + extent_key.offset);
11811 err |= CHUNK_TYPE_MISMATCH;
11813 } else if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
11814 if (!(bg_flags & (BTRFS_BLOCK_GROUP_SYSTEM |
11815 BTRFS_BLOCK_GROUP_METADATA))) {
11817 "bad extent[%llu, %llu) type mismatch with chunk",
11818 extent_key.objectid,
11819 extent_key.objectid + nodesize);
11820 err |= CHUNK_TYPE_MISMATCH;
11824 ret = btrfs_next_item(extent_root, &path);
11830 btrfs_release_path(&path);
11832 if (total != used) {
11834 "block group[%llu %llu] used %llu but extent items used %llu",
11835 bg_key.objectid, bg_key.offset, used, total);
11836 err |= ACCOUNTING_MISMATCH;
11842 * Check a chunk item.
11843 * Including checking all referred dev_extents and block group
11845 static int check_chunk_item(struct btrfs_fs_info *fs_info,
11846 struct extent_buffer *eb, int slot)
11848 struct btrfs_root *extent_root = fs_info->extent_root;
11849 struct btrfs_root *dev_root = fs_info->dev_root;
11850 struct btrfs_path path;
11851 struct btrfs_key chunk_key;
11852 struct btrfs_key bg_key;
11853 struct btrfs_key devext_key;
11854 struct btrfs_chunk *chunk;
11855 struct extent_buffer *leaf;
11856 struct btrfs_block_group_item *bi;
11857 struct btrfs_block_group_item bg_item;
11858 struct btrfs_dev_extent *ptr;
11870 btrfs_item_key_to_cpu(eb, &chunk_key, slot);
11871 chunk = btrfs_item_ptr(eb, slot, struct btrfs_chunk);
11872 length = btrfs_chunk_length(eb, chunk);
11873 chunk_end = chunk_key.offset + length;
11874 ret = btrfs_check_chunk_valid(fs_info, eb, chunk, slot,
11877 error("chunk[%llu %llu) is invalid", chunk_key.offset,
11879 err |= BYTES_UNALIGNED | UNKNOWN_TYPE;
11882 type = btrfs_chunk_type(eb, chunk);
11884 bg_key.objectid = chunk_key.offset;
11885 bg_key.type = BTRFS_BLOCK_GROUP_ITEM_KEY;
11886 bg_key.offset = length;
11888 btrfs_init_path(&path);
11889 ret = btrfs_search_slot(NULL, extent_root, &bg_key, &path, 0, 0);
11892 "chunk[%llu %llu) did not find the related block group item",
11893 chunk_key.offset, chunk_end);
11894 err |= REFERENCER_MISSING;
11896 leaf = path.nodes[0];
11897 bi = btrfs_item_ptr(leaf, path.slots[0],
11898 struct btrfs_block_group_item);
11899 read_extent_buffer(leaf, &bg_item, (unsigned long)bi,
11901 if (btrfs_block_group_flags(&bg_item) != type) {
11903 "chunk[%llu %llu) related block group item flags mismatch, wanted: %llu, have: %llu",
11904 chunk_key.offset, chunk_end, type,
11905 btrfs_block_group_flags(&bg_item));
11906 err |= REFERENCER_MISSING;
11910 num_stripes = btrfs_chunk_num_stripes(eb, chunk);
11911 stripe_len = btrfs_stripe_length(fs_info, eb, chunk);
11912 for (i = 0; i < num_stripes; i++) {
11913 btrfs_release_path(&path);
11914 btrfs_init_path(&path);
11915 devext_key.objectid = btrfs_stripe_devid_nr(eb, chunk, i);
11916 devext_key.type = BTRFS_DEV_EXTENT_KEY;
11917 devext_key.offset = btrfs_stripe_offset_nr(eb, chunk, i);
11919 ret = btrfs_search_slot(NULL, dev_root, &devext_key, &path,
11922 goto not_match_dev;
11924 leaf = path.nodes[0];
11925 ptr = btrfs_item_ptr(leaf, path.slots[0],
11926 struct btrfs_dev_extent);
11927 objectid = btrfs_dev_extent_chunk_objectid(leaf, ptr);
11928 offset = btrfs_dev_extent_chunk_offset(leaf, ptr);
11929 if (objectid != chunk_key.objectid ||
11930 offset != chunk_key.offset ||
11931 btrfs_dev_extent_length(leaf, ptr) != stripe_len)
11932 goto not_match_dev;
11935 err |= BACKREF_MISSING;
11937 "chunk[%llu %llu) stripe %d did not find the related dev extent",
11938 chunk_key.objectid, chunk_end, i);
11941 btrfs_release_path(&path);
11947 * Main entry function to check known items and update related accounting info
11949 static int check_leaf_items(struct btrfs_root *root, struct extent_buffer *eb)
11951 struct btrfs_fs_info *fs_info = root->fs_info;
11952 struct btrfs_key key;
11955 struct btrfs_extent_data_ref *dref;
11960 btrfs_item_key_to_cpu(eb, &key, slot);
11964 case BTRFS_EXTENT_DATA_KEY:
11965 ret = check_extent_data_item(root, eb, slot);
11968 case BTRFS_BLOCK_GROUP_ITEM_KEY:
11969 ret = check_block_group_item(fs_info, eb, slot);
11972 case BTRFS_DEV_ITEM_KEY:
11973 ret = check_dev_item(fs_info, eb, slot);
11976 case BTRFS_CHUNK_ITEM_KEY:
11977 ret = check_chunk_item(fs_info, eb, slot);
11980 case BTRFS_DEV_EXTENT_KEY:
11981 ret = check_dev_extent_item(fs_info, eb, slot);
11984 case BTRFS_EXTENT_ITEM_KEY:
11985 case BTRFS_METADATA_ITEM_KEY:
11986 ret = check_extent_item(fs_info, eb, slot);
11989 case BTRFS_EXTENT_CSUM_KEY:
11990 total_csum_bytes += btrfs_item_size_nr(eb, slot);
11992 case BTRFS_TREE_BLOCK_REF_KEY:
11993 ret = check_tree_block_backref(fs_info, key.offset,
11997 case BTRFS_EXTENT_DATA_REF_KEY:
11998 dref = btrfs_item_ptr(eb, slot, struct btrfs_extent_data_ref);
11999 ret = check_extent_data_backref(fs_info,
12000 btrfs_extent_data_ref_root(eb, dref),
12001 btrfs_extent_data_ref_objectid(eb, dref),
12002 btrfs_extent_data_ref_offset(eb, dref),
12004 btrfs_extent_data_ref_count(eb, dref));
12007 case BTRFS_SHARED_BLOCK_REF_KEY:
12008 ret = check_shared_block_backref(fs_info, key.offset,
12012 case BTRFS_SHARED_DATA_REF_KEY:
12013 ret = check_shared_data_backref(fs_info, key.offset,
12021 if (++slot < btrfs_header_nritems(eb))
12028 * Helper function for later fs/subvol tree check. To determine if a tree
12029 * block should be checked.
12030 * This function will ensure only the direct referencer with lowest rootid to
12031 * check a fs/subvolume tree block.
12033 * Backref check at extent tree would detect errors like missing subvolume
12034 * tree, so we can do aggressive check to reduce duplicated checks.
12036 static int should_check(struct btrfs_root *root, struct extent_buffer *eb)
12038 struct btrfs_root *extent_root = root->fs_info->extent_root;
12039 struct btrfs_key key;
12040 struct btrfs_path path;
12041 struct extent_buffer *leaf;
12043 struct btrfs_extent_item *ei;
12049 struct btrfs_extent_inline_ref *iref;
12052 btrfs_init_path(&path);
12053 key.objectid = btrfs_header_bytenr(eb);
12054 key.type = BTRFS_METADATA_ITEM_KEY;
12055 key.offset = (u64)-1;
12058 * Any failure in backref resolving means we can't determine
12059 * whom the tree block belongs to.
12060 * So in that case, we need to check that tree block
12062 ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0);
12066 ret = btrfs_previous_extent_item(extent_root, &path,
12067 btrfs_header_bytenr(eb));
12071 leaf = path.nodes[0];
12072 slot = path.slots[0];
12073 btrfs_item_key_to_cpu(leaf, &key, slot);
12074 ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
12076 if (key.type == BTRFS_METADATA_ITEM_KEY) {
12077 iref = (struct btrfs_extent_inline_ref *)(ei + 1);
12079 struct btrfs_tree_block_info *info;
12081 info = (struct btrfs_tree_block_info *)(ei + 1);
12082 iref = (struct btrfs_extent_inline_ref *)(info + 1);
12085 item_size = btrfs_item_size_nr(leaf, slot);
12086 ptr = (unsigned long)iref;
12087 end = (unsigned long)ei + item_size;
12088 while (ptr < end) {
12089 iref = (struct btrfs_extent_inline_ref *)ptr;
12090 type = btrfs_extent_inline_ref_type(leaf, iref);
12091 offset = btrfs_extent_inline_ref_offset(leaf, iref);
12094 * We only check the tree block if current root is
12095 * the lowest referencer of it.
12097 if (type == BTRFS_TREE_BLOCK_REF_KEY &&
12098 offset < root->objectid) {
12099 btrfs_release_path(&path);
12103 ptr += btrfs_extent_inline_ref_size(type);
12106 * Normally we should also check keyed tree block ref, but that may be
12107 * very time consuming. Inlined ref should already make us skip a lot
12108 * of refs now. So skip search keyed tree block ref.
12112 btrfs_release_path(&path);
12117 * Traversal function for tree block. We will do:
12118 * 1) Skip shared fs/subvolume tree blocks
12119 * 2) Update related bytes accounting
12120 * 3) Pre-order traversal
12122 static int traverse_tree_block(struct btrfs_root *root,
12123 struct extent_buffer *node)
12125 struct extent_buffer *eb;
12126 struct btrfs_key key;
12127 struct btrfs_key drop_key;
12135 * Skip shared fs/subvolume tree block, in that case they will
12136 * be checked by referencer with lowest rootid
12138 if (is_fstree(root->objectid) && !should_check(root, node))
12141 /* Update bytes accounting */
12142 total_btree_bytes += node->len;
12143 if (fs_root_objectid(btrfs_header_owner(node)))
12144 total_fs_tree_bytes += node->len;
12145 if (btrfs_header_owner(node) == BTRFS_EXTENT_TREE_OBJECTID)
12146 total_extent_tree_bytes += node->len;
12148 /* pre-order tranversal, check itself first */
12149 level = btrfs_header_level(node);
12150 ret = check_tree_block_ref(root, node, btrfs_header_bytenr(node),
12151 btrfs_header_level(node),
12152 btrfs_header_owner(node));
12156 "check %s failed root %llu bytenr %llu level %d, force continue check",
12157 level ? "node":"leaf", root->objectid,
12158 btrfs_header_bytenr(node), btrfs_header_level(node));
12161 btree_space_waste += btrfs_leaf_free_space(root, node);
12162 ret = check_leaf_items(root, node);
12167 nr = btrfs_header_nritems(node);
12168 btrfs_disk_key_to_cpu(&drop_key, &root->root_item.drop_progress);
12169 btree_space_waste += (BTRFS_NODEPTRS_PER_BLOCK(root) - nr) *
12170 sizeof(struct btrfs_key_ptr);
12172 /* Then check all its children */
12173 for (i = 0; i < nr; i++) {
12174 u64 blocknr = btrfs_node_blockptr(node, i);
12176 btrfs_node_key_to_cpu(node, &key, i);
12177 if (level == root->root_item.drop_level &&
12178 is_dropped_key(&key, &drop_key))
12182 * As a btrfs tree has most 8 levels (0..7), so it's quite safe
12183 * to call the function itself.
12185 eb = read_tree_block(root->fs_info, blocknr, 0);
12186 if (extent_buffer_uptodate(eb)) {
12187 ret = traverse_tree_block(root, eb);
12190 free_extent_buffer(eb);
12197 * Low memory usage version check_chunks_and_extents.
12199 static int check_chunks_and_extents_v2(struct btrfs_fs_info *fs_info)
12201 struct btrfs_path path;
12202 struct btrfs_key key;
12203 struct btrfs_root *root1;
12204 struct btrfs_root *root;
12205 struct btrfs_root *cur_root;
12209 root = fs_info->fs_root;
12211 root1 = root->fs_info->chunk_root;
12212 ret = traverse_tree_block(root1, root1->node);
12215 root1 = root->fs_info->tree_root;
12216 ret = traverse_tree_block(root1, root1->node);
12219 btrfs_init_path(&path);
12220 key.objectid = BTRFS_EXTENT_TREE_OBJECTID;
12222 key.type = BTRFS_ROOT_ITEM_KEY;
12224 ret = btrfs_search_slot(NULL, root1, &key, &path, 0, 0);
12226 error("cannot find extent treet in tree_root");
12231 btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
12232 if (key.type != BTRFS_ROOT_ITEM_KEY)
12234 key.offset = (u64)-1;
12236 if (key.objectid == BTRFS_TREE_RELOC_OBJECTID)
12237 cur_root = btrfs_read_fs_root_no_cache(root->fs_info,
12240 cur_root = btrfs_read_fs_root(root->fs_info, &key);
12241 if (IS_ERR(cur_root) || !cur_root) {
12242 error("failed to read tree: %lld", key.objectid);
12246 ret = traverse_tree_block(cur_root, cur_root->node);
12249 if (key.objectid == BTRFS_TREE_RELOC_OBJECTID)
12250 btrfs_free_fs_root(cur_root);
12252 ret = btrfs_next_item(root1, &path);
12258 btrfs_release_path(&path);
12262 static int do_check_chunks_and_extents(struct btrfs_fs_info *fs_info)
12266 if (!ctx.progress_enabled)
12267 fprintf(stderr, "checking extents\n");
12268 if (check_mode == CHECK_MODE_LOWMEM)
12269 ret = check_chunks_and_extents_v2(fs_info);
12271 ret = check_chunks_and_extents(fs_info);
12276 static int btrfs_fsck_reinit_root(struct btrfs_trans_handle *trans,
12277 struct btrfs_root *root, int overwrite)
12279 struct extent_buffer *c;
12280 struct extent_buffer *old = root->node;
12283 struct btrfs_disk_key disk_key = {0,0,0};
12289 extent_buffer_get(c);
12292 c = btrfs_alloc_free_block(trans, root,
12293 root->fs_info->nodesize,
12294 root->root_key.objectid,
12295 &disk_key, level, 0, 0);
12298 extent_buffer_get(c);
12302 memset_extent_buffer(c, 0, 0, sizeof(struct btrfs_header));
12303 btrfs_set_header_level(c, level);
12304 btrfs_set_header_bytenr(c, c->start);
12305 btrfs_set_header_generation(c, trans->transid);
12306 btrfs_set_header_backref_rev(c, BTRFS_MIXED_BACKREF_REV);
12307 btrfs_set_header_owner(c, root->root_key.objectid);
12309 write_extent_buffer(c, root->fs_info->fsid,
12310 btrfs_header_fsid(), BTRFS_FSID_SIZE);
12312 write_extent_buffer(c, root->fs_info->chunk_tree_uuid,
12313 btrfs_header_chunk_tree_uuid(c),
12316 btrfs_mark_buffer_dirty(c);
12318 * this case can happen in the following case:
12320 * 1.overwrite previous root.
12322 * 2.reinit reloc data root, this is because we skip pin
12323 * down reloc data tree before which means we can allocate
12324 * same block bytenr here.
12326 if (old->start == c->start) {
12327 btrfs_set_root_generation(&root->root_item,
12329 root->root_item.level = btrfs_header_level(root->node);
12330 ret = btrfs_update_root(trans, root->fs_info->tree_root,
12331 &root->root_key, &root->root_item);
12333 free_extent_buffer(c);
12337 free_extent_buffer(old);
12339 add_root_to_dirty_list(root);
12343 static int pin_down_tree_blocks(struct btrfs_fs_info *fs_info,
12344 struct extent_buffer *eb, int tree_root)
12346 struct extent_buffer *tmp;
12347 struct btrfs_root_item *ri;
12348 struct btrfs_key key;
12350 int level = btrfs_header_level(eb);
12356 * If we have pinned this block before, don't pin it again.
12357 * This can not only avoid forever loop with broken filesystem
12358 * but also give us some speedups.
12360 if (test_range_bit(&fs_info->pinned_extents, eb->start,
12361 eb->start + eb->len - 1, EXTENT_DIRTY, 0))
12364 btrfs_pin_extent(fs_info, eb->start, eb->len);
12366 nritems = btrfs_header_nritems(eb);
12367 for (i = 0; i < nritems; i++) {
12369 btrfs_item_key_to_cpu(eb, &key, i);
12370 if (key.type != BTRFS_ROOT_ITEM_KEY)
12372 /* Skip the extent root and reloc roots */
12373 if (key.objectid == BTRFS_EXTENT_TREE_OBJECTID ||
12374 key.objectid == BTRFS_TREE_RELOC_OBJECTID ||
12375 key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID)
12377 ri = btrfs_item_ptr(eb, i, struct btrfs_root_item);
12378 bytenr = btrfs_disk_root_bytenr(eb, ri);
12381 * If at any point we start needing the real root we
12382 * will have to build a stump root for the root we are
12383 * in, but for now this doesn't actually use the root so
12384 * just pass in extent_root.
12386 tmp = read_tree_block(fs_info, bytenr, 0);
12387 if (!extent_buffer_uptodate(tmp)) {
12388 fprintf(stderr, "Error reading root block\n");
12391 ret = pin_down_tree_blocks(fs_info, tmp, 0);
12392 free_extent_buffer(tmp);
12396 bytenr = btrfs_node_blockptr(eb, i);
12398 /* If we aren't the tree root don't read the block */
12399 if (level == 1 && !tree_root) {
12400 btrfs_pin_extent(fs_info, bytenr,
12401 fs_info->nodesize);
12405 tmp = read_tree_block(fs_info, bytenr, 0);
12406 if (!extent_buffer_uptodate(tmp)) {
12407 fprintf(stderr, "Error reading tree block\n");
12410 ret = pin_down_tree_blocks(fs_info, tmp, tree_root);
12411 free_extent_buffer(tmp);
12420 static int pin_metadata_blocks(struct btrfs_fs_info *fs_info)
12424 ret = pin_down_tree_blocks(fs_info, fs_info->chunk_root->node, 0);
12428 return pin_down_tree_blocks(fs_info, fs_info->tree_root->node, 1);
12431 static int reset_block_groups(struct btrfs_fs_info *fs_info)
12433 struct btrfs_block_group_cache *cache;
12434 struct btrfs_path path;
12435 struct extent_buffer *leaf;
12436 struct btrfs_chunk *chunk;
12437 struct btrfs_key key;
12441 btrfs_init_path(&path);
12443 key.type = BTRFS_CHUNK_ITEM_KEY;
12445 ret = btrfs_search_slot(NULL, fs_info->chunk_root, &key, &path, 0, 0);
12447 btrfs_release_path(&path);
12452 * We do this in case the block groups were screwed up and had alloc
12453 * bits that aren't actually set on the chunks. This happens with
12454 * restored images every time and could happen in real life I guess.
12456 fs_info->avail_data_alloc_bits = 0;
12457 fs_info->avail_metadata_alloc_bits = 0;
12458 fs_info->avail_system_alloc_bits = 0;
12460 /* First we need to create the in-memory block groups */
12462 if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) {
12463 ret = btrfs_next_leaf(fs_info->chunk_root, &path);
12465 btrfs_release_path(&path);
12473 leaf = path.nodes[0];
12474 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
12475 if (key.type != BTRFS_CHUNK_ITEM_KEY) {
12480 chunk = btrfs_item_ptr(leaf, path.slots[0], struct btrfs_chunk);
12481 btrfs_add_block_group(fs_info, 0,
12482 btrfs_chunk_type(leaf, chunk),
12483 key.objectid, key.offset,
12484 btrfs_chunk_length(leaf, chunk));
12485 set_extent_dirty(&fs_info->free_space_cache, key.offset,
12486 key.offset + btrfs_chunk_length(leaf, chunk));
12491 cache = btrfs_lookup_first_block_group(fs_info, start);
12495 start = cache->key.objectid + cache->key.offset;
12498 btrfs_release_path(&path);
12502 static int reset_balance(struct btrfs_trans_handle *trans,
12503 struct btrfs_fs_info *fs_info)
12505 struct btrfs_root *root = fs_info->tree_root;
12506 struct btrfs_path path;
12507 struct extent_buffer *leaf;
12508 struct btrfs_key key;
12509 int del_slot, del_nr = 0;
12513 btrfs_init_path(&path);
12514 key.objectid = BTRFS_BALANCE_OBJECTID;
12515 key.type = BTRFS_BALANCE_ITEM_KEY;
12517 ret = btrfs_search_slot(trans, root, &key, &path, -1, 1);
12522 goto reinit_data_reloc;
12527 ret = btrfs_del_item(trans, root, &path);
12530 btrfs_release_path(&path);
12532 key.objectid = BTRFS_TREE_RELOC_OBJECTID;
12533 key.type = BTRFS_ROOT_ITEM_KEY;
12535 ret = btrfs_search_slot(trans, root, &key, &path, -1, 1);
12539 if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) {
12544 ret = btrfs_del_items(trans, root, &path,
12551 btrfs_release_path(&path);
12554 ret = btrfs_search_slot(trans, root, &key, &path,
12561 leaf = path.nodes[0];
12562 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
12563 if (key.objectid > BTRFS_TREE_RELOC_OBJECTID)
12565 if (key.objectid != BTRFS_TREE_RELOC_OBJECTID) {
12570 del_slot = path.slots[0];
12579 ret = btrfs_del_items(trans, root, &path, del_slot, del_nr);
12583 btrfs_release_path(&path);
12586 key.objectid = BTRFS_DATA_RELOC_TREE_OBJECTID;
12587 key.type = BTRFS_ROOT_ITEM_KEY;
12588 key.offset = (u64)-1;
12589 root = btrfs_read_fs_root(fs_info, &key);
12590 if (IS_ERR(root)) {
12591 fprintf(stderr, "Error reading data reloc tree\n");
12592 ret = PTR_ERR(root);
12595 record_root_in_trans(trans, root);
12596 ret = btrfs_fsck_reinit_root(trans, root, 0);
12599 ret = btrfs_make_root_dir(trans, root, BTRFS_FIRST_FREE_OBJECTID);
12601 btrfs_release_path(&path);
12605 static int reinit_extent_tree(struct btrfs_trans_handle *trans,
12606 struct btrfs_fs_info *fs_info)
12612 * The only reason we don't do this is because right now we're just
12613 * walking the trees we find and pinning down their bytes, we don't look
12614 * at any of the leaves. In order to do mixed groups we'd have to check
12615 * the leaves of any fs roots and pin down the bytes for any file
12616 * extents we find. Not hard but why do it if we don't have to?
12618 if (btrfs_fs_incompat(fs_info, MIXED_GROUPS)) {
12619 fprintf(stderr, "We don't support re-initing the extent tree "
12620 "for mixed block groups yet, please notify a btrfs "
12621 "developer you want to do this so they can add this "
12622 "functionality.\n");
12627 * first we need to walk all of the trees except the extent tree and pin
12628 * down the bytes that are in use so we don't overwrite any existing
12631 ret = pin_metadata_blocks(fs_info);
12633 fprintf(stderr, "error pinning down used bytes\n");
12638 * Need to drop all the block groups since we're going to recreate all
12641 btrfs_free_block_groups(fs_info);
12642 ret = reset_block_groups(fs_info);
12644 fprintf(stderr, "error resetting the block groups\n");
12648 /* Ok we can allocate now, reinit the extent root */
12649 ret = btrfs_fsck_reinit_root(trans, fs_info->extent_root, 0);
12651 fprintf(stderr, "extent root initialization failed\n");
12653 * When the transaction code is updated we should end the
12654 * transaction, but for now progs only knows about commit so
12655 * just return an error.
12661 * Now we have all the in-memory block groups setup so we can make
12662 * allocations properly, and the metadata we care about is safe since we
12663 * pinned all of it above.
12666 struct btrfs_block_group_cache *cache;
12668 cache = btrfs_lookup_first_block_group(fs_info, start);
12671 start = cache->key.objectid + cache->key.offset;
12672 ret = btrfs_insert_item(trans, fs_info->extent_root,
12673 &cache->key, &cache->item,
12674 sizeof(cache->item));
12676 fprintf(stderr, "Error adding block group\n");
12679 btrfs_extent_post_op(trans, fs_info->extent_root);
12682 ret = reset_balance(trans, fs_info);
12684 fprintf(stderr, "error resetting the pending balance\n");
12689 static int recow_extent_buffer(struct btrfs_root *root, struct extent_buffer *eb)
12691 struct btrfs_path path;
12692 struct btrfs_trans_handle *trans;
12693 struct btrfs_key key;
12696 printf("Recowing metadata block %llu\n", eb->start);
12697 key.objectid = btrfs_header_owner(eb);
12698 key.type = BTRFS_ROOT_ITEM_KEY;
12699 key.offset = (u64)-1;
12701 root = btrfs_read_fs_root(root->fs_info, &key);
12702 if (IS_ERR(root)) {
12703 fprintf(stderr, "Couldn't find owner root %llu\n",
12705 return PTR_ERR(root);
12708 trans = btrfs_start_transaction(root, 1);
12710 return PTR_ERR(trans);
12712 btrfs_init_path(&path);
12713 path.lowest_level = btrfs_header_level(eb);
12714 if (path.lowest_level)
12715 btrfs_node_key_to_cpu(eb, &key, 0);
12717 btrfs_item_key_to_cpu(eb, &key, 0);
12719 ret = btrfs_search_slot(trans, root, &key, &path, 0, 1);
12720 btrfs_commit_transaction(trans, root);
12721 btrfs_release_path(&path);
12725 static int delete_bad_item(struct btrfs_root *root, struct bad_item *bad)
12727 struct btrfs_path path;
12728 struct btrfs_trans_handle *trans;
12729 struct btrfs_key key;
12732 printf("Deleting bad item [%llu,%u,%llu]\n", bad->key.objectid,
12733 bad->key.type, bad->key.offset);
12734 key.objectid = bad->root_id;
12735 key.type = BTRFS_ROOT_ITEM_KEY;
12736 key.offset = (u64)-1;
12738 root = btrfs_read_fs_root(root->fs_info, &key);
12739 if (IS_ERR(root)) {
12740 fprintf(stderr, "Couldn't find owner root %llu\n",
12742 return PTR_ERR(root);
12745 trans = btrfs_start_transaction(root, 1);
12747 return PTR_ERR(trans);
12749 btrfs_init_path(&path);
12750 ret = btrfs_search_slot(trans, root, &bad->key, &path, -1, 1);
12756 ret = btrfs_del_item(trans, root, &path);
12758 btrfs_commit_transaction(trans, root);
12759 btrfs_release_path(&path);
12763 static int zero_log_tree(struct btrfs_root *root)
12765 struct btrfs_trans_handle *trans;
12768 trans = btrfs_start_transaction(root, 1);
12769 if (IS_ERR(trans)) {
12770 ret = PTR_ERR(trans);
12773 btrfs_set_super_log_root(root->fs_info->super_copy, 0);
12774 btrfs_set_super_log_root_level(root->fs_info->super_copy, 0);
12775 ret = btrfs_commit_transaction(trans, root);
12779 static int populate_csum(struct btrfs_trans_handle *trans,
12780 struct btrfs_root *csum_root, char *buf, u64 start,
12783 struct btrfs_fs_info *fs_info = csum_root->fs_info;
12788 while (offset < len) {
12789 sectorsize = fs_info->sectorsize;
12790 ret = read_extent_data(fs_info, buf, start + offset,
12794 ret = btrfs_csum_file_block(trans, csum_root, start + len,
12795 start + offset, buf, sectorsize);
12798 offset += sectorsize;
12803 static int fill_csum_tree_from_one_fs_root(struct btrfs_trans_handle *trans,
12804 struct btrfs_root *csum_root,
12805 struct btrfs_root *cur_root)
12807 struct btrfs_path path;
12808 struct btrfs_key key;
12809 struct extent_buffer *node;
12810 struct btrfs_file_extent_item *fi;
12817 buf = malloc(cur_root->fs_info->sectorsize);
12821 btrfs_init_path(&path);
12825 ret = btrfs_search_slot(NULL, cur_root, &key, &path, 0, 0);
12828 /* Iterate all regular file extents and fill its csum */
12830 btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
12832 if (key.type != BTRFS_EXTENT_DATA_KEY)
12834 node = path.nodes[0];
12835 slot = path.slots[0];
12836 fi = btrfs_item_ptr(node, slot, struct btrfs_file_extent_item);
12837 if (btrfs_file_extent_type(node, fi) != BTRFS_FILE_EXTENT_REG)
12839 start = btrfs_file_extent_disk_bytenr(node, fi);
12840 len = btrfs_file_extent_disk_num_bytes(node, fi);
12842 ret = populate_csum(trans, csum_root, buf, start, len);
12843 if (ret == -EEXIST)
12849 * TODO: if next leaf is corrupted, jump to nearest next valid
12852 ret = btrfs_next_item(cur_root, &path);
12862 btrfs_release_path(&path);
12867 static int fill_csum_tree_from_fs(struct btrfs_trans_handle *trans,
12868 struct btrfs_root *csum_root)
12870 struct btrfs_fs_info *fs_info = csum_root->fs_info;
12871 struct btrfs_path path;
12872 struct btrfs_root *tree_root = fs_info->tree_root;
12873 struct btrfs_root *cur_root;
12874 struct extent_buffer *node;
12875 struct btrfs_key key;
12879 btrfs_init_path(&path);
12880 key.objectid = BTRFS_FS_TREE_OBJECTID;
12882 key.type = BTRFS_ROOT_ITEM_KEY;
12883 ret = btrfs_search_slot(NULL, tree_root, &key, &path, 0, 0);
12892 node = path.nodes[0];
12893 slot = path.slots[0];
12894 btrfs_item_key_to_cpu(node, &key, slot);
12895 if (key.objectid > BTRFS_LAST_FREE_OBJECTID)
12897 if (key.type != BTRFS_ROOT_ITEM_KEY)
12899 if (!is_fstree(key.objectid))
12901 key.offset = (u64)-1;
12903 cur_root = btrfs_read_fs_root(fs_info, &key);
12904 if (IS_ERR(cur_root) || !cur_root) {
12905 fprintf(stderr, "Fail to read fs/subvol tree: %lld\n",
12909 ret = fill_csum_tree_from_one_fs_root(trans, csum_root,
12914 ret = btrfs_next_item(tree_root, &path);
12924 btrfs_release_path(&path);
12928 static int fill_csum_tree_from_extent(struct btrfs_trans_handle *trans,
12929 struct btrfs_root *csum_root)
12931 struct btrfs_root *extent_root = csum_root->fs_info->extent_root;
12932 struct btrfs_path path;
12933 struct btrfs_extent_item *ei;
12934 struct extent_buffer *leaf;
12936 struct btrfs_key key;
12939 btrfs_init_path(&path);
12941 key.type = BTRFS_EXTENT_ITEM_KEY;
12943 ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0);
12945 btrfs_release_path(&path);
12949 buf = malloc(csum_root->fs_info->sectorsize);
12951 btrfs_release_path(&path);
12956 if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) {
12957 ret = btrfs_next_leaf(extent_root, &path);
12965 leaf = path.nodes[0];
12967 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
12968 if (key.type != BTRFS_EXTENT_ITEM_KEY) {
12973 ei = btrfs_item_ptr(leaf, path.slots[0],
12974 struct btrfs_extent_item);
12975 if (!(btrfs_extent_flags(leaf, ei) &
12976 BTRFS_EXTENT_FLAG_DATA)) {
12981 ret = populate_csum(trans, csum_root, buf, key.objectid,
12988 btrfs_release_path(&path);
12994 * Recalculate the csum and put it into the csum tree.
12996 * Extent tree init will wipe out all the extent info, so in that case, we
12997 * can't depend on extent tree, but use fs tree. If search_fs_tree is set, we
12998 * will use fs/subvol trees to init the csum tree.
13000 static int fill_csum_tree(struct btrfs_trans_handle *trans,
13001 struct btrfs_root *csum_root,
13002 int search_fs_tree)
13004 if (search_fs_tree)
13005 return fill_csum_tree_from_fs(trans, csum_root);
13007 return fill_csum_tree_from_extent(trans, csum_root);
13010 static void free_roots_info_cache(void)
13012 if (!roots_info_cache)
13015 while (!cache_tree_empty(roots_info_cache)) {
13016 struct cache_extent *entry;
13017 struct root_item_info *rii;
13019 entry = first_cache_extent(roots_info_cache);
13022 remove_cache_extent(roots_info_cache, entry);
13023 rii = container_of(entry, struct root_item_info, cache_extent);
13027 free(roots_info_cache);
13028 roots_info_cache = NULL;
13031 static int build_roots_info_cache(struct btrfs_fs_info *info)
13034 struct btrfs_key key;
13035 struct extent_buffer *leaf;
13036 struct btrfs_path path;
13038 if (!roots_info_cache) {
13039 roots_info_cache = malloc(sizeof(*roots_info_cache));
13040 if (!roots_info_cache)
13042 cache_tree_init(roots_info_cache);
13045 btrfs_init_path(&path);
13047 key.type = BTRFS_EXTENT_ITEM_KEY;
13049 ret = btrfs_search_slot(NULL, info->extent_root, &key, &path, 0, 0);
13052 leaf = path.nodes[0];
13055 struct btrfs_key found_key;
13056 struct btrfs_extent_item *ei;
13057 struct btrfs_extent_inline_ref *iref;
13058 int slot = path.slots[0];
13063 struct cache_extent *entry;
13064 struct root_item_info *rii;
13066 if (slot >= btrfs_header_nritems(leaf)) {
13067 ret = btrfs_next_leaf(info->extent_root, &path);
13074 leaf = path.nodes[0];
13075 slot = path.slots[0];
13078 btrfs_item_key_to_cpu(leaf, &found_key, path.slots[0]);
13080 if (found_key.type != BTRFS_EXTENT_ITEM_KEY &&
13081 found_key.type != BTRFS_METADATA_ITEM_KEY)
13084 ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
13085 flags = btrfs_extent_flags(leaf, ei);
13087 if (found_key.type == BTRFS_EXTENT_ITEM_KEY &&
13088 !(flags & BTRFS_EXTENT_FLAG_TREE_BLOCK))
13091 if (found_key.type == BTRFS_METADATA_ITEM_KEY) {
13092 iref = (struct btrfs_extent_inline_ref *)(ei + 1);
13093 level = found_key.offset;
13095 struct btrfs_tree_block_info *binfo;
13097 binfo = (struct btrfs_tree_block_info *)(ei + 1);
13098 iref = (struct btrfs_extent_inline_ref *)(binfo + 1);
13099 level = btrfs_tree_block_level(leaf, binfo);
13103 * For a root extent, it must be of the following type and the
13104 * first (and only one) iref in the item.
13106 type = btrfs_extent_inline_ref_type(leaf, iref);
13107 if (type != BTRFS_TREE_BLOCK_REF_KEY)
13110 root_id = btrfs_extent_inline_ref_offset(leaf, iref);
13111 entry = lookup_cache_extent(roots_info_cache, root_id, 1);
13113 rii = malloc(sizeof(struct root_item_info));
13118 rii->cache_extent.start = root_id;
13119 rii->cache_extent.size = 1;
13120 rii->level = (u8)-1;
13121 entry = &rii->cache_extent;
13122 ret = insert_cache_extent(roots_info_cache, entry);
13125 rii = container_of(entry, struct root_item_info,
13129 ASSERT(rii->cache_extent.start == root_id);
13130 ASSERT(rii->cache_extent.size == 1);
13132 if (level > rii->level || rii->level == (u8)-1) {
13133 rii->level = level;
13134 rii->bytenr = found_key.objectid;
13135 rii->gen = btrfs_extent_generation(leaf, ei);
13136 rii->node_count = 1;
13137 } else if (level == rii->level) {
13145 btrfs_release_path(&path);
13150 static int maybe_repair_root_item(struct btrfs_path *path,
13151 const struct btrfs_key *root_key,
13152 const int read_only_mode)
13154 const u64 root_id = root_key->objectid;
13155 struct cache_extent *entry;
13156 struct root_item_info *rii;
13157 struct btrfs_root_item ri;
13158 unsigned long offset;
13160 entry = lookup_cache_extent(roots_info_cache, root_id, 1);
13163 "Error: could not find extent items for root %llu\n",
13164 root_key->objectid);
13168 rii = container_of(entry, struct root_item_info, cache_extent);
13169 ASSERT(rii->cache_extent.start == root_id);
13170 ASSERT(rii->cache_extent.size == 1);
13172 if (rii->node_count != 1) {
13174 "Error: could not find btree root extent for root %llu\n",
13179 offset = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]);
13180 read_extent_buffer(path->nodes[0], &ri, offset, sizeof(ri));
13182 if (btrfs_root_bytenr(&ri) != rii->bytenr ||
13183 btrfs_root_level(&ri) != rii->level ||
13184 btrfs_root_generation(&ri) != rii->gen) {
13187 * If we're in repair mode but our caller told us to not update
13188 * the root item, i.e. just check if it needs to be updated, don't
13189 * print this message, since the caller will call us again shortly
13190 * for the same root item without read only mode (the caller will
13191 * open a transaction first).
13193 if (!(read_only_mode && repair))
13195 "%sroot item for root %llu,"
13196 " current bytenr %llu, current gen %llu, current level %u,"
13197 " new bytenr %llu, new gen %llu, new level %u\n",
13198 (read_only_mode ? "" : "fixing "),
13200 btrfs_root_bytenr(&ri), btrfs_root_generation(&ri),
13201 btrfs_root_level(&ri),
13202 rii->bytenr, rii->gen, rii->level);
13204 if (btrfs_root_generation(&ri) > rii->gen) {
13206 "root %llu has a root item with a more recent gen (%llu) compared to the found root node (%llu)\n",
13207 root_id, btrfs_root_generation(&ri), rii->gen);
13211 if (!read_only_mode) {
13212 btrfs_set_root_bytenr(&ri, rii->bytenr);
13213 btrfs_set_root_level(&ri, rii->level);
13214 btrfs_set_root_generation(&ri, rii->gen);
13215 write_extent_buffer(path->nodes[0], &ri,
13216 offset, sizeof(ri));
13226 * A regression introduced in the 3.17 kernel (more specifically in 3.17-rc2),
13227 * caused read-only snapshots to be corrupted if they were created at a moment
13228 * when the source subvolume/snapshot had orphan items. The issue was that the
13229 * on-disk root items became incorrect, referring to the pre orphan cleanup root
13230 * node instead of the post orphan cleanup root node.
13231 * So this function, and its callees, just detects and fixes those cases. Even
13232 * though the regression was for read-only snapshots, this function applies to
13233 * any snapshot/subvolume root.
13234 * This must be run before any other repair code - not doing it so, makes other
13235 * repair code delete or modify backrefs in the extent tree for example, which
13236 * will result in an inconsistent fs after repairing the root items.
13238 static int repair_root_items(struct btrfs_fs_info *info)
13240 struct btrfs_path path;
13241 struct btrfs_key key;
13242 struct extent_buffer *leaf;
13243 struct btrfs_trans_handle *trans = NULL;
13246 int need_trans = 0;
13248 btrfs_init_path(&path);
13250 ret = build_roots_info_cache(info);
13254 key.objectid = BTRFS_FIRST_FREE_OBJECTID;
13255 key.type = BTRFS_ROOT_ITEM_KEY;
13260 * Avoid opening and committing transactions if a leaf doesn't have
13261 * any root items that need to be fixed, so that we avoid rotating
13262 * backup roots unnecessarily.
13265 trans = btrfs_start_transaction(info->tree_root, 1);
13266 if (IS_ERR(trans)) {
13267 ret = PTR_ERR(trans);
13272 ret = btrfs_search_slot(trans, info->tree_root, &key, &path,
13276 leaf = path.nodes[0];
13279 struct btrfs_key found_key;
13281 if (path.slots[0] >= btrfs_header_nritems(leaf)) {
13282 int no_more_keys = find_next_key(&path, &key);
13284 btrfs_release_path(&path);
13286 ret = btrfs_commit_transaction(trans,
13298 btrfs_item_key_to_cpu(leaf, &found_key, path.slots[0]);
13300 if (found_key.type != BTRFS_ROOT_ITEM_KEY)
13302 if (found_key.objectid == BTRFS_TREE_RELOC_OBJECTID)
13305 ret = maybe_repair_root_item(&path, &found_key, trans ? 0 : 1);
13309 if (!trans && repair) {
13312 btrfs_release_path(&path);
13322 free_roots_info_cache();
13323 btrfs_release_path(&path);
13325 btrfs_commit_transaction(trans, info->tree_root);
13332 static int clear_free_space_cache(struct btrfs_fs_info *fs_info)
13334 struct btrfs_trans_handle *trans;
13335 struct btrfs_block_group_cache *bg_cache;
13339 /* Clear all free space cache inodes and its extent data */
13341 bg_cache = btrfs_lookup_first_block_group(fs_info, current);
13344 ret = btrfs_clear_free_space_cache(fs_info, bg_cache);
13347 current = bg_cache->key.objectid + bg_cache->key.offset;
13350 /* Don't forget to set cache_generation to -1 */
13351 trans = btrfs_start_transaction(fs_info->tree_root, 0);
13352 if (IS_ERR(trans)) {
13353 error("failed to update super block cache generation");
13354 return PTR_ERR(trans);
13356 btrfs_set_super_cache_generation(fs_info->super_copy, (u64)-1);
13357 btrfs_commit_transaction(trans, fs_info->tree_root);
13362 static int do_clear_free_space_cache(struct btrfs_fs_info *fs_info,
13367 if (clear_version == 1) {
13368 if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) {
13370 "free space cache v2 detected, use --clear-space-cache v2");
13374 printf("Clearing free space cache\n");
13375 ret = clear_free_space_cache(fs_info);
13377 error("failed to clear free space cache");
13380 printf("Free space cache cleared\n");
13382 } else if (clear_version == 2) {
13383 if (!btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) {
13384 printf("no free space cache v2 to clear\n");
13388 printf("Clear free space cache v2\n");
13389 ret = btrfs_clear_free_space_tree(fs_info);
13391 error("failed to clear free space cache v2: %d", ret);
13394 printf("free space cache v2 cleared\n");
13401 const char * const cmd_check_usage[] = {
13402 "btrfs check [options] <device>",
13403 "Check structural integrity of a filesystem (unmounted).",
13404 "Check structural integrity of an unmounted filesystem. Verify internal",
13405 "trees' consistency and item connectivity. In the repair mode try to",
13406 "fix the problems found. ",
13407 "WARNING: the repair mode is considered dangerous",
13409 "-s|--super <superblock> use this superblock copy",
13410 "-b|--backup use the first valid backup root copy",
13411 "--force skip mount checks, repair is not possible",
13412 "--repair try to repair the filesystem",
13413 "--readonly run in read-only mode (default)",
13414 "--init-csum-tree create a new CRC tree",
13415 "--init-extent-tree create a new extent tree",
13416 "--mode <MODE> allows choice of memory/IO trade-offs",
13417 " where MODE is one of:",
13418 " original - read inodes and extents to memory (requires",
13419 " more memory, does less IO)",
13420 " lowmem - try to use less memory but read blocks again",
13422 "--check-data-csum verify checksums of data blocks",
13423 "-Q|--qgroup-report print a report on qgroup consistency",
13424 "-E|--subvol-extents <subvolid>",
13425 " print subvolume extents and sharing state",
13426 "-r|--tree-root <bytenr> use the given bytenr for the tree root",
13427 "--chunk-root <bytenr> use the given bytenr for the chunk tree root",
13428 "-p|--progress indicate progress",
13429 "--clear-space-cache v1|v2 clear space cache for v1 or v2",
13433 int cmd_check(int argc, char **argv)
13435 struct cache_tree root_cache;
13436 struct btrfs_root *root;
13437 struct btrfs_fs_info *info;
13440 u64 tree_root_bytenr = 0;
13441 u64 chunk_root_bytenr = 0;
13442 char uuidbuf[BTRFS_UUID_UNPARSED_SIZE];
13446 int init_csum_tree = 0;
13448 int clear_space_cache = 0;
13449 int qgroup_report = 0;
13450 int qgroups_repaired = 0;
13451 unsigned ctree_flags = OPEN_CTREE_EXCLUSIVE;
13456 enum { GETOPT_VAL_REPAIR = 257, GETOPT_VAL_INIT_CSUM,
13457 GETOPT_VAL_INIT_EXTENT, GETOPT_VAL_CHECK_CSUM,
13458 GETOPT_VAL_READONLY, GETOPT_VAL_CHUNK_TREE,
13459 GETOPT_VAL_MODE, GETOPT_VAL_CLEAR_SPACE_CACHE,
13460 GETOPT_VAL_FORCE };
13461 static const struct option long_options[] = {
13462 { "super", required_argument, NULL, 's' },
13463 { "repair", no_argument, NULL, GETOPT_VAL_REPAIR },
13464 { "readonly", no_argument, NULL, GETOPT_VAL_READONLY },
13465 { "init-csum-tree", no_argument, NULL,
13466 GETOPT_VAL_INIT_CSUM },
13467 { "init-extent-tree", no_argument, NULL,
13468 GETOPT_VAL_INIT_EXTENT },
13469 { "check-data-csum", no_argument, NULL,
13470 GETOPT_VAL_CHECK_CSUM },
13471 { "backup", no_argument, NULL, 'b' },
13472 { "subvol-extents", required_argument, NULL, 'E' },
13473 { "qgroup-report", no_argument, NULL, 'Q' },
13474 { "tree-root", required_argument, NULL, 'r' },
13475 { "chunk-root", required_argument, NULL,
13476 GETOPT_VAL_CHUNK_TREE },
13477 { "progress", no_argument, NULL, 'p' },
13478 { "mode", required_argument, NULL,
13480 { "clear-space-cache", required_argument, NULL,
13481 GETOPT_VAL_CLEAR_SPACE_CACHE},
13482 { "force", no_argument, NULL, GETOPT_VAL_FORCE },
13483 { NULL, 0, NULL, 0}
13486 c = getopt_long(argc, argv, "as:br:pEQ", long_options, NULL);
13490 case 'a': /* ignored */ break;
13492 ctree_flags |= OPEN_CTREE_BACKUP_ROOT;
13495 num = arg_strtou64(optarg);
13496 if (num >= BTRFS_SUPER_MIRROR_MAX) {
13498 "super mirror should be less than %d",
13499 BTRFS_SUPER_MIRROR_MAX);
13502 bytenr = btrfs_sb_offset(((int)num));
13503 printf("using SB copy %llu, bytenr %llu\n", num,
13504 (unsigned long long)bytenr);
13510 subvolid = arg_strtou64(optarg);
13513 tree_root_bytenr = arg_strtou64(optarg);
13515 case GETOPT_VAL_CHUNK_TREE:
13516 chunk_root_bytenr = arg_strtou64(optarg);
13519 ctx.progress_enabled = true;
13523 usage(cmd_check_usage);
13524 case GETOPT_VAL_REPAIR:
13525 printf("enabling repair mode\n");
13527 ctree_flags |= OPEN_CTREE_WRITES;
13529 case GETOPT_VAL_READONLY:
13532 case GETOPT_VAL_INIT_CSUM:
13533 printf("Creating a new CRC tree\n");
13534 init_csum_tree = 1;
13536 ctree_flags |= OPEN_CTREE_WRITES;
13538 case GETOPT_VAL_INIT_EXTENT:
13539 init_extent_tree = 1;
13540 ctree_flags |= (OPEN_CTREE_WRITES |
13541 OPEN_CTREE_NO_BLOCK_GROUPS);
13544 case GETOPT_VAL_CHECK_CSUM:
13545 check_data_csum = 1;
13547 case GETOPT_VAL_MODE:
13548 check_mode = parse_check_mode(optarg);
13549 if (check_mode == CHECK_MODE_UNKNOWN) {
13550 error("unknown mode: %s", optarg);
13554 case GETOPT_VAL_CLEAR_SPACE_CACHE:
13555 if (strcmp(optarg, "v1") == 0) {
13556 clear_space_cache = 1;
13557 } else if (strcmp(optarg, "v2") == 0) {
13558 clear_space_cache = 2;
13559 ctree_flags |= OPEN_CTREE_INVALIDATE_FST;
13562 "invalid argument to --clear-space-cache, must be v1 or v2");
13565 ctree_flags |= OPEN_CTREE_WRITES;
13567 case GETOPT_VAL_FORCE:
13573 if (check_argc_exact(argc - optind, 1))
13574 usage(cmd_check_usage);
13576 if (ctx.progress_enabled) {
13577 ctx.tp = TASK_NOTHING;
13578 ctx.info = task_init(print_status_check, print_status_return, &ctx);
13581 /* This check is the only reason for --readonly to exist */
13582 if (readonly && repair) {
13583 error("repair options are not compatible with --readonly");
13588 * experimental and dangerous
13590 if (repair && check_mode == CHECK_MODE_LOWMEM)
13591 warning("low-memory mode repair support is only partial");
13594 cache_tree_init(&root_cache);
13596 ret = check_mounted(argv[optind]);
13599 error("could not check mount status: %s",
13605 "%s is currently mounted, use --force if you really intend to check the filesystem",
13613 error("repair and --force is not yet supported");
13620 "cannot check mount status of %s, the filesystem could be mounted, continuing because of --force",
13624 "filesystem mounted, continuing because of --force");
13626 /* A block device is mounted in exclusive mode by kernel */
13627 ctree_flags &= ~OPEN_CTREE_EXCLUSIVE;
13630 /* only allow partial opening under repair mode */
13632 ctree_flags |= OPEN_CTREE_PARTIAL;
13634 info = open_ctree_fs_info(argv[optind], bytenr, tree_root_bytenr,
13635 chunk_root_bytenr, ctree_flags);
13637 error("cannot open file system");
13643 global_info = info;
13644 root = info->fs_root;
13645 uuid_unparse(info->super_copy->fsid, uuidbuf);
13647 printf("Checking filesystem on %s\nUUID: %s\n", argv[optind], uuidbuf);
13650 * Check the bare minimum before starting anything else that could rely
13651 * on it, namely the tree roots, any local consistency checks
13653 if (!extent_buffer_uptodate(info->tree_root->node) ||
13654 !extent_buffer_uptodate(info->dev_root->node) ||
13655 !extent_buffer_uptodate(info->chunk_root->node)) {
13656 error("critical roots corrupted, unable to check the filesystem");
13662 if (clear_space_cache) {
13663 ret = do_clear_free_space_cache(info, clear_space_cache);
13669 * repair mode will force us to commit transaction which
13670 * will make us fail to load log tree when mounting.
13672 if (repair && btrfs_super_log_root(info->super_copy)) {
13673 ret = ask_user("repair mode will force to clear out log tree, are you sure?");
13679 ret = zero_log_tree(root);
13682 error("failed to zero log tree: %d", ret);
13687 if (qgroup_report) {
13688 printf("Print quota groups for %s\nUUID: %s\n", argv[optind],
13690 ret = qgroup_verify_all(info);
13697 printf("Print extent state for subvolume %llu on %s\nUUID: %s\n",
13698 subvolid, argv[optind], uuidbuf);
13699 ret = print_extent_state(info, subvolid);
13704 if (init_extent_tree || init_csum_tree) {
13705 struct btrfs_trans_handle *trans;
13707 trans = btrfs_start_transaction(info->extent_root, 0);
13708 if (IS_ERR(trans)) {
13709 error("error starting transaction");
13710 ret = PTR_ERR(trans);
13715 if (init_extent_tree) {
13716 printf("Creating a new extent tree\n");
13717 ret = reinit_extent_tree(trans, info);
13723 if (init_csum_tree) {
13724 printf("Reinitialize checksum tree\n");
13725 ret = btrfs_fsck_reinit_root(trans, info->csum_root, 0);
13727 error("checksum tree initialization failed: %d",
13734 ret = fill_csum_tree(trans, info->csum_root,
13738 error("checksum tree refilling failed: %d", ret);
13743 * Ok now we commit and run the normal fsck, which will add
13744 * extent entries for all of the items it finds.
13746 ret = btrfs_commit_transaction(trans, info->extent_root);
13751 if (!extent_buffer_uptodate(info->extent_root->node)) {
13752 error("critical: extent_root, unable to check the filesystem");
13757 if (!extent_buffer_uptodate(info->csum_root->node)) {
13758 error("critical: csum_root, unable to check the filesystem");
13764 ret = do_check_chunks_and_extents(info);
13768 "errors found in extent allocation tree or chunk allocation");
13770 ret = repair_root_items(info);
13773 error("failed to repair root items: %s", strerror(-ret));
13777 fprintf(stderr, "Fixed %d roots.\n", ret);
13779 } else if (ret > 0) {
13781 "Found %d roots with an outdated root item.\n",
13784 "Please run a filesystem check with the option --repair to fix them.\n");
13790 if (!ctx.progress_enabled) {
13791 if (btrfs_fs_compat_ro(info, FREE_SPACE_TREE))
13792 fprintf(stderr, "checking free space tree\n");
13794 fprintf(stderr, "checking free space cache\n");
13796 ret = check_space_cache(root);
13799 if (btrfs_fs_compat_ro(info, FREE_SPACE_TREE))
13800 error("errors found in free space tree");
13802 error("errors found in free space cache");
13807 * We used to have to have these hole extents in between our real
13808 * extents so if we don't have this flag set we need to make sure there
13809 * are no gaps in the file extents for inodes, otherwise we can just
13810 * ignore it when this happens.
13812 no_holes = btrfs_fs_incompat(root->fs_info, NO_HOLES);
13813 ret = do_check_fs_roots(info, &root_cache);
13816 error("errors found in fs roots");
13820 fprintf(stderr, "checking csums\n");
13821 ret = check_csums(root);
13824 error("errors found in csum tree");
13828 fprintf(stderr, "checking root refs\n");
13829 /* For low memory mode, check_fs_roots_v2 handles root refs */
13830 if (check_mode != CHECK_MODE_LOWMEM) {
13831 ret = check_root_refs(root, &root_cache);
13834 error("errors found in root refs");
13839 while (repair && !list_empty(&root->fs_info->recow_ebs)) {
13840 struct extent_buffer *eb;
13842 eb = list_first_entry(&root->fs_info->recow_ebs,
13843 struct extent_buffer, recow);
13844 list_del_init(&eb->recow);
13845 ret = recow_extent_buffer(root, eb);
13848 error("fails to fix transid errors");
13853 while (!list_empty(&delete_items)) {
13854 struct bad_item *bad;
13856 bad = list_first_entry(&delete_items, struct bad_item, list);
13857 list_del_init(&bad->list);
13859 ret = delete_bad_item(root, bad);
13865 if (info->quota_enabled) {
13866 fprintf(stderr, "checking quota groups\n");
13867 ret = qgroup_verify_all(info);
13870 error("failed to check quota groups");
13874 ret = repair_qgroups(info, &qgroups_repaired);
13877 error("failed to repair quota groups");
13883 if (!list_empty(&root->fs_info->recow_ebs)) {
13884 error("transid errors in file system");
13889 printf("found %llu bytes used, ",
13890 (unsigned long long)bytes_used);
13892 printf("error(s) found\n");
13894 printf("no error found\n");
13895 printf("total csum bytes: %llu\n",(unsigned long long)total_csum_bytes);
13896 printf("total tree bytes: %llu\n",
13897 (unsigned long long)total_btree_bytes);
13898 printf("total fs tree bytes: %llu\n",
13899 (unsigned long long)total_fs_tree_bytes);
13900 printf("total extent tree bytes: %llu\n",
13901 (unsigned long long)total_extent_tree_bytes);
13902 printf("btree space waste bytes: %llu\n",
13903 (unsigned long long)btree_space_waste);
13904 printf("file data blocks allocated: %llu\n referenced %llu\n",
13905 (unsigned long long)data_bytes_allocated,
13906 (unsigned long long)data_bytes_referenced);
13908 free_qgroup_counts();
13909 free_root_recs_tree(&root_cache);
13913 if (ctx.progress_enabled)
13914 task_deinit(ctx.info);