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"
50 TASK_NOTHING, /* have to be the last element */
55 enum task_position tp;
57 struct task_info *info;
60 static u64 bytes_used = 0;
61 static u64 total_csum_bytes = 0;
62 static u64 total_btree_bytes = 0;
63 static u64 total_fs_tree_bytes = 0;
64 static u64 total_extent_tree_bytes = 0;
65 static u64 btree_space_waste = 0;
66 static u64 data_bytes_allocated = 0;
67 static u64 data_bytes_referenced = 0;
68 static int found_old_backref = 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 {
88 struct list_head list;
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* to_extent_backref(struct list_head *entry)
98 return list_entry(entry, struct extent_backref, list);
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 */
134 static inline struct data_backref* to_data_backref(struct extent_backref *back)
136 return container_of(back, struct data_backref, node);
140 * Much like data_backref, just removed the undetermined members
141 * and change it to use list_head.
142 * During extent scan, it is stored in root->orphan_data_extent.
143 * During fs tree scan, it is then moved to inode_rec->orphan_data_extents.
145 struct orphan_data_extent {
146 struct list_head list;
154 struct tree_backref {
155 struct extent_backref node;
162 static inline struct tree_backref* to_tree_backref(struct extent_backref *back)
164 return container_of(back, struct tree_backref, node);
167 /* Explicit initialization for extent_record::flag_block_full_backref */
168 enum { FLAG_UNSET = 2 };
170 struct extent_record {
171 struct list_head backrefs;
172 struct list_head dups;
173 struct list_head list;
174 struct cache_extent cache;
175 struct btrfs_disk_key parent_key;
180 u64 extent_item_refs;
182 u64 parent_generation;
186 unsigned int flag_block_full_backref:2;
187 unsigned int found_rec:1;
188 unsigned int content_checked:1;
189 unsigned int owner_ref_checked:1;
190 unsigned int is_root:1;
191 unsigned int metadata:1;
192 unsigned int bad_full_backref:1;
193 unsigned int crossing_stripes:1;
194 unsigned int wrong_chunk_type:1;
197 static inline struct extent_record* to_extent_record(struct list_head *entry)
199 return container_of(entry, struct extent_record, list);
202 struct inode_backref {
203 struct list_head list;
204 unsigned int found_dir_item:1;
205 unsigned int found_dir_index:1;
206 unsigned int found_inode_ref:1;
216 static inline struct inode_backref* to_inode_backref(struct list_head *entry)
218 return list_entry(entry, struct inode_backref, list);
221 struct root_item_record {
222 struct list_head list;
229 struct btrfs_key drop_key;
232 #define REF_ERR_NO_DIR_ITEM (1 << 0)
233 #define REF_ERR_NO_DIR_INDEX (1 << 1)
234 #define REF_ERR_NO_INODE_REF (1 << 2)
235 #define REF_ERR_DUP_DIR_ITEM (1 << 3)
236 #define REF_ERR_DUP_DIR_INDEX (1 << 4)
237 #define REF_ERR_DUP_INODE_REF (1 << 5)
238 #define REF_ERR_INDEX_UNMATCH (1 << 6)
239 #define REF_ERR_FILETYPE_UNMATCH (1 << 7)
240 #define REF_ERR_NAME_TOO_LONG (1 << 8) // 100
241 #define REF_ERR_NO_ROOT_REF (1 << 9)
242 #define REF_ERR_NO_ROOT_BACKREF (1 << 10)
243 #define REF_ERR_DUP_ROOT_REF (1 << 11)
244 #define REF_ERR_DUP_ROOT_BACKREF (1 << 12)
246 struct file_extent_hole {
252 struct inode_record {
253 struct list_head backrefs;
254 unsigned int checked:1;
255 unsigned int merging:1;
256 unsigned int found_inode_item:1;
257 unsigned int found_dir_item:1;
258 unsigned int found_file_extent:1;
259 unsigned int found_csum_item:1;
260 unsigned int some_csum_missing:1;
261 unsigned int nodatasum:1;
274 struct rb_root holes;
275 struct list_head orphan_extents;
280 #define I_ERR_NO_INODE_ITEM (1 << 0)
281 #define I_ERR_NO_ORPHAN_ITEM (1 << 1)
282 #define I_ERR_DUP_INODE_ITEM (1 << 2)
283 #define I_ERR_DUP_DIR_INDEX (1 << 3)
284 #define I_ERR_ODD_DIR_ITEM (1 << 4)
285 #define I_ERR_ODD_FILE_EXTENT (1 << 5)
286 #define I_ERR_BAD_FILE_EXTENT (1 << 6)
287 #define I_ERR_FILE_EXTENT_OVERLAP (1 << 7)
288 #define I_ERR_FILE_EXTENT_DISCOUNT (1 << 8) // 100
289 #define I_ERR_DIR_ISIZE_WRONG (1 << 9)
290 #define I_ERR_FILE_NBYTES_WRONG (1 << 10) // 400
291 #define I_ERR_ODD_CSUM_ITEM (1 << 11)
292 #define I_ERR_SOME_CSUM_MISSING (1 << 12)
293 #define I_ERR_LINK_COUNT_WRONG (1 << 13)
294 #define I_ERR_FILE_EXTENT_ORPHAN (1 << 14)
296 struct root_backref {
297 struct list_head list;
298 unsigned int found_dir_item:1;
299 unsigned int found_dir_index:1;
300 unsigned int found_back_ref:1;
301 unsigned int found_forward_ref:1;
302 unsigned int reachable:1;
311 static inline struct root_backref* to_root_backref(struct list_head *entry)
313 return list_entry(entry, struct root_backref, list);
317 struct list_head backrefs;
318 struct cache_extent cache;
319 unsigned int found_root_item:1;
325 struct cache_extent cache;
330 struct cache_extent cache;
331 struct cache_tree root_cache;
332 struct cache_tree inode_cache;
333 struct inode_record *current;
342 struct walk_control {
343 struct cache_tree shared;
344 struct shared_node *nodes[BTRFS_MAX_LEVEL];
350 struct btrfs_key key;
352 struct list_head list;
355 struct extent_entry {
360 struct list_head list;
363 struct root_item_info {
364 /* level of the root */
366 /* number of nodes at this level, must be 1 for a root */
370 struct cache_extent cache_extent;
374 * Error bit for low memory mode check.
376 * Currently no caller cares about it yet. Just internal use for error
379 #define BACKREF_MISSING (1 << 0) /* Backref missing in extent tree */
380 #define BACKREF_MISMATCH (1 << 1) /* Backref exists but does not match */
381 #define BYTES_UNALIGNED (1 << 2) /* Some bytes are not aligned */
382 #define REFERENCER_MISSING (1 << 3) /* Referencer not found */
383 #define REFERENCER_MISMATCH (1 << 4) /* Referenceer found but does not match */
384 #define CROSSING_STRIPE_BOUNDARY (1 << 4) /* For kernel scrub workaround */
385 #define ITEM_SIZE_MISMATCH (1 << 5) /* Bad item size */
386 #define UNKNOWN_TYPE (1 << 6) /* Unknown type */
387 #define ACCOUNTING_MISMATCH (1 << 7) /* Used space accounting error */
388 #define CHUNK_TYPE_MISMATCH (1 << 8)
390 static void *print_status_check(void *p)
392 struct task_ctx *priv = p;
393 const char work_indicator[] = { '.', 'o', 'O', 'o' };
395 static char *task_position_string[] = {
397 "checking free space cache",
401 task_period_start(priv->info, 1000 /* 1s */);
403 if (priv->tp == TASK_NOTHING)
407 printf("%s [%c]\r", task_position_string[priv->tp],
408 work_indicator[count % 4]);
411 task_period_wait(priv->info);
416 static int print_status_return(void *p)
424 static enum btrfs_check_mode parse_check_mode(const char *str)
426 if (strcmp(str, "lowmem") == 0)
427 return CHECK_MODE_LOWMEM;
428 if (strcmp(str, "orig") == 0)
429 return CHECK_MODE_ORIGINAL;
430 if (strcmp(str, "original") == 0)
431 return CHECK_MODE_ORIGINAL;
433 return CHECK_MODE_UNKNOWN;
436 /* Compatible function to allow reuse of old codes */
437 static u64 first_extent_gap(struct rb_root *holes)
439 struct file_extent_hole *hole;
441 if (RB_EMPTY_ROOT(holes))
444 hole = rb_entry(rb_first(holes), struct file_extent_hole, node);
448 static int compare_hole(struct rb_node *node1, struct rb_node *node2)
450 struct file_extent_hole *hole1;
451 struct file_extent_hole *hole2;
453 hole1 = rb_entry(node1, struct file_extent_hole, node);
454 hole2 = rb_entry(node2, struct file_extent_hole, node);
456 if (hole1->start > hole2->start)
458 if (hole1->start < hole2->start)
460 /* Now hole1->start == hole2->start */
461 if (hole1->len >= hole2->len)
463 * Hole 1 will be merge center
464 * Same hole will be merged later
467 /* Hole 2 will be merge center */
472 * Add a hole to the record
474 * This will do hole merge for copy_file_extent_holes(),
475 * which will ensure there won't be continuous holes.
477 static int add_file_extent_hole(struct rb_root *holes,
480 struct file_extent_hole *hole;
481 struct file_extent_hole *prev = NULL;
482 struct file_extent_hole *next = NULL;
484 hole = malloc(sizeof(*hole));
489 /* Since compare will not return 0, no -EEXIST will happen */
490 rb_insert(holes, &hole->node, compare_hole);
492 /* simple merge with previous hole */
493 if (rb_prev(&hole->node))
494 prev = rb_entry(rb_prev(&hole->node), struct file_extent_hole,
496 if (prev && prev->start + prev->len >= hole->start) {
497 hole->len = hole->start + hole->len - prev->start;
498 hole->start = prev->start;
499 rb_erase(&prev->node, holes);
504 /* iterate merge with next holes */
506 if (!rb_next(&hole->node))
508 next = rb_entry(rb_next(&hole->node), struct file_extent_hole,
510 if (hole->start + hole->len >= next->start) {
511 if (hole->start + hole->len <= next->start + next->len)
512 hole->len = next->start + next->len -
514 rb_erase(&next->node, holes);
523 static int compare_hole_range(struct rb_node *node, void *data)
525 struct file_extent_hole *hole;
528 hole = (struct file_extent_hole *)data;
531 hole = rb_entry(node, struct file_extent_hole, node);
532 if (start < hole->start)
534 if (start >= hole->start && start < hole->start + hole->len)
540 * Delete a hole in the record
542 * This will do the hole split and is much restrict than add.
544 static int del_file_extent_hole(struct rb_root *holes,
547 struct file_extent_hole *hole;
548 struct file_extent_hole tmp;
553 struct rb_node *node;
560 node = rb_search(holes, &tmp, compare_hole_range, NULL);
563 hole = rb_entry(node, struct file_extent_hole, node);
564 if (start + len > hole->start + hole->len)
568 * Now there will be no overlap, delete the hole and re-add the
569 * split(s) if they exists.
571 if (start > hole->start) {
572 prev_start = hole->start;
573 prev_len = start - hole->start;
576 if (hole->start + hole->len > start + len) {
577 next_start = start + len;
578 next_len = hole->start + hole->len - start - len;
581 rb_erase(node, holes);
584 ret = add_file_extent_hole(holes, prev_start, prev_len);
589 ret = add_file_extent_hole(holes, next_start, next_len);
596 static int copy_file_extent_holes(struct rb_root *dst,
599 struct file_extent_hole *hole;
600 struct rb_node *node;
603 node = rb_first(src);
605 hole = rb_entry(node, struct file_extent_hole, node);
606 ret = add_file_extent_hole(dst, hole->start, hole->len);
609 node = rb_next(node);
614 static void free_file_extent_holes(struct rb_root *holes)
616 struct rb_node *node;
617 struct file_extent_hole *hole;
619 node = rb_first(holes);
621 hole = rb_entry(node, struct file_extent_hole, node);
622 rb_erase(node, holes);
624 node = rb_first(holes);
628 static void reset_cached_block_groups(struct btrfs_fs_info *fs_info);
630 static void record_root_in_trans(struct btrfs_trans_handle *trans,
631 struct btrfs_root *root)
633 if (root->last_trans != trans->transid) {
634 root->track_dirty = 1;
635 root->last_trans = trans->transid;
636 root->commit_root = root->node;
637 extent_buffer_get(root->node);
641 static u8 imode_to_type(u32 imode)
644 static unsigned char btrfs_type_by_mode[S_IFMT >> S_SHIFT] = {
645 [S_IFREG >> S_SHIFT] = BTRFS_FT_REG_FILE,
646 [S_IFDIR >> S_SHIFT] = BTRFS_FT_DIR,
647 [S_IFCHR >> S_SHIFT] = BTRFS_FT_CHRDEV,
648 [S_IFBLK >> S_SHIFT] = BTRFS_FT_BLKDEV,
649 [S_IFIFO >> S_SHIFT] = BTRFS_FT_FIFO,
650 [S_IFSOCK >> S_SHIFT] = BTRFS_FT_SOCK,
651 [S_IFLNK >> S_SHIFT] = BTRFS_FT_SYMLINK,
654 return btrfs_type_by_mode[(imode & S_IFMT) >> S_SHIFT];
658 static int device_record_compare(struct rb_node *node1, struct rb_node *node2)
660 struct device_record *rec1;
661 struct device_record *rec2;
663 rec1 = rb_entry(node1, struct device_record, node);
664 rec2 = rb_entry(node2, struct device_record, node);
665 if (rec1->devid > rec2->devid)
667 else if (rec1->devid < rec2->devid)
673 static struct inode_record *clone_inode_rec(struct inode_record *orig_rec)
675 struct inode_record *rec;
676 struct inode_backref *backref;
677 struct inode_backref *orig;
678 struct inode_backref *tmp;
679 struct orphan_data_extent *src_orphan;
680 struct orphan_data_extent *dst_orphan;
685 rec = malloc(sizeof(*rec));
687 return ERR_PTR(-ENOMEM);
688 memcpy(rec, orig_rec, sizeof(*rec));
690 INIT_LIST_HEAD(&rec->backrefs);
691 INIT_LIST_HEAD(&rec->orphan_extents);
692 rec->holes = RB_ROOT;
694 list_for_each_entry(orig, &orig_rec->backrefs, list) {
695 size = sizeof(*orig) + orig->namelen + 1;
696 backref = malloc(size);
701 memcpy(backref, orig, size);
702 list_add_tail(&backref->list, &rec->backrefs);
704 list_for_each_entry(src_orphan, &orig_rec->orphan_extents, list) {
705 dst_orphan = malloc(sizeof(*dst_orphan));
710 memcpy(dst_orphan, src_orphan, sizeof(*src_orphan));
711 list_add_tail(&dst_orphan->list, &rec->orphan_extents);
713 ret = copy_file_extent_holes(&rec->holes, &orig_rec->holes);
720 rb = rb_first(&rec->holes);
722 struct file_extent_hole *hole;
724 hole = rb_entry(rb, struct file_extent_hole, node);
730 if (!list_empty(&rec->backrefs))
731 list_for_each_entry_safe(orig, tmp, &rec->backrefs, list) {
732 list_del(&orig->list);
736 if (!list_empty(&rec->orphan_extents))
737 list_for_each_entry_safe(orig, tmp, &rec->orphan_extents, list) {
738 list_del(&orig->list);
747 static void print_orphan_data_extents(struct list_head *orphan_extents,
750 struct orphan_data_extent *orphan;
752 if (list_empty(orphan_extents))
754 printf("The following data extent is lost in tree %llu:\n",
756 list_for_each_entry(orphan, orphan_extents, list) {
757 printf("\tinode: %llu, offset:%llu, disk_bytenr: %llu, disk_len: %llu\n",
758 orphan->objectid, orphan->offset, orphan->disk_bytenr,
763 static void print_inode_error(struct btrfs_root *root, struct inode_record *rec)
765 u64 root_objectid = root->root_key.objectid;
766 int errors = rec->errors;
770 /* reloc root errors, we print its corresponding fs root objectid*/
771 if (root_objectid == BTRFS_TREE_RELOC_OBJECTID) {
772 root_objectid = root->root_key.offset;
773 fprintf(stderr, "reloc");
775 fprintf(stderr, "root %llu inode %llu errors %x",
776 (unsigned long long) root_objectid,
777 (unsigned long long) rec->ino, rec->errors);
779 if (errors & I_ERR_NO_INODE_ITEM)
780 fprintf(stderr, ", no inode item");
781 if (errors & I_ERR_NO_ORPHAN_ITEM)
782 fprintf(stderr, ", no orphan item");
783 if (errors & I_ERR_DUP_INODE_ITEM)
784 fprintf(stderr, ", dup inode item");
785 if (errors & I_ERR_DUP_DIR_INDEX)
786 fprintf(stderr, ", dup dir index");
787 if (errors & I_ERR_ODD_DIR_ITEM)
788 fprintf(stderr, ", odd dir item");
789 if (errors & I_ERR_ODD_FILE_EXTENT)
790 fprintf(stderr, ", odd file extent");
791 if (errors & I_ERR_BAD_FILE_EXTENT)
792 fprintf(stderr, ", bad file extent");
793 if (errors & I_ERR_FILE_EXTENT_OVERLAP)
794 fprintf(stderr, ", file extent overlap");
795 if (errors & I_ERR_FILE_EXTENT_DISCOUNT)
796 fprintf(stderr, ", file extent discount");
797 if (errors & I_ERR_DIR_ISIZE_WRONG)
798 fprintf(stderr, ", dir isize wrong");
799 if (errors & I_ERR_FILE_NBYTES_WRONG)
800 fprintf(stderr, ", nbytes wrong");
801 if (errors & I_ERR_ODD_CSUM_ITEM)
802 fprintf(stderr, ", odd csum item");
803 if (errors & I_ERR_SOME_CSUM_MISSING)
804 fprintf(stderr, ", some csum missing");
805 if (errors & I_ERR_LINK_COUNT_WRONG)
806 fprintf(stderr, ", link count wrong");
807 if (errors & I_ERR_FILE_EXTENT_ORPHAN)
808 fprintf(stderr, ", orphan file extent");
809 fprintf(stderr, "\n");
810 /* Print the orphan extents if needed */
811 if (errors & I_ERR_FILE_EXTENT_ORPHAN)
812 print_orphan_data_extents(&rec->orphan_extents, root->objectid);
814 /* Print the holes if needed */
815 if (errors & I_ERR_FILE_EXTENT_DISCOUNT) {
816 struct file_extent_hole *hole;
817 struct rb_node *node;
820 node = rb_first(&rec->holes);
821 fprintf(stderr, "Found file extent holes:\n");
824 hole = rb_entry(node, struct file_extent_hole, node);
825 fprintf(stderr, "\tstart: %llu, len: %llu\n",
826 hole->start, hole->len);
827 node = rb_next(node);
830 fprintf(stderr, "\tstart: 0, len: %llu\n",
831 round_up(rec->isize, root->sectorsize));
835 static void print_ref_error(int errors)
837 if (errors & REF_ERR_NO_DIR_ITEM)
838 fprintf(stderr, ", no dir item");
839 if (errors & REF_ERR_NO_DIR_INDEX)
840 fprintf(stderr, ", no dir index");
841 if (errors & REF_ERR_NO_INODE_REF)
842 fprintf(stderr, ", no inode ref");
843 if (errors & REF_ERR_DUP_DIR_ITEM)
844 fprintf(stderr, ", dup dir item");
845 if (errors & REF_ERR_DUP_DIR_INDEX)
846 fprintf(stderr, ", dup dir index");
847 if (errors & REF_ERR_DUP_INODE_REF)
848 fprintf(stderr, ", dup inode ref");
849 if (errors & REF_ERR_INDEX_UNMATCH)
850 fprintf(stderr, ", index mismatch");
851 if (errors & REF_ERR_FILETYPE_UNMATCH)
852 fprintf(stderr, ", filetype mismatch");
853 if (errors & REF_ERR_NAME_TOO_LONG)
854 fprintf(stderr, ", name too long");
855 if (errors & REF_ERR_NO_ROOT_REF)
856 fprintf(stderr, ", no root ref");
857 if (errors & REF_ERR_NO_ROOT_BACKREF)
858 fprintf(stderr, ", no root backref");
859 if (errors & REF_ERR_DUP_ROOT_REF)
860 fprintf(stderr, ", dup root ref");
861 if (errors & REF_ERR_DUP_ROOT_BACKREF)
862 fprintf(stderr, ", dup root backref");
863 fprintf(stderr, "\n");
866 static struct inode_record *get_inode_rec(struct cache_tree *inode_cache,
869 struct ptr_node *node;
870 struct cache_extent *cache;
871 struct inode_record *rec = NULL;
874 cache = lookup_cache_extent(inode_cache, ino, 1);
876 node = container_of(cache, struct ptr_node, cache);
878 if (mod && rec->refs > 1) {
879 node->data = clone_inode_rec(rec);
880 if (IS_ERR(node->data))
886 rec = calloc(1, sizeof(*rec));
888 return ERR_PTR(-ENOMEM);
890 rec->extent_start = (u64)-1;
892 INIT_LIST_HEAD(&rec->backrefs);
893 INIT_LIST_HEAD(&rec->orphan_extents);
894 rec->holes = RB_ROOT;
896 node = malloc(sizeof(*node));
899 return ERR_PTR(-ENOMEM);
901 node->cache.start = ino;
902 node->cache.size = 1;
905 if (ino == BTRFS_FREE_INO_OBJECTID)
908 ret = insert_cache_extent(inode_cache, &node->cache);
910 return ERR_PTR(-EEXIST);
915 static void free_orphan_data_extents(struct list_head *orphan_extents)
917 struct orphan_data_extent *orphan;
919 while (!list_empty(orphan_extents)) {
920 orphan = list_entry(orphan_extents->next,
921 struct orphan_data_extent, list);
922 list_del(&orphan->list);
927 static void free_inode_rec(struct inode_record *rec)
929 struct inode_backref *backref;
934 while (!list_empty(&rec->backrefs)) {
935 backref = to_inode_backref(rec->backrefs.next);
936 list_del(&backref->list);
939 free_orphan_data_extents(&rec->orphan_extents);
940 free_file_extent_holes(&rec->holes);
944 static int can_free_inode_rec(struct inode_record *rec)
946 if (!rec->errors && rec->checked && rec->found_inode_item &&
947 rec->nlink == rec->found_link && list_empty(&rec->backrefs))
952 static void maybe_free_inode_rec(struct cache_tree *inode_cache,
953 struct inode_record *rec)
955 struct cache_extent *cache;
956 struct inode_backref *tmp, *backref;
957 struct ptr_node *node;
960 if (!rec->found_inode_item)
963 filetype = imode_to_type(rec->imode);
964 list_for_each_entry_safe(backref, tmp, &rec->backrefs, list) {
965 if (backref->found_dir_item && backref->found_dir_index) {
966 if (backref->filetype != filetype)
967 backref->errors |= REF_ERR_FILETYPE_UNMATCH;
968 if (!backref->errors && backref->found_inode_ref &&
969 rec->nlink == rec->found_link) {
970 list_del(&backref->list);
976 if (!rec->checked || rec->merging)
979 if (S_ISDIR(rec->imode)) {
980 if (rec->found_size != rec->isize)
981 rec->errors |= I_ERR_DIR_ISIZE_WRONG;
982 if (rec->found_file_extent)
983 rec->errors |= I_ERR_ODD_FILE_EXTENT;
984 } else if (S_ISREG(rec->imode) || S_ISLNK(rec->imode)) {
985 if (rec->found_dir_item)
986 rec->errors |= I_ERR_ODD_DIR_ITEM;
987 if (rec->found_size != rec->nbytes)
988 rec->errors |= I_ERR_FILE_NBYTES_WRONG;
989 if (rec->nlink > 0 && !no_holes &&
990 (rec->extent_end < rec->isize ||
991 first_extent_gap(&rec->holes) < rec->isize))
992 rec->errors |= I_ERR_FILE_EXTENT_DISCOUNT;
995 if (S_ISREG(rec->imode) || S_ISLNK(rec->imode)) {
996 if (rec->found_csum_item && rec->nodatasum)
997 rec->errors |= I_ERR_ODD_CSUM_ITEM;
998 if (rec->some_csum_missing && !rec->nodatasum)
999 rec->errors |= I_ERR_SOME_CSUM_MISSING;
1002 BUG_ON(rec->refs != 1);
1003 if (can_free_inode_rec(rec)) {
1004 cache = lookup_cache_extent(inode_cache, rec->ino, 1);
1005 node = container_of(cache, struct ptr_node, cache);
1006 BUG_ON(node->data != rec);
1007 remove_cache_extent(inode_cache, &node->cache);
1009 free_inode_rec(rec);
1013 static int check_orphan_item(struct btrfs_root *root, u64 ino)
1015 struct btrfs_path path;
1016 struct btrfs_key key;
1019 key.objectid = BTRFS_ORPHAN_OBJECTID;
1020 key.type = BTRFS_ORPHAN_ITEM_KEY;
1023 btrfs_init_path(&path);
1024 ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
1025 btrfs_release_path(&path);
1031 static int process_inode_item(struct extent_buffer *eb,
1032 int slot, struct btrfs_key *key,
1033 struct shared_node *active_node)
1035 struct inode_record *rec;
1036 struct btrfs_inode_item *item;
1038 rec = active_node->current;
1039 BUG_ON(rec->ino != key->objectid || rec->refs > 1);
1040 if (rec->found_inode_item) {
1041 rec->errors |= I_ERR_DUP_INODE_ITEM;
1044 item = btrfs_item_ptr(eb, slot, struct btrfs_inode_item);
1045 rec->nlink = btrfs_inode_nlink(eb, item);
1046 rec->isize = btrfs_inode_size(eb, item);
1047 rec->nbytes = btrfs_inode_nbytes(eb, item);
1048 rec->imode = btrfs_inode_mode(eb, item);
1049 if (btrfs_inode_flags(eb, item) & BTRFS_INODE_NODATASUM)
1051 rec->found_inode_item = 1;
1052 if (rec->nlink == 0)
1053 rec->errors |= I_ERR_NO_ORPHAN_ITEM;
1054 maybe_free_inode_rec(&active_node->inode_cache, rec);
1058 static struct inode_backref *get_inode_backref(struct inode_record *rec,
1060 int namelen, u64 dir)
1062 struct inode_backref *backref;
1064 list_for_each_entry(backref, &rec->backrefs, list) {
1065 if (rec->ino == BTRFS_MULTIPLE_OBJECTIDS)
1067 if (backref->dir != dir || backref->namelen != namelen)
1069 if (memcmp(name, backref->name, namelen))
1074 backref = malloc(sizeof(*backref) + namelen + 1);
1077 memset(backref, 0, sizeof(*backref));
1079 backref->namelen = namelen;
1080 memcpy(backref->name, name, namelen);
1081 backref->name[namelen] = '\0';
1082 list_add_tail(&backref->list, &rec->backrefs);
1086 static int add_inode_backref(struct cache_tree *inode_cache,
1087 u64 ino, u64 dir, u64 index,
1088 const char *name, int namelen,
1089 u8 filetype, u8 itemtype, int errors)
1091 struct inode_record *rec;
1092 struct inode_backref *backref;
1094 rec = get_inode_rec(inode_cache, ino, 1);
1095 BUG_ON(IS_ERR(rec));
1096 backref = get_inode_backref(rec, name, namelen, dir);
1099 backref->errors |= errors;
1100 if (itemtype == BTRFS_DIR_INDEX_KEY) {
1101 if (backref->found_dir_index)
1102 backref->errors |= REF_ERR_DUP_DIR_INDEX;
1103 if (backref->found_inode_ref && backref->index != index)
1104 backref->errors |= REF_ERR_INDEX_UNMATCH;
1105 if (backref->found_dir_item && backref->filetype != filetype)
1106 backref->errors |= REF_ERR_FILETYPE_UNMATCH;
1108 backref->index = index;
1109 backref->filetype = filetype;
1110 backref->found_dir_index = 1;
1111 } else if (itemtype == BTRFS_DIR_ITEM_KEY) {
1113 if (backref->found_dir_item)
1114 backref->errors |= REF_ERR_DUP_DIR_ITEM;
1115 if (backref->found_dir_index && backref->filetype != filetype)
1116 backref->errors |= REF_ERR_FILETYPE_UNMATCH;
1118 backref->filetype = filetype;
1119 backref->found_dir_item = 1;
1120 } else if ((itemtype == BTRFS_INODE_REF_KEY) ||
1121 (itemtype == BTRFS_INODE_EXTREF_KEY)) {
1122 if (backref->found_inode_ref)
1123 backref->errors |= REF_ERR_DUP_INODE_REF;
1124 if (backref->found_dir_index && backref->index != index)
1125 backref->errors |= REF_ERR_INDEX_UNMATCH;
1127 backref->index = index;
1129 backref->ref_type = itemtype;
1130 backref->found_inode_ref = 1;
1135 maybe_free_inode_rec(inode_cache, rec);
1139 static int merge_inode_recs(struct inode_record *src, struct inode_record *dst,
1140 struct cache_tree *dst_cache)
1142 struct inode_backref *backref;
1147 list_for_each_entry(backref, &src->backrefs, list) {
1148 if (backref->found_dir_index) {
1149 add_inode_backref(dst_cache, dst->ino, backref->dir,
1150 backref->index, backref->name,
1151 backref->namelen, backref->filetype,
1152 BTRFS_DIR_INDEX_KEY, backref->errors);
1154 if (backref->found_dir_item) {
1156 add_inode_backref(dst_cache, dst->ino,
1157 backref->dir, 0, backref->name,
1158 backref->namelen, backref->filetype,
1159 BTRFS_DIR_ITEM_KEY, backref->errors);
1161 if (backref->found_inode_ref) {
1162 add_inode_backref(dst_cache, dst->ino,
1163 backref->dir, backref->index,
1164 backref->name, backref->namelen, 0,
1165 backref->ref_type, backref->errors);
1169 if (src->found_dir_item)
1170 dst->found_dir_item = 1;
1171 if (src->found_file_extent)
1172 dst->found_file_extent = 1;
1173 if (src->found_csum_item)
1174 dst->found_csum_item = 1;
1175 if (src->some_csum_missing)
1176 dst->some_csum_missing = 1;
1177 if (first_extent_gap(&dst->holes) > first_extent_gap(&src->holes)) {
1178 ret = copy_file_extent_holes(&dst->holes, &src->holes);
1183 BUG_ON(src->found_link < dir_count);
1184 dst->found_link += src->found_link - dir_count;
1185 dst->found_size += src->found_size;
1186 if (src->extent_start != (u64)-1) {
1187 if (dst->extent_start == (u64)-1) {
1188 dst->extent_start = src->extent_start;
1189 dst->extent_end = src->extent_end;
1191 if (dst->extent_end > src->extent_start)
1192 dst->errors |= I_ERR_FILE_EXTENT_OVERLAP;
1193 else if (dst->extent_end < src->extent_start) {
1194 ret = add_file_extent_hole(&dst->holes,
1196 src->extent_start - dst->extent_end);
1198 if (dst->extent_end < src->extent_end)
1199 dst->extent_end = src->extent_end;
1203 dst->errors |= src->errors;
1204 if (src->found_inode_item) {
1205 if (!dst->found_inode_item) {
1206 dst->nlink = src->nlink;
1207 dst->isize = src->isize;
1208 dst->nbytes = src->nbytes;
1209 dst->imode = src->imode;
1210 dst->nodatasum = src->nodatasum;
1211 dst->found_inode_item = 1;
1213 dst->errors |= I_ERR_DUP_INODE_ITEM;
1221 static int splice_shared_node(struct shared_node *src_node,
1222 struct shared_node *dst_node)
1224 struct cache_extent *cache;
1225 struct ptr_node *node, *ins;
1226 struct cache_tree *src, *dst;
1227 struct inode_record *rec, *conflict;
1228 u64 current_ino = 0;
1232 if (--src_node->refs == 0)
1234 if (src_node->current)
1235 current_ino = src_node->current->ino;
1237 src = &src_node->root_cache;
1238 dst = &dst_node->root_cache;
1240 cache = search_cache_extent(src, 0);
1242 node = container_of(cache, struct ptr_node, cache);
1244 cache = next_cache_extent(cache);
1247 remove_cache_extent(src, &node->cache);
1250 ins = malloc(sizeof(*ins));
1252 ins->cache.start = node->cache.start;
1253 ins->cache.size = node->cache.size;
1257 ret = insert_cache_extent(dst, &ins->cache);
1258 if (ret == -EEXIST) {
1259 conflict = get_inode_rec(dst, rec->ino, 1);
1260 BUG_ON(IS_ERR(conflict));
1261 merge_inode_recs(rec, conflict, dst);
1263 conflict->checked = 1;
1264 if (dst_node->current == conflict)
1265 dst_node->current = NULL;
1267 maybe_free_inode_rec(dst, conflict);
1268 free_inode_rec(rec);
1275 if (src == &src_node->root_cache) {
1276 src = &src_node->inode_cache;
1277 dst = &dst_node->inode_cache;
1281 if (current_ino > 0 && (!dst_node->current ||
1282 current_ino > dst_node->current->ino)) {
1283 if (dst_node->current) {
1284 dst_node->current->checked = 1;
1285 maybe_free_inode_rec(dst, dst_node->current);
1287 dst_node->current = get_inode_rec(dst, current_ino, 1);
1288 BUG_ON(IS_ERR(dst_node->current));
1293 static void free_inode_ptr(struct cache_extent *cache)
1295 struct ptr_node *node;
1296 struct inode_record *rec;
1298 node = container_of(cache, struct ptr_node, cache);
1300 free_inode_rec(rec);
1304 FREE_EXTENT_CACHE_BASED_TREE(inode_recs, free_inode_ptr);
1306 static struct shared_node *find_shared_node(struct cache_tree *shared,
1309 struct cache_extent *cache;
1310 struct shared_node *node;
1312 cache = lookup_cache_extent(shared, bytenr, 1);
1314 node = container_of(cache, struct shared_node, cache);
1320 static int add_shared_node(struct cache_tree *shared, u64 bytenr, u32 refs)
1323 struct shared_node *node;
1325 node = calloc(1, sizeof(*node));
1328 node->cache.start = bytenr;
1329 node->cache.size = 1;
1330 cache_tree_init(&node->root_cache);
1331 cache_tree_init(&node->inode_cache);
1334 ret = insert_cache_extent(shared, &node->cache);
1339 static int enter_shared_node(struct btrfs_root *root, u64 bytenr, u32 refs,
1340 struct walk_control *wc, int level)
1342 struct shared_node *node;
1343 struct shared_node *dest;
1346 if (level == wc->active_node)
1349 BUG_ON(wc->active_node <= level);
1350 node = find_shared_node(&wc->shared, bytenr);
1352 ret = add_shared_node(&wc->shared, bytenr, refs);
1354 node = find_shared_node(&wc->shared, bytenr);
1355 wc->nodes[level] = node;
1356 wc->active_node = level;
1360 if (wc->root_level == wc->active_node &&
1361 btrfs_root_refs(&root->root_item) == 0) {
1362 if (--node->refs == 0) {
1363 free_inode_recs_tree(&node->root_cache);
1364 free_inode_recs_tree(&node->inode_cache);
1365 remove_cache_extent(&wc->shared, &node->cache);
1371 dest = wc->nodes[wc->active_node];
1372 splice_shared_node(node, dest);
1373 if (node->refs == 0) {
1374 remove_cache_extent(&wc->shared, &node->cache);
1380 static int leave_shared_node(struct btrfs_root *root,
1381 struct walk_control *wc, int level)
1383 struct shared_node *node;
1384 struct shared_node *dest;
1387 if (level == wc->root_level)
1390 for (i = level + 1; i < BTRFS_MAX_LEVEL; i++) {
1394 BUG_ON(i >= BTRFS_MAX_LEVEL);
1396 node = wc->nodes[wc->active_node];
1397 wc->nodes[wc->active_node] = NULL;
1398 wc->active_node = i;
1400 dest = wc->nodes[wc->active_node];
1401 if (wc->active_node < wc->root_level ||
1402 btrfs_root_refs(&root->root_item) > 0) {
1403 BUG_ON(node->refs <= 1);
1404 splice_shared_node(node, dest);
1406 BUG_ON(node->refs < 2);
1415 * 1 - if the root with id child_root_id is a child of root parent_root_id
1416 * 0 - if the root child_root_id isn't a child of the root parent_root_id but
1417 * has other root(s) as parent(s)
1418 * 2 - if the root child_root_id doesn't have any parent roots
1420 static int is_child_root(struct btrfs_root *root, u64 parent_root_id,
1423 struct btrfs_path path;
1424 struct btrfs_key key;
1425 struct extent_buffer *leaf;
1429 btrfs_init_path(&path);
1431 key.objectid = parent_root_id;
1432 key.type = BTRFS_ROOT_REF_KEY;
1433 key.offset = child_root_id;
1434 ret = btrfs_search_slot(NULL, root->fs_info->tree_root, &key, &path,
1438 btrfs_release_path(&path);
1442 key.objectid = child_root_id;
1443 key.type = BTRFS_ROOT_BACKREF_KEY;
1445 ret = btrfs_search_slot(NULL, root->fs_info->tree_root, &key, &path,
1451 leaf = path.nodes[0];
1452 if (path.slots[0] >= btrfs_header_nritems(leaf)) {
1453 ret = btrfs_next_leaf(root->fs_info->tree_root, &path);
1456 leaf = path.nodes[0];
1459 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
1460 if (key.objectid != child_root_id ||
1461 key.type != BTRFS_ROOT_BACKREF_KEY)
1466 if (key.offset == parent_root_id) {
1467 btrfs_release_path(&path);
1474 btrfs_release_path(&path);
1477 return has_parent ? 0 : 2;
1480 static int process_dir_item(struct btrfs_root *root,
1481 struct extent_buffer *eb,
1482 int slot, struct btrfs_key *key,
1483 struct shared_node *active_node)
1493 struct btrfs_dir_item *di;
1494 struct inode_record *rec;
1495 struct cache_tree *root_cache;
1496 struct cache_tree *inode_cache;
1497 struct btrfs_key location;
1498 char namebuf[BTRFS_NAME_LEN];
1500 root_cache = &active_node->root_cache;
1501 inode_cache = &active_node->inode_cache;
1502 rec = active_node->current;
1503 rec->found_dir_item = 1;
1505 di = btrfs_item_ptr(eb, slot, struct btrfs_dir_item);
1506 total = btrfs_item_size_nr(eb, slot);
1507 while (cur < total) {
1509 btrfs_dir_item_key_to_cpu(eb, di, &location);
1510 name_len = btrfs_dir_name_len(eb, di);
1511 data_len = btrfs_dir_data_len(eb, di);
1512 filetype = btrfs_dir_type(eb, di);
1514 rec->found_size += name_len;
1515 if (name_len <= BTRFS_NAME_LEN) {
1519 len = BTRFS_NAME_LEN;
1520 error = REF_ERR_NAME_TOO_LONG;
1522 read_extent_buffer(eb, namebuf, (unsigned long)(di + 1), len);
1524 if (location.type == BTRFS_INODE_ITEM_KEY) {
1525 add_inode_backref(inode_cache, location.objectid,
1526 key->objectid, key->offset, namebuf,
1527 len, filetype, key->type, error);
1528 } else if (location.type == BTRFS_ROOT_ITEM_KEY) {
1529 add_inode_backref(root_cache, location.objectid,
1530 key->objectid, key->offset,
1531 namebuf, len, filetype,
1534 fprintf(stderr, "invalid location in dir item %u\n",
1536 add_inode_backref(inode_cache, BTRFS_MULTIPLE_OBJECTIDS,
1537 key->objectid, key->offset, namebuf,
1538 len, filetype, key->type, error);
1541 len = sizeof(*di) + name_len + data_len;
1542 di = (struct btrfs_dir_item *)((char *)di + len);
1545 if (key->type == BTRFS_DIR_INDEX_KEY && nritems > 1)
1546 rec->errors |= I_ERR_DUP_DIR_INDEX;
1551 static int process_inode_ref(struct extent_buffer *eb,
1552 int slot, struct btrfs_key *key,
1553 struct shared_node *active_node)
1561 struct cache_tree *inode_cache;
1562 struct btrfs_inode_ref *ref;
1563 char namebuf[BTRFS_NAME_LEN];
1565 inode_cache = &active_node->inode_cache;
1567 ref = btrfs_item_ptr(eb, slot, struct btrfs_inode_ref);
1568 total = btrfs_item_size_nr(eb, slot);
1569 while (cur < total) {
1570 name_len = btrfs_inode_ref_name_len(eb, ref);
1571 index = btrfs_inode_ref_index(eb, ref);
1572 if (name_len <= BTRFS_NAME_LEN) {
1576 len = BTRFS_NAME_LEN;
1577 error = REF_ERR_NAME_TOO_LONG;
1579 read_extent_buffer(eb, namebuf, (unsigned long)(ref + 1), len);
1580 add_inode_backref(inode_cache, key->objectid, key->offset,
1581 index, namebuf, len, 0, key->type, error);
1583 len = sizeof(*ref) + name_len;
1584 ref = (struct btrfs_inode_ref *)((char *)ref + len);
1590 static int process_inode_extref(struct extent_buffer *eb,
1591 int slot, struct btrfs_key *key,
1592 struct shared_node *active_node)
1601 struct cache_tree *inode_cache;
1602 struct btrfs_inode_extref *extref;
1603 char namebuf[BTRFS_NAME_LEN];
1605 inode_cache = &active_node->inode_cache;
1607 extref = btrfs_item_ptr(eb, slot, struct btrfs_inode_extref);
1608 total = btrfs_item_size_nr(eb, slot);
1609 while (cur < total) {
1610 name_len = btrfs_inode_extref_name_len(eb, extref);
1611 index = btrfs_inode_extref_index(eb, extref);
1612 parent = btrfs_inode_extref_parent(eb, extref);
1613 if (name_len <= BTRFS_NAME_LEN) {
1617 len = BTRFS_NAME_LEN;
1618 error = REF_ERR_NAME_TOO_LONG;
1620 read_extent_buffer(eb, namebuf,
1621 (unsigned long)(extref + 1), len);
1622 add_inode_backref(inode_cache, key->objectid, parent,
1623 index, namebuf, len, 0, key->type, error);
1625 len = sizeof(*extref) + name_len;
1626 extref = (struct btrfs_inode_extref *)((char *)extref + len);
1633 static int count_csum_range(struct btrfs_root *root, u64 start,
1634 u64 len, u64 *found)
1636 struct btrfs_key key;
1637 struct btrfs_path path;
1638 struct extent_buffer *leaf;
1643 u16 csum_size = btrfs_super_csum_size(root->fs_info->super_copy);
1645 btrfs_init_path(&path);
1647 key.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
1649 key.type = BTRFS_EXTENT_CSUM_KEY;
1651 ret = btrfs_search_slot(NULL, root->fs_info->csum_root,
1655 if (ret > 0 && path.slots[0] > 0) {
1656 leaf = path.nodes[0];
1657 btrfs_item_key_to_cpu(leaf, &key, path.slots[0] - 1);
1658 if (key.objectid == BTRFS_EXTENT_CSUM_OBJECTID &&
1659 key.type == BTRFS_EXTENT_CSUM_KEY)
1664 leaf = path.nodes[0];
1665 if (path.slots[0] >= btrfs_header_nritems(leaf)) {
1666 ret = btrfs_next_leaf(root->fs_info->csum_root, &path);
1671 leaf = path.nodes[0];
1674 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
1675 if (key.objectid != BTRFS_EXTENT_CSUM_OBJECTID ||
1676 key.type != BTRFS_EXTENT_CSUM_KEY)
1679 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
1680 if (key.offset >= start + len)
1683 if (key.offset > start)
1686 size = btrfs_item_size_nr(leaf, path.slots[0]);
1687 csum_end = key.offset + (size / csum_size) * root->sectorsize;
1688 if (csum_end > start) {
1689 size = min(csum_end - start, len);
1698 btrfs_release_path(&path);
1704 static int process_file_extent(struct btrfs_root *root,
1705 struct extent_buffer *eb,
1706 int slot, struct btrfs_key *key,
1707 struct shared_node *active_node)
1709 struct inode_record *rec;
1710 struct btrfs_file_extent_item *fi;
1712 u64 disk_bytenr = 0;
1713 u64 extent_offset = 0;
1714 u64 mask = root->sectorsize - 1;
1718 rec = active_node->current;
1719 BUG_ON(rec->ino != key->objectid || rec->refs > 1);
1720 rec->found_file_extent = 1;
1722 if (rec->extent_start == (u64)-1) {
1723 rec->extent_start = key->offset;
1724 rec->extent_end = key->offset;
1727 if (rec->extent_end > key->offset)
1728 rec->errors |= I_ERR_FILE_EXTENT_OVERLAP;
1729 else if (rec->extent_end < key->offset) {
1730 ret = add_file_extent_hole(&rec->holes, rec->extent_end,
1731 key->offset - rec->extent_end);
1736 fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
1737 extent_type = btrfs_file_extent_type(eb, fi);
1739 if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
1740 num_bytes = btrfs_file_extent_inline_len(eb, slot, fi);
1742 rec->errors |= I_ERR_BAD_FILE_EXTENT;
1743 rec->found_size += num_bytes;
1744 num_bytes = (num_bytes + mask) & ~mask;
1745 } else if (extent_type == BTRFS_FILE_EXTENT_REG ||
1746 extent_type == BTRFS_FILE_EXTENT_PREALLOC) {
1747 num_bytes = btrfs_file_extent_num_bytes(eb, fi);
1748 disk_bytenr = btrfs_file_extent_disk_bytenr(eb, fi);
1749 extent_offset = btrfs_file_extent_offset(eb, fi);
1750 if (num_bytes == 0 || (num_bytes & mask))
1751 rec->errors |= I_ERR_BAD_FILE_EXTENT;
1752 if (num_bytes + extent_offset >
1753 btrfs_file_extent_ram_bytes(eb, fi))
1754 rec->errors |= I_ERR_BAD_FILE_EXTENT;
1755 if (extent_type == BTRFS_FILE_EXTENT_PREALLOC &&
1756 (btrfs_file_extent_compression(eb, fi) ||
1757 btrfs_file_extent_encryption(eb, fi) ||
1758 btrfs_file_extent_other_encoding(eb, fi)))
1759 rec->errors |= I_ERR_BAD_FILE_EXTENT;
1760 if (disk_bytenr > 0)
1761 rec->found_size += num_bytes;
1763 rec->errors |= I_ERR_BAD_FILE_EXTENT;
1765 rec->extent_end = key->offset + num_bytes;
1768 * The data reloc tree will copy full extents into its inode and then
1769 * copy the corresponding csums. Because the extent it copied could be
1770 * a preallocated extent that hasn't been written to yet there may be no
1771 * csums to copy, ergo we won't have csums for our file extent. This is
1772 * ok so just don't bother checking csums if the inode belongs to the
1775 if (disk_bytenr > 0 &&
1776 btrfs_header_owner(eb) != BTRFS_DATA_RELOC_TREE_OBJECTID) {
1778 if (btrfs_file_extent_compression(eb, fi))
1779 num_bytes = btrfs_file_extent_disk_num_bytes(eb, fi);
1781 disk_bytenr += extent_offset;
1783 ret = count_csum_range(root, disk_bytenr, num_bytes, &found);
1786 if (extent_type == BTRFS_FILE_EXTENT_REG) {
1788 rec->found_csum_item = 1;
1789 if (found < num_bytes)
1790 rec->some_csum_missing = 1;
1791 } else if (extent_type == BTRFS_FILE_EXTENT_PREALLOC) {
1793 rec->errors |= I_ERR_ODD_CSUM_ITEM;
1799 static int process_one_leaf(struct btrfs_root *root, struct extent_buffer *eb,
1800 struct walk_control *wc)
1802 struct btrfs_key key;
1806 struct cache_tree *inode_cache;
1807 struct shared_node *active_node;
1809 if (wc->root_level == wc->active_node &&
1810 btrfs_root_refs(&root->root_item) == 0)
1813 active_node = wc->nodes[wc->active_node];
1814 inode_cache = &active_node->inode_cache;
1815 nritems = btrfs_header_nritems(eb);
1816 for (i = 0; i < nritems; i++) {
1817 btrfs_item_key_to_cpu(eb, &key, i);
1819 if (key.objectid == BTRFS_FREE_SPACE_OBJECTID)
1821 if (key.type == BTRFS_ORPHAN_ITEM_KEY)
1824 if (active_node->current == NULL ||
1825 active_node->current->ino < key.objectid) {
1826 if (active_node->current) {
1827 active_node->current->checked = 1;
1828 maybe_free_inode_rec(inode_cache,
1829 active_node->current);
1831 active_node->current = get_inode_rec(inode_cache,
1833 BUG_ON(IS_ERR(active_node->current));
1836 case BTRFS_DIR_ITEM_KEY:
1837 case BTRFS_DIR_INDEX_KEY:
1838 ret = process_dir_item(root, eb, i, &key, active_node);
1840 case BTRFS_INODE_REF_KEY:
1841 ret = process_inode_ref(eb, i, &key, active_node);
1843 case BTRFS_INODE_EXTREF_KEY:
1844 ret = process_inode_extref(eb, i, &key, active_node);
1846 case BTRFS_INODE_ITEM_KEY:
1847 ret = process_inode_item(eb, i, &key, active_node);
1849 case BTRFS_EXTENT_DATA_KEY:
1850 ret = process_file_extent(root, eb, i, &key,
1861 u64 bytenr[BTRFS_MAX_LEVEL];
1862 u64 refs[BTRFS_MAX_LEVEL];
1863 int need_check[BTRFS_MAX_LEVEL];
1866 static int update_nodes_refs(struct btrfs_root *root, u64 bytenr,
1867 struct node_refs *nrefs, u64 level);
1868 static int check_inode_item(struct btrfs_root *root, struct btrfs_path *path,
1869 unsigned int ext_ref);
1871 static int process_one_leaf_v2(struct btrfs_root *root, struct btrfs_path *path,
1872 struct node_refs *nrefs, int *level, int ext_ref)
1874 struct extent_buffer *cur = path->nodes[0];
1875 struct btrfs_key key;
1878 int root_level = btrfs_header_level(root->node);
1880 int ret = 0; /* Final return value */
1881 int err = 0; /* Positive error bitmap */
1883 cur_bytenr = cur->start;
1885 /* skip to first inode item in this leaf */
1886 nritems = btrfs_header_nritems(cur);
1887 for (i = 0; i < nritems; i++) {
1888 btrfs_item_key_to_cpu(cur, &key, i);
1889 if (key.type == BTRFS_INODE_ITEM_KEY)
1893 path->slots[0] = nritems;
1899 err |= check_inode_item(root, path, ext_ref);
1901 if (err & LAST_ITEM)
1904 /* still have inode items in thie leaf */
1905 if (cur->start == cur_bytenr)
1909 * we have switched to another leaf, above nodes may
1910 * have changed, here walk down the path, if a node
1911 * or leaf is shared, check whether we can skip this
1914 for (i = root_level; i >= 0; i--) {
1915 if (path->nodes[i]->start == nrefs->bytenr[i])
1918 ret = update_nodes_refs(root,
1919 path->nodes[i]->start,
1924 if (!nrefs->need_check[i]) {
1930 for (i = 0; i < *level; i++) {
1931 free_extent_buffer(path->nodes[i]);
1932 path->nodes[i] = NULL;
1937 * Convert any error bitmap to -EIO, as we should avoid
1938 * mixing positive and negative return value to represent
1946 static void reada_walk_down(struct btrfs_root *root,
1947 struct extent_buffer *node, int slot)
1956 level = btrfs_header_level(node);
1960 nritems = btrfs_header_nritems(node);
1961 blocksize = root->nodesize;
1962 for (i = slot; i < nritems; i++) {
1963 bytenr = btrfs_node_blockptr(node, i);
1964 ptr_gen = btrfs_node_ptr_generation(node, i);
1965 readahead_tree_block(root, bytenr, blocksize, ptr_gen);
1970 * Check the child node/leaf by the following condition:
1971 * 1. the first item key of the node/leaf should be the same with the one
1973 * 2. block in parent node should match the child node/leaf.
1974 * 3. generation of parent node and child's header should be consistent.
1976 * Or the child node/leaf pointed by the key in parent is not valid.
1978 * We hope to check leaf owner too, but since subvol may share leaves,
1979 * which makes leaf owner check not so strong, key check should be
1980 * sufficient enough for that case.
1982 static int check_child_node(struct btrfs_root *root,
1983 struct extent_buffer *parent, int slot,
1984 struct extent_buffer *child)
1986 struct btrfs_key parent_key;
1987 struct btrfs_key child_key;
1990 btrfs_node_key_to_cpu(parent, &parent_key, slot);
1991 if (btrfs_header_level(child) == 0)
1992 btrfs_item_key_to_cpu(child, &child_key, 0);
1994 btrfs_node_key_to_cpu(child, &child_key, 0);
1996 if (memcmp(&parent_key, &child_key, sizeof(parent_key))) {
1999 "Wrong key of child node/leaf, wanted: (%llu, %u, %llu), have: (%llu, %u, %llu)\n",
2000 parent_key.objectid, parent_key.type, parent_key.offset,
2001 child_key.objectid, child_key.type, child_key.offset);
2003 if (btrfs_header_bytenr(child) != btrfs_node_blockptr(parent, slot)) {
2005 fprintf(stderr, "Wrong block of child node/leaf, wanted: %llu, have: %llu\n",
2006 btrfs_node_blockptr(parent, slot),
2007 btrfs_header_bytenr(child));
2009 if (btrfs_node_ptr_generation(parent, slot) !=
2010 btrfs_header_generation(child)) {
2012 fprintf(stderr, "Wrong generation of child node/leaf, wanted: %llu, have: %llu\n",
2013 btrfs_header_generation(child),
2014 btrfs_node_ptr_generation(parent, slot));
2020 * for a tree node or leaf, if it's shared, indeed we don't need to iterate it
2021 * in every fs or file tree check. Here we find its all root ids, and only check
2022 * it in the fs or file tree which has the smallest root id.
2024 static int need_check(struct btrfs_root *root, struct ulist *roots)
2026 struct rb_node *node;
2027 struct ulist_node *u;
2029 if (roots->nnodes == 1)
2032 node = rb_first(&roots->root);
2033 u = rb_entry(node, struct ulist_node, rb_node);
2035 * current root id is not smallest, we skip it and let it be checked
2036 * in the fs or file tree who hash the smallest root id.
2038 if (root->objectid != u->val)
2045 * for a tree node or leaf, we record its reference count, so later if we still
2046 * process this node or leaf, don't need to compute its reference count again.
2048 static int update_nodes_refs(struct btrfs_root *root, u64 bytenr,
2049 struct node_refs *nrefs, u64 level)
2053 struct ulist *roots;
2055 if (nrefs->bytenr[level] != bytenr) {
2056 ret = btrfs_lookup_extent_info(NULL, root, bytenr,
2057 level, 1, &refs, NULL);
2061 nrefs->bytenr[level] = bytenr;
2062 nrefs->refs[level] = refs;
2064 ret = btrfs_find_all_roots(NULL, root->fs_info, bytenr,
2069 check = need_check(root, roots);
2071 nrefs->need_check[level] = check;
2073 nrefs->need_check[level] = 1;
2080 static int walk_down_tree(struct btrfs_root *root, struct btrfs_path *path,
2081 struct walk_control *wc, int *level,
2082 struct node_refs *nrefs)
2084 enum btrfs_tree_block_status status;
2087 struct extent_buffer *next;
2088 struct extent_buffer *cur;
2093 WARN_ON(*level < 0);
2094 WARN_ON(*level >= BTRFS_MAX_LEVEL);
2096 if (path->nodes[*level]->start == nrefs->bytenr[*level]) {
2097 refs = nrefs->refs[*level];
2100 ret = btrfs_lookup_extent_info(NULL, root,
2101 path->nodes[*level]->start,
2102 *level, 1, &refs, NULL);
2107 nrefs->bytenr[*level] = path->nodes[*level]->start;
2108 nrefs->refs[*level] = refs;
2112 ret = enter_shared_node(root, path->nodes[*level]->start,
2120 while (*level >= 0) {
2121 WARN_ON(*level < 0);
2122 WARN_ON(*level >= BTRFS_MAX_LEVEL);
2123 cur = path->nodes[*level];
2125 if (btrfs_header_level(cur) != *level)
2128 if (path->slots[*level] >= btrfs_header_nritems(cur))
2131 ret = process_one_leaf(root, cur, wc);
2136 bytenr = btrfs_node_blockptr(cur, path->slots[*level]);
2137 ptr_gen = btrfs_node_ptr_generation(cur, path->slots[*level]);
2138 blocksize = root->nodesize;
2140 if (bytenr == nrefs->bytenr[*level - 1]) {
2141 refs = nrefs->refs[*level - 1];
2143 ret = btrfs_lookup_extent_info(NULL, root, bytenr,
2144 *level - 1, 1, &refs, NULL);
2148 nrefs->bytenr[*level - 1] = bytenr;
2149 nrefs->refs[*level - 1] = refs;
2154 ret = enter_shared_node(root, bytenr, refs,
2157 path->slots[*level]++;
2162 next = btrfs_find_tree_block(root, bytenr, blocksize);
2163 if (!next || !btrfs_buffer_uptodate(next, ptr_gen)) {
2164 free_extent_buffer(next);
2165 reada_walk_down(root, cur, path->slots[*level]);
2166 next = read_tree_block(root, bytenr, blocksize,
2168 if (!extent_buffer_uptodate(next)) {
2169 struct btrfs_key node_key;
2171 btrfs_node_key_to_cpu(path->nodes[*level],
2173 path->slots[*level]);
2174 btrfs_add_corrupt_extent_record(root->fs_info,
2176 path->nodes[*level]->start,
2177 root->nodesize, *level);
2183 ret = check_child_node(root, cur, path->slots[*level], next);
2189 if (btrfs_is_leaf(next))
2190 status = btrfs_check_leaf(root, NULL, next);
2192 status = btrfs_check_node(root, NULL, next);
2193 if (status != BTRFS_TREE_BLOCK_CLEAN) {
2194 free_extent_buffer(next);
2199 *level = *level - 1;
2200 free_extent_buffer(path->nodes[*level]);
2201 path->nodes[*level] = next;
2202 path->slots[*level] = 0;
2205 path->slots[*level] = btrfs_header_nritems(path->nodes[*level]);
2209 static int check_inode_item(struct btrfs_root *root, struct btrfs_path *path,
2210 unsigned int ext_ref);
2212 static int walk_down_tree_v2(struct btrfs_root *root, struct btrfs_path *path,
2213 int *level, struct node_refs *nrefs, int ext_ref)
2215 enum btrfs_tree_block_status status;
2218 struct extent_buffer *next;
2219 struct extent_buffer *cur;
2223 WARN_ON(*level < 0);
2224 WARN_ON(*level >= BTRFS_MAX_LEVEL);
2226 ret = update_nodes_refs(root, path->nodes[*level]->start,
2231 while (*level >= 0) {
2232 WARN_ON(*level < 0);
2233 WARN_ON(*level >= BTRFS_MAX_LEVEL);
2234 cur = path->nodes[*level];
2236 if (btrfs_header_level(cur) != *level)
2239 if (path->slots[*level] >= btrfs_header_nritems(cur))
2241 /* Don't forgot to check leaf/node validation */
2243 ret = btrfs_check_leaf(root, NULL, cur);
2244 if (ret != BTRFS_TREE_BLOCK_CLEAN) {
2248 ret = process_one_leaf_v2(root, path, nrefs,
2252 ret = btrfs_check_node(root, NULL, cur);
2253 if (ret != BTRFS_TREE_BLOCK_CLEAN) {
2258 bytenr = btrfs_node_blockptr(cur, path->slots[*level]);
2259 ptr_gen = btrfs_node_ptr_generation(cur, path->slots[*level]);
2260 blocksize = root->nodesize;
2262 ret = update_nodes_refs(root, bytenr, nrefs, *level - 1);
2265 if (!nrefs->need_check[*level - 1]) {
2266 path->slots[*level]++;
2270 next = btrfs_find_tree_block(root, bytenr, blocksize);
2271 if (!next || !btrfs_buffer_uptodate(next, ptr_gen)) {
2272 free_extent_buffer(next);
2273 reada_walk_down(root, cur, path->slots[*level]);
2274 next = read_tree_block(root, bytenr, blocksize,
2276 if (!extent_buffer_uptodate(next)) {
2277 struct btrfs_key node_key;
2279 btrfs_node_key_to_cpu(path->nodes[*level],
2281 path->slots[*level]);
2282 btrfs_add_corrupt_extent_record(root->fs_info,
2284 path->nodes[*level]->start,
2285 root->nodesize, *level);
2291 ret = check_child_node(root, cur, path->slots[*level], next);
2295 if (btrfs_is_leaf(next))
2296 status = btrfs_check_leaf(root, NULL, next);
2298 status = btrfs_check_node(root, NULL, next);
2299 if (status != BTRFS_TREE_BLOCK_CLEAN) {
2300 free_extent_buffer(next);
2305 *level = *level - 1;
2306 free_extent_buffer(path->nodes[*level]);
2307 path->nodes[*level] = next;
2308 path->slots[*level] = 0;
2313 static int walk_up_tree(struct btrfs_root *root, struct btrfs_path *path,
2314 struct walk_control *wc, int *level)
2317 struct extent_buffer *leaf;
2319 for (i = *level; i < BTRFS_MAX_LEVEL - 1 && path->nodes[i]; i++) {
2320 leaf = path->nodes[i];
2321 if (path->slots[i] + 1 < btrfs_header_nritems(leaf)) {
2326 free_extent_buffer(path->nodes[*level]);
2327 path->nodes[*level] = NULL;
2328 BUG_ON(*level > wc->active_node);
2329 if (*level == wc->active_node)
2330 leave_shared_node(root, wc, *level);
2337 static int walk_up_tree_v2(struct btrfs_root *root, struct btrfs_path *path,
2341 struct extent_buffer *leaf;
2343 for (i = *level; i < BTRFS_MAX_LEVEL - 1 && path->nodes[i]; i++) {
2344 leaf = path->nodes[i];
2345 if (path->slots[i] + 1 < btrfs_header_nritems(leaf)) {
2350 free_extent_buffer(path->nodes[*level]);
2351 path->nodes[*level] = NULL;
2358 static int check_root_dir(struct inode_record *rec)
2360 struct inode_backref *backref;
2363 if (!rec->found_inode_item || rec->errors)
2365 if (rec->nlink != 1 || rec->found_link != 0)
2367 if (list_empty(&rec->backrefs))
2369 backref = to_inode_backref(rec->backrefs.next);
2370 if (!backref->found_inode_ref)
2372 if (backref->index != 0 || backref->namelen != 2 ||
2373 memcmp(backref->name, "..", 2))
2375 if (backref->found_dir_index || backref->found_dir_item)
2382 static int repair_inode_isize(struct btrfs_trans_handle *trans,
2383 struct btrfs_root *root, struct btrfs_path *path,
2384 struct inode_record *rec)
2386 struct btrfs_inode_item *ei;
2387 struct btrfs_key key;
2390 key.objectid = rec->ino;
2391 key.type = BTRFS_INODE_ITEM_KEY;
2392 key.offset = (u64)-1;
2394 ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
2398 if (!path->slots[0]) {
2405 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
2406 if (key.objectid != rec->ino) {
2411 ei = btrfs_item_ptr(path->nodes[0], path->slots[0],
2412 struct btrfs_inode_item);
2413 btrfs_set_inode_size(path->nodes[0], ei, rec->found_size);
2414 btrfs_mark_buffer_dirty(path->nodes[0]);
2415 rec->errors &= ~I_ERR_DIR_ISIZE_WRONG;
2416 printf("reset isize for dir %Lu root %Lu\n", rec->ino,
2417 root->root_key.objectid);
2419 btrfs_release_path(path);
2423 static int repair_inode_orphan_item(struct btrfs_trans_handle *trans,
2424 struct btrfs_root *root,
2425 struct btrfs_path *path,
2426 struct inode_record *rec)
2430 ret = btrfs_add_orphan_item(trans, root, path, rec->ino);
2431 btrfs_release_path(path);
2433 rec->errors &= ~I_ERR_NO_ORPHAN_ITEM;
2437 static int repair_inode_nbytes(struct btrfs_trans_handle *trans,
2438 struct btrfs_root *root,
2439 struct btrfs_path *path,
2440 struct inode_record *rec)
2442 struct btrfs_inode_item *ei;
2443 struct btrfs_key key;
2446 key.objectid = rec->ino;
2447 key.type = BTRFS_INODE_ITEM_KEY;
2450 ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
2457 /* Since ret == 0, no need to check anything */
2458 ei = btrfs_item_ptr(path->nodes[0], path->slots[0],
2459 struct btrfs_inode_item);
2460 btrfs_set_inode_nbytes(path->nodes[0], ei, rec->found_size);
2461 btrfs_mark_buffer_dirty(path->nodes[0]);
2462 rec->errors &= ~I_ERR_FILE_NBYTES_WRONG;
2463 printf("reset nbytes for ino %llu root %llu\n",
2464 rec->ino, root->root_key.objectid);
2466 btrfs_release_path(path);
2470 static int add_missing_dir_index(struct btrfs_root *root,
2471 struct cache_tree *inode_cache,
2472 struct inode_record *rec,
2473 struct inode_backref *backref)
2475 struct btrfs_path path;
2476 struct btrfs_trans_handle *trans;
2477 struct btrfs_dir_item *dir_item;
2478 struct extent_buffer *leaf;
2479 struct btrfs_key key;
2480 struct btrfs_disk_key disk_key;
2481 struct inode_record *dir_rec;
2482 unsigned long name_ptr;
2483 u32 data_size = sizeof(*dir_item) + backref->namelen;
2486 trans = btrfs_start_transaction(root, 1);
2488 return PTR_ERR(trans);
2490 fprintf(stderr, "repairing missing dir index item for inode %llu\n",
2491 (unsigned long long)rec->ino);
2493 btrfs_init_path(&path);
2494 key.objectid = backref->dir;
2495 key.type = BTRFS_DIR_INDEX_KEY;
2496 key.offset = backref->index;
2497 ret = btrfs_insert_empty_item(trans, root, &path, &key, data_size);
2500 leaf = path.nodes[0];
2501 dir_item = btrfs_item_ptr(leaf, path.slots[0], struct btrfs_dir_item);
2503 disk_key.objectid = cpu_to_le64(rec->ino);
2504 disk_key.type = BTRFS_INODE_ITEM_KEY;
2505 disk_key.offset = 0;
2507 btrfs_set_dir_item_key(leaf, dir_item, &disk_key);
2508 btrfs_set_dir_type(leaf, dir_item, imode_to_type(rec->imode));
2509 btrfs_set_dir_data_len(leaf, dir_item, 0);
2510 btrfs_set_dir_name_len(leaf, dir_item, backref->namelen);
2511 name_ptr = (unsigned long)(dir_item + 1);
2512 write_extent_buffer(leaf, backref->name, name_ptr, backref->namelen);
2513 btrfs_mark_buffer_dirty(leaf);
2514 btrfs_release_path(&path);
2515 btrfs_commit_transaction(trans, root);
2517 backref->found_dir_index = 1;
2518 dir_rec = get_inode_rec(inode_cache, backref->dir, 0);
2519 BUG_ON(IS_ERR(dir_rec));
2522 dir_rec->found_size += backref->namelen;
2523 if (dir_rec->found_size == dir_rec->isize &&
2524 (dir_rec->errors & I_ERR_DIR_ISIZE_WRONG))
2525 dir_rec->errors &= ~I_ERR_DIR_ISIZE_WRONG;
2526 if (dir_rec->found_size != dir_rec->isize)
2527 dir_rec->errors |= I_ERR_DIR_ISIZE_WRONG;
2532 static int delete_dir_index(struct btrfs_root *root,
2533 struct cache_tree *inode_cache,
2534 struct inode_record *rec,
2535 struct inode_backref *backref)
2537 struct btrfs_trans_handle *trans;
2538 struct btrfs_dir_item *di;
2539 struct btrfs_path path;
2542 trans = btrfs_start_transaction(root, 1);
2544 return PTR_ERR(trans);
2546 fprintf(stderr, "Deleting bad dir index [%llu,%u,%llu] root %llu\n",
2547 (unsigned long long)backref->dir,
2548 BTRFS_DIR_INDEX_KEY, (unsigned long long)backref->index,
2549 (unsigned long long)root->objectid);
2551 btrfs_init_path(&path);
2552 di = btrfs_lookup_dir_index(trans, root, &path, backref->dir,
2553 backref->name, backref->namelen,
2554 backref->index, -1);
2557 btrfs_release_path(&path);
2558 btrfs_commit_transaction(trans, root);
2565 ret = btrfs_del_item(trans, root, &path);
2567 ret = btrfs_delete_one_dir_name(trans, root, &path, di);
2569 btrfs_release_path(&path);
2570 btrfs_commit_transaction(trans, root);
2574 static int create_inode_item(struct btrfs_root *root,
2575 struct inode_record *rec,
2576 struct inode_backref *backref, int root_dir)
2578 struct btrfs_trans_handle *trans;
2579 struct btrfs_inode_item inode_item;
2580 time_t now = time(NULL);
2583 trans = btrfs_start_transaction(root, 1);
2584 if (IS_ERR(trans)) {
2585 ret = PTR_ERR(trans);
2589 fprintf(stderr, "root %llu inode %llu recreating inode item, this may "
2590 "be incomplete, please check permissions and content after "
2591 "the fsck completes.\n", (unsigned long long)root->objectid,
2592 (unsigned long long)rec->ino);
2594 memset(&inode_item, 0, sizeof(inode_item));
2595 btrfs_set_stack_inode_generation(&inode_item, trans->transid);
2597 btrfs_set_stack_inode_nlink(&inode_item, 1);
2599 btrfs_set_stack_inode_nlink(&inode_item, rec->found_link);
2600 btrfs_set_stack_inode_nbytes(&inode_item, rec->found_size);
2601 if (rec->found_dir_item) {
2602 if (rec->found_file_extent)
2603 fprintf(stderr, "root %llu inode %llu has both a dir "
2604 "item and extents, unsure if it is a dir or a "
2605 "regular file so setting it as a directory\n",
2606 (unsigned long long)root->objectid,
2607 (unsigned long long)rec->ino);
2608 btrfs_set_stack_inode_mode(&inode_item, S_IFDIR | 0755);
2609 btrfs_set_stack_inode_size(&inode_item, rec->found_size);
2610 } else if (!rec->found_dir_item) {
2611 btrfs_set_stack_inode_size(&inode_item, rec->extent_end);
2612 btrfs_set_stack_inode_mode(&inode_item, S_IFREG | 0755);
2614 btrfs_set_stack_timespec_sec(&inode_item.atime, now);
2615 btrfs_set_stack_timespec_nsec(&inode_item.atime, 0);
2616 btrfs_set_stack_timespec_sec(&inode_item.ctime, now);
2617 btrfs_set_stack_timespec_nsec(&inode_item.ctime, 0);
2618 btrfs_set_stack_timespec_sec(&inode_item.mtime, now);
2619 btrfs_set_stack_timespec_nsec(&inode_item.mtime, 0);
2620 btrfs_set_stack_timespec_sec(&inode_item.otime, 0);
2621 btrfs_set_stack_timespec_nsec(&inode_item.otime, 0);
2623 ret = btrfs_insert_inode(trans, root, rec->ino, &inode_item);
2625 btrfs_commit_transaction(trans, root);
2629 static int repair_inode_backrefs(struct btrfs_root *root,
2630 struct inode_record *rec,
2631 struct cache_tree *inode_cache,
2634 struct inode_backref *tmp, *backref;
2635 u64 root_dirid = btrfs_root_dirid(&root->root_item);
2639 list_for_each_entry_safe(backref, tmp, &rec->backrefs, list) {
2640 if (!delete && rec->ino == root_dirid) {
2641 if (!rec->found_inode_item) {
2642 ret = create_inode_item(root, rec, backref, 1);
2649 /* Index 0 for root dir's are special, don't mess with it */
2650 if (rec->ino == root_dirid && backref->index == 0)
2654 ((backref->found_dir_index && !backref->found_inode_ref) ||
2655 (backref->found_dir_index && backref->found_inode_ref &&
2656 (backref->errors & REF_ERR_INDEX_UNMATCH)))) {
2657 ret = delete_dir_index(root, inode_cache, rec, backref);
2661 list_del(&backref->list);
2665 if (!delete && !backref->found_dir_index &&
2666 backref->found_dir_item && backref->found_inode_ref) {
2667 ret = add_missing_dir_index(root, inode_cache, rec,
2672 if (backref->found_dir_item &&
2673 backref->found_dir_index &&
2674 backref->found_dir_index) {
2675 if (!backref->errors &&
2676 backref->found_inode_ref) {
2677 list_del(&backref->list);
2683 if (!delete && (!backref->found_dir_index &&
2684 !backref->found_dir_item &&
2685 backref->found_inode_ref)) {
2686 struct btrfs_trans_handle *trans;
2687 struct btrfs_key location;
2689 ret = check_dir_conflict(root, backref->name,
2695 * let nlink fixing routine to handle it,
2696 * which can do it better.
2701 location.objectid = rec->ino;
2702 location.type = BTRFS_INODE_ITEM_KEY;
2703 location.offset = 0;
2705 trans = btrfs_start_transaction(root, 1);
2706 if (IS_ERR(trans)) {
2707 ret = PTR_ERR(trans);
2710 fprintf(stderr, "adding missing dir index/item pair "
2712 (unsigned long long)rec->ino);
2713 ret = btrfs_insert_dir_item(trans, root, backref->name,
2715 backref->dir, &location,
2716 imode_to_type(rec->imode),
2719 btrfs_commit_transaction(trans, root);
2723 if (!delete && (backref->found_inode_ref &&
2724 backref->found_dir_index &&
2725 backref->found_dir_item &&
2726 !(backref->errors & REF_ERR_INDEX_UNMATCH) &&
2727 !rec->found_inode_item)) {
2728 ret = create_inode_item(root, rec, backref, 0);
2735 return ret ? ret : repaired;
2739 * To determine the file type for nlink/inode_item repair
2741 * Return 0 if file type is found and BTRFS_FT_* is stored into type.
2742 * Return -ENOENT if file type is not found.
2744 static int find_file_type(struct inode_record *rec, u8 *type)
2746 struct inode_backref *backref;
2748 /* For inode item recovered case */
2749 if (rec->found_inode_item) {
2750 *type = imode_to_type(rec->imode);
2754 list_for_each_entry(backref, &rec->backrefs, list) {
2755 if (backref->found_dir_index || backref->found_dir_item) {
2756 *type = backref->filetype;
2764 * To determine the file name for nlink repair
2766 * Return 0 if file name is found, set name and namelen.
2767 * Return -ENOENT if file name is not found.
2769 static int find_file_name(struct inode_record *rec,
2770 char *name, int *namelen)
2772 struct inode_backref *backref;
2774 list_for_each_entry(backref, &rec->backrefs, list) {
2775 if (backref->found_dir_index || backref->found_dir_item ||
2776 backref->found_inode_ref) {
2777 memcpy(name, backref->name, backref->namelen);
2778 *namelen = backref->namelen;
2785 /* Reset the nlink of the inode to the correct one */
2786 static int reset_nlink(struct btrfs_trans_handle *trans,
2787 struct btrfs_root *root,
2788 struct btrfs_path *path,
2789 struct inode_record *rec)
2791 struct inode_backref *backref;
2792 struct inode_backref *tmp;
2793 struct btrfs_key key;
2794 struct btrfs_inode_item *inode_item;
2797 /* We don't believe this either, reset it and iterate backref */
2798 rec->found_link = 0;
2800 /* Remove all backref including the valid ones */
2801 list_for_each_entry_safe(backref, tmp, &rec->backrefs, list) {
2802 ret = btrfs_unlink(trans, root, rec->ino, backref->dir,
2803 backref->index, backref->name,
2804 backref->namelen, 0);
2808 /* remove invalid backref, so it won't be added back */
2809 if (!(backref->found_dir_index &&
2810 backref->found_dir_item &&
2811 backref->found_inode_ref)) {
2812 list_del(&backref->list);
2819 /* Set nlink to 0 */
2820 key.objectid = rec->ino;
2821 key.type = BTRFS_INODE_ITEM_KEY;
2823 ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
2830 inode_item = btrfs_item_ptr(path->nodes[0], path->slots[0],
2831 struct btrfs_inode_item);
2832 btrfs_set_inode_nlink(path->nodes[0], inode_item, 0);
2833 btrfs_mark_buffer_dirty(path->nodes[0]);
2834 btrfs_release_path(path);
2837 * Add back valid inode_ref/dir_item/dir_index,
2838 * add_link() will handle the nlink inc, so new nlink must be correct
2840 list_for_each_entry(backref, &rec->backrefs, list) {
2841 ret = btrfs_add_link(trans, root, rec->ino, backref->dir,
2842 backref->name, backref->namelen,
2843 backref->filetype, &backref->index, 1);
2848 btrfs_release_path(path);
2852 static int repair_inode_nlinks(struct btrfs_trans_handle *trans,
2853 struct btrfs_root *root,
2854 struct btrfs_path *path,
2855 struct inode_record *rec)
2857 char *dir_name = "lost+found";
2858 char namebuf[BTRFS_NAME_LEN] = {0};
2863 int name_recovered = 0;
2864 int type_recovered = 0;
2868 * Get file name and type first before these invalid inode ref
2869 * are deleted by remove_all_invalid_backref()
2871 name_recovered = !find_file_name(rec, namebuf, &namelen);
2872 type_recovered = !find_file_type(rec, &type);
2874 if (!name_recovered) {
2875 printf("Can't get file name for inode %llu, using '%llu' as fallback\n",
2876 rec->ino, rec->ino);
2877 namelen = count_digits(rec->ino);
2878 sprintf(namebuf, "%llu", rec->ino);
2881 if (!type_recovered) {
2882 printf("Can't get file type for inode %llu, using FILE as fallback\n",
2884 type = BTRFS_FT_REG_FILE;
2888 ret = reset_nlink(trans, root, path, rec);
2891 "Failed to reset nlink for inode %llu: %s\n",
2892 rec->ino, strerror(-ret));
2896 if (rec->found_link == 0) {
2897 lost_found_ino = root->highest_inode;
2898 if (lost_found_ino >= BTRFS_LAST_FREE_OBJECTID) {
2903 ret = btrfs_mkdir(trans, root, dir_name, strlen(dir_name),
2904 BTRFS_FIRST_FREE_OBJECTID, &lost_found_ino,
2907 fprintf(stderr, "Failed to create '%s' dir: %s\n",
2908 dir_name, strerror(-ret));
2911 ret = btrfs_add_link(trans, root, rec->ino, lost_found_ino,
2912 namebuf, namelen, type, NULL, 1);
2914 * Add ".INO" suffix several times to handle case where
2915 * "FILENAME.INO" is already taken by another file.
2917 while (ret == -EEXIST) {
2919 * Conflicting file name, add ".INO" as suffix * +1 for '.'
2921 if (namelen + count_digits(rec->ino) + 1 >
2926 snprintf(namebuf + namelen, BTRFS_NAME_LEN - namelen,
2928 namelen += count_digits(rec->ino) + 1;
2929 ret = btrfs_add_link(trans, root, rec->ino,
2930 lost_found_ino, namebuf,
2931 namelen, type, NULL, 1);
2935 "Failed to link the inode %llu to %s dir: %s\n",
2936 rec->ino, dir_name, strerror(-ret));
2940 * Just increase the found_link, don't actually add the
2941 * backref. This will make things easier and this inode
2942 * record will be freed after the repair is done.
2943 * So fsck will not report problem about this inode.
2946 printf("Moving file '%.*s' to '%s' dir since it has no valid backref\n",
2947 namelen, namebuf, dir_name);
2949 printf("Fixed the nlink of inode %llu\n", rec->ino);
2952 * Clear the flag anyway, or we will loop forever for the same inode
2953 * as it will not be removed from the bad inode list and the dead loop
2956 rec->errors &= ~I_ERR_LINK_COUNT_WRONG;
2957 btrfs_release_path(path);
2962 * Check if there is any normal(reg or prealloc) file extent for given
2964 * This is used to determine the file type when neither its dir_index/item or
2965 * inode_item exists.
2967 * This will *NOT* report error, if any error happens, just consider it does
2968 * not have any normal file extent.
2970 static int find_normal_file_extent(struct btrfs_root *root, u64 ino)
2972 struct btrfs_path path;
2973 struct btrfs_key key;
2974 struct btrfs_key found_key;
2975 struct btrfs_file_extent_item *fi;
2979 btrfs_init_path(&path);
2981 key.type = BTRFS_EXTENT_DATA_KEY;
2984 ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
2989 if (ret && path.slots[0] >= btrfs_header_nritems(path.nodes[0])) {
2990 ret = btrfs_next_leaf(root, &path);
2997 btrfs_item_key_to_cpu(path.nodes[0], &found_key,
2999 if (found_key.objectid != ino ||
3000 found_key.type != BTRFS_EXTENT_DATA_KEY)
3002 fi = btrfs_item_ptr(path.nodes[0], path.slots[0],
3003 struct btrfs_file_extent_item);
3004 type = btrfs_file_extent_type(path.nodes[0], fi);
3005 if (type != BTRFS_FILE_EXTENT_INLINE) {
3011 btrfs_release_path(&path);
3015 static u32 btrfs_type_to_imode(u8 type)
3017 static u32 imode_by_btrfs_type[] = {
3018 [BTRFS_FT_REG_FILE] = S_IFREG,
3019 [BTRFS_FT_DIR] = S_IFDIR,
3020 [BTRFS_FT_CHRDEV] = S_IFCHR,
3021 [BTRFS_FT_BLKDEV] = S_IFBLK,
3022 [BTRFS_FT_FIFO] = S_IFIFO,
3023 [BTRFS_FT_SOCK] = S_IFSOCK,
3024 [BTRFS_FT_SYMLINK] = S_IFLNK,
3027 return imode_by_btrfs_type[(type)];
3030 static int repair_inode_no_item(struct btrfs_trans_handle *trans,
3031 struct btrfs_root *root,
3032 struct btrfs_path *path,
3033 struct inode_record *rec)
3037 int type_recovered = 0;
3040 printf("Trying to rebuild inode:%llu\n", rec->ino);
3042 type_recovered = !find_file_type(rec, &filetype);
3045 * Try to determine inode type if type not found.
3047 * For found regular file extent, it must be FILE.
3048 * For found dir_item/index, it must be DIR.
3050 * For undetermined one, use FILE as fallback.
3053 * 1. If found backref(inode_index/item is already handled) to it,
3055 * Need new inode-inode ref structure to allow search for that.
3057 if (!type_recovered) {
3058 if (rec->found_file_extent &&
3059 find_normal_file_extent(root, rec->ino)) {
3061 filetype = BTRFS_FT_REG_FILE;
3062 } else if (rec->found_dir_item) {
3064 filetype = BTRFS_FT_DIR;
3065 } else if (!list_empty(&rec->orphan_extents)) {
3067 filetype = BTRFS_FT_REG_FILE;
3069 printf("Can't determine the filetype for inode %llu, assume it is a normal file\n",
3072 filetype = BTRFS_FT_REG_FILE;
3076 ret = btrfs_new_inode(trans, root, rec->ino,
3077 mode | btrfs_type_to_imode(filetype));
3082 * Here inode rebuild is done, we only rebuild the inode item,
3083 * don't repair the nlink(like move to lost+found).
3084 * That is the job of nlink repair.
3086 * We just fill the record and return
3088 rec->found_dir_item = 1;
3089 rec->imode = mode | btrfs_type_to_imode(filetype);
3091 rec->errors &= ~I_ERR_NO_INODE_ITEM;
3092 /* Ensure the inode_nlinks repair function will be called */
3093 rec->errors |= I_ERR_LINK_COUNT_WRONG;
3098 static int repair_inode_orphan_extent(struct btrfs_trans_handle *trans,
3099 struct btrfs_root *root,
3100 struct btrfs_path *path,
3101 struct inode_record *rec)
3103 struct orphan_data_extent *orphan;
3104 struct orphan_data_extent *tmp;
3107 list_for_each_entry_safe(orphan, tmp, &rec->orphan_extents, list) {
3109 * Check for conflicting file extents
3111 * Here we don't know whether the extents is compressed or not,
3112 * so we can only assume it not compressed nor data offset,
3113 * and use its disk_len as extent length.
3115 ret = btrfs_get_extent(NULL, root, path, orphan->objectid,
3116 orphan->offset, orphan->disk_len, 0);
3117 btrfs_release_path(path);
3122 "orphan extent (%llu, %llu) conflicts, delete the orphan\n",
3123 orphan->disk_bytenr, orphan->disk_len);
3124 ret = btrfs_free_extent(trans,
3125 root->fs_info->extent_root,
3126 orphan->disk_bytenr, orphan->disk_len,
3127 0, root->objectid, orphan->objectid,
3132 ret = btrfs_insert_file_extent(trans, root, orphan->objectid,
3133 orphan->offset, orphan->disk_bytenr,
3134 orphan->disk_len, orphan->disk_len);
3138 /* Update file size info */
3139 rec->found_size += orphan->disk_len;
3140 if (rec->found_size == rec->nbytes)
3141 rec->errors &= ~I_ERR_FILE_NBYTES_WRONG;
3143 /* Update the file extent hole info too */
3144 ret = del_file_extent_hole(&rec->holes, orphan->offset,
3148 if (RB_EMPTY_ROOT(&rec->holes))
3149 rec->errors &= ~I_ERR_FILE_EXTENT_DISCOUNT;
3151 list_del(&orphan->list);
3154 rec->errors &= ~I_ERR_FILE_EXTENT_ORPHAN;
3159 static int repair_inode_discount_extent(struct btrfs_trans_handle *trans,
3160 struct btrfs_root *root,
3161 struct btrfs_path *path,
3162 struct inode_record *rec)
3164 struct rb_node *node;
3165 struct file_extent_hole *hole;
3169 node = rb_first(&rec->holes);
3173 hole = rb_entry(node, struct file_extent_hole, node);
3174 ret = btrfs_punch_hole(trans, root, rec->ino,
3175 hole->start, hole->len);
3178 ret = del_file_extent_hole(&rec->holes, hole->start,
3182 if (RB_EMPTY_ROOT(&rec->holes))
3183 rec->errors &= ~I_ERR_FILE_EXTENT_DISCOUNT;
3184 node = rb_first(&rec->holes);
3186 /* special case for a file losing all its file extent */
3188 ret = btrfs_punch_hole(trans, root, rec->ino, 0,
3189 round_up(rec->isize, root->sectorsize));
3193 printf("Fixed discount file extents for inode: %llu in root: %llu\n",
3194 rec->ino, root->objectid);
3199 static int try_repair_inode(struct btrfs_root *root, struct inode_record *rec)
3201 struct btrfs_trans_handle *trans;
3202 struct btrfs_path path;
3205 if (!(rec->errors & (I_ERR_DIR_ISIZE_WRONG |
3206 I_ERR_NO_ORPHAN_ITEM |
3207 I_ERR_LINK_COUNT_WRONG |
3208 I_ERR_NO_INODE_ITEM |
3209 I_ERR_FILE_EXTENT_ORPHAN |
3210 I_ERR_FILE_EXTENT_DISCOUNT|
3211 I_ERR_FILE_NBYTES_WRONG)))
3215 * For nlink repair, it may create a dir and add link, so
3216 * 2 for parent(256)'s dir_index and dir_item
3217 * 2 for lost+found dir's inode_item and inode_ref
3218 * 1 for the new inode_ref of the file
3219 * 2 for lost+found dir's dir_index and dir_item for the file
3221 trans = btrfs_start_transaction(root, 7);
3223 return PTR_ERR(trans);
3225 btrfs_init_path(&path);
3226 if (rec->errors & I_ERR_NO_INODE_ITEM)
3227 ret = repair_inode_no_item(trans, root, &path, rec);
3228 if (!ret && rec->errors & I_ERR_FILE_EXTENT_ORPHAN)
3229 ret = repair_inode_orphan_extent(trans, root, &path, rec);
3230 if (!ret && rec->errors & I_ERR_FILE_EXTENT_DISCOUNT)
3231 ret = repair_inode_discount_extent(trans, root, &path, rec);
3232 if (!ret && rec->errors & I_ERR_DIR_ISIZE_WRONG)
3233 ret = repair_inode_isize(trans, root, &path, rec);
3234 if (!ret && rec->errors & I_ERR_NO_ORPHAN_ITEM)
3235 ret = repair_inode_orphan_item(trans, root, &path, rec);
3236 if (!ret && rec->errors & I_ERR_LINK_COUNT_WRONG)
3237 ret = repair_inode_nlinks(trans, root, &path, rec);
3238 if (!ret && rec->errors & I_ERR_FILE_NBYTES_WRONG)
3239 ret = repair_inode_nbytes(trans, root, &path, rec);
3240 btrfs_commit_transaction(trans, root);
3241 btrfs_release_path(&path);
3245 static int check_inode_recs(struct btrfs_root *root,
3246 struct cache_tree *inode_cache)
3248 struct cache_extent *cache;
3249 struct ptr_node *node;
3250 struct inode_record *rec;
3251 struct inode_backref *backref;
3256 u64 root_dirid = btrfs_root_dirid(&root->root_item);
3258 if (btrfs_root_refs(&root->root_item) == 0) {
3259 if (!cache_tree_empty(inode_cache))
3260 fprintf(stderr, "warning line %d\n", __LINE__);
3265 * We need to record the highest inode number for later 'lost+found'
3267 * We must select an ino not used/referred by any existing inode, or
3268 * 'lost+found' ino may be a missing ino in a corrupted leaf,
3269 * this may cause 'lost+found' dir has wrong nlinks.
3271 cache = last_cache_extent(inode_cache);
3273 node = container_of(cache, struct ptr_node, cache);
3275 if (rec->ino > root->highest_inode)
3276 root->highest_inode = rec->ino;
3280 * We need to repair backrefs first because we could change some of the
3281 * errors in the inode recs.
3283 * We also need to go through and delete invalid backrefs first and then
3284 * add the correct ones second. We do this because we may get EEXIST
3285 * when adding back the correct index because we hadn't yet deleted the
3288 * For example, if we were missing a dir index then the directories
3289 * isize would be wrong, so if we fixed the isize to what we thought it
3290 * would be and then fixed the backref we'd still have a invalid fs, so
3291 * we need to add back the dir index and then check to see if the isize
3296 if (stage == 3 && !err)
3299 cache = search_cache_extent(inode_cache, 0);
3300 while (repair && cache) {
3301 node = container_of(cache, struct ptr_node, cache);
3303 cache = next_cache_extent(cache);
3305 /* Need to free everything up and rescan */
3307 remove_cache_extent(inode_cache, &node->cache);
3309 free_inode_rec(rec);
3313 if (list_empty(&rec->backrefs))
3316 ret = repair_inode_backrefs(root, rec, inode_cache,
3330 rec = get_inode_rec(inode_cache, root_dirid, 0);
3331 BUG_ON(IS_ERR(rec));
3333 ret = check_root_dir(rec);
3335 fprintf(stderr, "root %llu root dir %llu error\n",
3336 (unsigned long long)root->root_key.objectid,
3337 (unsigned long long)root_dirid);
3338 print_inode_error(root, rec);
3343 struct btrfs_trans_handle *trans;
3345 trans = btrfs_start_transaction(root, 1);
3346 if (IS_ERR(trans)) {
3347 err = PTR_ERR(trans);
3352 "root %llu missing its root dir, recreating\n",
3353 (unsigned long long)root->objectid);
3355 ret = btrfs_make_root_dir(trans, root, root_dirid);
3358 btrfs_commit_transaction(trans, root);
3362 fprintf(stderr, "root %llu root dir %llu not found\n",
3363 (unsigned long long)root->root_key.objectid,
3364 (unsigned long long)root_dirid);
3368 cache = search_cache_extent(inode_cache, 0);
3371 node = container_of(cache, struct ptr_node, cache);
3373 remove_cache_extent(inode_cache, &node->cache);
3375 if (rec->ino == root_dirid ||
3376 rec->ino == BTRFS_ORPHAN_OBJECTID) {
3377 free_inode_rec(rec);
3381 if (rec->errors & I_ERR_NO_ORPHAN_ITEM) {
3382 ret = check_orphan_item(root, rec->ino);
3384 rec->errors &= ~I_ERR_NO_ORPHAN_ITEM;
3385 if (can_free_inode_rec(rec)) {
3386 free_inode_rec(rec);
3391 if (!rec->found_inode_item)
3392 rec->errors |= I_ERR_NO_INODE_ITEM;
3393 if (rec->found_link != rec->nlink)
3394 rec->errors |= I_ERR_LINK_COUNT_WRONG;
3396 ret = try_repair_inode(root, rec);
3397 if (ret == 0 && can_free_inode_rec(rec)) {
3398 free_inode_rec(rec);
3404 if (!(repair && ret == 0))
3406 print_inode_error(root, rec);
3407 list_for_each_entry(backref, &rec->backrefs, list) {
3408 if (!backref->found_dir_item)
3409 backref->errors |= REF_ERR_NO_DIR_ITEM;
3410 if (!backref->found_dir_index)
3411 backref->errors |= REF_ERR_NO_DIR_INDEX;
3412 if (!backref->found_inode_ref)
3413 backref->errors |= REF_ERR_NO_INODE_REF;
3414 fprintf(stderr, "\tunresolved ref dir %llu index %llu"
3415 " namelen %u name %s filetype %d errors %x",
3416 (unsigned long long)backref->dir,
3417 (unsigned long long)backref->index,
3418 backref->namelen, backref->name,
3419 backref->filetype, backref->errors);
3420 print_ref_error(backref->errors);
3422 free_inode_rec(rec);
3424 return (error > 0) ? -1 : 0;
3427 static struct root_record *get_root_rec(struct cache_tree *root_cache,
3430 struct cache_extent *cache;
3431 struct root_record *rec = NULL;
3434 cache = lookup_cache_extent(root_cache, objectid, 1);
3436 rec = container_of(cache, struct root_record, cache);
3438 rec = calloc(1, sizeof(*rec));
3440 return ERR_PTR(-ENOMEM);
3441 rec->objectid = objectid;
3442 INIT_LIST_HEAD(&rec->backrefs);
3443 rec->cache.start = objectid;
3444 rec->cache.size = 1;
3446 ret = insert_cache_extent(root_cache, &rec->cache);
3448 return ERR_PTR(-EEXIST);
3453 static struct root_backref *get_root_backref(struct root_record *rec,
3454 u64 ref_root, u64 dir, u64 index,
3455 const char *name, int namelen)
3457 struct root_backref *backref;
3459 list_for_each_entry(backref, &rec->backrefs, list) {
3460 if (backref->ref_root != ref_root || backref->dir != dir ||
3461 backref->namelen != namelen)
3463 if (memcmp(name, backref->name, namelen))
3468 backref = calloc(1, sizeof(*backref) + namelen + 1);
3471 backref->ref_root = ref_root;
3473 backref->index = index;
3474 backref->namelen = namelen;
3475 memcpy(backref->name, name, namelen);
3476 backref->name[namelen] = '\0';
3477 list_add_tail(&backref->list, &rec->backrefs);
3481 static void free_root_record(struct cache_extent *cache)
3483 struct root_record *rec;
3484 struct root_backref *backref;
3486 rec = container_of(cache, struct root_record, cache);
3487 while (!list_empty(&rec->backrefs)) {
3488 backref = to_root_backref(rec->backrefs.next);
3489 list_del(&backref->list);
3496 FREE_EXTENT_CACHE_BASED_TREE(root_recs, free_root_record);
3498 static int add_root_backref(struct cache_tree *root_cache,
3499 u64 root_id, u64 ref_root, u64 dir, u64 index,
3500 const char *name, int namelen,
3501 int item_type, int errors)
3503 struct root_record *rec;
3504 struct root_backref *backref;
3506 rec = get_root_rec(root_cache, root_id);
3507 BUG_ON(IS_ERR(rec));
3508 backref = get_root_backref(rec, ref_root, dir, index, name, namelen);
3511 backref->errors |= errors;
3513 if (item_type != BTRFS_DIR_ITEM_KEY) {
3514 if (backref->found_dir_index || backref->found_back_ref ||
3515 backref->found_forward_ref) {
3516 if (backref->index != index)
3517 backref->errors |= REF_ERR_INDEX_UNMATCH;
3519 backref->index = index;
3523 if (item_type == BTRFS_DIR_ITEM_KEY) {
3524 if (backref->found_forward_ref)
3526 backref->found_dir_item = 1;
3527 } else if (item_type == BTRFS_DIR_INDEX_KEY) {
3528 backref->found_dir_index = 1;
3529 } else if (item_type == BTRFS_ROOT_REF_KEY) {
3530 if (backref->found_forward_ref)
3531 backref->errors |= REF_ERR_DUP_ROOT_REF;
3532 else if (backref->found_dir_item)
3534 backref->found_forward_ref = 1;
3535 } else if (item_type == BTRFS_ROOT_BACKREF_KEY) {
3536 if (backref->found_back_ref)
3537 backref->errors |= REF_ERR_DUP_ROOT_BACKREF;
3538 backref->found_back_ref = 1;
3543 if (backref->found_forward_ref && backref->found_dir_item)
3544 backref->reachable = 1;
3548 static int merge_root_recs(struct btrfs_root *root,
3549 struct cache_tree *src_cache,
3550 struct cache_tree *dst_cache)
3552 struct cache_extent *cache;
3553 struct ptr_node *node;
3554 struct inode_record *rec;
3555 struct inode_backref *backref;
3558 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) {
3559 free_inode_recs_tree(src_cache);
3564 cache = search_cache_extent(src_cache, 0);
3567 node = container_of(cache, struct ptr_node, cache);
3569 remove_cache_extent(src_cache, &node->cache);
3572 ret = is_child_root(root, root->objectid, rec->ino);
3578 list_for_each_entry(backref, &rec->backrefs, list) {
3579 BUG_ON(backref->found_inode_ref);
3580 if (backref->found_dir_item)
3581 add_root_backref(dst_cache, rec->ino,
3582 root->root_key.objectid, backref->dir,
3583 backref->index, backref->name,
3584 backref->namelen, BTRFS_DIR_ITEM_KEY,
3586 if (backref->found_dir_index)
3587 add_root_backref(dst_cache, rec->ino,
3588 root->root_key.objectid, backref->dir,
3589 backref->index, backref->name,
3590 backref->namelen, BTRFS_DIR_INDEX_KEY,
3594 free_inode_rec(rec);
3601 static int check_root_refs(struct btrfs_root *root,
3602 struct cache_tree *root_cache)
3604 struct root_record *rec;
3605 struct root_record *ref_root;
3606 struct root_backref *backref;
3607 struct cache_extent *cache;
3613 rec = get_root_rec(root_cache, BTRFS_FS_TREE_OBJECTID);
3614 BUG_ON(IS_ERR(rec));
3617 /* fixme: this can not detect circular references */
3620 cache = search_cache_extent(root_cache, 0);
3624 rec = container_of(cache, struct root_record, cache);
3625 cache = next_cache_extent(cache);
3627 if (rec->found_ref == 0)
3630 list_for_each_entry(backref, &rec->backrefs, list) {
3631 if (!backref->reachable)
3634 ref_root = get_root_rec(root_cache,
3636 BUG_ON(IS_ERR(ref_root));
3637 if (ref_root->found_ref > 0)
3640 backref->reachable = 0;
3642 if (rec->found_ref == 0)
3648 cache = search_cache_extent(root_cache, 0);
3652 rec = container_of(cache, struct root_record, cache);
3653 cache = next_cache_extent(cache);
3655 if (rec->found_ref == 0 &&
3656 rec->objectid >= BTRFS_FIRST_FREE_OBJECTID &&
3657 rec->objectid <= BTRFS_LAST_FREE_OBJECTID) {
3658 ret = check_orphan_item(root->fs_info->tree_root,
3664 * If we don't have a root item then we likely just have
3665 * a dir item in a snapshot for this root but no actual
3666 * ref key or anything so it's meaningless.
3668 if (!rec->found_root_item)
3671 fprintf(stderr, "fs tree %llu not referenced\n",
3672 (unsigned long long)rec->objectid);
3676 if (rec->found_ref > 0 && !rec->found_root_item)
3678 list_for_each_entry(backref, &rec->backrefs, list) {
3679 if (!backref->found_dir_item)
3680 backref->errors |= REF_ERR_NO_DIR_ITEM;
3681 if (!backref->found_dir_index)
3682 backref->errors |= REF_ERR_NO_DIR_INDEX;
3683 if (!backref->found_back_ref)
3684 backref->errors |= REF_ERR_NO_ROOT_BACKREF;
3685 if (!backref->found_forward_ref)
3686 backref->errors |= REF_ERR_NO_ROOT_REF;
3687 if (backref->reachable && backref->errors)
3694 fprintf(stderr, "fs tree %llu refs %u %s\n",
3695 (unsigned long long)rec->objectid, rec->found_ref,
3696 rec->found_root_item ? "" : "not found");
3698 list_for_each_entry(backref, &rec->backrefs, list) {
3699 if (!backref->reachable)
3701 if (!backref->errors && rec->found_root_item)
3703 fprintf(stderr, "\tunresolved ref root %llu dir %llu"
3704 " index %llu namelen %u name %s errors %x\n",
3705 (unsigned long long)backref->ref_root,
3706 (unsigned long long)backref->dir,
3707 (unsigned long long)backref->index,
3708 backref->namelen, backref->name,
3710 print_ref_error(backref->errors);
3713 return errors > 0 ? 1 : 0;
3716 static int process_root_ref(struct extent_buffer *eb, int slot,
3717 struct btrfs_key *key,
3718 struct cache_tree *root_cache)
3724 struct btrfs_root_ref *ref;
3725 char namebuf[BTRFS_NAME_LEN];
3728 ref = btrfs_item_ptr(eb, slot, struct btrfs_root_ref);
3730 dirid = btrfs_root_ref_dirid(eb, ref);
3731 index = btrfs_root_ref_sequence(eb, ref);
3732 name_len = btrfs_root_ref_name_len(eb, ref);
3734 if (name_len <= BTRFS_NAME_LEN) {
3738 len = BTRFS_NAME_LEN;
3739 error = REF_ERR_NAME_TOO_LONG;
3741 read_extent_buffer(eb, namebuf, (unsigned long)(ref + 1), len);
3743 if (key->type == BTRFS_ROOT_REF_KEY) {
3744 add_root_backref(root_cache, key->offset, key->objectid, dirid,
3745 index, namebuf, len, key->type, error);
3747 add_root_backref(root_cache, key->objectid, key->offset, dirid,
3748 index, namebuf, len, key->type, error);
3753 static void free_corrupt_block(struct cache_extent *cache)
3755 struct btrfs_corrupt_block *corrupt;
3757 corrupt = container_of(cache, struct btrfs_corrupt_block, cache);
3761 FREE_EXTENT_CACHE_BASED_TREE(corrupt_blocks, free_corrupt_block);
3764 * Repair the btree of the given root.
3766 * The fix is to remove the node key in corrupt_blocks cache_tree.
3767 * and rebalance the tree.
3768 * After the fix, the btree should be writeable.
3770 static int repair_btree(struct btrfs_root *root,
3771 struct cache_tree *corrupt_blocks)
3773 struct btrfs_trans_handle *trans;
3774 struct btrfs_path path;
3775 struct btrfs_corrupt_block *corrupt;
3776 struct cache_extent *cache;
3777 struct btrfs_key key;
3782 if (cache_tree_empty(corrupt_blocks))
3785 trans = btrfs_start_transaction(root, 1);
3786 if (IS_ERR(trans)) {
3787 ret = PTR_ERR(trans);
3788 fprintf(stderr, "Error starting transaction: %s\n",
3792 btrfs_init_path(&path);
3793 cache = first_cache_extent(corrupt_blocks);
3795 corrupt = container_of(cache, struct btrfs_corrupt_block,
3797 level = corrupt->level;
3798 path.lowest_level = level;
3799 key.objectid = corrupt->key.objectid;
3800 key.type = corrupt->key.type;
3801 key.offset = corrupt->key.offset;
3804 * Here we don't want to do any tree balance, since it may
3805 * cause a balance with corrupted brother leaf/node,
3806 * so ins_len set to 0 here.
3807 * Balance will be done after all corrupt node/leaf is deleted.
3809 ret = btrfs_search_slot(trans, root, &key, &path, 0, 1);
3812 offset = btrfs_node_blockptr(path.nodes[level],
3815 /* Remove the ptr */
3816 ret = btrfs_del_ptr(trans, root, &path, level,
3821 * Remove the corresponding extent
3822 * return value is not concerned.
3824 btrfs_release_path(&path);
3825 ret = btrfs_free_extent(trans, root, offset, root->nodesize,
3826 0, root->root_key.objectid,
3828 cache = next_cache_extent(cache);
3831 /* Balance the btree using btrfs_search_slot() */
3832 cache = first_cache_extent(corrupt_blocks);
3834 corrupt = container_of(cache, struct btrfs_corrupt_block,
3836 memcpy(&key, &corrupt->key, sizeof(key));
3837 ret = btrfs_search_slot(trans, root, &key, &path, -1, 1);
3840 /* return will always >0 since it won't find the item */
3842 btrfs_release_path(&path);
3843 cache = next_cache_extent(cache);
3846 btrfs_commit_transaction(trans, root);
3847 btrfs_release_path(&path);
3851 static int check_fs_root(struct btrfs_root *root,
3852 struct cache_tree *root_cache,
3853 struct walk_control *wc)
3859 struct btrfs_path path;
3860 struct shared_node root_node;
3861 struct root_record *rec;
3862 struct btrfs_root_item *root_item = &root->root_item;
3863 struct cache_tree corrupt_blocks;
3864 struct orphan_data_extent *orphan;
3865 struct orphan_data_extent *tmp;
3866 enum btrfs_tree_block_status status;
3867 struct node_refs nrefs;
3870 * Reuse the corrupt_block cache tree to record corrupted tree block
3872 * Unlike the usage in extent tree check, here we do it in a per
3873 * fs/subvol tree base.
3875 cache_tree_init(&corrupt_blocks);
3876 root->fs_info->corrupt_blocks = &corrupt_blocks;
3878 if (root->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID) {
3879 rec = get_root_rec(root_cache, root->root_key.objectid);
3880 BUG_ON(IS_ERR(rec));
3881 if (btrfs_root_refs(root_item) > 0)
3882 rec->found_root_item = 1;
3885 btrfs_init_path(&path);
3886 memset(&root_node, 0, sizeof(root_node));
3887 cache_tree_init(&root_node.root_cache);
3888 cache_tree_init(&root_node.inode_cache);
3889 memset(&nrefs, 0, sizeof(nrefs));
3891 /* Move the orphan extent record to corresponding inode_record */
3892 list_for_each_entry_safe(orphan, tmp,
3893 &root->orphan_data_extents, list) {
3894 struct inode_record *inode;
3896 inode = get_inode_rec(&root_node.inode_cache, orphan->objectid,
3898 BUG_ON(IS_ERR(inode));
3899 inode->errors |= I_ERR_FILE_EXTENT_ORPHAN;
3900 list_move(&orphan->list, &inode->orphan_extents);
3903 level = btrfs_header_level(root->node);
3904 memset(wc->nodes, 0, sizeof(wc->nodes));
3905 wc->nodes[level] = &root_node;
3906 wc->active_node = level;
3907 wc->root_level = level;
3909 /* We may not have checked the root block, lets do that now */
3910 if (btrfs_is_leaf(root->node))
3911 status = btrfs_check_leaf(root, NULL, root->node);
3913 status = btrfs_check_node(root, NULL, root->node);
3914 if (status != BTRFS_TREE_BLOCK_CLEAN)
3917 if (btrfs_root_refs(root_item) > 0 ||
3918 btrfs_disk_key_objectid(&root_item->drop_progress) == 0) {
3919 path.nodes[level] = root->node;
3920 extent_buffer_get(root->node);
3921 path.slots[level] = 0;
3923 struct btrfs_key key;
3924 struct btrfs_disk_key found_key;
3926 btrfs_disk_key_to_cpu(&key, &root_item->drop_progress);
3927 level = root_item->drop_level;
3928 path.lowest_level = level;
3929 if (level > btrfs_header_level(root->node) ||
3930 level >= BTRFS_MAX_LEVEL) {
3931 error("ignoring invalid drop level: %u", level);
3934 wret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
3937 btrfs_node_key(path.nodes[level], &found_key,
3939 WARN_ON(memcmp(&found_key, &root_item->drop_progress,
3940 sizeof(found_key)));
3944 wret = walk_down_tree(root, &path, wc, &level, &nrefs);
3950 wret = walk_up_tree(root, &path, wc, &level);
3957 btrfs_release_path(&path);
3959 if (!cache_tree_empty(&corrupt_blocks)) {
3960 struct cache_extent *cache;
3961 struct btrfs_corrupt_block *corrupt;
3963 printf("The following tree block(s) is corrupted in tree %llu:\n",
3964 root->root_key.objectid);
3965 cache = first_cache_extent(&corrupt_blocks);
3967 corrupt = container_of(cache,
3968 struct btrfs_corrupt_block,
3970 printf("\ttree block bytenr: %llu, level: %d, node key: (%llu, %u, %llu)\n",
3971 cache->start, corrupt->level,
3972 corrupt->key.objectid, corrupt->key.type,
3973 corrupt->key.offset);
3974 cache = next_cache_extent(cache);
3977 printf("Try to repair the btree for root %llu\n",
3978 root->root_key.objectid);
3979 ret = repair_btree(root, &corrupt_blocks);
3981 fprintf(stderr, "Failed to repair btree: %s\n",
3984 printf("Btree for root %llu is fixed\n",
3985 root->root_key.objectid);
3989 err = merge_root_recs(root, &root_node.root_cache, root_cache);
3993 if (root_node.current) {
3994 root_node.current->checked = 1;
3995 maybe_free_inode_rec(&root_node.inode_cache,
3999 err = check_inode_recs(root, &root_node.inode_cache);
4003 free_corrupt_blocks_tree(&corrupt_blocks);
4004 root->fs_info->corrupt_blocks = NULL;
4005 free_orphan_data_extents(&root->orphan_data_extents);
4009 static int fs_root_objectid(u64 objectid)
4011 if (objectid == BTRFS_TREE_RELOC_OBJECTID ||
4012 objectid == BTRFS_DATA_RELOC_TREE_OBJECTID)
4014 return is_fstree(objectid);
4017 static int check_fs_roots(struct btrfs_root *root,
4018 struct cache_tree *root_cache)
4020 struct btrfs_path path;
4021 struct btrfs_key key;
4022 struct walk_control wc;
4023 struct extent_buffer *leaf, *tree_node;
4024 struct btrfs_root *tmp_root;
4025 struct btrfs_root *tree_root = root->fs_info->tree_root;
4029 if (ctx.progress_enabled) {
4030 ctx.tp = TASK_FS_ROOTS;
4031 task_start(ctx.info);
4035 * Just in case we made any changes to the extent tree that weren't
4036 * reflected into the free space cache yet.
4039 reset_cached_block_groups(root->fs_info);
4040 memset(&wc, 0, sizeof(wc));
4041 cache_tree_init(&wc.shared);
4042 btrfs_init_path(&path);
4047 key.type = BTRFS_ROOT_ITEM_KEY;
4048 ret = btrfs_search_slot(NULL, tree_root, &key, &path, 0, 0);
4053 tree_node = tree_root->node;
4055 if (tree_node != tree_root->node) {
4056 free_root_recs_tree(root_cache);
4057 btrfs_release_path(&path);
4060 leaf = path.nodes[0];
4061 if (path.slots[0] >= btrfs_header_nritems(leaf)) {
4062 ret = btrfs_next_leaf(tree_root, &path);
4068 leaf = path.nodes[0];
4070 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
4071 if (key.type == BTRFS_ROOT_ITEM_KEY &&
4072 fs_root_objectid(key.objectid)) {
4073 if (key.objectid == BTRFS_TREE_RELOC_OBJECTID) {
4074 tmp_root = btrfs_read_fs_root_no_cache(
4075 root->fs_info, &key);
4077 key.offset = (u64)-1;
4078 tmp_root = btrfs_read_fs_root(
4079 root->fs_info, &key);
4081 if (IS_ERR(tmp_root)) {
4085 ret = check_fs_root(tmp_root, root_cache, &wc);
4086 if (ret == -EAGAIN) {
4087 free_root_recs_tree(root_cache);
4088 btrfs_release_path(&path);
4093 if (key.objectid == BTRFS_TREE_RELOC_OBJECTID)
4094 btrfs_free_fs_root(tmp_root);
4095 } else if (key.type == BTRFS_ROOT_REF_KEY ||
4096 key.type == BTRFS_ROOT_BACKREF_KEY) {
4097 process_root_ref(leaf, path.slots[0], &key,
4104 btrfs_release_path(&path);
4106 free_extent_cache_tree(&wc.shared);
4107 if (!cache_tree_empty(&wc.shared))
4108 fprintf(stderr, "warning line %d\n", __LINE__);
4110 task_stop(ctx.info);
4116 * Find DIR_ITEM/DIR_INDEX for the given key and check it with the specified
4117 * INODE_REF/INODE_EXTREF match.
4119 * @root: the root of the fs/file tree
4120 * @ref_key: the key of the INODE_REF/INODE_EXTREF
4121 * @key: the key of the DIR_ITEM/DIR_INDEX
4122 * @index: the index in the INODE_REF/INODE_EXTREF, be used to
4123 * distinguish root_dir between normal dir/file
4124 * @name: the name in the INODE_REF/INODE_EXTREF
4125 * @namelen: the length of name in the INODE_REF/INODE_EXTREF
4126 * @mode: the st_mode of INODE_ITEM
4128 * Return 0 if no error occurred.
4129 * Return ROOT_DIR_ERROR if found DIR_ITEM/DIR_INDEX for root_dir.
4130 * Return DIR_ITEM_MISSING if couldn't find DIR_ITEM/DIR_INDEX for normal
4132 * Return DIR_ITEM_MISMATCH if INODE_REF/INODE_EXTREF and DIR_ITEM/DIR_INDEX
4133 * not match for normal dir/file.
4135 static int find_dir_item(struct btrfs_root *root, struct btrfs_key *ref_key,
4136 struct btrfs_key *key, u64 index, char *name,
4137 u32 namelen, u32 mode)
4139 struct btrfs_path path;
4140 struct extent_buffer *node;
4141 struct btrfs_dir_item *di;
4142 struct btrfs_key location;
4143 char namebuf[BTRFS_NAME_LEN] = {0};
4153 btrfs_init_path(&path);
4154 ret = btrfs_search_slot(NULL, root, key, &path, 0, 0);
4156 ret = DIR_ITEM_MISSING;
4160 /* Process root dir and goto out*/
4163 ret = ROOT_DIR_ERROR;
4165 "root %llu INODE %s[%llu %llu] ROOT_DIR shouldn't have %s",
4167 ref_key->type == BTRFS_INODE_REF_KEY ?
4169 ref_key->objectid, ref_key->offset,
4170 key->type == BTRFS_DIR_ITEM_KEY ?
4171 "DIR_ITEM" : "DIR_INDEX");
4179 /* Process normal file/dir */
4181 ret = DIR_ITEM_MISSING;
4183 "root %llu INODE %s[%llu %llu] doesn't have related %s[%llu %llu] namelen %u filename %s filetype %d",
4185 ref_key->type == BTRFS_INODE_REF_KEY ? "REF" : "EXTREF",
4186 ref_key->objectid, ref_key->offset,
4187 key->type == BTRFS_DIR_ITEM_KEY ?
4188 "DIR_ITEM" : "DIR_INDEX",
4189 key->objectid, key->offset, namelen, name,
4190 imode_to_type(mode));
4194 /* Check whether inode_id/filetype/name match */
4195 node = path.nodes[0];
4196 slot = path.slots[0];
4197 di = btrfs_item_ptr(node, slot, struct btrfs_dir_item);
4198 total = btrfs_item_size_nr(node, slot);
4199 while (cur < total) {
4200 ret = DIR_ITEM_MISMATCH;
4201 name_len = btrfs_dir_name_len(node, di);
4202 data_len = btrfs_dir_data_len(node, di);
4204 btrfs_dir_item_key_to_cpu(node, di, &location);
4205 if (location.objectid != ref_key->objectid ||
4206 location.type != BTRFS_INODE_ITEM_KEY ||
4207 location.offset != 0)
4210 filetype = btrfs_dir_type(node, di);
4211 if (imode_to_type(mode) != filetype)
4214 if (name_len <= BTRFS_NAME_LEN) {
4217 len = BTRFS_NAME_LEN;
4218 warning("root %llu %s[%llu %llu] name too long %u, trimmed",
4220 key->type == BTRFS_DIR_ITEM_KEY ?
4221 "DIR_ITEM" : "DIR_INDEX",
4222 key->objectid, key->offset, name_len);
4224 read_extent_buffer(node, namebuf, (unsigned long)(di + 1), len);
4225 if (len != namelen || strncmp(namebuf, name, len))
4231 len = sizeof(*di) + name_len + data_len;
4232 di = (struct btrfs_dir_item *)((char *)di + len);
4235 if (ret == DIR_ITEM_MISMATCH)
4237 "root %llu INODE %s[%llu %llu] and %s[%llu %llu] mismatch namelen %u filename %s filetype %d",
4239 ref_key->type == BTRFS_INODE_REF_KEY ? "REF" : "EXTREF",
4240 ref_key->objectid, ref_key->offset,
4241 key->type == BTRFS_DIR_ITEM_KEY ?
4242 "DIR_ITEM" : "DIR_INDEX",
4243 key->objectid, key->offset, namelen, name,
4244 imode_to_type(mode));
4246 btrfs_release_path(&path);
4251 * Traverse the given INODE_REF and call find_dir_item() to find related
4252 * DIR_ITEM/DIR_INDEX.
4254 * @root: the root of the fs/file tree
4255 * @ref_key: the key of the INODE_REF
4256 * @refs: the count of INODE_REF
4257 * @mode: the st_mode of INODE_ITEM
4259 * Return 0 if no error occurred.
4261 static int check_inode_ref(struct btrfs_root *root, struct btrfs_key *ref_key,
4262 struct extent_buffer *node, int slot, u64 *refs,
4265 struct btrfs_key key;
4266 struct btrfs_inode_ref *ref;
4267 char namebuf[BTRFS_NAME_LEN] = {0};
4275 ref = btrfs_item_ptr(node, slot, struct btrfs_inode_ref);
4276 total = btrfs_item_size_nr(node, slot);
4279 /* Update inode ref count */
4282 index = btrfs_inode_ref_index(node, ref);
4283 name_len = btrfs_inode_ref_name_len(node, ref);
4284 if (name_len <= BTRFS_NAME_LEN) {
4287 len = BTRFS_NAME_LEN;
4288 warning("root %llu INODE_REF[%llu %llu] name too long",
4289 root->objectid, ref_key->objectid, ref_key->offset);
4292 read_extent_buffer(node, namebuf, (unsigned long)(ref + 1), len);
4294 /* Check root dir ref name */
4295 if (index == 0 && strncmp(namebuf, "..", name_len)) {
4296 error("root %llu INODE_REF[%llu %llu] ROOT_DIR name shouldn't be %s",
4297 root->objectid, ref_key->objectid, ref_key->offset,
4299 err |= ROOT_DIR_ERROR;
4302 /* Find related DIR_INDEX */
4303 key.objectid = ref_key->offset;
4304 key.type = BTRFS_DIR_INDEX_KEY;
4306 ret = find_dir_item(root, ref_key, &key, index, namebuf, len, mode);
4309 /* Find related dir_item */
4310 key.objectid = ref_key->offset;
4311 key.type = BTRFS_DIR_ITEM_KEY;
4312 key.offset = btrfs_name_hash(namebuf, len);
4313 ret = find_dir_item(root, ref_key, &key, index, namebuf, len, mode);
4316 len = sizeof(*ref) + name_len;
4317 ref = (struct btrfs_inode_ref *)((char *)ref + len);
4326 * Traverse the given INODE_EXTREF and call find_dir_item() to find related
4327 * DIR_ITEM/DIR_INDEX.
4329 * @root: the root of the fs/file tree
4330 * @ref_key: the key of the INODE_EXTREF
4331 * @refs: the count of INODE_EXTREF
4332 * @mode: the st_mode of INODE_ITEM
4334 * Return 0 if no error occurred.
4336 static int check_inode_extref(struct btrfs_root *root,
4337 struct btrfs_key *ref_key,
4338 struct extent_buffer *node, int slot, u64 *refs,
4341 struct btrfs_key key;
4342 struct btrfs_inode_extref *extref;
4343 char namebuf[BTRFS_NAME_LEN] = {0};
4353 extref = btrfs_item_ptr(node, slot, struct btrfs_inode_extref);
4354 total = btrfs_item_size_nr(node, slot);
4357 /* update inode ref count */
4359 name_len = btrfs_inode_extref_name_len(node, extref);
4360 index = btrfs_inode_extref_index(node, extref);
4361 parent = btrfs_inode_extref_parent(node, extref);
4362 if (name_len <= BTRFS_NAME_LEN) {
4365 len = BTRFS_NAME_LEN;
4366 warning("root %llu INODE_EXTREF[%llu %llu] name too long",
4367 root->objectid, ref_key->objectid, ref_key->offset);
4369 read_extent_buffer(node, namebuf, (unsigned long)(extref + 1), len);
4371 /* Check root dir ref name */
4372 if (index == 0 && strncmp(namebuf, "..", name_len)) {
4373 error("root %llu INODE_EXTREF[%llu %llu] ROOT_DIR name shouldn't be %s",
4374 root->objectid, ref_key->objectid, ref_key->offset,
4376 err |= ROOT_DIR_ERROR;
4379 /* find related dir_index */
4380 key.objectid = parent;
4381 key.type = BTRFS_DIR_INDEX_KEY;
4383 ret = find_dir_item(root, ref_key, &key, index, namebuf, len, mode);
4386 /* find related dir_item */
4387 key.objectid = parent;
4388 key.type = BTRFS_DIR_ITEM_KEY;
4389 key.offset = btrfs_name_hash(namebuf, len);
4390 ret = find_dir_item(root, ref_key, &key, index, namebuf, len, mode);
4393 len = sizeof(*extref) + name_len;
4394 extref = (struct btrfs_inode_extref *)((char *)extref + len);
4404 * Find INODE_REF/INODE_EXTREF for the given key and check it with the specified
4405 * DIR_ITEM/DIR_INDEX match.
4407 * @root: the root of the fs/file tree
4408 * @key: the key of the INODE_REF/INODE_EXTREF
4409 * @name: the name in the INODE_REF/INODE_EXTREF
4410 * @namelen: the length of name in the INODE_REF/INODE_EXTREF
4411 * @index: the index in the INODE_REF/INODE_EXTREF, for DIR_ITEM set index
4413 * @ext_ref: the EXTENDED_IREF feature
4415 * Return 0 if no error occurred.
4416 * Return >0 for error bitmap
4418 static int find_inode_ref(struct btrfs_root *root, struct btrfs_key *key,
4419 char *name, int namelen, u64 index,
4420 unsigned int ext_ref)
4422 struct btrfs_path path;
4423 struct btrfs_inode_ref *ref;
4424 struct btrfs_inode_extref *extref;
4425 struct extent_buffer *node;
4426 char ref_namebuf[BTRFS_NAME_LEN] = {0};
4437 btrfs_init_path(&path);
4438 ret = btrfs_search_slot(NULL, root, key, &path, 0, 0);
4440 ret = INODE_REF_MISSING;
4444 node = path.nodes[0];
4445 slot = path.slots[0];
4447 ref = btrfs_item_ptr(node, slot, struct btrfs_inode_ref);
4448 total = btrfs_item_size_nr(node, slot);
4450 /* Iterate all entry of INODE_REF */
4451 while (cur < total) {
4452 ret = INODE_REF_MISSING;
4454 ref_namelen = btrfs_inode_ref_name_len(node, ref);
4455 ref_index = btrfs_inode_ref_index(node, ref);
4456 if (index != (u64)-1 && index != ref_index)
4459 if (ref_namelen <= BTRFS_NAME_LEN) {
4462 len = BTRFS_NAME_LEN;
4463 warning("root %llu INODE %s[%llu %llu] name too long",
4465 key->type == BTRFS_INODE_REF_KEY ?
4467 key->objectid, key->offset);
4469 read_extent_buffer(node, ref_namebuf, (unsigned long)(ref + 1),
4472 if (len != namelen || strncmp(ref_namebuf, name, len))
4478 len = sizeof(*ref) + ref_namelen;
4479 ref = (struct btrfs_inode_ref *)((char *)ref + len);
4484 /* Skip if not support EXTENDED_IREF feature */
4488 btrfs_release_path(&path);
4489 btrfs_init_path(&path);
4491 dir_id = key->offset;
4492 key->type = BTRFS_INODE_EXTREF_KEY;
4493 key->offset = btrfs_extref_hash(dir_id, name, namelen);
4495 ret = btrfs_search_slot(NULL, root, key, &path, 0, 0);
4497 ret = INODE_REF_MISSING;
4501 node = path.nodes[0];
4502 slot = path.slots[0];
4504 extref = btrfs_item_ptr(node, slot, struct btrfs_inode_extref);
4506 total = btrfs_item_size_nr(node, slot);
4508 /* Iterate all entry of INODE_EXTREF */
4509 while (cur < total) {
4510 ret = INODE_REF_MISSING;
4512 ref_namelen = btrfs_inode_extref_name_len(node, extref);
4513 ref_index = btrfs_inode_extref_index(node, extref);
4514 parent = btrfs_inode_extref_parent(node, extref);
4515 if (index != (u64)-1 && index != ref_index)
4518 if (parent != dir_id)
4521 if (ref_namelen <= BTRFS_NAME_LEN) {
4524 len = BTRFS_NAME_LEN;
4525 warning("Warning: root %llu INODE %s[%llu %llu] name too long\n",
4527 key->type == BTRFS_INODE_REF_KEY ?
4529 key->objectid, key->offset);
4531 read_extent_buffer(node, ref_namebuf,
4532 (unsigned long)(extref + 1), len);
4534 if (len != namelen || strncmp(ref_namebuf, name, len))
4541 len = sizeof(*extref) + ref_namelen;
4542 extref = (struct btrfs_inode_extref *)((char *)extref + len);
4547 btrfs_release_path(&path);
4552 * Traverse the given DIR_ITEM/DIR_INDEX and check related INODE_ITEM and
4553 * call find_inode_ref() to check related INODE_REF/INODE_EXTREF.
4555 * @root: the root of the fs/file tree
4556 * @key: the key of the INODE_REF/INODE_EXTREF
4557 * @size: the st_size of the INODE_ITEM
4558 * @ext_ref: the EXTENDED_IREF feature
4560 * Return 0 if no error occurred.
4562 static int check_dir_item(struct btrfs_root *root, struct btrfs_key *key,
4563 struct extent_buffer *node, int slot, u64 *size,
4564 unsigned int ext_ref)
4566 struct btrfs_dir_item *di;
4567 struct btrfs_inode_item *ii;
4568 struct btrfs_path path;
4569 struct btrfs_key location;
4570 char namebuf[BTRFS_NAME_LEN] = {0};
4583 * For DIR_ITEM set index to (u64)-1, so that find_inode_ref
4584 * ignore index check.
4586 index = (key->type == BTRFS_DIR_INDEX_KEY) ? key->offset : (u64)-1;
4588 di = btrfs_item_ptr(node, slot, struct btrfs_dir_item);
4589 total = btrfs_item_size_nr(node, slot);
4591 while (cur < total) {
4592 data_len = btrfs_dir_data_len(node, di);
4594 error("root %llu %s[%llu %llu] data_len shouldn't be %u",
4595 root->objectid, key->type == BTRFS_DIR_ITEM_KEY ?
4596 "DIR_ITEM" : "DIR_INDEX",
4597 key->objectid, key->offset, data_len);
4599 name_len = btrfs_dir_name_len(node, di);
4600 if (name_len <= BTRFS_NAME_LEN) {
4603 len = BTRFS_NAME_LEN;
4604 warning("root %llu %s[%llu %llu] name too long",
4606 key->type == BTRFS_DIR_ITEM_KEY ?
4607 "DIR_ITEM" : "DIR_INDEX",
4608 key->objectid, key->offset);
4610 (*size) += name_len;
4612 read_extent_buffer(node, namebuf, (unsigned long)(di + 1), len);
4613 filetype = btrfs_dir_type(node, di);
4615 btrfs_init_path(&path);
4616 btrfs_dir_item_key_to_cpu(node, di, &location);
4618 /* Ignore related ROOT_ITEM check */
4619 if (location.type == BTRFS_ROOT_ITEM_KEY)
4622 /* Check relative INODE_ITEM(existence/filetype) */
4623 ret = btrfs_search_slot(NULL, root, &location, &path, 0, 0);
4625 err |= INODE_ITEM_MISSING;
4626 error("root %llu %s[%llu %llu] couldn't find relative INODE_ITEM[%llu] namelen %u filename %s filetype %x",
4627 root->objectid, key->type == BTRFS_DIR_ITEM_KEY ?
4628 "DIR_ITEM" : "DIR_INDEX", key->objectid,
4629 key->offset, location.objectid, name_len,
4634 ii = btrfs_item_ptr(path.nodes[0], path.slots[0],
4635 struct btrfs_inode_item);
4636 mode = btrfs_inode_mode(path.nodes[0], ii);
4638 if (imode_to_type(mode) != filetype) {
4639 err |= INODE_ITEM_MISMATCH;
4640 error("root %llu %s[%llu %llu] relative INODE_ITEM filetype mismatch namelen %u filename %s filetype %d",
4641 root->objectid, key->type == BTRFS_DIR_ITEM_KEY ?
4642 "DIR_ITEM" : "DIR_INDEX", key->objectid,
4643 key->offset, name_len, namebuf, filetype);
4646 /* Check relative INODE_REF/INODE_EXTREF */
4647 location.type = BTRFS_INODE_REF_KEY;
4648 location.offset = key->objectid;
4649 ret = find_inode_ref(root, &location, namebuf, len,
4652 if (ret & INODE_REF_MISSING)
4653 error("root %llu %s[%llu %llu] relative INODE_REF missing namelen %u filename %s filetype %d",
4654 root->objectid, key->type == BTRFS_DIR_ITEM_KEY ?
4655 "DIR_ITEM" : "DIR_INDEX", key->objectid,
4656 key->offset, name_len, namebuf, filetype);
4659 btrfs_release_path(&path);
4660 len = sizeof(*di) + name_len + data_len;
4661 di = (struct btrfs_dir_item *)((char *)di + len);
4664 if (key->type == BTRFS_DIR_INDEX_KEY && cur < total) {
4665 error("root %llu DIR_INDEX[%llu %llu] should contain only one entry",
4666 root->objectid, key->objectid, key->offset);
4675 * Check file extent datasum/hole, update the size of the file extents,
4676 * check and update the last offset of the file extent.
4678 * @root: the root of fs/file tree.
4679 * @fkey: the key of the file extent.
4680 * @nodatasum: INODE_NODATASUM feature.
4681 * @size: the sum of all EXTENT_DATA items size for this inode.
4682 * @end: the offset of the last extent.
4684 * Return 0 if no error occurred.
4686 static int check_file_extent(struct btrfs_root *root, struct btrfs_key *fkey,
4687 struct extent_buffer *node, int slot,
4688 unsigned int nodatasum, u64 *size, u64 *end)
4690 struct btrfs_file_extent_item *fi;
4693 u64 extent_num_bytes;
4695 unsigned int extent_type;
4696 unsigned int is_hole;
4700 fi = btrfs_item_ptr(node, slot, struct btrfs_file_extent_item);
4702 extent_type = btrfs_file_extent_type(node, fi);
4703 /* Skip if file extent is inline */
4704 if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
4705 struct btrfs_item *e = btrfs_item_nr(slot);
4706 u32 item_inline_len;
4708 item_inline_len = btrfs_file_extent_inline_item_len(node, e);
4709 extent_num_bytes = btrfs_file_extent_inline_len(node, slot, fi);
4710 if (extent_num_bytes == 0 ||
4711 extent_num_bytes != item_inline_len)
4712 err |= FILE_EXTENT_ERROR;
4713 *size += extent_num_bytes;
4717 /* Check extent type */
4718 if (extent_type != BTRFS_FILE_EXTENT_REG &&
4719 extent_type != BTRFS_FILE_EXTENT_PREALLOC) {
4720 err |= FILE_EXTENT_ERROR;
4721 error("root %llu EXTENT_DATA[%llu %llu] type bad",
4722 root->objectid, fkey->objectid, fkey->offset);
4726 /* Check REG_EXTENT/PREALLOC_EXTENT */
4727 disk_bytenr = btrfs_file_extent_disk_bytenr(node, fi);
4728 disk_num_bytes = btrfs_file_extent_disk_num_bytes(node, fi);
4729 extent_num_bytes = btrfs_file_extent_num_bytes(node, fi);
4730 is_hole = (disk_bytenr == 0) && (disk_num_bytes == 0);
4732 /* Check EXTENT_DATA datasum */
4733 ret = count_csum_range(root, disk_bytenr, disk_num_bytes, &found);
4734 if (found > 0 && nodatasum) {
4735 err |= ODD_CSUM_ITEM;
4736 error("root %llu EXTENT_DATA[%llu %llu] nodatasum shouldn't have datasum",
4737 root->objectid, fkey->objectid, fkey->offset);
4738 } else if (extent_type == BTRFS_FILE_EXTENT_REG && !nodatasum &&
4740 (ret < 0 || found == 0 || found < disk_num_bytes)) {
4741 err |= CSUM_ITEM_MISSING;
4742 error("root %llu EXTENT_DATA[%llu %llu] datasum missing",
4743 root->objectid, fkey->objectid, fkey->offset);
4744 } else if (extent_type == BTRFS_FILE_EXTENT_PREALLOC && found > 0) {
4745 err |= ODD_CSUM_ITEM;
4746 error("root %llu EXTENT_DATA[%llu %llu] prealloc shouldn't have datasum",
4747 root->objectid, fkey->objectid, fkey->offset);
4750 /* Check EXTENT_DATA hole */
4751 if (no_holes && is_hole) {
4752 err |= FILE_EXTENT_ERROR;
4753 error("root %llu EXTENT_DATA[%llu %llu] shouldn't be hole",
4754 root->objectid, fkey->objectid, fkey->offset);
4755 } else if (!no_holes && *end != fkey->offset) {
4756 err |= FILE_EXTENT_ERROR;
4757 error("root %llu EXTENT_DATA[%llu %llu] interrupt",
4758 root->objectid, fkey->objectid, fkey->offset);
4761 *end += extent_num_bytes;
4763 *size += extent_num_bytes;
4769 * Check INODE_ITEM and related ITEMs (the same inode number)
4770 * 1. check link count
4771 * 2. check inode ref/extref
4772 * 3. check dir item/index
4774 * @ext_ref: the EXTENDED_IREF feature
4776 * Return 0 if no error occurred.
4777 * Return >0 for error or hit the traversal is done(by error bitmap)
4779 static int check_inode_item(struct btrfs_root *root, struct btrfs_path *path,
4780 unsigned int ext_ref)
4782 struct extent_buffer *node;
4783 struct btrfs_inode_item *ii;
4784 struct btrfs_key key;
4793 u64 extent_size = 0;
4795 unsigned int nodatasum;
4800 node = path->nodes[0];
4801 slot = path->slots[0];
4803 btrfs_item_key_to_cpu(node, &key, slot);
4804 inode_id = key.objectid;
4806 if (inode_id == BTRFS_ORPHAN_OBJECTID) {
4807 ret = btrfs_next_item(root, path);
4813 ii = btrfs_item_ptr(node, slot, struct btrfs_inode_item);
4814 isize = btrfs_inode_size(node, ii);
4815 nbytes = btrfs_inode_nbytes(node, ii);
4816 mode = btrfs_inode_mode(node, ii);
4817 dir = imode_to_type(mode) == BTRFS_FT_DIR;
4818 nlink = btrfs_inode_nlink(node, ii);
4819 nodatasum = btrfs_inode_flags(node, ii) & BTRFS_INODE_NODATASUM;
4822 ret = btrfs_next_item(root, path);
4824 /* out will fill 'err' rusing current statistics */
4826 } else if (ret > 0) {
4831 node = path->nodes[0];
4832 slot = path->slots[0];
4833 btrfs_item_key_to_cpu(node, &key, slot);
4834 if (key.objectid != inode_id)
4838 case BTRFS_INODE_REF_KEY:
4839 ret = check_inode_ref(root, &key, node, slot, &refs,
4843 case BTRFS_INODE_EXTREF_KEY:
4844 if (key.type == BTRFS_INODE_EXTREF_KEY && !ext_ref)
4845 warning("root %llu EXTREF[%llu %llu] isn't supported",
4846 root->objectid, key.objectid,
4848 ret = check_inode_extref(root, &key, node, slot, &refs,
4852 case BTRFS_DIR_ITEM_KEY:
4853 case BTRFS_DIR_INDEX_KEY:
4855 warning("root %llu INODE[%llu] mode %u shouldn't have DIR_INDEX[%llu %llu]",
4856 root->objectid, inode_id,
4857 imode_to_type(mode), key.objectid,
4860 ret = check_dir_item(root, &key, node, slot, &size,
4864 case BTRFS_EXTENT_DATA_KEY:
4866 warning("root %llu DIR INODE[%llu] shouldn't EXTENT_DATA[%llu %llu]",
4867 root->objectid, inode_id, key.objectid,
4870 ret = check_file_extent(root, &key, node, slot,
4871 nodatasum, &extent_size,
4875 case BTRFS_XATTR_ITEM_KEY:
4878 error("ITEM[%llu %u %llu] UNKNOWN TYPE",
4879 key.objectid, key.type, key.offset);
4884 /* verify INODE_ITEM nlink/isize/nbytes */
4887 err |= LINK_COUNT_ERROR;
4888 error("root %llu DIR INODE[%llu] shouldn't have more than one link(%llu)",
4889 root->objectid, inode_id, nlink);
4893 * Just a warning, as dir inode nbytes is just an
4894 * instructive value.
4896 if (!IS_ALIGNED(nbytes, root->nodesize)) {
4897 warning("root %llu DIR INODE[%llu] nbytes should be aligned to %u",
4898 root->objectid, inode_id, root->nodesize);
4901 if (isize != size) {
4903 error("root %llu DIR INODE [%llu] size(%llu) not equal to %llu",
4904 root->objectid, inode_id, isize, size);
4907 if (nlink != refs) {
4908 err |= LINK_COUNT_ERROR;
4909 error("root %llu INODE[%llu] nlink(%llu) not equal to inode_refs(%llu)",
4910 root->objectid, inode_id, nlink, refs);
4911 } else if (!nlink) {
4915 if (!nbytes && !no_holes && extent_end < isize) {
4916 err |= NBYTES_ERROR;
4917 error("root %llu INODE[%llu] size (%llu) should have a file extent hole",
4918 root->objectid, inode_id, isize);
4921 if (nbytes != extent_size) {
4922 err |= NBYTES_ERROR;
4923 error("root %llu INODE[%llu] nbytes(%llu) not equal to extent_size(%llu)",
4924 root->objectid, inode_id, nbytes, extent_size);
4932 * Iterate all item on the tree and call check_inode_item() to check.
4934 * @root: the root of the tree to be checked.
4935 * @ext_ref: the EXTENDED_IREF feature
4937 * Return 0 if no error found.
4938 * Return <0 for error.
4940 static int check_fs_root_v2(struct btrfs_root *root, unsigned int ext_ref)
4942 struct btrfs_path *path;
4943 struct node_refs nrefs;
4944 struct btrfs_root_item *root_item = &root->root_item;
4948 path = btrfs_alloc_path();
4952 memset(&nrefs, 0, sizeof(nrefs));
4953 level = btrfs_header_level(root->node);
4955 if (btrfs_root_refs(root_item) > 0 ||
4956 btrfs_disk_key_objectid(&root_item->drop_progress) == 0) {
4957 path->nodes[level] = root->node;
4958 path->slots[level] = 0;
4959 extent_buffer_get(root->node);
4961 struct btrfs_key key;
4963 btrfs_disk_key_to_cpu(&key, &root_item->drop_progress);
4964 level = root_item->drop_level;
4965 path->lowest_level = level;
4966 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
4973 wret = walk_down_tree_v2(root, path, &level, &nrefs, ext_ref);
4979 wret = walk_up_tree_v2(root, path, &level);
4987 btrfs_free_path(path);
4992 * Find the relative ref for root_ref and root_backref.
4994 * @root: the root of the root tree.
4995 * @ref_key: the key of the root ref.
4997 * Return 0 if no error occurred.
4999 static int check_root_ref(struct btrfs_root *root, struct btrfs_key *ref_key,
5000 struct extent_buffer *node, int slot)
5002 struct btrfs_path *path;
5003 struct btrfs_key key;
5004 struct btrfs_root_ref *ref;
5005 struct btrfs_root_ref *backref;
5006 char ref_name[BTRFS_NAME_LEN] = {0};
5007 char backref_name[BTRFS_NAME_LEN] = {0};
5013 u32 backref_namelen;
5018 ref = btrfs_item_ptr(node, slot, struct btrfs_root_ref);
5019 ref_dirid = btrfs_root_ref_dirid(node, ref);
5020 ref_seq = btrfs_root_ref_sequence(node, ref);
5021 ref_namelen = btrfs_root_ref_name_len(node, ref);
5023 if (ref_namelen <= BTRFS_NAME_LEN) {
5026 len = BTRFS_NAME_LEN;
5027 warning("%s[%llu %llu] ref_name too long",
5028 ref_key->type == BTRFS_ROOT_REF_KEY ?
5029 "ROOT_REF" : "ROOT_BACKREF", ref_key->objectid,
5032 read_extent_buffer(node, ref_name, (unsigned long)(ref + 1), len);
5034 /* Find relative root_ref */
5035 key.objectid = ref_key->offset;
5036 key.type = BTRFS_ROOT_BACKREF_KEY + BTRFS_ROOT_REF_KEY - ref_key->type;
5037 key.offset = ref_key->objectid;
5039 path = btrfs_alloc_path();
5040 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
5042 err |= ROOT_REF_MISSING;
5043 error("%s[%llu %llu] couldn't find relative ref",
5044 ref_key->type == BTRFS_ROOT_REF_KEY ?
5045 "ROOT_REF" : "ROOT_BACKREF",
5046 ref_key->objectid, ref_key->offset);
5050 backref = btrfs_item_ptr(path->nodes[0], path->slots[0],
5051 struct btrfs_root_ref);
5052 backref_dirid = btrfs_root_ref_dirid(path->nodes[0], backref);
5053 backref_seq = btrfs_root_ref_sequence(path->nodes[0], backref);
5054 backref_namelen = btrfs_root_ref_name_len(path->nodes[0], backref);
5056 if (backref_namelen <= BTRFS_NAME_LEN) {
5057 len = backref_namelen;
5059 len = BTRFS_NAME_LEN;
5060 warning("%s[%llu %llu] ref_name too long",
5061 key.type == BTRFS_ROOT_REF_KEY ?
5062 "ROOT_REF" : "ROOT_BACKREF",
5063 key.objectid, key.offset);
5065 read_extent_buffer(path->nodes[0], backref_name,
5066 (unsigned long)(backref + 1), len);
5068 if (ref_dirid != backref_dirid || ref_seq != backref_seq ||
5069 ref_namelen != backref_namelen ||
5070 strncmp(ref_name, backref_name, len)) {
5071 err |= ROOT_REF_MISMATCH;
5072 error("%s[%llu %llu] mismatch relative ref",
5073 ref_key->type == BTRFS_ROOT_REF_KEY ?
5074 "ROOT_REF" : "ROOT_BACKREF",
5075 ref_key->objectid, ref_key->offset);
5078 btrfs_free_path(path);
5083 * Check all fs/file tree in low_memory mode.
5085 * 1. for fs tree root item, call check_fs_root_v2()
5086 * 2. for fs tree root ref/backref, call check_root_ref()
5088 * Return 0 if no error occurred.
5090 static int check_fs_roots_v2(struct btrfs_fs_info *fs_info)
5092 struct btrfs_root *tree_root = fs_info->tree_root;
5093 struct btrfs_root *cur_root = NULL;
5094 struct btrfs_path *path;
5095 struct btrfs_key key;
5096 struct extent_buffer *node;
5097 unsigned int ext_ref;
5102 ext_ref = btrfs_fs_incompat(fs_info,
5103 BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF);
5105 path = btrfs_alloc_path();
5109 key.objectid = BTRFS_FS_TREE_OBJECTID;
5111 key.type = BTRFS_ROOT_ITEM_KEY;
5113 ret = btrfs_search_slot(NULL, tree_root, &key, path, 0, 0);
5117 } else if (ret > 0) {
5123 node = path->nodes[0];
5124 slot = path->slots[0];
5125 btrfs_item_key_to_cpu(node, &key, slot);
5126 if (key.objectid > BTRFS_LAST_FREE_OBJECTID)
5128 if (key.type == BTRFS_ROOT_ITEM_KEY &&
5129 fs_root_objectid(key.objectid)) {
5130 if (key.objectid == BTRFS_TREE_RELOC_OBJECTID) {
5131 cur_root = btrfs_read_fs_root_no_cache(fs_info,
5134 key.offset = (u64)-1;
5135 cur_root = btrfs_read_fs_root(fs_info, &key);
5138 if (IS_ERR(cur_root)) {
5139 error("Fail to read fs/subvol tree: %lld",
5145 ret = check_fs_root_v2(cur_root, ext_ref);
5148 if (key.objectid == BTRFS_TREE_RELOC_OBJECTID)
5149 btrfs_free_fs_root(cur_root);
5150 } else if (key.type == BTRFS_ROOT_REF_KEY ||
5151 key.type == BTRFS_ROOT_BACKREF_KEY) {
5152 ret = check_root_ref(tree_root, &key, node, slot);
5156 ret = btrfs_next_item(tree_root, path);
5166 btrfs_free_path(path);
5170 static int all_backpointers_checked(struct extent_record *rec, int print_errs)
5172 struct list_head *cur = rec->backrefs.next;
5173 struct extent_backref *back;
5174 struct tree_backref *tback;
5175 struct data_backref *dback;
5179 while(cur != &rec->backrefs) {
5180 back = to_extent_backref(cur);
5182 if (!back->found_extent_tree) {
5186 if (back->is_data) {
5187 dback = to_data_backref(back);
5188 fprintf(stderr, "Backref %llu %s %llu"
5189 " owner %llu offset %llu num_refs %lu"
5190 " not found in extent tree\n",
5191 (unsigned long long)rec->start,
5192 back->full_backref ?
5194 back->full_backref ?
5195 (unsigned long long)dback->parent:
5196 (unsigned long long)dback->root,
5197 (unsigned long long)dback->owner,
5198 (unsigned long long)dback->offset,
5199 (unsigned long)dback->num_refs);
5201 tback = to_tree_backref(back);
5202 fprintf(stderr, "Backref %llu parent %llu"
5203 " root %llu not found in extent tree\n",
5204 (unsigned long long)rec->start,
5205 (unsigned long long)tback->parent,
5206 (unsigned long long)tback->root);
5209 if (!back->is_data && !back->found_ref) {
5213 tback = to_tree_backref(back);
5214 fprintf(stderr, "Backref %llu %s %llu not referenced back %p\n",
5215 (unsigned long long)rec->start,
5216 back->full_backref ? "parent" : "root",
5217 back->full_backref ?
5218 (unsigned long long)tback->parent :
5219 (unsigned long long)tback->root, back);
5221 if (back->is_data) {
5222 dback = to_data_backref(back);
5223 if (dback->found_ref != dback->num_refs) {
5227 fprintf(stderr, "Incorrect local backref count"
5228 " on %llu %s %llu owner %llu"
5229 " offset %llu found %u wanted %u back %p\n",
5230 (unsigned long long)rec->start,
5231 back->full_backref ?
5233 back->full_backref ?
5234 (unsigned long long)dback->parent:
5235 (unsigned long long)dback->root,
5236 (unsigned long long)dback->owner,
5237 (unsigned long long)dback->offset,
5238 dback->found_ref, dback->num_refs, back);
5240 if (dback->disk_bytenr != rec->start) {
5244 fprintf(stderr, "Backref disk bytenr does not"
5245 " match extent record, bytenr=%llu, "
5246 "ref bytenr=%llu\n",
5247 (unsigned long long)rec->start,
5248 (unsigned long long)dback->disk_bytenr);
5251 if (dback->bytes != rec->nr) {
5255 fprintf(stderr, "Backref bytes do not match "
5256 "extent backref, bytenr=%llu, ref "
5257 "bytes=%llu, backref bytes=%llu\n",
5258 (unsigned long long)rec->start,
5259 (unsigned long long)rec->nr,
5260 (unsigned long long)dback->bytes);
5263 if (!back->is_data) {
5266 dback = to_data_backref(back);
5267 found += dback->found_ref;
5270 if (found != rec->refs) {
5274 fprintf(stderr, "Incorrect global backref count "
5275 "on %llu found %llu wanted %llu\n",
5276 (unsigned long long)rec->start,
5277 (unsigned long long)found,
5278 (unsigned long long)rec->refs);
5284 static int free_all_extent_backrefs(struct extent_record *rec)
5286 struct extent_backref *back;
5287 struct list_head *cur;
5288 while (!list_empty(&rec->backrefs)) {
5289 cur = rec->backrefs.next;
5290 back = to_extent_backref(cur);
5297 static void free_extent_record_cache(struct btrfs_fs_info *fs_info,
5298 struct cache_tree *extent_cache)
5300 struct cache_extent *cache;
5301 struct extent_record *rec;
5304 cache = first_cache_extent(extent_cache);
5307 rec = container_of(cache, struct extent_record, cache);
5308 remove_cache_extent(extent_cache, cache);
5309 free_all_extent_backrefs(rec);
5314 static int maybe_free_extent_rec(struct cache_tree *extent_cache,
5315 struct extent_record *rec)
5317 if (rec->content_checked && rec->owner_ref_checked &&
5318 rec->extent_item_refs == rec->refs && rec->refs > 0 &&
5319 rec->num_duplicates == 0 && !all_backpointers_checked(rec, 0) &&
5320 !rec->bad_full_backref && !rec->crossing_stripes &&
5321 !rec->wrong_chunk_type) {
5322 remove_cache_extent(extent_cache, &rec->cache);
5323 free_all_extent_backrefs(rec);
5324 list_del_init(&rec->list);
5330 static int check_owner_ref(struct btrfs_root *root,
5331 struct extent_record *rec,
5332 struct extent_buffer *buf)
5334 struct extent_backref *node;
5335 struct tree_backref *back;
5336 struct btrfs_root *ref_root;
5337 struct btrfs_key key;
5338 struct btrfs_path path;
5339 struct extent_buffer *parent;
5344 list_for_each_entry(node, &rec->backrefs, list) {
5347 if (!node->found_ref)
5349 if (node->full_backref)
5351 back = to_tree_backref(node);
5352 if (btrfs_header_owner(buf) == back->root)
5355 BUG_ON(rec->is_root);
5357 /* try to find the block by search corresponding fs tree */
5358 key.objectid = btrfs_header_owner(buf);
5359 key.type = BTRFS_ROOT_ITEM_KEY;
5360 key.offset = (u64)-1;
5362 ref_root = btrfs_read_fs_root(root->fs_info, &key);
5363 if (IS_ERR(ref_root))
5366 level = btrfs_header_level(buf);
5368 btrfs_item_key_to_cpu(buf, &key, 0);
5370 btrfs_node_key_to_cpu(buf, &key, 0);
5372 btrfs_init_path(&path);
5373 path.lowest_level = level + 1;
5374 ret = btrfs_search_slot(NULL, ref_root, &key, &path, 0, 0);
5378 parent = path.nodes[level + 1];
5379 if (parent && buf->start == btrfs_node_blockptr(parent,
5380 path.slots[level + 1]))
5383 btrfs_release_path(&path);
5384 return found ? 0 : 1;
5387 static int is_extent_tree_record(struct extent_record *rec)
5389 struct list_head *cur = rec->backrefs.next;
5390 struct extent_backref *node;
5391 struct tree_backref *back;
5394 while(cur != &rec->backrefs) {
5395 node = to_extent_backref(cur);
5399 back = to_tree_backref(node);
5400 if (node->full_backref)
5402 if (back->root == BTRFS_EXTENT_TREE_OBJECTID)
5409 static int record_bad_block_io(struct btrfs_fs_info *info,
5410 struct cache_tree *extent_cache,
5413 struct extent_record *rec;
5414 struct cache_extent *cache;
5415 struct btrfs_key key;
5417 cache = lookup_cache_extent(extent_cache, start, len);
5421 rec = container_of(cache, struct extent_record, cache);
5422 if (!is_extent_tree_record(rec))
5425 btrfs_disk_key_to_cpu(&key, &rec->parent_key);
5426 return btrfs_add_corrupt_extent_record(info, &key, start, len, 0);
5429 static int swap_values(struct btrfs_root *root, struct btrfs_path *path,
5430 struct extent_buffer *buf, int slot)
5432 if (btrfs_header_level(buf)) {
5433 struct btrfs_key_ptr ptr1, ptr2;
5435 read_extent_buffer(buf, &ptr1, btrfs_node_key_ptr_offset(slot),
5436 sizeof(struct btrfs_key_ptr));
5437 read_extent_buffer(buf, &ptr2,
5438 btrfs_node_key_ptr_offset(slot + 1),
5439 sizeof(struct btrfs_key_ptr));
5440 write_extent_buffer(buf, &ptr1,
5441 btrfs_node_key_ptr_offset(slot + 1),
5442 sizeof(struct btrfs_key_ptr));
5443 write_extent_buffer(buf, &ptr2,
5444 btrfs_node_key_ptr_offset(slot),
5445 sizeof(struct btrfs_key_ptr));
5447 struct btrfs_disk_key key;
5448 btrfs_node_key(buf, &key, 0);
5449 btrfs_fixup_low_keys(root, path, &key,
5450 btrfs_header_level(buf) + 1);
5453 struct btrfs_item *item1, *item2;
5454 struct btrfs_key k1, k2;
5455 char *item1_data, *item2_data;
5456 u32 item1_offset, item2_offset, item1_size, item2_size;
5458 item1 = btrfs_item_nr(slot);
5459 item2 = btrfs_item_nr(slot + 1);
5460 btrfs_item_key_to_cpu(buf, &k1, slot);
5461 btrfs_item_key_to_cpu(buf, &k2, slot + 1);
5462 item1_offset = btrfs_item_offset(buf, item1);
5463 item2_offset = btrfs_item_offset(buf, item2);
5464 item1_size = btrfs_item_size(buf, item1);
5465 item2_size = btrfs_item_size(buf, item2);
5467 item1_data = malloc(item1_size);
5470 item2_data = malloc(item2_size);
5476 read_extent_buffer(buf, item1_data, item1_offset, item1_size);
5477 read_extent_buffer(buf, item2_data, item2_offset, item2_size);
5479 write_extent_buffer(buf, item1_data, item2_offset, item2_size);
5480 write_extent_buffer(buf, item2_data, item1_offset, item1_size);
5484 btrfs_set_item_offset(buf, item1, item2_offset);
5485 btrfs_set_item_offset(buf, item2, item1_offset);
5486 btrfs_set_item_size(buf, item1, item2_size);
5487 btrfs_set_item_size(buf, item2, item1_size);
5489 path->slots[0] = slot;
5490 btrfs_set_item_key_unsafe(root, path, &k2);
5491 path->slots[0] = slot + 1;
5492 btrfs_set_item_key_unsafe(root, path, &k1);
5497 static int fix_key_order(struct btrfs_trans_handle *trans,
5498 struct btrfs_root *root,
5499 struct btrfs_path *path)
5501 struct extent_buffer *buf;
5502 struct btrfs_key k1, k2;
5504 int level = path->lowest_level;
5507 buf = path->nodes[level];
5508 for (i = 0; i < btrfs_header_nritems(buf) - 1; i++) {
5510 btrfs_node_key_to_cpu(buf, &k1, i);
5511 btrfs_node_key_to_cpu(buf, &k2, i + 1);
5513 btrfs_item_key_to_cpu(buf, &k1, i);
5514 btrfs_item_key_to_cpu(buf, &k2, i + 1);
5516 if (btrfs_comp_cpu_keys(&k1, &k2) < 0)
5518 ret = swap_values(root, path, buf, i);
5521 btrfs_mark_buffer_dirty(buf);
5527 static int delete_bogus_item(struct btrfs_trans_handle *trans,
5528 struct btrfs_root *root,
5529 struct btrfs_path *path,
5530 struct extent_buffer *buf, int slot)
5532 struct btrfs_key key;
5533 int nritems = btrfs_header_nritems(buf);
5535 btrfs_item_key_to_cpu(buf, &key, slot);
5537 /* These are all the keys we can deal with missing. */
5538 if (key.type != BTRFS_DIR_INDEX_KEY &&
5539 key.type != BTRFS_EXTENT_ITEM_KEY &&
5540 key.type != BTRFS_METADATA_ITEM_KEY &&
5541 key.type != BTRFS_TREE_BLOCK_REF_KEY &&
5542 key.type != BTRFS_EXTENT_DATA_REF_KEY)
5545 printf("Deleting bogus item [%llu,%u,%llu] at slot %d on block %llu\n",
5546 (unsigned long long)key.objectid, key.type,
5547 (unsigned long long)key.offset, slot, buf->start);
5548 memmove_extent_buffer(buf, btrfs_item_nr_offset(slot),
5549 btrfs_item_nr_offset(slot + 1),
5550 sizeof(struct btrfs_item) *
5551 (nritems - slot - 1));
5552 btrfs_set_header_nritems(buf, nritems - 1);
5554 struct btrfs_disk_key disk_key;
5556 btrfs_item_key(buf, &disk_key, 0);
5557 btrfs_fixup_low_keys(root, path, &disk_key, 1);
5559 btrfs_mark_buffer_dirty(buf);
5563 static int fix_item_offset(struct btrfs_trans_handle *trans,
5564 struct btrfs_root *root,
5565 struct btrfs_path *path)
5567 struct extent_buffer *buf;
5571 /* We should only get this for leaves */
5572 BUG_ON(path->lowest_level);
5573 buf = path->nodes[0];
5575 for (i = 0; i < btrfs_header_nritems(buf); i++) {
5576 unsigned int shift = 0, offset;
5578 if (i == 0 && btrfs_item_end_nr(buf, i) !=
5579 BTRFS_LEAF_DATA_SIZE(root)) {
5580 if (btrfs_item_end_nr(buf, i) >
5581 BTRFS_LEAF_DATA_SIZE(root)) {
5582 ret = delete_bogus_item(trans, root, path,
5586 fprintf(stderr, "item is off the end of the "
5587 "leaf, can't fix\n");
5591 shift = BTRFS_LEAF_DATA_SIZE(root) -
5592 btrfs_item_end_nr(buf, i);
5593 } else if (i > 0 && btrfs_item_end_nr(buf, i) !=
5594 btrfs_item_offset_nr(buf, i - 1)) {
5595 if (btrfs_item_end_nr(buf, i) >
5596 btrfs_item_offset_nr(buf, i - 1)) {
5597 ret = delete_bogus_item(trans, root, path,
5601 fprintf(stderr, "items overlap, can't fix\n");
5605 shift = btrfs_item_offset_nr(buf, i - 1) -
5606 btrfs_item_end_nr(buf, i);
5611 printf("Shifting item nr %d by %u bytes in block %llu\n",
5612 i, shift, (unsigned long long)buf->start);
5613 offset = btrfs_item_offset_nr(buf, i);
5614 memmove_extent_buffer(buf,
5615 btrfs_leaf_data(buf) + offset + shift,
5616 btrfs_leaf_data(buf) + offset,
5617 btrfs_item_size_nr(buf, i));
5618 btrfs_set_item_offset(buf, btrfs_item_nr(i),
5620 btrfs_mark_buffer_dirty(buf);
5624 * We may have moved things, in which case we want to exit so we don't
5625 * write those changes out. Once we have proper abort functionality in
5626 * progs this can be changed to something nicer.
5633 * Attempt to fix basic block failures. If we can't fix it for whatever reason
5634 * then just return -EIO.
5636 static int try_to_fix_bad_block(struct btrfs_root *root,
5637 struct extent_buffer *buf,
5638 enum btrfs_tree_block_status status)
5640 struct btrfs_trans_handle *trans;
5641 struct ulist *roots;
5642 struct ulist_node *node;
5643 struct btrfs_root *search_root;
5644 struct btrfs_path path;
5645 struct ulist_iterator iter;
5646 struct btrfs_key root_key, key;
5649 if (status != BTRFS_TREE_BLOCK_BAD_KEY_ORDER &&
5650 status != BTRFS_TREE_BLOCK_INVALID_OFFSETS)
5653 ret = btrfs_find_all_roots(NULL, root->fs_info, buf->start, 0, &roots);
5657 btrfs_init_path(&path);
5658 ULIST_ITER_INIT(&iter);
5659 while ((node = ulist_next(roots, &iter))) {
5660 root_key.objectid = node->val;
5661 root_key.type = BTRFS_ROOT_ITEM_KEY;
5662 root_key.offset = (u64)-1;
5664 search_root = btrfs_read_fs_root(root->fs_info, &root_key);
5671 trans = btrfs_start_transaction(search_root, 0);
5672 if (IS_ERR(trans)) {
5673 ret = PTR_ERR(trans);
5677 path.lowest_level = btrfs_header_level(buf);
5678 path.skip_check_block = 1;
5679 if (path.lowest_level)
5680 btrfs_node_key_to_cpu(buf, &key, 0);
5682 btrfs_item_key_to_cpu(buf, &key, 0);
5683 ret = btrfs_search_slot(trans, search_root, &key, &path, 0, 1);
5686 btrfs_commit_transaction(trans, search_root);
5689 if (status == BTRFS_TREE_BLOCK_BAD_KEY_ORDER)
5690 ret = fix_key_order(trans, search_root, &path);
5691 else if (status == BTRFS_TREE_BLOCK_INVALID_OFFSETS)
5692 ret = fix_item_offset(trans, search_root, &path);
5694 btrfs_commit_transaction(trans, search_root);
5697 btrfs_release_path(&path);
5698 btrfs_commit_transaction(trans, search_root);
5701 btrfs_release_path(&path);
5705 static int check_block(struct btrfs_root *root,
5706 struct cache_tree *extent_cache,
5707 struct extent_buffer *buf, u64 flags)
5709 struct extent_record *rec;
5710 struct cache_extent *cache;
5711 struct btrfs_key key;
5712 enum btrfs_tree_block_status status;
5716 cache = lookup_cache_extent(extent_cache, buf->start, buf->len);
5719 rec = container_of(cache, struct extent_record, cache);
5720 rec->generation = btrfs_header_generation(buf);
5722 level = btrfs_header_level(buf);
5723 if (btrfs_header_nritems(buf) > 0) {
5726 btrfs_item_key_to_cpu(buf, &key, 0);
5728 btrfs_node_key_to_cpu(buf, &key, 0);
5730 rec->info_objectid = key.objectid;
5732 rec->info_level = level;
5734 if (btrfs_is_leaf(buf))
5735 status = btrfs_check_leaf(root, &rec->parent_key, buf);
5737 status = btrfs_check_node(root, &rec->parent_key, buf);
5739 if (status != BTRFS_TREE_BLOCK_CLEAN) {
5741 status = try_to_fix_bad_block(root, buf, status);
5742 if (status != BTRFS_TREE_BLOCK_CLEAN) {
5744 fprintf(stderr, "bad block %llu\n",
5745 (unsigned long long)buf->start);
5748 * Signal to callers we need to start the scan over
5749 * again since we'll have cowed blocks.
5754 rec->content_checked = 1;
5755 if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)
5756 rec->owner_ref_checked = 1;
5758 ret = check_owner_ref(root, rec, buf);
5760 rec->owner_ref_checked = 1;
5764 maybe_free_extent_rec(extent_cache, rec);
5768 static struct tree_backref *find_tree_backref(struct extent_record *rec,
5769 u64 parent, u64 root)
5771 struct list_head *cur = rec->backrefs.next;
5772 struct extent_backref *node;
5773 struct tree_backref *back;
5775 while(cur != &rec->backrefs) {
5776 node = to_extent_backref(cur);
5780 back = to_tree_backref(node);
5782 if (!node->full_backref)
5784 if (parent == back->parent)
5787 if (node->full_backref)
5789 if (back->root == root)
5796 static struct tree_backref *alloc_tree_backref(struct extent_record *rec,
5797 u64 parent, u64 root)
5799 struct tree_backref *ref = malloc(sizeof(*ref));
5803 memset(&ref->node, 0, sizeof(ref->node));
5805 ref->parent = parent;
5806 ref->node.full_backref = 1;
5809 ref->node.full_backref = 0;
5811 list_add_tail(&ref->node.list, &rec->backrefs);
5816 static struct data_backref *find_data_backref(struct extent_record *rec,
5817 u64 parent, u64 root,
5818 u64 owner, u64 offset,
5820 u64 disk_bytenr, u64 bytes)
5822 struct list_head *cur = rec->backrefs.next;
5823 struct extent_backref *node;
5824 struct data_backref *back;
5826 while(cur != &rec->backrefs) {
5827 node = to_extent_backref(cur);
5831 back = to_data_backref(node);
5833 if (!node->full_backref)
5835 if (parent == back->parent)
5838 if (node->full_backref)
5840 if (back->root == root && back->owner == owner &&
5841 back->offset == offset) {
5842 if (found_ref && node->found_ref &&
5843 (back->bytes != bytes ||
5844 back->disk_bytenr != disk_bytenr))
5853 static struct data_backref *alloc_data_backref(struct extent_record *rec,
5854 u64 parent, u64 root,
5855 u64 owner, u64 offset,
5858 struct data_backref *ref = malloc(sizeof(*ref));
5862 memset(&ref->node, 0, sizeof(ref->node));
5863 ref->node.is_data = 1;
5866 ref->parent = parent;
5869 ref->node.full_backref = 1;
5873 ref->offset = offset;
5874 ref->node.full_backref = 0;
5876 ref->bytes = max_size;
5879 list_add_tail(&ref->node.list, &rec->backrefs);
5880 if (max_size > rec->max_size)
5881 rec->max_size = max_size;
5885 /* Check if the type of extent matches with its chunk */
5886 static void check_extent_type(struct extent_record *rec)
5888 struct btrfs_block_group_cache *bg_cache;
5890 bg_cache = btrfs_lookup_first_block_group(global_info, rec->start);
5894 /* data extent, check chunk directly*/
5895 if (!rec->metadata) {
5896 if (!(bg_cache->flags & BTRFS_BLOCK_GROUP_DATA))
5897 rec->wrong_chunk_type = 1;
5901 /* metadata extent, check the obvious case first */
5902 if (!(bg_cache->flags & (BTRFS_BLOCK_GROUP_SYSTEM |
5903 BTRFS_BLOCK_GROUP_METADATA))) {
5904 rec->wrong_chunk_type = 1;
5909 * Check SYSTEM extent, as it's also marked as metadata, we can only
5910 * make sure it's a SYSTEM extent by its backref
5912 if (!list_empty(&rec->backrefs)) {
5913 struct extent_backref *node;
5914 struct tree_backref *tback;
5917 node = to_extent_backref(rec->backrefs.next);
5918 if (node->is_data) {
5919 /* tree block shouldn't have data backref */
5920 rec->wrong_chunk_type = 1;
5923 tback = container_of(node, struct tree_backref, node);
5925 if (tback->root == BTRFS_CHUNK_TREE_OBJECTID)
5926 bg_type = BTRFS_BLOCK_GROUP_SYSTEM;
5928 bg_type = BTRFS_BLOCK_GROUP_METADATA;
5929 if (!(bg_cache->flags & bg_type))
5930 rec->wrong_chunk_type = 1;
5935 * Allocate a new extent record, fill default values from @tmpl and insert int
5936 * @extent_cache. Caller is supposed to make sure the [start,nr) is not in
5937 * the cache, otherwise it fails.
5939 static int add_extent_rec_nolookup(struct cache_tree *extent_cache,
5940 struct extent_record *tmpl)
5942 struct extent_record *rec;
5945 rec = malloc(sizeof(*rec));
5948 rec->start = tmpl->start;
5949 rec->max_size = tmpl->max_size;
5950 rec->nr = max(tmpl->nr, tmpl->max_size);
5951 rec->found_rec = tmpl->found_rec;
5952 rec->content_checked = tmpl->content_checked;
5953 rec->owner_ref_checked = tmpl->owner_ref_checked;
5954 rec->num_duplicates = 0;
5955 rec->metadata = tmpl->metadata;
5956 rec->flag_block_full_backref = FLAG_UNSET;
5957 rec->bad_full_backref = 0;
5958 rec->crossing_stripes = 0;
5959 rec->wrong_chunk_type = 0;
5960 rec->is_root = tmpl->is_root;
5961 rec->refs = tmpl->refs;
5962 rec->extent_item_refs = tmpl->extent_item_refs;
5963 rec->parent_generation = tmpl->parent_generation;
5964 INIT_LIST_HEAD(&rec->backrefs);
5965 INIT_LIST_HEAD(&rec->dups);
5966 INIT_LIST_HEAD(&rec->list);
5967 memcpy(&rec->parent_key, &tmpl->parent_key, sizeof(tmpl->parent_key));
5968 rec->cache.start = tmpl->start;
5969 rec->cache.size = tmpl->nr;
5970 ret = insert_cache_extent(extent_cache, &rec->cache);
5975 bytes_used += rec->nr;
5978 rec->crossing_stripes = check_crossing_stripes(global_info,
5979 rec->start, global_info->tree_root->nodesize);
5980 check_extent_type(rec);
5985 * Lookup and modify an extent, some values of @tmpl are interpreted verbatim,
5987 * - refs - if found, increase refs
5988 * - is_root - if found, set
5989 * - content_checked - if found, set
5990 * - owner_ref_checked - if found, set
5992 * If not found, create a new one, initialize and insert.
5994 static int add_extent_rec(struct cache_tree *extent_cache,
5995 struct extent_record *tmpl)
5997 struct extent_record *rec;
5998 struct cache_extent *cache;
6002 cache = lookup_cache_extent(extent_cache, tmpl->start, tmpl->nr);
6004 rec = container_of(cache, struct extent_record, cache);
6008 rec->nr = max(tmpl->nr, tmpl->max_size);
6011 * We need to make sure to reset nr to whatever the extent
6012 * record says was the real size, this way we can compare it to
6015 if (tmpl->found_rec) {
6016 if (tmpl->start != rec->start || rec->found_rec) {
6017 struct extent_record *tmp;
6020 if (list_empty(&rec->list))
6021 list_add_tail(&rec->list,
6022 &duplicate_extents);
6025 * We have to do this song and dance in case we
6026 * find an extent record that falls inside of
6027 * our current extent record but does not have
6028 * the same objectid.
6030 tmp = malloc(sizeof(*tmp));
6033 tmp->start = tmpl->start;
6034 tmp->max_size = tmpl->max_size;
6037 tmp->metadata = tmpl->metadata;
6038 tmp->extent_item_refs = tmpl->extent_item_refs;
6039 INIT_LIST_HEAD(&tmp->list);
6040 list_add_tail(&tmp->list, &rec->dups);
6041 rec->num_duplicates++;
6048 if (tmpl->extent_item_refs && !dup) {
6049 if (rec->extent_item_refs) {
6050 fprintf(stderr, "block %llu rec "
6051 "extent_item_refs %llu, passed %llu\n",
6052 (unsigned long long)tmpl->start,
6053 (unsigned long long)
6054 rec->extent_item_refs,
6055 (unsigned long long)tmpl->extent_item_refs);
6057 rec->extent_item_refs = tmpl->extent_item_refs;
6061 if (tmpl->content_checked)
6062 rec->content_checked = 1;
6063 if (tmpl->owner_ref_checked)
6064 rec->owner_ref_checked = 1;
6065 memcpy(&rec->parent_key, &tmpl->parent_key,
6066 sizeof(tmpl->parent_key));
6067 if (tmpl->parent_generation)
6068 rec->parent_generation = tmpl->parent_generation;
6069 if (rec->max_size < tmpl->max_size)
6070 rec->max_size = tmpl->max_size;
6073 * A metadata extent can't cross stripe_len boundary, otherwise
6074 * kernel scrub won't be able to handle it.
6075 * As now stripe_len is fixed to BTRFS_STRIPE_LEN, just check
6079 rec->crossing_stripes = check_crossing_stripes(
6080 global_info, rec->start,
6081 global_info->tree_root->nodesize);
6082 check_extent_type(rec);
6083 maybe_free_extent_rec(extent_cache, rec);
6087 ret = add_extent_rec_nolookup(extent_cache, tmpl);
6092 static int add_tree_backref(struct cache_tree *extent_cache, u64 bytenr,
6093 u64 parent, u64 root, int found_ref)
6095 struct extent_record *rec;
6096 struct tree_backref *back;
6097 struct cache_extent *cache;
6100 cache = lookup_cache_extent(extent_cache, bytenr, 1);
6102 struct extent_record tmpl;
6104 memset(&tmpl, 0, sizeof(tmpl));
6105 tmpl.start = bytenr;
6109 ret = add_extent_rec_nolookup(extent_cache, &tmpl);
6113 /* really a bug in cache_extent implement now */
6114 cache = lookup_cache_extent(extent_cache, bytenr, 1);
6119 rec = container_of(cache, struct extent_record, cache);
6120 if (rec->start != bytenr) {
6122 * Several cause, from unaligned bytenr to over lapping extents
6127 back = find_tree_backref(rec, parent, root);
6129 back = alloc_tree_backref(rec, parent, root);
6135 if (back->node.found_ref) {
6136 fprintf(stderr, "Extent back ref already exists "
6137 "for %llu parent %llu root %llu \n",
6138 (unsigned long long)bytenr,
6139 (unsigned long long)parent,
6140 (unsigned long long)root);
6142 back->node.found_ref = 1;
6144 if (back->node.found_extent_tree) {
6145 fprintf(stderr, "Extent back ref already exists "
6146 "for %llu parent %llu root %llu \n",
6147 (unsigned long long)bytenr,
6148 (unsigned long long)parent,
6149 (unsigned long long)root);
6151 back->node.found_extent_tree = 1;
6153 check_extent_type(rec);
6154 maybe_free_extent_rec(extent_cache, rec);
6158 static int add_data_backref(struct cache_tree *extent_cache, u64 bytenr,
6159 u64 parent, u64 root, u64 owner, u64 offset,
6160 u32 num_refs, int found_ref, u64 max_size)
6162 struct extent_record *rec;
6163 struct data_backref *back;
6164 struct cache_extent *cache;
6167 cache = lookup_cache_extent(extent_cache, bytenr, 1);
6169 struct extent_record tmpl;
6171 memset(&tmpl, 0, sizeof(tmpl));
6172 tmpl.start = bytenr;
6174 tmpl.max_size = max_size;
6176 ret = add_extent_rec_nolookup(extent_cache, &tmpl);
6180 cache = lookup_cache_extent(extent_cache, bytenr, 1);
6185 rec = container_of(cache, struct extent_record, cache);
6186 if (rec->max_size < max_size)
6187 rec->max_size = max_size;
6190 * If found_ref is set then max_size is the real size and must match the
6191 * existing refs. So if we have already found a ref then we need to
6192 * make sure that this ref matches the existing one, otherwise we need
6193 * to add a new backref so we can notice that the backrefs don't match
6194 * and we need to figure out who is telling the truth. This is to
6195 * account for that awful fsync bug I introduced where we'd end up with
6196 * a btrfs_file_extent_item that would have its length include multiple
6197 * prealloc extents or point inside of a prealloc extent.
6199 back = find_data_backref(rec, parent, root, owner, offset, found_ref,
6202 back = alloc_data_backref(rec, parent, root, owner, offset,
6208 BUG_ON(num_refs != 1);
6209 if (back->node.found_ref)
6210 BUG_ON(back->bytes != max_size);
6211 back->node.found_ref = 1;
6212 back->found_ref += 1;
6213 back->bytes = max_size;
6214 back->disk_bytenr = bytenr;
6216 rec->content_checked = 1;
6217 rec->owner_ref_checked = 1;
6219 if (back->node.found_extent_tree) {
6220 fprintf(stderr, "Extent back ref already exists "
6221 "for %llu parent %llu root %llu "
6222 "owner %llu offset %llu num_refs %lu\n",
6223 (unsigned long long)bytenr,
6224 (unsigned long long)parent,
6225 (unsigned long long)root,
6226 (unsigned long long)owner,
6227 (unsigned long long)offset,
6228 (unsigned long)num_refs);
6230 back->num_refs = num_refs;
6231 back->node.found_extent_tree = 1;
6233 maybe_free_extent_rec(extent_cache, rec);
6237 static int add_pending(struct cache_tree *pending,
6238 struct cache_tree *seen, u64 bytenr, u32 size)
6241 ret = add_cache_extent(seen, bytenr, size);
6244 add_cache_extent(pending, bytenr, size);
6248 static int pick_next_pending(struct cache_tree *pending,
6249 struct cache_tree *reada,
6250 struct cache_tree *nodes,
6251 u64 last, struct block_info *bits, int bits_nr,
6254 unsigned long node_start = last;
6255 struct cache_extent *cache;
6258 cache = search_cache_extent(reada, 0);
6260 bits[0].start = cache->start;
6261 bits[0].size = cache->size;
6266 if (node_start > 32768)
6267 node_start -= 32768;
6269 cache = search_cache_extent(nodes, node_start);
6271 cache = search_cache_extent(nodes, 0);
6274 cache = search_cache_extent(pending, 0);
6279 bits[ret].start = cache->start;
6280 bits[ret].size = cache->size;
6281 cache = next_cache_extent(cache);
6283 } while (cache && ret < bits_nr);
6289 bits[ret].start = cache->start;
6290 bits[ret].size = cache->size;
6291 cache = next_cache_extent(cache);
6293 } while (cache && ret < bits_nr);
6295 if (bits_nr - ret > 8) {
6296 u64 lookup = bits[0].start + bits[0].size;
6297 struct cache_extent *next;
6298 next = search_cache_extent(pending, lookup);
6300 if (next->start - lookup > 32768)
6302 bits[ret].start = next->start;
6303 bits[ret].size = next->size;
6304 lookup = next->start + next->size;
6308 next = next_cache_extent(next);
6316 static void free_chunk_record(struct cache_extent *cache)
6318 struct chunk_record *rec;
6320 rec = container_of(cache, struct chunk_record, cache);
6321 list_del_init(&rec->list);
6322 list_del_init(&rec->dextents);
6326 void free_chunk_cache_tree(struct cache_tree *chunk_cache)
6328 cache_tree_free_extents(chunk_cache, free_chunk_record);
6331 static void free_device_record(struct rb_node *node)
6333 struct device_record *rec;
6335 rec = container_of(node, struct device_record, node);
6339 FREE_RB_BASED_TREE(device_cache, free_device_record);
6341 int insert_block_group_record(struct block_group_tree *tree,
6342 struct block_group_record *bg_rec)
6346 ret = insert_cache_extent(&tree->tree, &bg_rec->cache);
6350 list_add_tail(&bg_rec->list, &tree->block_groups);
6354 static void free_block_group_record(struct cache_extent *cache)
6356 struct block_group_record *rec;
6358 rec = container_of(cache, struct block_group_record, cache);
6359 list_del_init(&rec->list);
6363 void free_block_group_tree(struct block_group_tree *tree)
6365 cache_tree_free_extents(&tree->tree, free_block_group_record);
6368 int insert_device_extent_record(struct device_extent_tree *tree,
6369 struct device_extent_record *de_rec)
6374 * Device extent is a bit different from the other extents, because
6375 * the extents which belong to the different devices may have the
6376 * same start and size, so we need use the special extent cache
6377 * search/insert functions.
6379 ret = insert_cache_extent2(&tree->tree, &de_rec->cache);
6383 list_add_tail(&de_rec->chunk_list, &tree->no_chunk_orphans);
6384 list_add_tail(&de_rec->device_list, &tree->no_device_orphans);
6388 static void free_device_extent_record(struct cache_extent *cache)
6390 struct device_extent_record *rec;
6392 rec = container_of(cache, struct device_extent_record, cache);
6393 if (!list_empty(&rec->chunk_list))
6394 list_del_init(&rec->chunk_list);
6395 if (!list_empty(&rec->device_list))
6396 list_del_init(&rec->device_list);
6400 void free_device_extent_tree(struct device_extent_tree *tree)
6402 cache_tree_free_extents(&tree->tree, free_device_extent_record);
6405 #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
6406 static int process_extent_ref_v0(struct cache_tree *extent_cache,
6407 struct extent_buffer *leaf, int slot)
6409 struct btrfs_extent_ref_v0 *ref0;
6410 struct btrfs_key key;
6413 btrfs_item_key_to_cpu(leaf, &key, slot);
6414 ref0 = btrfs_item_ptr(leaf, slot, struct btrfs_extent_ref_v0);
6415 if (btrfs_ref_objectid_v0(leaf, ref0) < BTRFS_FIRST_FREE_OBJECTID) {
6416 ret = add_tree_backref(extent_cache, key.objectid, key.offset,
6419 ret = add_data_backref(extent_cache, key.objectid, key.offset,
6420 0, 0, 0, btrfs_ref_count_v0(leaf, ref0), 0, 0);
6426 struct chunk_record *btrfs_new_chunk_record(struct extent_buffer *leaf,
6427 struct btrfs_key *key,
6430 struct btrfs_chunk *ptr;
6431 struct chunk_record *rec;
6434 ptr = btrfs_item_ptr(leaf, slot, struct btrfs_chunk);
6435 num_stripes = btrfs_chunk_num_stripes(leaf, ptr);
6437 rec = calloc(1, btrfs_chunk_record_size(num_stripes));
6439 fprintf(stderr, "memory allocation failed\n");
6443 INIT_LIST_HEAD(&rec->list);
6444 INIT_LIST_HEAD(&rec->dextents);
6447 rec->cache.start = key->offset;
6448 rec->cache.size = btrfs_chunk_length(leaf, ptr);
6450 rec->generation = btrfs_header_generation(leaf);
6452 rec->objectid = key->objectid;
6453 rec->type = key->type;
6454 rec->offset = key->offset;
6456 rec->length = rec->cache.size;
6457 rec->owner = btrfs_chunk_owner(leaf, ptr);
6458 rec->stripe_len = btrfs_chunk_stripe_len(leaf, ptr);
6459 rec->type_flags = btrfs_chunk_type(leaf, ptr);
6460 rec->io_width = btrfs_chunk_io_width(leaf, ptr);
6461 rec->io_align = btrfs_chunk_io_align(leaf, ptr);
6462 rec->sector_size = btrfs_chunk_sector_size(leaf, ptr);
6463 rec->num_stripes = num_stripes;
6464 rec->sub_stripes = btrfs_chunk_sub_stripes(leaf, ptr);
6466 for (i = 0; i < rec->num_stripes; ++i) {
6467 rec->stripes[i].devid =
6468 btrfs_stripe_devid_nr(leaf, ptr, i);
6469 rec->stripes[i].offset =
6470 btrfs_stripe_offset_nr(leaf, ptr, i);
6471 read_extent_buffer(leaf, rec->stripes[i].dev_uuid,
6472 (unsigned long)btrfs_stripe_dev_uuid_nr(ptr, i),
6479 static int process_chunk_item(struct cache_tree *chunk_cache,
6480 struct btrfs_key *key, struct extent_buffer *eb,
6483 struct chunk_record *rec;
6484 struct btrfs_chunk *chunk;
6487 chunk = btrfs_item_ptr(eb, slot, struct btrfs_chunk);
6489 * Do extra check for this chunk item,
6491 * It's still possible one can craft a leaf with CHUNK_ITEM, with
6492 * wrong onwer(3) out of chunk tree, to pass both chunk tree check
6493 * and owner<->key_type check.
6495 ret = btrfs_check_chunk_valid(global_info->tree_root, eb, chunk, slot,
6498 error("chunk(%llu, %llu) is not valid, ignore it",
6499 key->offset, btrfs_chunk_length(eb, chunk));
6502 rec = btrfs_new_chunk_record(eb, key, slot);
6503 ret = insert_cache_extent(chunk_cache, &rec->cache);
6505 fprintf(stderr, "Chunk[%llu, %llu] existed.\n",
6506 rec->offset, rec->length);
6513 static int process_device_item(struct rb_root *dev_cache,
6514 struct btrfs_key *key, struct extent_buffer *eb, int slot)
6516 struct btrfs_dev_item *ptr;
6517 struct device_record *rec;
6520 ptr = btrfs_item_ptr(eb,
6521 slot, struct btrfs_dev_item);
6523 rec = malloc(sizeof(*rec));
6525 fprintf(stderr, "memory allocation failed\n");
6529 rec->devid = key->offset;
6530 rec->generation = btrfs_header_generation(eb);
6532 rec->objectid = key->objectid;
6533 rec->type = key->type;
6534 rec->offset = key->offset;
6536 rec->devid = btrfs_device_id(eb, ptr);
6537 rec->total_byte = btrfs_device_total_bytes(eb, ptr);
6538 rec->byte_used = btrfs_device_bytes_used(eb, ptr);
6540 ret = rb_insert(dev_cache, &rec->node, device_record_compare);
6542 fprintf(stderr, "Device[%llu] existed.\n", rec->devid);
6549 struct block_group_record *
6550 btrfs_new_block_group_record(struct extent_buffer *leaf, struct btrfs_key *key,
6553 struct btrfs_block_group_item *ptr;
6554 struct block_group_record *rec;
6556 rec = calloc(1, sizeof(*rec));
6558 fprintf(stderr, "memory allocation failed\n");
6562 rec->cache.start = key->objectid;
6563 rec->cache.size = key->offset;
6565 rec->generation = btrfs_header_generation(leaf);
6567 rec->objectid = key->objectid;
6568 rec->type = key->type;
6569 rec->offset = key->offset;
6571 ptr = btrfs_item_ptr(leaf, slot, struct btrfs_block_group_item);
6572 rec->flags = btrfs_disk_block_group_flags(leaf, ptr);
6574 INIT_LIST_HEAD(&rec->list);
6579 static int process_block_group_item(struct block_group_tree *block_group_cache,
6580 struct btrfs_key *key,
6581 struct extent_buffer *eb, int slot)
6583 struct block_group_record *rec;
6586 rec = btrfs_new_block_group_record(eb, key, slot);
6587 ret = insert_block_group_record(block_group_cache, rec);
6589 fprintf(stderr, "Block Group[%llu, %llu] existed.\n",
6590 rec->objectid, rec->offset);
6597 struct device_extent_record *
6598 btrfs_new_device_extent_record(struct extent_buffer *leaf,
6599 struct btrfs_key *key, int slot)
6601 struct device_extent_record *rec;
6602 struct btrfs_dev_extent *ptr;
6604 rec = calloc(1, sizeof(*rec));
6606 fprintf(stderr, "memory allocation failed\n");
6610 rec->cache.objectid = key->objectid;
6611 rec->cache.start = key->offset;
6613 rec->generation = btrfs_header_generation(leaf);
6615 rec->objectid = key->objectid;
6616 rec->type = key->type;
6617 rec->offset = key->offset;
6619 ptr = btrfs_item_ptr(leaf, slot, struct btrfs_dev_extent);
6620 rec->chunk_objecteid =
6621 btrfs_dev_extent_chunk_objectid(leaf, ptr);
6623 btrfs_dev_extent_chunk_offset(leaf, ptr);
6624 rec->length = btrfs_dev_extent_length(leaf, ptr);
6625 rec->cache.size = rec->length;
6627 INIT_LIST_HEAD(&rec->chunk_list);
6628 INIT_LIST_HEAD(&rec->device_list);
6634 process_device_extent_item(struct device_extent_tree *dev_extent_cache,
6635 struct btrfs_key *key, struct extent_buffer *eb,
6638 struct device_extent_record *rec;
6641 rec = btrfs_new_device_extent_record(eb, key, slot);
6642 ret = insert_device_extent_record(dev_extent_cache, rec);
6645 "Device extent[%llu, %llu, %llu] existed.\n",
6646 rec->objectid, rec->offset, rec->length);
6653 static int process_extent_item(struct btrfs_root *root,
6654 struct cache_tree *extent_cache,
6655 struct extent_buffer *eb, int slot)
6657 struct btrfs_extent_item *ei;
6658 struct btrfs_extent_inline_ref *iref;
6659 struct btrfs_extent_data_ref *dref;
6660 struct btrfs_shared_data_ref *sref;
6661 struct btrfs_key key;
6662 struct extent_record tmpl;
6667 u32 item_size = btrfs_item_size_nr(eb, slot);
6673 btrfs_item_key_to_cpu(eb, &key, slot);
6675 if (key.type == BTRFS_METADATA_ITEM_KEY) {
6677 num_bytes = root->nodesize;
6679 num_bytes = key.offset;
6682 if (!IS_ALIGNED(key.objectid, root->sectorsize)) {
6683 error("ignoring invalid extent, bytenr %llu is not aligned to %u",
6684 key.objectid, root->sectorsize);
6687 if (item_size < sizeof(*ei)) {
6688 #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
6689 struct btrfs_extent_item_v0 *ei0;
6690 BUG_ON(item_size != sizeof(*ei0));
6691 ei0 = btrfs_item_ptr(eb, slot, struct btrfs_extent_item_v0);
6692 refs = btrfs_extent_refs_v0(eb, ei0);
6696 memset(&tmpl, 0, sizeof(tmpl));
6697 tmpl.start = key.objectid;
6698 tmpl.nr = num_bytes;
6699 tmpl.extent_item_refs = refs;
6700 tmpl.metadata = metadata;
6702 tmpl.max_size = num_bytes;
6704 return add_extent_rec(extent_cache, &tmpl);
6707 ei = btrfs_item_ptr(eb, slot, struct btrfs_extent_item);
6708 refs = btrfs_extent_refs(eb, ei);
6709 if (btrfs_extent_flags(eb, ei) & BTRFS_EXTENT_FLAG_TREE_BLOCK)
6713 if (metadata && num_bytes != root->nodesize) {
6714 error("ignore invalid metadata extent, length %llu does not equal to %u",
6715 num_bytes, root->nodesize);
6718 if (!metadata && !IS_ALIGNED(num_bytes, root->sectorsize)) {
6719 error("ignore invalid data extent, length %llu is not aligned to %u",
6720 num_bytes, root->sectorsize);
6724 memset(&tmpl, 0, sizeof(tmpl));
6725 tmpl.start = key.objectid;
6726 tmpl.nr = num_bytes;
6727 tmpl.extent_item_refs = refs;
6728 tmpl.metadata = metadata;
6730 tmpl.max_size = num_bytes;
6731 add_extent_rec(extent_cache, &tmpl);
6733 ptr = (unsigned long)(ei + 1);
6734 if (btrfs_extent_flags(eb, ei) & BTRFS_EXTENT_FLAG_TREE_BLOCK &&
6735 key.type == BTRFS_EXTENT_ITEM_KEY)
6736 ptr += sizeof(struct btrfs_tree_block_info);
6738 end = (unsigned long)ei + item_size;
6740 iref = (struct btrfs_extent_inline_ref *)ptr;
6741 type = btrfs_extent_inline_ref_type(eb, iref);
6742 offset = btrfs_extent_inline_ref_offset(eb, iref);
6744 case BTRFS_TREE_BLOCK_REF_KEY:
6745 ret = add_tree_backref(extent_cache, key.objectid,
6748 error("add_tree_backref failed: %s",
6751 case BTRFS_SHARED_BLOCK_REF_KEY:
6752 ret = add_tree_backref(extent_cache, key.objectid,
6755 error("add_tree_backref failed: %s",
6758 case BTRFS_EXTENT_DATA_REF_KEY:
6759 dref = (struct btrfs_extent_data_ref *)(&iref->offset);
6760 add_data_backref(extent_cache, key.objectid, 0,
6761 btrfs_extent_data_ref_root(eb, dref),
6762 btrfs_extent_data_ref_objectid(eb,
6764 btrfs_extent_data_ref_offset(eb, dref),
6765 btrfs_extent_data_ref_count(eb, dref),
6768 case BTRFS_SHARED_DATA_REF_KEY:
6769 sref = (struct btrfs_shared_data_ref *)(iref + 1);
6770 add_data_backref(extent_cache, key.objectid, offset,
6772 btrfs_shared_data_ref_count(eb, sref),
6776 fprintf(stderr, "corrupt extent record: key %Lu %u %Lu\n",
6777 key.objectid, key.type, num_bytes);
6780 ptr += btrfs_extent_inline_ref_size(type);
6787 static int check_cache_range(struct btrfs_root *root,
6788 struct btrfs_block_group_cache *cache,
6789 u64 offset, u64 bytes)
6791 struct btrfs_free_space *entry;
6797 for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) {
6798 bytenr = btrfs_sb_offset(i);
6799 ret = btrfs_rmap_block(&root->fs_info->mapping_tree,
6800 cache->key.objectid, bytenr, 0,
6801 &logical, &nr, &stripe_len);
6806 if (logical[nr] + stripe_len <= offset)
6808 if (offset + bytes <= logical[nr])
6810 if (logical[nr] == offset) {
6811 if (stripe_len >= bytes) {
6815 bytes -= stripe_len;
6816 offset += stripe_len;
6817 } else if (logical[nr] < offset) {
6818 if (logical[nr] + stripe_len >=
6823 bytes = (offset + bytes) -
6824 (logical[nr] + stripe_len);
6825 offset = logical[nr] + stripe_len;
6828 * Could be tricky, the super may land in the
6829 * middle of the area we're checking. First
6830 * check the easiest case, it's at the end.
6832 if (logical[nr] + stripe_len >=
6834 bytes = logical[nr] - offset;
6838 /* Check the left side */
6839 ret = check_cache_range(root, cache,
6841 logical[nr] - offset);
6847 /* Now we continue with the right side */
6848 bytes = (offset + bytes) -
6849 (logical[nr] + stripe_len);
6850 offset = logical[nr] + stripe_len;
6857 entry = btrfs_find_free_space(cache->free_space_ctl, offset, bytes);
6859 fprintf(stderr, "There is no free space entry for %Lu-%Lu\n",
6860 offset, offset+bytes);
6864 if (entry->offset != offset) {
6865 fprintf(stderr, "Wanted offset %Lu, found %Lu\n", offset,
6870 if (entry->bytes != bytes) {
6871 fprintf(stderr, "Wanted bytes %Lu, found %Lu for off %Lu\n",
6872 bytes, entry->bytes, offset);
6876 unlink_free_space(cache->free_space_ctl, entry);
6881 static int verify_space_cache(struct btrfs_root *root,
6882 struct btrfs_block_group_cache *cache)
6884 struct btrfs_path path;
6885 struct extent_buffer *leaf;
6886 struct btrfs_key key;
6890 root = root->fs_info->extent_root;
6892 last = max_t(u64, cache->key.objectid, BTRFS_SUPER_INFO_OFFSET);
6894 btrfs_init_path(&path);
6895 key.objectid = last;
6897 key.type = BTRFS_EXTENT_ITEM_KEY;
6898 ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
6903 if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) {
6904 ret = btrfs_next_leaf(root, &path);
6912 leaf = path.nodes[0];
6913 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
6914 if (key.objectid >= cache->key.offset + cache->key.objectid)
6916 if (key.type != BTRFS_EXTENT_ITEM_KEY &&
6917 key.type != BTRFS_METADATA_ITEM_KEY) {
6922 if (last == key.objectid) {
6923 if (key.type == BTRFS_EXTENT_ITEM_KEY)
6924 last = key.objectid + key.offset;
6926 last = key.objectid + root->nodesize;
6931 ret = check_cache_range(root, cache, last,
6932 key.objectid - last);
6935 if (key.type == BTRFS_EXTENT_ITEM_KEY)
6936 last = key.objectid + key.offset;
6938 last = key.objectid + root->nodesize;
6942 if (last < cache->key.objectid + cache->key.offset)
6943 ret = check_cache_range(root, cache, last,
6944 cache->key.objectid +
6945 cache->key.offset - last);
6948 btrfs_release_path(&path);
6951 !RB_EMPTY_ROOT(&cache->free_space_ctl->free_space_offset)) {
6952 fprintf(stderr, "There are still entries left in the space "
6960 static int check_space_cache(struct btrfs_root *root)
6962 struct btrfs_block_group_cache *cache;
6963 u64 start = BTRFS_SUPER_INFO_OFFSET + BTRFS_SUPER_INFO_SIZE;
6967 if (btrfs_super_cache_generation(root->fs_info->super_copy) != -1ULL &&
6968 btrfs_super_generation(root->fs_info->super_copy) !=
6969 btrfs_super_cache_generation(root->fs_info->super_copy)) {
6970 printf("cache and super generation don't match, space cache "
6971 "will be invalidated\n");
6975 if (ctx.progress_enabled) {
6976 ctx.tp = TASK_FREE_SPACE;
6977 task_start(ctx.info);
6981 cache = btrfs_lookup_first_block_group(root->fs_info, start);
6985 start = cache->key.objectid + cache->key.offset;
6986 if (!cache->free_space_ctl) {
6987 if (btrfs_init_free_space_ctl(cache,
6988 root->sectorsize)) {
6993 btrfs_remove_free_space_cache(cache);
6996 if (btrfs_fs_compat_ro(root->fs_info,
6997 BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE)) {
6998 ret = exclude_super_stripes(root, cache);
7000 fprintf(stderr, "could not exclude super stripes: %s\n",
7005 ret = load_free_space_tree(root->fs_info, cache);
7006 free_excluded_extents(root, cache);
7008 fprintf(stderr, "could not load free space tree: %s\n",
7015 ret = load_free_space_cache(root->fs_info, cache);
7020 ret = verify_space_cache(root, cache);
7022 fprintf(stderr, "cache appears valid but isn't %Lu\n",
7023 cache->key.objectid);
7028 task_stop(ctx.info);
7030 return error ? -EINVAL : 0;
7033 static int check_extent_csums(struct btrfs_root *root, u64 bytenr,
7034 u64 num_bytes, unsigned long leaf_offset,
7035 struct extent_buffer *eb) {
7038 u16 csum_size = btrfs_super_csum_size(root->fs_info->super_copy);
7040 unsigned long csum_offset;
7044 u64 data_checked = 0;
7050 if (num_bytes % root->sectorsize)
7053 data = malloc(num_bytes);
7057 while (offset < num_bytes) {
7060 read_len = num_bytes - offset;
7061 /* read as much space once a time */
7062 ret = read_extent_data(root, data + offset,
7063 bytenr + offset, &read_len, mirror);
7067 /* verify every 4k data's checksum */
7068 while (data_checked < read_len) {
7070 tmp = offset + data_checked;
7072 csum = btrfs_csum_data(NULL, (char *)data + tmp,
7073 csum, root->sectorsize);
7074 btrfs_csum_final(csum, (u8 *)&csum);
7076 csum_offset = leaf_offset +
7077 tmp / root->sectorsize * csum_size;
7078 read_extent_buffer(eb, (char *)&csum_expected,
7079 csum_offset, csum_size);
7080 /* try another mirror */
7081 if (csum != csum_expected) {
7082 fprintf(stderr, "mirror %d bytenr %llu csum %u expected csum %u\n",
7083 mirror, bytenr + tmp,
7084 csum, csum_expected);
7085 num_copies = btrfs_num_copies(
7086 &root->fs_info->mapping_tree,
7088 if (mirror < num_copies - 1) {
7093 data_checked += root->sectorsize;
7102 static int check_extent_exists(struct btrfs_root *root, u64 bytenr,
7105 struct btrfs_path path;
7106 struct extent_buffer *leaf;
7107 struct btrfs_key key;
7110 btrfs_init_path(&path);
7111 key.objectid = bytenr;
7112 key.type = BTRFS_EXTENT_ITEM_KEY;
7113 key.offset = (u64)-1;
7116 ret = btrfs_search_slot(NULL, root->fs_info->extent_root, &key, &path,
7119 fprintf(stderr, "Error looking up extent record %d\n", ret);
7120 btrfs_release_path(&path);
7123 if (path.slots[0] > 0) {
7126 ret = btrfs_prev_leaf(root, &path);
7129 } else if (ret > 0) {
7136 btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
7139 * Block group items come before extent items if they have the same
7140 * bytenr, so walk back one more just in case. Dear future traveller,
7141 * first congrats on mastering time travel. Now if it's not too much
7142 * trouble could you go back to 2006 and tell Chris to make the
7143 * BLOCK_GROUP_ITEM_KEY (and BTRFS_*_REF_KEY) lower than the
7144 * EXTENT_ITEM_KEY please?
7146 while (key.type > BTRFS_EXTENT_ITEM_KEY) {
7147 if (path.slots[0] > 0) {
7150 ret = btrfs_prev_leaf(root, &path);
7153 } else if (ret > 0) {
7158 btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
7162 if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) {
7163 ret = btrfs_next_leaf(root, &path);
7165 fprintf(stderr, "Error going to next leaf "
7167 btrfs_release_path(&path);
7173 leaf = path.nodes[0];
7174 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
7175 if (key.type != BTRFS_EXTENT_ITEM_KEY) {
7179 if (key.objectid + key.offset < bytenr) {
7183 if (key.objectid > bytenr + num_bytes)
7186 if (key.objectid == bytenr) {
7187 if (key.offset >= num_bytes) {
7191 num_bytes -= key.offset;
7192 bytenr += key.offset;
7193 } else if (key.objectid < bytenr) {
7194 if (key.objectid + key.offset >= bytenr + num_bytes) {
7198 num_bytes = (bytenr + num_bytes) -
7199 (key.objectid + key.offset);
7200 bytenr = key.objectid + key.offset;
7202 if (key.objectid + key.offset < bytenr + num_bytes) {
7203 u64 new_start = key.objectid + key.offset;
7204 u64 new_bytes = bytenr + num_bytes - new_start;
7207 * Weird case, the extent is in the middle of
7208 * our range, we'll have to search one side
7209 * and then the other. Not sure if this happens
7210 * in real life, but no harm in coding it up
7211 * anyway just in case.
7213 btrfs_release_path(&path);
7214 ret = check_extent_exists(root, new_start,
7217 fprintf(stderr, "Right section didn't "
7221 num_bytes = key.objectid - bytenr;
7224 num_bytes = key.objectid - bytenr;
7231 if (num_bytes && !ret) {
7232 fprintf(stderr, "There are no extents for csum range "
7233 "%Lu-%Lu\n", bytenr, bytenr+num_bytes);
7237 btrfs_release_path(&path);
7241 static int check_csums(struct btrfs_root *root)
7243 struct btrfs_path path;
7244 struct extent_buffer *leaf;
7245 struct btrfs_key key;
7246 u64 offset = 0, num_bytes = 0;
7247 u16 csum_size = btrfs_super_csum_size(root->fs_info->super_copy);
7251 unsigned long leaf_offset;
7253 root = root->fs_info->csum_root;
7254 if (!extent_buffer_uptodate(root->node)) {
7255 fprintf(stderr, "No valid csum tree found\n");
7259 btrfs_init_path(&path);
7260 key.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
7261 key.type = BTRFS_EXTENT_CSUM_KEY;
7263 ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
7265 fprintf(stderr, "Error searching csum tree %d\n", ret);
7266 btrfs_release_path(&path);
7270 if (ret > 0 && path.slots[0])
7275 if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) {
7276 ret = btrfs_next_leaf(root, &path);
7278 fprintf(stderr, "Error going to next leaf "
7285 leaf = path.nodes[0];
7287 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
7288 if (key.type != BTRFS_EXTENT_CSUM_KEY) {
7293 data_len = (btrfs_item_size_nr(leaf, path.slots[0]) /
7294 csum_size) * root->sectorsize;
7295 if (!check_data_csum)
7296 goto skip_csum_check;
7297 leaf_offset = btrfs_item_ptr_offset(leaf, path.slots[0]);
7298 ret = check_extent_csums(root, key.offset, data_len,
7304 offset = key.offset;
7305 } else if (key.offset != offset + num_bytes) {
7306 ret = check_extent_exists(root, offset, num_bytes);
7308 fprintf(stderr, "Csum exists for %Lu-%Lu but "
7309 "there is no extent record\n",
7310 offset, offset+num_bytes);
7313 offset = key.offset;
7316 num_bytes += data_len;
7320 btrfs_release_path(&path);
7324 static int is_dropped_key(struct btrfs_key *key,
7325 struct btrfs_key *drop_key) {
7326 if (key->objectid < drop_key->objectid)
7328 else if (key->objectid == drop_key->objectid) {
7329 if (key->type < drop_key->type)
7331 else if (key->type == drop_key->type) {
7332 if (key->offset < drop_key->offset)
7340 * Here are the rules for FULL_BACKREF.
7342 * 1) If BTRFS_HEADER_FLAG_RELOC is set then we have FULL_BACKREF set.
7343 * 2) If btrfs_header_owner(buf) no longer points to buf then we have
7345 * 3) We cowed the block walking down a reloc tree. This is impossible to tell
7346 * if it happened after the relocation occurred since we'll have dropped the
7347 * reloc root, so it's entirely possible to have FULL_BACKREF set on buf and
7348 * have no real way to know for sure.
7350 * We process the blocks one root at a time, and we start from the lowest root
7351 * objectid and go to the highest. So we can just lookup the owner backref for
7352 * the record and if we don't find it then we know it doesn't exist and we have
7355 * FIXME: if we ever start reclaiming root objectid's then we need to fix this
7356 * assumption and simply indicate that we _think_ that the FULL BACKREF needs to
7357 * be set or not and then we can check later once we've gathered all the refs.
7359 static int calc_extent_flag(struct btrfs_root *root,
7360 struct cache_tree *extent_cache,
7361 struct extent_buffer *buf,
7362 struct root_item_record *ri,
7365 struct extent_record *rec;
7366 struct cache_extent *cache;
7367 struct tree_backref *tback;
7370 cache = lookup_cache_extent(extent_cache, buf->start, 1);
7371 /* we have added this extent before */
7375 rec = container_of(cache, struct extent_record, cache);
7378 * Except file/reloc tree, we can not have
7381 if (ri->objectid < BTRFS_FIRST_FREE_OBJECTID)
7386 if (buf->start == ri->bytenr)
7389 if (btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC))
7392 owner = btrfs_header_owner(buf);
7393 if (owner == ri->objectid)
7396 tback = find_tree_backref(rec, 0, owner);
7401 if (rec->flag_block_full_backref != FLAG_UNSET &&
7402 rec->flag_block_full_backref != 0)
7403 rec->bad_full_backref = 1;
7406 *flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
7407 if (rec->flag_block_full_backref != FLAG_UNSET &&
7408 rec->flag_block_full_backref != 1)
7409 rec->bad_full_backref = 1;
7413 static void report_mismatch_key_root(u8 key_type, u64 rootid)
7415 fprintf(stderr, "Invalid key type(");
7416 print_key_type(stderr, 0, key_type);
7417 fprintf(stderr, ") found in root(");
7418 print_objectid(stderr, rootid, 0);
7419 fprintf(stderr, ")\n");
7423 * Check if the key is valid with its extent buffer.
7425 * This is a early check in case invalid key exists in a extent buffer
7426 * This is not comprehensive yet, but should prevent wrong key/item passed
7429 static int check_type_with_root(u64 rootid, u8 key_type)
7432 /* Only valid in chunk tree */
7433 case BTRFS_DEV_ITEM_KEY:
7434 case BTRFS_CHUNK_ITEM_KEY:
7435 if (rootid != BTRFS_CHUNK_TREE_OBJECTID)
7438 /* valid in csum and log tree */
7439 case BTRFS_CSUM_TREE_OBJECTID:
7440 if (!(rootid == BTRFS_TREE_LOG_OBJECTID ||
7444 case BTRFS_EXTENT_ITEM_KEY:
7445 case BTRFS_METADATA_ITEM_KEY:
7446 case BTRFS_BLOCK_GROUP_ITEM_KEY:
7447 if (rootid != BTRFS_EXTENT_TREE_OBJECTID)
7450 case BTRFS_ROOT_ITEM_KEY:
7451 if (rootid != BTRFS_ROOT_TREE_OBJECTID)
7454 case BTRFS_DEV_EXTENT_KEY:
7455 if (rootid != BTRFS_DEV_TREE_OBJECTID)
7461 report_mismatch_key_root(key_type, rootid);
7465 static int run_next_block(struct btrfs_root *root,
7466 struct block_info *bits,
7469 struct cache_tree *pending,
7470 struct cache_tree *seen,
7471 struct cache_tree *reada,
7472 struct cache_tree *nodes,
7473 struct cache_tree *extent_cache,
7474 struct cache_tree *chunk_cache,
7475 struct rb_root *dev_cache,
7476 struct block_group_tree *block_group_cache,
7477 struct device_extent_tree *dev_extent_cache,
7478 struct root_item_record *ri)
7480 struct extent_buffer *buf;
7481 struct extent_record *rec = NULL;
7492 struct btrfs_key key;
7493 struct cache_extent *cache;
7496 nritems = pick_next_pending(pending, reada, nodes, *last, bits,
7497 bits_nr, &reada_bits);
7502 for(i = 0; i < nritems; i++) {
7503 ret = add_cache_extent(reada, bits[i].start,
7508 /* fixme, get the parent transid */
7509 readahead_tree_block(root, bits[i].start,
7513 *last = bits[0].start;
7514 bytenr = bits[0].start;
7515 size = bits[0].size;
7517 cache = lookup_cache_extent(pending, bytenr, size);
7519 remove_cache_extent(pending, cache);
7522 cache = lookup_cache_extent(reada, bytenr, size);
7524 remove_cache_extent(reada, cache);
7527 cache = lookup_cache_extent(nodes, bytenr, size);
7529 remove_cache_extent(nodes, cache);
7532 cache = lookup_cache_extent(extent_cache, bytenr, size);
7534 rec = container_of(cache, struct extent_record, cache);
7535 gen = rec->parent_generation;
7538 /* fixme, get the real parent transid */
7539 buf = read_tree_block(root, bytenr, size, gen);
7540 if (!extent_buffer_uptodate(buf)) {
7541 record_bad_block_io(root->fs_info,
7542 extent_cache, bytenr, size);
7546 nritems = btrfs_header_nritems(buf);
7549 if (!init_extent_tree) {
7550 ret = btrfs_lookup_extent_info(NULL, root, bytenr,
7551 btrfs_header_level(buf), 1, NULL,
7554 ret = calc_extent_flag(root, extent_cache, buf, ri, &flags);
7556 fprintf(stderr, "Couldn't calc extent flags\n");
7557 flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
7562 ret = calc_extent_flag(root, extent_cache, buf, ri, &flags);
7564 fprintf(stderr, "Couldn't calc extent flags\n");
7565 flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
7569 if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF) {
7571 ri->objectid != BTRFS_TREE_RELOC_OBJECTID &&
7572 ri->objectid == btrfs_header_owner(buf)) {
7574 * Ok we got to this block from it's original owner and
7575 * we have FULL_BACKREF set. Relocation can leave
7576 * converted blocks over so this is altogether possible,
7577 * however it's not possible if the generation > the
7578 * last snapshot, so check for this case.
7580 if (!btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC) &&
7581 btrfs_header_generation(buf) > ri->last_snapshot) {
7582 flags &= ~BTRFS_BLOCK_FLAG_FULL_BACKREF;
7583 rec->bad_full_backref = 1;
7588 (ri->objectid == BTRFS_TREE_RELOC_OBJECTID ||
7589 btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC))) {
7590 flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
7591 rec->bad_full_backref = 1;
7595 if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF) {
7596 rec->flag_block_full_backref = 1;
7600 rec->flag_block_full_backref = 0;
7602 owner = btrfs_header_owner(buf);
7605 ret = check_block(root, extent_cache, buf, flags);
7609 if (btrfs_is_leaf(buf)) {
7610 btree_space_waste += btrfs_leaf_free_space(root, buf);
7611 for (i = 0; i < nritems; i++) {
7612 struct btrfs_file_extent_item *fi;
7613 btrfs_item_key_to_cpu(buf, &key, i);
7615 * Check key type against the leaf owner.
7616 * Could filter quite a lot of early error if
7619 if (check_type_with_root(btrfs_header_owner(buf),
7621 fprintf(stderr, "ignoring invalid key\n");
7624 if (key.type == BTRFS_EXTENT_ITEM_KEY) {
7625 process_extent_item(root, extent_cache, buf,
7629 if (key.type == BTRFS_METADATA_ITEM_KEY) {
7630 process_extent_item(root, extent_cache, buf,
7634 if (key.type == BTRFS_EXTENT_CSUM_KEY) {
7636 btrfs_item_size_nr(buf, i);
7639 if (key.type == BTRFS_CHUNK_ITEM_KEY) {
7640 process_chunk_item(chunk_cache, &key, buf, i);
7643 if (key.type == BTRFS_DEV_ITEM_KEY) {
7644 process_device_item(dev_cache, &key, buf, i);
7647 if (key.type == BTRFS_BLOCK_GROUP_ITEM_KEY) {
7648 process_block_group_item(block_group_cache,
7652 if (key.type == BTRFS_DEV_EXTENT_KEY) {
7653 process_device_extent_item(dev_extent_cache,
7658 if (key.type == BTRFS_EXTENT_REF_V0_KEY) {
7659 #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
7660 process_extent_ref_v0(extent_cache, buf, i);
7667 if (key.type == BTRFS_TREE_BLOCK_REF_KEY) {
7668 ret = add_tree_backref(extent_cache,
7669 key.objectid, 0, key.offset, 0);
7671 error("add_tree_backref failed: %s",
7675 if (key.type == BTRFS_SHARED_BLOCK_REF_KEY) {
7676 ret = add_tree_backref(extent_cache,
7677 key.objectid, key.offset, 0, 0);
7679 error("add_tree_backref failed: %s",
7683 if (key.type == BTRFS_EXTENT_DATA_REF_KEY) {
7684 struct btrfs_extent_data_ref *ref;
7685 ref = btrfs_item_ptr(buf, i,
7686 struct btrfs_extent_data_ref);
7687 add_data_backref(extent_cache,
7689 btrfs_extent_data_ref_root(buf, ref),
7690 btrfs_extent_data_ref_objectid(buf,
7692 btrfs_extent_data_ref_offset(buf, ref),
7693 btrfs_extent_data_ref_count(buf, ref),
7694 0, root->sectorsize);
7697 if (key.type == BTRFS_SHARED_DATA_REF_KEY) {
7698 struct btrfs_shared_data_ref *ref;
7699 ref = btrfs_item_ptr(buf, i,
7700 struct btrfs_shared_data_ref);
7701 add_data_backref(extent_cache,
7702 key.objectid, key.offset, 0, 0, 0,
7703 btrfs_shared_data_ref_count(buf, ref),
7704 0, root->sectorsize);
7707 if (key.type == BTRFS_ORPHAN_ITEM_KEY) {
7708 struct bad_item *bad;
7710 if (key.objectid == BTRFS_ORPHAN_OBJECTID)
7714 bad = malloc(sizeof(struct bad_item));
7717 INIT_LIST_HEAD(&bad->list);
7718 memcpy(&bad->key, &key,
7719 sizeof(struct btrfs_key));
7720 bad->root_id = owner;
7721 list_add_tail(&bad->list, &delete_items);
7724 if (key.type != BTRFS_EXTENT_DATA_KEY)
7726 fi = btrfs_item_ptr(buf, i,
7727 struct btrfs_file_extent_item);
7728 if (btrfs_file_extent_type(buf, fi) ==
7729 BTRFS_FILE_EXTENT_INLINE)
7731 if (btrfs_file_extent_disk_bytenr(buf, fi) == 0)
7734 data_bytes_allocated +=
7735 btrfs_file_extent_disk_num_bytes(buf, fi);
7736 if (data_bytes_allocated < root->sectorsize) {
7739 data_bytes_referenced +=
7740 btrfs_file_extent_num_bytes(buf, fi);
7741 add_data_backref(extent_cache,
7742 btrfs_file_extent_disk_bytenr(buf, fi),
7743 parent, owner, key.objectid, key.offset -
7744 btrfs_file_extent_offset(buf, fi), 1, 1,
7745 btrfs_file_extent_disk_num_bytes(buf, fi));
7749 struct btrfs_key first_key;
7751 first_key.objectid = 0;
7754 btrfs_item_key_to_cpu(buf, &first_key, 0);
7755 level = btrfs_header_level(buf);
7756 for (i = 0; i < nritems; i++) {
7757 struct extent_record tmpl;
7759 ptr = btrfs_node_blockptr(buf, i);
7760 size = root->nodesize;
7761 btrfs_node_key_to_cpu(buf, &key, i);
7763 if ((level == ri->drop_level)
7764 && is_dropped_key(&key, &ri->drop_key)) {
7769 memset(&tmpl, 0, sizeof(tmpl));
7770 btrfs_cpu_key_to_disk(&tmpl.parent_key, &key);
7771 tmpl.parent_generation = btrfs_node_ptr_generation(buf, i);
7776 tmpl.max_size = size;
7777 ret = add_extent_rec(extent_cache, &tmpl);
7781 ret = add_tree_backref(extent_cache, ptr, parent,
7784 error("add_tree_backref failed: %s",
7790 add_pending(nodes, seen, ptr, size);
7792 add_pending(pending, seen, ptr, size);
7795 btree_space_waste += (BTRFS_NODEPTRS_PER_BLOCK(root) -
7796 nritems) * sizeof(struct btrfs_key_ptr);
7798 total_btree_bytes += buf->len;
7799 if (fs_root_objectid(btrfs_header_owner(buf)))
7800 total_fs_tree_bytes += buf->len;
7801 if (btrfs_header_owner(buf) == BTRFS_EXTENT_TREE_OBJECTID)
7802 total_extent_tree_bytes += buf->len;
7803 if (!found_old_backref &&
7804 btrfs_header_owner(buf) == BTRFS_TREE_RELOC_OBJECTID &&
7805 btrfs_header_backref_rev(buf) == BTRFS_MIXED_BACKREF_REV &&
7806 !btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC))
7807 found_old_backref = 1;
7809 free_extent_buffer(buf);
7813 static int add_root_to_pending(struct extent_buffer *buf,
7814 struct cache_tree *extent_cache,
7815 struct cache_tree *pending,
7816 struct cache_tree *seen,
7817 struct cache_tree *nodes,
7820 struct extent_record tmpl;
7823 if (btrfs_header_level(buf) > 0)
7824 add_pending(nodes, seen, buf->start, buf->len);
7826 add_pending(pending, seen, buf->start, buf->len);
7828 memset(&tmpl, 0, sizeof(tmpl));
7829 tmpl.start = buf->start;
7834 tmpl.max_size = buf->len;
7835 add_extent_rec(extent_cache, &tmpl);
7837 if (objectid == BTRFS_TREE_RELOC_OBJECTID ||
7838 btrfs_header_backref_rev(buf) < BTRFS_MIXED_BACKREF_REV)
7839 ret = add_tree_backref(extent_cache, buf->start, buf->start,
7842 ret = add_tree_backref(extent_cache, buf->start, 0, objectid,
7847 /* as we fix the tree, we might be deleting blocks that
7848 * we're tracking for repair. This hook makes sure we
7849 * remove any backrefs for blocks as we are fixing them.
7851 static int free_extent_hook(struct btrfs_trans_handle *trans,
7852 struct btrfs_root *root,
7853 u64 bytenr, u64 num_bytes, u64 parent,
7854 u64 root_objectid, u64 owner, u64 offset,
7857 struct extent_record *rec;
7858 struct cache_extent *cache;
7860 struct cache_tree *extent_cache = root->fs_info->fsck_extent_cache;
7862 is_data = owner >= BTRFS_FIRST_FREE_OBJECTID;
7863 cache = lookup_cache_extent(extent_cache, bytenr, num_bytes);
7867 rec = container_of(cache, struct extent_record, cache);
7869 struct data_backref *back;
7870 back = find_data_backref(rec, parent, root_objectid, owner,
7871 offset, 1, bytenr, num_bytes);
7874 if (back->node.found_ref) {
7875 back->found_ref -= refs_to_drop;
7877 rec->refs -= refs_to_drop;
7879 if (back->node.found_extent_tree) {
7880 back->num_refs -= refs_to_drop;
7881 if (rec->extent_item_refs)
7882 rec->extent_item_refs -= refs_to_drop;
7884 if (back->found_ref == 0)
7885 back->node.found_ref = 0;
7886 if (back->num_refs == 0)
7887 back->node.found_extent_tree = 0;
7889 if (!back->node.found_extent_tree && back->node.found_ref) {
7890 list_del(&back->node.list);
7894 struct tree_backref *back;
7895 back = find_tree_backref(rec, parent, root_objectid);
7898 if (back->node.found_ref) {
7901 back->node.found_ref = 0;
7903 if (back->node.found_extent_tree) {
7904 if (rec->extent_item_refs)
7905 rec->extent_item_refs--;
7906 back->node.found_extent_tree = 0;
7908 if (!back->node.found_extent_tree && back->node.found_ref) {
7909 list_del(&back->node.list);
7913 maybe_free_extent_rec(extent_cache, rec);
7918 static int delete_extent_records(struct btrfs_trans_handle *trans,
7919 struct btrfs_root *root,
7920 struct btrfs_path *path,
7921 u64 bytenr, u64 new_len)
7923 struct btrfs_key key;
7924 struct btrfs_key found_key;
7925 struct extent_buffer *leaf;
7930 key.objectid = bytenr;
7932 key.offset = (u64)-1;
7935 ret = btrfs_search_slot(trans, root->fs_info->extent_root,
7942 if (path->slots[0] == 0)
7948 leaf = path->nodes[0];
7949 slot = path->slots[0];
7951 btrfs_item_key_to_cpu(leaf, &found_key, slot);
7952 if (found_key.objectid != bytenr)
7955 if (found_key.type != BTRFS_EXTENT_ITEM_KEY &&
7956 found_key.type != BTRFS_METADATA_ITEM_KEY &&
7957 found_key.type != BTRFS_TREE_BLOCK_REF_KEY &&
7958 found_key.type != BTRFS_EXTENT_DATA_REF_KEY &&
7959 found_key.type != BTRFS_EXTENT_REF_V0_KEY &&
7960 found_key.type != BTRFS_SHARED_BLOCK_REF_KEY &&
7961 found_key.type != BTRFS_SHARED_DATA_REF_KEY) {
7962 btrfs_release_path(path);
7963 if (found_key.type == 0) {
7964 if (found_key.offset == 0)
7966 key.offset = found_key.offset - 1;
7967 key.type = found_key.type;
7969 key.type = found_key.type - 1;
7970 key.offset = (u64)-1;
7974 fprintf(stderr, "repair deleting extent record: key %Lu %u %Lu\n",
7975 found_key.objectid, found_key.type, found_key.offset);
7977 ret = btrfs_del_item(trans, root->fs_info->extent_root, path);
7980 btrfs_release_path(path);
7982 if (found_key.type == BTRFS_EXTENT_ITEM_KEY ||
7983 found_key.type == BTRFS_METADATA_ITEM_KEY) {
7984 u64 bytes = (found_key.type == BTRFS_EXTENT_ITEM_KEY) ?
7985 found_key.offset : root->nodesize;
7987 ret = btrfs_update_block_group(trans, root, bytenr,
7994 btrfs_release_path(path);
7999 * for a single backref, this will allocate a new extent
8000 * and add the backref to it.
8002 static int record_extent(struct btrfs_trans_handle *trans,
8003 struct btrfs_fs_info *info,
8004 struct btrfs_path *path,
8005 struct extent_record *rec,
8006 struct extent_backref *back,
8007 int allocated, u64 flags)
8010 struct btrfs_root *extent_root = info->extent_root;
8011 struct extent_buffer *leaf;
8012 struct btrfs_key ins_key;
8013 struct btrfs_extent_item *ei;
8014 struct data_backref *dback;
8015 struct btrfs_tree_block_info *bi;
8018 rec->max_size = max_t(u64, rec->max_size,
8019 info->extent_root->nodesize);
8022 u32 item_size = sizeof(*ei);
8025 item_size += sizeof(*bi);
8027 ins_key.objectid = rec->start;
8028 ins_key.offset = rec->max_size;
8029 ins_key.type = BTRFS_EXTENT_ITEM_KEY;
8031 ret = btrfs_insert_empty_item(trans, extent_root, path,
8032 &ins_key, item_size);
8036 leaf = path->nodes[0];
8037 ei = btrfs_item_ptr(leaf, path->slots[0],
8038 struct btrfs_extent_item);
8040 btrfs_set_extent_refs(leaf, ei, 0);
8041 btrfs_set_extent_generation(leaf, ei, rec->generation);
8043 if (back->is_data) {
8044 btrfs_set_extent_flags(leaf, ei,
8045 BTRFS_EXTENT_FLAG_DATA);
8047 struct btrfs_disk_key copy_key;;
8049 bi = (struct btrfs_tree_block_info *)(ei + 1);
8050 memset_extent_buffer(leaf, 0, (unsigned long)bi,
8053 btrfs_set_disk_key_objectid(©_key,
8054 rec->info_objectid);
8055 btrfs_set_disk_key_type(©_key, 0);
8056 btrfs_set_disk_key_offset(©_key, 0);
8058 btrfs_set_tree_block_level(leaf, bi, rec->info_level);
8059 btrfs_set_tree_block_key(leaf, bi, ©_key);
8061 btrfs_set_extent_flags(leaf, ei,
8062 BTRFS_EXTENT_FLAG_TREE_BLOCK | flags);
8065 btrfs_mark_buffer_dirty(leaf);
8066 ret = btrfs_update_block_group(trans, extent_root, rec->start,
8067 rec->max_size, 1, 0);
8070 btrfs_release_path(path);
8073 if (back->is_data) {
8077 dback = to_data_backref(back);
8078 if (back->full_backref)
8079 parent = dback->parent;
8083 for (i = 0; i < dback->found_ref; i++) {
8084 /* if parent != 0, we're doing a full backref
8085 * passing BTRFS_FIRST_FREE_OBJECTID as the owner
8086 * just makes the backref allocator create a data
8089 ret = btrfs_inc_extent_ref(trans, info->extent_root,
8090 rec->start, rec->max_size,
8094 BTRFS_FIRST_FREE_OBJECTID :
8100 fprintf(stderr, "adding new data backref"
8101 " on %llu %s %llu owner %llu"
8102 " offset %llu found %d\n",
8103 (unsigned long long)rec->start,
8104 back->full_backref ?
8106 back->full_backref ?
8107 (unsigned long long)parent :
8108 (unsigned long long)dback->root,
8109 (unsigned long long)dback->owner,
8110 (unsigned long long)dback->offset,
8114 struct tree_backref *tback;
8116 tback = to_tree_backref(back);
8117 if (back->full_backref)
8118 parent = tback->parent;
8122 ret = btrfs_inc_extent_ref(trans, info->extent_root,
8123 rec->start, rec->max_size,
8124 parent, tback->root, 0, 0);
8125 fprintf(stderr, "adding new tree backref on "
8126 "start %llu len %llu parent %llu root %llu\n",
8127 rec->start, rec->max_size, parent, tback->root);
8130 btrfs_release_path(path);
8134 static struct extent_entry *find_entry(struct list_head *entries,
8135 u64 bytenr, u64 bytes)
8137 struct extent_entry *entry = NULL;
8139 list_for_each_entry(entry, entries, list) {
8140 if (entry->bytenr == bytenr && entry->bytes == bytes)
8147 static struct extent_entry *find_most_right_entry(struct list_head *entries)
8149 struct extent_entry *entry, *best = NULL, *prev = NULL;
8151 list_for_each_entry(entry, entries, list) {
8153 * If there are as many broken entries as entries then we know
8154 * not to trust this particular entry.
8156 if (entry->broken == entry->count)
8160 * Special case, when there are only two entries and 'best' is
8170 * If our current entry == best then we can't be sure our best
8171 * is really the best, so we need to keep searching.
8173 if (best && best->count == entry->count) {
8179 /* Prev == entry, not good enough, have to keep searching */
8180 if (!prev->broken && prev->count == entry->count)
8184 best = (prev->count > entry->count) ? prev : entry;
8185 else if (best->count < entry->count)
8193 static int repair_ref(struct btrfs_fs_info *info, struct btrfs_path *path,
8194 struct data_backref *dback, struct extent_entry *entry)
8196 struct btrfs_trans_handle *trans;
8197 struct btrfs_root *root;
8198 struct btrfs_file_extent_item *fi;
8199 struct extent_buffer *leaf;
8200 struct btrfs_key key;
8204 key.objectid = dback->root;
8205 key.type = BTRFS_ROOT_ITEM_KEY;
8206 key.offset = (u64)-1;
8207 root = btrfs_read_fs_root(info, &key);
8209 fprintf(stderr, "Couldn't find root for our ref\n");
8214 * The backref points to the original offset of the extent if it was
8215 * split, so we need to search down to the offset we have and then walk
8216 * forward until we find the backref we're looking for.
8218 key.objectid = dback->owner;
8219 key.type = BTRFS_EXTENT_DATA_KEY;
8220 key.offset = dback->offset;
8221 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
8223 fprintf(stderr, "Error looking up ref %d\n", ret);
8228 if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) {
8229 ret = btrfs_next_leaf(root, path);
8231 fprintf(stderr, "Couldn't find our ref, next\n");
8235 leaf = path->nodes[0];
8236 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
8237 if (key.objectid != dback->owner ||
8238 key.type != BTRFS_EXTENT_DATA_KEY) {
8239 fprintf(stderr, "Couldn't find our ref, search\n");
8242 fi = btrfs_item_ptr(leaf, path->slots[0],
8243 struct btrfs_file_extent_item);
8244 bytenr = btrfs_file_extent_disk_bytenr(leaf, fi);
8245 bytes = btrfs_file_extent_disk_num_bytes(leaf, fi);
8247 if (bytenr == dback->disk_bytenr && bytes == dback->bytes)
8252 btrfs_release_path(path);
8254 trans = btrfs_start_transaction(root, 1);
8256 return PTR_ERR(trans);
8259 * Ok we have the key of the file extent we want to fix, now we can cow
8260 * down to the thing and fix it.
8262 ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
8264 fprintf(stderr, "Error cowing down to ref [%Lu, %u, %Lu]: %d\n",
8265 key.objectid, key.type, key.offset, ret);
8269 fprintf(stderr, "Well that's odd, we just found this key "
8270 "[%Lu, %u, %Lu]\n", key.objectid, key.type,
8275 leaf = path->nodes[0];
8276 fi = btrfs_item_ptr(leaf, path->slots[0],
8277 struct btrfs_file_extent_item);
8279 if (btrfs_file_extent_compression(leaf, fi) &&
8280 dback->disk_bytenr != entry->bytenr) {
8281 fprintf(stderr, "Ref doesn't match the record start and is "
8282 "compressed, please take a btrfs-image of this file "
8283 "system and send it to a btrfs developer so they can "
8284 "complete this functionality for bytenr %Lu\n",
8285 dback->disk_bytenr);
8290 if (dback->node.broken && dback->disk_bytenr != entry->bytenr) {
8291 btrfs_set_file_extent_disk_bytenr(leaf, fi, entry->bytenr);
8292 } else if (dback->disk_bytenr > entry->bytenr) {
8293 u64 off_diff, offset;
8295 off_diff = dback->disk_bytenr - entry->bytenr;
8296 offset = btrfs_file_extent_offset(leaf, fi);
8297 if (dback->disk_bytenr + offset +
8298 btrfs_file_extent_num_bytes(leaf, fi) >
8299 entry->bytenr + entry->bytes) {
8300 fprintf(stderr, "Ref is past the entry end, please "
8301 "take a btrfs-image of this file system and "
8302 "send it to a btrfs developer, ref %Lu\n",
8303 dback->disk_bytenr);
8308 btrfs_set_file_extent_disk_bytenr(leaf, fi, entry->bytenr);
8309 btrfs_set_file_extent_offset(leaf, fi, offset);
8310 } else if (dback->disk_bytenr < entry->bytenr) {
8313 offset = btrfs_file_extent_offset(leaf, fi);
8314 if (dback->disk_bytenr + offset < entry->bytenr) {
8315 fprintf(stderr, "Ref is before the entry start, please"
8316 " take a btrfs-image of this file system and "
8317 "send it to a btrfs developer, ref %Lu\n",
8318 dback->disk_bytenr);
8323 offset += dback->disk_bytenr;
8324 offset -= entry->bytenr;
8325 btrfs_set_file_extent_disk_bytenr(leaf, fi, entry->bytenr);
8326 btrfs_set_file_extent_offset(leaf, fi, offset);
8329 btrfs_set_file_extent_disk_num_bytes(leaf, fi, entry->bytes);
8332 * Chances are if disk_num_bytes were wrong then so is ram_bytes, but
8333 * only do this if we aren't using compression, otherwise it's a
8336 if (!btrfs_file_extent_compression(leaf, fi))
8337 btrfs_set_file_extent_ram_bytes(leaf, fi, entry->bytes);
8339 printf("ram bytes may be wrong?\n");
8340 btrfs_mark_buffer_dirty(leaf);
8342 err = btrfs_commit_transaction(trans, root);
8343 btrfs_release_path(path);
8344 return ret ? ret : err;
8347 static int verify_backrefs(struct btrfs_fs_info *info, struct btrfs_path *path,
8348 struct extent_record *rec)
8350 struct extent_backref *back;
8351 struct data_backref *dback;
8352 struct extent_entry *entry, *best = NULL;
8355 int broken_entries = 0;
8360 * Metadata is easy and the backrefs should always agree on bytenr and
8361 * size, if not we've got bigger issues.
8366 list_for_each_entry(back, &rec->backrefs, list) {
8367 if (back->full_backref || !back->is_data)
8370 dback = to_data_backref(back);
8373 * We only pay attention to backrefs that we found a real
8376 if (dback->found_ref == 0)
8380 * For now we only catch when the bytes don't match, not the
8381 * bytenr. We can easily do this at the same time, but I want
8382 * to have a fs image to test on before we just add repair
8383 * functionality willy-nilly so we know we won't screw up the
8387 entry = find_entry(&entries, dback->disk_bytenr,
8390 entry = malloc(sizeof(struct extent_entry));
8395 memset(entry, 0, sizeof(*entry));
8396 entry->bytenr = dback->disk_bytenr;
8397 entry->bytes = dback->bytes;
8398 list_add_tail(&entry->list, &entries);
8403 * If we only have on entry we may think the entries agree when
8404 * in reality they don't so we have to do some extra checking.
8406 if (dback->disk_bytenr != rec->start ||
8407 dback->bytes != rec->nr || back->broken)
8418 /* Yay all the backrefs agree, carry on good sir */
8419 if (nr_entries <= 1 && !mismatch)
8422 fprintf(stderr, "attempting to repair backref discrepency for bytenr "
8423 "%Lu\n", rec->start);
8426 * First we want to see if the backrefs can agree amongst themselves who
8427 * is right, so figure out which one of the entries has the highest
8430 best = find_most_right_entry(&entries);
8433 * Ok so we may have an even split between what the backrefs think, so
8434 * this is where we use the extent ref to see what it thinks.
8437 entry = find_entry(&entries, rec->start, rec->nr);
8438 if (!entry && (!broken_entries || !rec->found_rec)) {
8439 fprintf(stderr, "Backrefs don't agree with each other "
8440 "and extent record doesn't agree with anybody,"
8441 " so we can't fix bytenr %Lu bytes %Lu\n",
8442 rec->start, rec->nr);
8445 } else if (!entry) {
8447 * Ok our backrefs were broken, we'll assume this is the
8448 * correct value and add an entry for this range.
8450 entry = malloc(sizeof(struct extent_entry));
8455 memset(entry, 0, sizeof(*entry));
8456 entry->bytenr = rec->start;
8457 entry->bytes = rec->nr;
8458 list_add_tail(&entry->list, &entries);
8462 best = find_most_right_entry(&entries);
8464 fprintf(stderr, "Backrefs and extent record evenly "
8465 "split on who is right, this is going to "
8466 "require user input to fix bytenr %Lu bytes "
8467 "%Lu\n", rec->start, rec->nr);
8474 * I don't think this can happen currently as we'll abort() if we catch
8475 * this case higher up, but in case somebody removes that we still can't
8476 * deal with it properly here yet, so just bail out of that's the case.
8478 if (best->bytenr != rec->start) {
8479 fprintf(stderr, "Extent start and backref starts don't match, "
8480 "please use btrfs-image on this file system and send "
8481 "it to a btrfs developer so they can make fsck fix "
8482 "this particular case. bytenr is %Lu, bytes is %Lu\n",
8483 rec->start, rec->nr);
8489 * Ok great we all agreed on an extent record, let's go find the real
8490 * references and fix up the ones that don't match.
8492 list_for_each_entry(back, &rec->backrefs, list) {
8493 if (back->full_backref || !back->is_data)
8496 dback = to_data_backref(back);
8499 * Still ignoring backrefs that don't have a real ref attached
8502 if (dback->found_ref == 0)
8505 if (dback->bytes == best->bytes &&
8506 dback->disk_bytenr == best->bytenr)
8509 ret = repair_ref(info, path, dback, best);
8515 * Ok we messed with the actual refs, which means we need to drop our
8516 * entire cache and go back and rescan. I know this is a huge pain and
8517 * adds a lot of extra work, but it's the only way to be safe. Once all
8518 * the backrefs agree we may not need to do anything to the extent
8523 while (!list_empty(&entries)) {
8524 entry = list_entry(entries.next, struct extent_entry, list);
8525 list_del_init(&entry->list);
8531 static int process_duplicates(struct btrfs_root *root,
8532 struct cache_tree *extent_cache,
8533 struct extent_record *rec)
8535 struct extent_record *good, *tmp;
8536 struct cache_extent *cache;
8540 * If we found a extent record for this extent then return, or if we
8541 * have more than one duplicate we are likely going to need to delete
8544 if (rec->found_rec || rec->num_duplicates > 1)
8547 /* Shouldn't happen but just in case */
8548 BUG_ON(!rec->num_duplicates);
8551 * So this happens if we end up with a backref that doesn't match the
8552 * actual extent entry. So either the backref is bad or the extent
8553 * entry is bad. Either way we want to have the extent_record actually
8554 * reflect what we found in the extent_tree, so we need to take the
8555 * duplicate out and use that as the extent_record since the only way we
8556 * get a duplicate is if we find a real life BTRFS_EXTENT_ITEM_KEY.
8558 remove_cache_extent(extent_cache, &rec->cache);
8560 good = to_extent_record(rec->dups.next);
8561 list_del_init(&good->list);
8562 INIT_LIST_HEAD(&good->backrefs);
8563 INIT_LIST_HEAD(&good->dups);
8564 good->cache.start = good->start;
8565 good->cache.size = good->nr;
8566 good->content_checked = 0;
8567 good->owner_ref_checked = 0;
8568 good->num_duplicates = 0;
8569 good->refs = rec->refs;
8570 list_splice_init(&rec->backrefs, &good->backrefs);
8572 cache = lookup_cache_extent(extent_cache, good->start,
8576 tmp = container_of(cache, struct extent_record, cache);
8579 * If we find another overlapping extent and it's found_rec is
8580 * set then it's a duplicate and we need to try and delete
8583 if (tmp->found_rec || tmp->num_duplicates > 0) {
8584 if (list_empty(&good->list))
8585 list_add_tail(&good->list,
8586 &duplicate_extents);
8587 good->num_duplicates += tmp->num_duplicates + 1;
8588 list_splice_init(&tmp->dups, &good->dups);
8589 list_del_init(&tmp->list);
8590 list_add_tail(&tmp->list, &good->dups);
8591 remove_cache_extent(extent_cache, &tmp->cache);
8596 * Ok we have another non extent item backed extent rec, so lets
8597 * just add it to this extent and carry on like we did above.
8599 good->refs += tmp->refs;
8600 list_splice_init(&tmp->backrefs, &good->backrefs);
8601 remove_cache_extent(extent_cache, &tmp->cache);
8604 ret = insert_cache_extent(extent_cache, &good->cache);
8607 return good->num_duplicates ? 0 : 1;
8610 static int delete_duplicate_records(struct btrfs_root *root,
8611 struct extent_record *rec)
8613 struct btrfs_trans_handle *trans;
8614 LIST_HEAD(delete_list);
8615 struct btrfs_path path;
8616 struct extent_record *tmp, *good, *n;
8619 struct btrfs_key key;
8621 btrfs_init_path(&path);
8624 /* Find the record that covers all of the duplicates. */
8625 list_for_each_entry(tmp, &rec->dups, list) {
8626 if (good->start < tmp->start)
8628 if (good->nr > tmp->nr)
8631 if (tmp->start + tmp->nr < good->start + good->nr) {
8632 fprintf(stderr, "Ok we have overlapping extents that "
8633 "aren't completely covered by each other, this "
8634 "is going to require more careful thought. "
8635 "The extents are [%Lu-%Lu] and [%Lu-%Lu]\n",
8636 tmp->start, tmp->nr, good->start, good->nr);
8643 list_add_tail(&rec->list, &delete_list);
8645 list_for_each_entry_safe(tmp, n, &rec->dups, list) {
8648 list_move_tail(&tmp->list, &delete_list);
8651 root = root->fs_info->extent_root;
8652 trans = btrfs_start_transaction(root, 1);
8653 if (IS_ERR(trans)) {
8654 ret = PTR_ERR(trans);
8658 list_for_each_entry(tmp, &delete_list, list) {
8659 if (tmp->found_rec == 0)
8661 key.objectid = tmp->start;
8662 key.type = BTRFS_EXTENT_ITEM_KEY;
8663 key.offset = tmp->nr;
8665 /* Shouldn't happen but just in case */
8666 if (tmp->metadata) {
8667 fprintf(stderr, "Well this shouldn't happen, extent "
8668 "record overlaps but is metadata? "
8669 "[%Lu, %Lu]\n", tmp->start, tmp->nr);
8673 ret = btrfs_search_slot(trans, root, &key, &path, -1, 1);
8679 ret = btrfs_del_item(trans, root, &path);
8682 btrfs_release_path(&path);
8685 err = btrfs_commit_transaction(trans, root);
8689 while (!list_empty(&delete_list)) {
8690 tmp = to_extent_record(delete_list.next);
8691 list_del_init(&tmp->list);
8697 while (!list_empty(&rec->dups)) {
8698 tmp = to_extent_record(rec->dups.next);
8699 list_del_init(&tmp->list);
8703 btrfs_release_path(&path);
8705 if (!ret && !nr_del)
8706 rec->num_duplicates = 0;
8708 return ret ? ret : nr_del;
8711 static int find_possible_backrefs(struct btrfs_fs_info *info,
8712 struct btrfs_path *path,
8713 struct cache_tree *extent_cache,
8714 struct extent_record *rec)
8716 struct btrfs_root *root;
8717 struct extent_backref *back;
8718 struct data_backref *dback;
8719 struct cache_extent *cache;
8720 struct btrfs_file_extent_item *fi;
8721 struct btrfs_key key;
8725 list_for_each_entry(back, &rec->backrefs, list) {
8726 /* Don't care about full backrefs (poor unloved backrefs) */
8727 if (back->full_backref || !back->is_data)
8730 dback = to_data_backref(back);
8732 /* We found this one, we don't need to do a lookup */
8733 if (dback->found_ref)
8736 key.objectid = dback->root;
8737 key.type = BTRFS_ROOT_ITEM_KEY;
8738 key.offset = (u64)-1;
8740 root = btrfs_read_fs_root(info, &key);
8742 /* No root, definitely a bad ref, skip */
8743 if (IS_ERR(root) && PTR_ERR(root) == -ENOENT)
8745 /* Other err, exit */
8747 return PTR_ERR(root);
8749 key.objectid = dback->owner;
8750 key.type = BTRFS_EXTENT_DATA_KEY;
8751 key.offset = dback->offset;
8752 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
8754 btrfs_release_path(path);
8757 /* Didn't find it, we can carry on */
8762 fi = btrfs_item_ptr(path->nodes[0], path->slots[0],
8763 struct btrfs_file_extent_item);
8764 bytenr = btrfs_file_extent_disk_bytenr(path->nodes[0], fi);
8765 bytes = btrfs_file_extent_disk_num_bytes(path->nodes[0], fi);
8766 btrfs_release_path(path);
8767 cache = lookup_cache_extent(extent_cache, bytenr, 1);
8769 struct extent_record *tmp;
8770 tmp = container_of(cache, struct extent_record, cache);
8773 * If we found an extent record for the bytenr for this
8774 * particular backref then we can't add it to our
8775 * current extent record. We only want to add backrefs
8776 * that don't have a corresponding extent item in the
8777 * extent tree since they likely belong to this record
8778 * and we need to fix it if it doesn't match bytenrs.
8784 dback->found_ref += 1;
8785 dback->disk_bytenr = bytenr;
8786 dback->bytes = bytes;
8789 * Set this so the verify backref code knows not to trust the
8790 * values in this backref.
8799 * Record orphan data ref into corresponding root.
8801 * Return 0 if the extent item contains data ref and recorded.
8802 * Return 1 if the extent item contains no useful data ref
8803 * On that case, it may contains only shared_dataref or metadata backref
8804 * or the file extent exists(this should be handled by the extent bytenr
8806 * Return <0 if something goes wrong.
8808 static int record_orphan_data_extents(struct btrfs_fs_info *fs_info,
8809 struct extent_record *rec)
8811 struct btrfs_key key;
8812 struct btrfs_root *dest_root;
8813 struct extent_backref *back;
8814 struct data_backref *dback;
8815 struct orphan_data_extent *orphan;
8816 struct btrfs_path path;
8817 int recorded_data_ref = 0;
8822 btrfs_init_path(&path);
8823 list_for_each_entry(back, &rec->backrefs, list) {
8824 if (back->full_backref || !back->is_data ||
8825 !back->found_extent_tree)
8827 dback = to_data_backref(back);
8828 if (dback->found_ref)
8830 key.objectid = dback->root;
8831 key.type = BTRFS_ROOT_ITEM_KEY;
8832 key.offset = (u64)-1;
8834 dest_root = btrfs_read_fs_root(fs_info, &key);
8836 /* For non-exist root we just skip it */
8837 if (IS_ERR(dest_root) || !dest_root)
8840 key.objectid = dback->owner;
8841 key.type = BTRFS_EXTENT_DATA_KEY;
8842 key.offset = dback->offset;
8844 ret = btrfs_search_slot(NULL, dest_root, &key, &path, 0, 0);
8845 btrfs_release_path(&path);
8847 * For ret < 0, it's OK since the fs-tree may be corrupted,
8848 * we need to record it for inode/file extent rebuild.
8849 * For ret > 0, we record it only for file extent rebuild.
8850 * For ret == 0, the file extent exists but only bytenr
8851 * mismatch, let the original bytenr fix routine to handle,
8857 orphan = malloc(sizeof(*orphan));
8862 INIT_LIST_HEAD(&orphan->list);
8863 orphan->root = dback->root;
8864 orphan->objectid = dback->owner;
8865 orphan->offset = dback->offset;
8866 orphan->disk_bytenr = rec->cache.start;
8867 orphan->disk_len = rec->cache.size;
8868 list_add(&dest_root->orphan_data_extents, &orphan->list);
8869 recorded_data_ref = 1;
8872 btrfs_release_path(&path);
8874 return !recorded_data_ref;
8880 * when an incorrect extent item is found, this will delete
8881 * all of the existing entries for it and recreate them
8882 * based on what the tree scan found.
8884 static int fixup_extent_refs(struct btrfs_fs_info *info,
8885 struct cache_tree *extent_cache,
8886 struct extent_record *rec)
8888 struct btrfs_trans_handle *trans = NULL;
8890 struct btrfs_path path;
8891 struct list_head *cur = rec->backrefs.next;
8892 struct cache_extent *cache;
8893 struct extent_backref *back;
8897 if (rec->flag_block_full_backref)
8898 flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
8900 btrfs_init_path(&path);
8901 if (rec->refs != rec->extent_item_refs && !rec->metadata) {
8903 * Sometimes the backrefs themselves are so broken they don't
8904 * get attached to any meaningful rec, so first go back and
8905 * check any of our backrefs that we couldn't find and throw
8906 * them into the list if we find the backref so that
8907 * verify_backrefs can figure out what to do.
8909 ret = find_possible_backrefs(info, &path, extent_cache, rec);
8914 /* step one, make sure all of the backrefs agree */
8915 ret = verify_backrefs(info, &path, rec);
8919 trans = btrfs_start_transaction(info->extent_root, 1);
8920 if (IS_ERR(trans)) {
8921 ret = PTR_ERR(trans);
8925 /* step two, delete all the existing records */
8926 ret = delete_extent_records(trans, info->extent_root, &path,
8927 rec->start, rec->max_size);
8932 /* was this block corrupt? If so, don't add references to it */
8933 cache = lookup_cache_extent(info->corrupt_blocks,
8934 rec->start, rec->max_size);
8940 /* step three, recreate all the refs we did find */
8941 while(cur != &rec->backrefs) {
8942 back = to_extent_backref(cur);
8946 * if we didn't find any references, don't create a
8949 if (!back->found_ref)
8952 rec->bad_full_backref = 0;
8953 ret = record_extent(trans, info, &path, rec, back, allocated, flags);
8961 int err = btrfs_commit_transaction(trans, info->extent_root);
8966 btrfs_release_path(&path);
8970 static int fixup_extent_flags(struct btrfs_fs_info *fs_info,
8971 struct extent_record *rec)
8973 struct btrfs_trans_handle *trans;
8974 struct btrfs_root *root = fs_info->extent_root;
8975 struct btrfs_path path;
8976 struct btrfs_extent_item *ei;
8977 struct btrfs_key key;
8981 key.objectid = rec->start;
8982 if (rec->metadata) {
8983 key.type = BTRFS_METADATA_ITEM_KEY;
8984 key.offset = rec->info_level;
8986 key.type = BTRFS_EXTENT_ITEM_KEY;
8987 key.offset = rec->max_size;
8990 trans = btrfs_start_transaction(root, 0);
8992 return PTR_ERR(trans);
8994 btrfs_init_path(&path);
8995 ret = btrfs_search_slot(trans, root, &key, &path, 0, 1);
8997 btrfs_release_path(&path);
8998 btrfs_commit_transaction(trans, root);
9001 fprintf(stderr, "Didn't find extent for %llu\n",
9002 (unsigned long long)rec->start);
9003 btrfs_release_path(&path);
9004 btrfs_commit_transaction(trans, root);
9008 ei = btrfs_item_ptr(path.nodes[0], path.slots[0],
9009 struct btrfs_extent_item);
9010 flags = btrfs_extent_flags(path.nodes[0], ei);
9011 if (rec->flag_block_full_backref) {
9012 fprintf(stderr, "setting full backref on %llu\n",
9013 (unsigned long long)key.objectid);
9014 flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
9016 fprintf(stderr, "clearing full backref on %llu\n",
9017 (unsigned long long)key.objectid);
9018 flags &= ~BTRFS_BLOCK_FLAG_FULL_BACKREF;
9020 btrfs_set_extent_flags(path.nodes[0], ei, flags);
9021 btrfs_mark_buffer_dirty(path.nodes[0]);
9022 btrfs_release_path(&path);
9023 return btrfs_commit_transaction(trans, root);
9026 /* right now we only prune from the extent allocation tree */
9027 static int prune_one_block(struct btrfs_trans_handle *trans,
9028 struct btrfs_fs_info *info,
9029 struct btrfs_corrupt_block *corrupt)
9032 struct btrfs_path path;
9033 struct extent_buffer *eb;
9037 int level = corrupt->level + 1;
9039 btrfs_init_path(&path);
9041 /* we want to stop at the parent to our busted block */
9042 path.lowest_level = level;
9044 ret = btrfs_search_slot(trans, info->extent_root,
9045 &corrupt->key, &path, -1, 1);
9050 eb = path.nodes[level];
9057 * hopefully the search gave us the block we want to prune,
9058 * lets try that first
9060 slot = path.slots[level];
9061 found = btrfs_node_blockptr(eb, slot);
9062 if (found == corrupt->cache.start)
9065 nritems = btrfs_header_nritems(eb);
9067 /* the search failed, lets scan this node and hope we find it */
9068 for (slot = 0; slot < nritems; slot++) {
9069 found = btrfs_node_blockptr(eb, slot);
9070 if (found == corrupt->cache.start)
9074 * we couldn't find the bad block. TODO, search all the nodes for pointers
9077 if (eb == info->extent_root->node) {
9082 btrfs_release_path(&path);
9087 printk("deleting pointer to block %Lu\n", corrupt->cache.start);
9088 ret = btrfs_del_ptr(trans, info->extent_root, &path, level, slot);
9091 btrfs_release_path(&path);
9095 static int prune_corrupt_blocks(struct btrfs_fs_info *info)
9097 struct btrfs_trans_handle *trans = NULL;
9098 struct cache_extent *cache;
9099 struct btrfs_corrupt_block *corrupt;
9102 cache = search_cache_extent(info->corrupt_blocks, 0);
9106 trans = btrfs_start_transaction(info->extent_root, 1);
9108 return PTR_ERR(trans);
9110 corrupt = container_of(cache, struct btrfs_corrupt_block, cache);
9111 prune_one_block(trans, info, corrupt);
9112 remove_cache_extent(info->corrupt_blocks, cache);
9115 return btrfs_commit_transaction(trans, info->extent_root);
9119 static void reset_cached_block_groups(struct btrfs_fs_info *fs_info)
9121 struct btrfs_block_group_cache *cache;
9126 ret = find_first_extent_bit(&fs_info->free_space_cache, 0,
9127 &start, &end, EXTENT_DIRTY);
9130 clear_extent_dirty(&fs_info->free_space_cache, start, end,
9136 cache = btrfs_lookup_first_block_group(fs_info, start);
9141 start = cache->key.objectid + cache->key.offset;
9145 static int check_extent_refs(struct btrfs_root *root,
9146 struct cache_tree *extent_cache)
9148 struct extent_record *rec;
9149 struct cache_extent *cache;
9158 * if we're doing a repair, we have to make sure
9159 * we don't allocate from the problem extents.
9160 * In the worst case, this will be all the
9163 cache = search_cache_extent(extent_cache, 0);
9165 rec = container_of(cache, struct extent_record, cache);
9166 set_extent_dirty(root->fs_info->excluded_extents,
9168 rec->start + rec->max_size - 1,
9170 cache = next_cache_extent(cache);
9173 /* pin down all the corrupted blocks too */
9174 cache = search_cache_extent(root->fs_info->corrupt_blocks, 0);
9176 set_extent_dirty(root->fs_info->excluded_extents,
9178 cache->start + cache->size - 1,
9180 cache = next_cache_extent(cache);
9182 prune_corrupt_blocks(root->fs_info);
9183 reset_cached_block_groups(root->fs_info);
9186 reset_cached_block_groups(root->fs_info);
9189 * We need to delete any duplicate entries we find first otherwise we
9190 * could mess up the extent tree when we have backrefs that actually
9191 * belong to a different extent item and not the weird duplicate one.
9193 while (repair && !list_empty(&duplicate_extents)) {
9194 rec = to_extent_record(duplicate_extents.next);
9195 list_del_init(&rec->list);
9197 /* Sometimes we can find a backref before we find an actual
9198 * extent, so we need to process it a little bit to see if there
9199 * truly are multiple EXTENT_ITEM_KEY's for the same range, or
9200 * if this is a backref screwup. If we need to delete stuff
9201 * process_duplicates() will return 0, otherwise it will return
9204 if (process_duplicates(root, extent_cache, rec))
9206 ret = delete_duplicate_records(root, rec);
9210 * delete_duplicate_records will return the number of entries
9211 * deleted, so if it's greater than 0 then we know we actually
9212 * did something and we need to remove.
9226 cache = search_cache_extent(extent_cache, 0);
9229 rec = container_of(cache, struct extent_record, cache);
9230 if (rec->num_duplicates) {
9231 fprintf(stderr, "extent item %llu has multiple extent "
9232 "items\n", (unsigned long long)rec->start);
9237 if (rec->refs != rec->extent_item_refs) {
9238 fprintf(stderr, "ref mismatch on [%llu %llu] ",
9239 (unsigned long long)rec->start,
9240 (unsigned long long)rec->nr);
9241 fprintf(stderr, "extent item %llu, found %llu\n",
9242 (unsigned long long)rec->extent_item_refs,
9243 (unsigned long long)rec->refs);
9244 ret = record_orphan_data_extents(root->fs_info, rec);
9251 * we can't use the extent to repair file
9252 * extent, let the fallback method handle it.
9254 if (!fixed && repair) {
9255 ret = fixup_extent_refs(
9266 if (all_backpointers_checked(rec, 1)) {
9267 fprintf(stderr, "backpointer mismatch on [%llu %llu]\n",
9268 (unsigned long long)rec->start,
9269 (unsigned long long)rec->nr);
9271 if (!fixed && !recorded && repair) {
9272 ret = fixup_extent_refs(root->fs_info,
9281 if (!rec->owner_ref_checked) {
9282 fprintf(stderr, "owner ref check failed [%llu %llu]\n",
9283 (unsigned long long)rec->start,
9284 (unsigned long long)rec->nr);
9285 if (!fixed && !recorded && repair) {
9286 ret = fixup_extent_refs(root->fs_info,
9295 if (rec->bad_full_backref) {
9296 fprintf(stderr, "bad full backref, on [%llu]\n",
9297 (unsigned long long)rec->start);
9299 ret = fixup_extent_flags(root->fs_info, rec);
9308 * Although it's not a extent ref's problem, we reuse this
9309 * routine for error reporting.
9310 * No repair function yet.
9312 if (rec->crossing_stripes) {
9314 "bad metadata [%llu, %llu) crossing stripe boundary\n",
9315 rec->start, rec->start + rec->max_size);
9320 if (rec->wrong_chunk_type) {
9322 "bad extent [%llu, %llu), type mismatch with chunk\n",
9323 rec->start, rec->start + rec->max_size);
9328 remove_cache_extent(extent_cache, cache);
9329 free_all_extent_backrefs(rec);
9330 if (!init_extent_tree && repair && (!cur_err || fixed))
9331 clear_extent_dirty(root->fs_info->excluded_extents,
9333 rec->start + rec->max_size - 1,
9339 if (ret && ret != -EAGAIN) {
9340 fprintf(stderr, "failed to repair damaged filesystem, aborting\n");
9343 struct btrfs_trans_handle *trans;
9345 root = root->fs_info->extent_root;
9346 trans = btrfs_start_transaction(root, 1);
9347 if (IS_ERR(trans)) {
9348 ret = PTR_ERR(trans);
9352 btrfs_fix_block_accounting(trans, root);
9353 ret = btrfs_commit_transaction(trans, root);
9358 fprintf(stderr, "repaired damaged extent references\n");
9364 u64 calc_stripe_length(u64 type, u64 length, int num_stripes)
9368 if (type & BTRFS_BLOCK_GROUP_RAID0) {
9369 stripe_size = length;
9370 stripe_size /= num_stripes;
9371 } else if (type & BTRFS_BLOCK_GROUP_RAID10) {
9372 stripe_size = length * 2;
9373 stripe_size /= num_stripes;
9374 } else if (type & BTRFS_BLOCK_GROUP_RAID5) {
9375 stripe_size = length;
9376 stripe_size /= (num_stripes - 1);
9377 } else if (type & BTRFS_BLOCK_GROUP_RAID6) {
9378 stripe_size = length;
9379 stripe_size /= (num_stripes - 2);
9381 stripe_size = length;
9387 * Check the chunk with its block group/dev list ref:
9388 * Return 0 if all refs seems valid.
9389 * Return 1 if part of refs seems valid, need later check for rebuild ref
9390 * like missing block group and needs to search extent tree to rebuild them.
9391 * Return -1 if essential refs are missing and unable to rebuild.
9393 static int check_chunk_refs(struct chunk_record *chunk_rec,
9394 struct block_group_tree *block_group_cache,
9395 struct device_extent_tree *dev_extent_cache,
9398 struct cache_extent *block_group_item;
9399 struct block_group_record *block_group_rec;
9400 struct cache_extent *dev_extent_item;
9401 struct device_extent_record *dev_extent_rec;
9405 int metadump_v2 = 0;
9409 block_group_item = lookup_cache_extent(&block_group_cache->tree,
9412 if (block_group_item) {
9413 block_group_rec = container_of(block_group_item,
9414 struct block_group_record,
9416 if (chunk_rec->length != block_group_rec->offset ||
9417 chunk_rec->offset != block_group_rec->objectid ||
9419 chunk_rec->type_flags != block_group_rec->flags)) {
9422 "Chunk[%llu, %u, %llu]: length(%llu), offset(%llu), type(%llu) mismatch with block group[%llu, %u, %llu]: offset(%llu), objectid(%llu), flags(%llu)\n",
9423 chunk_rec->objectid,
9428 chunk_rec->type_flags,
9429 block_group_rec->objectid,
9430 block_group_rec->type,
9431 block_group_rec->offset,
9432 block_group_rec->offset,
9433 block_group_rec->objectid,
9434 block_group_rec->flags);
9437 list_del_init(&block_group_rec->list);
9438 chunk_rec->bg_rec = block_group_rec;
9443 "Chunk[%llu, %u, %llu]: length(%llu), offset(%llu), type(%llu) is not found in block group\n",
9444 chunk_rec->objectid,
9449 chunk_rec->type_flags);
9456 length = calc_stripe_length(chunk_rec->type_flags, chunk_rec->length,
9457 chunk_rec->num_stripes);
9458 for (i = 0; i < chunk_rec->num_stripes; ++i) {
9459 devid = chunk_rec->stripes[i].devid;
9460 offset = chunk_rec->stripes[i].offset;
9461 dev_extent_item = lookup_cache_extent2(&dev_extent_cache->tree,
9462 devid, offset, length);
9463 if (dev_extent_item) {
9464 dev_extent_rec = container_of(dev_extent_item,
9465 struct device_extent_record,
9467 if (dev_extent_rec->objectid != devid ||
9468 dev_extent_rec->offset != offset ||
9469 dev_extent_rec->chunk_offset != chunk_rec->offset ||
9470 dev_extent_rec->length != length) {
9473 "Chunk[%llu, %u, %llu] stripe[%llu, %llu] dismatch dev extent[%llu, %llu, %llu]\n",
9474 chunk_rec->objectid,
9477 chunk_rec->stripes[i].devid,
9478 chunk_rec->stripes[i].offset,
9479 dev_extent_rec->objectid,
9480 dev_extent_rec->offset,
9481 dev_extent_rec->length);
9484 list_move(&dev_extent_rec->chunk_list,
9485 &chunk_rec->dextents);
9490 "Chunk[%llu, %u, %llu] stripe[%llu, %llu] is not found in dev extent\n",
9491 chunk_rec->objectid,
9494 chunk_rec->stripes[i].devid,
9495 chunk_rec->stripes[i].offset);
9502 /* check btrfs_chunk -> btrfs_dev_extent / btrfs_block_group_item */
9503 int check_chunks(struct cache_tree *chunk_cache,
9504 struct block_group_tree *block_group_cache,
9505 struct device_extent_tree *dev_extent_cache,
9506 struct list_head *good, struct list_head *bad,
9507 struct list_head *rebuild, int silent)
9509 struct cache_extent *chunk_item;
9510 struct chunk_record *chunk_rec;
9511 struct block_group_record *bg_rec;
9512 struct device_extent_record *dext_rec;
9516 chunk_item = first_cache_extent(chunk_cache);
9517 while (chunk_item) {
9518 chunk_rec = container_of(chunk_item, struct chunk_record,
9520 err = check_chunk_refs(chunk_rec, block_group_cache,
9521 dev_extent_cache, silent);
9524 if (err == 0 && good)
9525 list_add_tail(&chunk_rec->list, good);
9526 if (err > 0 && rebuild)
9527 list_add_tail(&chunk_rec->list, rebuild);
9529 list_add_tail(&chunk_rec->list, bad);
9530 chunk_item = next_cache_extent(chunk_item);
9533 list_for_each_entry(bg_rec, &block_group_cache->block_groups, list) {
9536 "Block group[%llu, %llu] (flags = %llu) didn't find the relative chunk.\n",
9544 list_for_each_entry(dext_rec, &dev_extent_cache->no_chunk_orphans,
9548 "Device extent[%llu, %llu, %llu] didn't find the relative chunk.\n",
9559 static int check_device_used(struct device_record *dev_rec,
9560 struct device_extent_tree *dext_cache)
9562 struct cache_extent *cache;
9563 struct device_extent_record *dev_extent_rec;
9566 cache = search_cache_extent2(&dext_cache->tree, dev_rec->devid, 0);
9568 dev_extent_rec = container_of(cache,
9569 struct device_extent_record,
9571 if (dev_extent_rec->objectid != dev_rec->devid)
9574 list_del_init(&dev_extent_rec->device_list);
9575 total_byte += dev_extent_rec->length;
9576 cache = next_cache_extent(cache);
9579 if (total_byte != dev_rec->byte_used) {
9581 "Dev extent's total-byte(%llu) is not equal to byte-used(%llu) in dev[%llu, %u, %llu]\n",
9582 total_byte, dev_rec->byte_used, dev_rec->objectid,
9583 dev_rec->type, dev_rec->offset);
9590 /* check btrfs_dev_item -> btrfs_dev_extent */
9591 static int check_devices(struct rb_root *dev_cache,
9592 struct device_extent_tree *dev_extent_cache)
9594 struct rb_node *dev_node;
9595 struct device_record *dev_rec;
9596 struct device_extent_record *dext_rec;
9600 dev_node = rb_first(dev_cache);
9602 dev_rec = container_of(dev_node, struct device_record, node);
9603 err = check_device_used(dev_rec, dev_extent_cache);
9607 dev_node = rb_next(dev_node);
9609 list_for_each_entry(dext_rec, &dev_extent_cache->no_device_orphans,
9612 "Device extent[%llu, %llu, %llu] didn't find its device.\n",
9613 dext_rec->objectid, dext_rec->offset, dext_rec->length);
9620 static int add_root_item_to_list(struct list_head *head,
9621 u64 objectid, u64 bytenr, u64 last_snapshot,
9622 u8 level, u8 drop_level,
9623 int level_size, struct btrfs_key *drop_key)
9626 struct root_item_record *ri_rec;
9627 ri_rec = malloc(sizeof(*ri_rec));
9630 ri_rec->bytenr = bytenr;
9631 ri_rec->objectid = objectid;
9632 ri_rec->level = level;
9633 ri_rec->level_size = level_size;
9634 ri_rec->drop_level = drop_level;
9635 ri_rec->last_snapshot = last_snapshot;
9637 memcpy(&ri_rec->drop_key, drop_key, sizeof(*drop_key));
9638 list_add_tail(&ri_rec->list, head);
9643 static void free_root_item_list(struct list_head *list)
9645 struct root_item_record *ri_rec;
9647 while (!list_empty(list)) {
9648 ri_rec = list_first_entry(list, struct root_item_record,
9650 list_del_init(&ri_rec->list);
9655 static int deal_root_from_list(struct list_head *list,
9656 struct btrfs_root *root,
9657 struct block_info *bits,
9659 struct cache_tree *pending,
9660 struct cache_tree *seen,
9661 struct cache_tree *reada,
9662 struct cache_tree *nodes,
9663 struct cache_tree *extent_cache,
9664 struct cache_tree *chunk_cache,
9665 struct rb_root *dev_cache,
9666 struct block_group_tree *block_group_cache,
9667 struct device_extent_tree *dev_extent_cache)
9672 while (!list_empty(list)) {
9673 struct root_item_record *rec;
9674 struct extent_buffer *buf;
9675 rec = list_entry(list->next,
9676 struct root_item_record, list);
9678 buf = read_tree_block(root->fs_info->tree_root,
9679 rec->bytenr, rec->level_size, 0);
9680 if (!extent_buffer_uptodate(buf)) {
9681 free_extent_buffer(buf);
9685 ret = add_root_to_pending(buf, extent_cache, pending,
9686 seen, nodes, rec->objectid);
9690 * To rebuild extent tree, we need deal with snapshot
9691 * one by one, otherwise we deal with node firstly which
9692 * can maximize readahead.
9695 ret = run_next_block(root, bits, bits_nr, &last,
9696 pending, seen, reada, nodes,
9697 extent_cache, chunk_cache,
9698 dev_cache, block_group_cache,
9699 dev_extent_cache, rec);
9703 free_extent_buffer(buf);
9704 list_del(&rec->list);
9710 ret = run_next_block(root, bits, bits_nr, &last, pending, seen,
9711 reada, nodes, extent_cache, chunk_cache,
9712 dev_cache, block_group_cache,
9713 dev_extent_cache, NULL);
9723 static int check_chunks_and_extents(struct btrfs_root *root)
9725 struct rb_root dev_cache;
9726 struct cache_tree chunk_cache;
9727 struct block_group_tree block_group_cache;
9728 struct device_extent_tree dev_extent_cache;
9729 struct cache_tree extent_cache;
9730 struct cache_tree seen;
9731 struct cache_tree pending;
9732 struct cache_tree reada;
9733 struct cache_tree nodes;
9734 struct extent_io_tree excluded_extents;
9735 struct cache_tree corrupt_blocks;
9736 struct btrfs_path path;
9737 struct btrfs_key key;
9738 struct btrfs_key found_key;
9740 struct block_info *bits;
9742 struct extent_buffer *leaf;
9744 struct btrfs_root_item ri;
9745 struct list_head dropping_trees;
9746 struct list_head normal_trees;
9747 struct btrfs_root *root1;
9752 dev_cache = RB_ROOT;
9753 cache_tree_init(&chunk_cache);
9754 block_group_tree_init(&block_group_cache);
9755 device_extent_tree_init(&dev_extent_cache);
9757 cache_tree_init(&extent_cache);
9758 cache_tree_init(&seen);
9759 cache_tree_init(&pending);
9760 cache_tree_init(&nodes);
9761 cache_tree_init(&reada);
9762 cache_tree_init(&corrupt_blocks);
9763 extent_io_tree_init(&excluded_extents);
9764 INIT_LIST_HEAD(&dropping_trees);
9765 INIT_LIST_HEAD(&normal_trees);
9768 root->fs_info->excluded_extents = &excluded_extents;
9769 root->fs_info->fsck_extent_cache = &extent_cache;
9770 root->fs_info->free_extent_hook = free_extent_hook;
9771 root->fs_info->corrupt_blocks = &corrupt_blocks;
9775 bits = malloc(bits_nr * sizeof(struct block_info));
9781 if (ctx.progress_enabled) {
9782 ctx.tp = TASK_EXTENTS;
9783 task_start(ctx.info);
9787 root1 = root->fs_info->tree_root;
9788 level = btrfs_header_level(root1->node);
9789 ret = add_root_item_to_list(&normal_trees, root1->root_key.objectid,
9790 root1->node->start, 0, level, 0,
9791 root1->nodesize, NULL);
9794 root1 = root->fs_info->chunk_root;
9795 level = btrfs_header_level(root1->node);
9796 ret = add_root_item_to_list(&normal_trees, root1->root_key.objectid,
9797 root1->node->start, 0, level, 0,
9798 root1->nodesize, NULL);
9801 btrfs_init_path(&path);
9804 key.type = BTRFS_ROOT_ITEM_KEY;
9805 ret = btrfs_search_slot(NULL, root->fs_info->tree_root,
9810 leaf = path.nodes[0];
9811 slot = path.slots[0];
9812 if (slot >= btrfs_header_nritems(path.nodes[0])) {
9813 ret = btrfs_next_leaf(root, &path);
9816 leaf = path.nodes[0];
9817 slot = path.slots[0];
9819 btrfs_item_key_to_cpu(leaf, &found_key, path.slots[0]);
9820 if (found_key.type == BTRFS_ROOT_ITEM_KEY) {
9821 unsigned long offset;
9824 offset = btrfs_item_ptr_offset(leaf, path.slots[0]);
9825 read_extent_buffer(leaf, &ri, offset, sizeof(ri));
9826 last_snapshot = btrfs_root_last_snapshot(&ri);
9827 if (btrfs_disk_key_objectid(&ri.drop_progress) == 0) {
9828 level = btrfs_root_level(&ri);
9829 level_size = root->nodesize;
9830 ret = add_root_item_to_list(&normal_trees,
9832 btrfs_root_bytenr(&ri),
9833 last_snapshot, level,
9834 0, level_size, NULL);
9838 level = btrfs_root_level(&ri);
9839 level_size = root->nodesize;
9840 objectid = found_key.objectid;
9841 btrfs_disk_key_to_cpu(&found_key,
9843 ret = add_root_item_to_list(&dropping_trees,
9845 btrfs_root_bytenr(&ri),
9846 last_snapshot, level,
9848 level_size, &found_key);
9855 btrfs_release_path(&path);
9858 * check_block can return -EAGAIN if it fixes something, please keep
9859 * this in mind when dealing with return values from these functions, if
9860 * we get -EAGAIN we want to fall through and restart the loop.
9862 ret = deal_root_from_list(&normal_trees, root, bits, bits_nr, &pending,
9863 &seen, &reada, &nodes, &extent_cache,
9864 &chunk_cache, &dev_cache, &block_group_cache,
9871 ret = deal_root_from_list(&dropping_trees, root, bits, bits_nr,
9872 &pending, &seen, &reada, &nodes,
9873 &extent_cache, &chunk_cache, &dev_cache,
9874 &block_group_cache, &dev_extent_cache);
9881 ret = check_chunks(&chunk_cache, &block_group_cache,
9882 &dev_extent_cache, NULL, NULL, NULL, 0);
9889 ret = check_extent_refs(root, &extent_cache);
9896 ret = check_devices(&dev_cache, &dev_extent_cache);
9901 task_stop(ctx.info);
9903 free_corrupt_blocks_tree(root->fs_info->corrupt_blocks);
9904 extent_io_tree_cleanup(&excluded_extents);
9905 root->fs_info->fsck_extent_cache = NULL;
9906 root->fs_info->free_extent_hook = NULL;
9907 root->fs_info->corrupt_blocks = NULL;
9908 root->fs_info->excluded_extents = NULL;
9911 free_chunk_cache_tree(&chunk_cache);
9912 free_device_cache_tree(&dev_cache);
9913 free_block_group_tree(&block_group_cache);
9914 free_device_extent_tree(&dev_extent_cache);
9915 free_extent_cache_tree(&seen);
9916 free_extent_cache_tree(&pending);
9917 free_extent_cache_tree(&reada);
9918 free_extent_cache_tree(&nodes);
9921 free_corrupt_blocks_tree(root->fs_info->corrupt_blocks);
9922 free_extent_cache_tree(&seen);
9923 free_extent_cache_tree(&pending);
9924 free_extent_cache_tree(&reada);
9925 free_extent_cache_tree(&nodes);
9926 free_chunk_cache_tree(&chunk_cache);
9927 free_block_group_tree(&block_group_cache);
9928 free_device_cache_tree(&dev_cache);
9929 free_device_extent_tree(&dev_extent_cache);
9930 free_extent_record_cache(root->fs_info, &extent_cache);
9931 free_root_item_list(&normal_trees);
9932 free_root_item_list(&dropping_trees);
9933 extent_io_tree_cleanup(&excluded_extents);
9938 * Check backrefs of a tree block given by @bytenr or @eb.
9940 * @root: the root containing the @bytenr or @eb
9941 * @eb: tree block extent buffer, can be NULL
9942 * @bytenr: bytenr of the tree block to search
9943 * @level: tree level of the tree block
9944 * @owner: owner of the tree block
9946 * Return >0 for any error found and output error message
9947 * Return 0 for no error found
9949 static int check_tree_block_ref(struct btrfs_root *root,
9950 struct extent_buffer *eb, u64 bytenr,
9951 int level, u64 owner)
9953 struct btrfs_key key;
9954 struct btrfs_root *extent_root = root->fs_info->extent_root;
9955 struct btrfs_path path;
9956 struct btrfs_extent_item *ei;
9957 struct btrfs_extent_inline_ref *iref;
9958 struct extent_buffer *leaf;
9964 u32 nodesize = root->nodesize;
9971 btrfs_init_path(&path);
9972 key.objectid = bytenr;
9973 if (btrfs_fs_incompat(root->fs_info,
9974 BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA))
9975 key.type = BTRFS_METADATA_ITEM_KEY;
9977 key.type = BTRFS_EXTENT_ITEM_KEY;
9978 key.offset = (u64)-1;
9980 /* Search for the backref in extent tree */
9981 ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0);
9983 err |= BACKREF_MISSING;
9986 ret = btrfs_previous_extent_item(extent_root, &path, bytenr);
9988 err |= BACKREF_MISSING;
9992 leaf = path.nodes[0];
9993 slot = path.slots[0];
9994 btrfs_item_key_to_cpu(leaf, &key, slot);
9996 ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
9998 if (key.type == BTRFS_METADATA_ITEM_KEY) {
9999 skinny_level = (int)key.offset;
10000 iref = (struct btrfs_extent_inline_ref *)(ei + 1);
10002 struct btrfs_tree_block_info *info;
10004 info = (struct btrfs_tree_block_info *)(ei + 1);
10005 skinny_level = btrfs_tree_block_level(leaf, info);
10006 iref = (struct btrfs_extent_inline_ref *)(info + 1);
10013 if (!(btrfs_extent_flags(leaf, ei) &
10014 BTRFS_EXTENT_FLAG_TREE_BLOCK)) {
10016 "extent[%llu %u] backref type mismatch, missing bit: %llx",
10017 key.objectid, nodesize,
10018 BTRFS_EXTENT_FLAG_TREE_BLOCK);
10019 err = BACKREF_MISMATCH;
10021 header_gen = btrfs_header_generation(eb);
10022 extent_gen = btrfs_extent_generation(leaf, ei);
10023 if (header_gen != extent_gen) {
10025 "extent[%llu %u] backref generation mismatch, wanted: %llu, have: %llu",
10026 key.objectid, nodesize, header_gen,
10028 err = BACKREF_MISMATCH;
10030 if (level != skinny_level) {
10032 "extent[%llu %u] level mismatch, wanted: %u, have: %u",
10033 key.objectid, nodesize, level, skinny_level);
10034 err = BACKREF_MISMATCH;
10036 if (!is_fstree(owner) && btrfs_extent_refs(leaf, ei) != 1) {
10038 "extent[%llu %u] is referred by other roots than %llu",
10039 key.objectid, nodesize, root->objectid);
10040 err = BACKREF_MISMATCH;
10045 * Iterate the extent/metadata item to find the exact backref
10047 item_size = btrfs_item_size_nr(leaf, slot);
10048 ptr = (unsigned long)iref;
10049 end = (unsigned long)ei + item_size;
10050 while (ptr < end) {
10051 iref = (struct btrfs_extent_inline_ref *)ptr;
10052 type = btrfs_extent_inline_ref_type(leaf, iref);
10053 offset = btrfs_extent_inline_ref_offset(leaf, iref);
10055 if (type == BTRFS_TREE_BLOCK_REF_KEY &&
10056 (offset == root->objectid || offset == owner)) {
10058 } else if (type == BTRFS_SHARED_BLOCK_REF_KEY) {
10059 /* Check if the backref points to valid referencer */
10060 found_ref = !check_tree_block_ref(root, NULL, offset,
10066 ptr += btrfs_extent_inline_ref_size(type);
10070 * Inlined extent item doesn't have what we need, check
10071 * TREE_BLOCK_REF_KEY
10074 btrfs_release_path(&path);
10075 key.objectid = bytenr;
10076 key.type = BTRFS_TREE_BLOCK_REF_KEY;
10077 key.offset = root->objectid;
10079 ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0);
10084 err |= BACKREF_MISSING;
10086 btrfs_release_path(&path);
10087 if (eb && (err & BACKREF_MISSING))
10088 error("extent[%llu %u] backref lost (owner: %llu, level: %u)",
10089 bytenr, nodesize, owner, level);
10094 * Check EXTENT_DATA item, mainly for its dbackref in extent tree
10096 * Return >0 any error found and output error message
10097 * Return 0 for no error found
10099 static int check_extent_data_item(struct btrfs_root *root,
10100 struct extent_buffer *eb, int slot)
10102 struct btrfs_file_extent_item *fi;
10103 struct btrfs_path path;
10104 struct btrfs_root *extent_root = root->fs_info->extent_root;
10105 struct btrfs_key fi_key;
10106 struct btrfs_key dbref_key;
10107 struct extent_buffer *leaf;
10108 struct btrfs_extent_item *ei;
10109 struct btrfs_extent_inline_ref *iref;
10110 struct btrfs_extent_data_ref *dref;
10112 u64 file_extent_gen;
10114 u64 disk_num_bytes;
10115 u64 extent_num_bytes;
10123 int found_dbackref = 0;
10127 btrfs_item_key_to_cpu(eb, &fi_key, slot);
10128 fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
10129 file_extent_gen = btrfs_file_extent_generation(eb, fi);
10131 /* Nothing to check for hole and inline data extents */
10132 if (btrfs_file_extent_type(eb, fi) == BTRFS_FILE_EXTENT_INLINE ||
10133 btrfs_file_extent_disk_bytenr(eb, fi) == 0)
10136 disk_bytenr = btrfs_file_extent_disk_bytenr(eb, fi);
10137 disk_num_bytes = btrfs_file_extent_disk_num_bytes(eb, fi);
10138 extent_num_bytes = btrfs_file_extent_num_bytes(eb, fi);
10140 /* Check unaligned disk_num_bytes and num_bytes */
10141 if (!IS_ALIGNED(disk_num_bytes, root->sectorsize)) {
10143 "file extent [%llu, %llu] has unaligned disk num bytes: %llu, should be aligned to %u",
10144 fi_key.objectid, fi_key.offset, disk_num_bytes,
10146 err |= BYTES_UNALIGNED;
10148 data_bytes_allocated += disk_num_bytes;
10150 if (!IS_ALIGNED(extent_num_bytes, root->sectorsize)) {
10152 "file extent [%llu, %llu] has unaligned num bytes: %llu, should be aligned to %u",
10153 fi_key.objectid, fi_key.offset, extent_num_bytes,
10155 err |= BYTES_UNALIGNED;
10157 data_bytes_referenced += extent_num_bytes;
10159 owner = btrfs_header_owner(eb);
10161 /* Check the extent item of the file extent in extent tree */
10162 btrfs_init_path(&path);
10163 dbref_key.objectid = btrfs_file_extent_disk_bytenr(eb, fi);
10164 dbref_key.type = BTRFS_EXTENT_ITEM_KEY;
10165 dbref_key.offset = btrfs_file_extent_disk_num_bytes(eb, fi);
10167 ret = btrfs_search_slot(NULL, extent_root, &dbref_key, &path, 0, 0);
10169 err |= BACKREF_MISSING;
10173 leaf = path.nodes[0];
10174 slot = path.slots[0];
10175 ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
10177 extent_flags = btrfs_extent_flags(leaf, ei);
10178 extent_gen = btrfs_extent_generation(leaf, ei);
10180 if (!(extent_flags & BTRFS_EXTENT_FLAG_DATA)) {
10182 "extent[%llu %llu] backref type mismatch, wanted bit: %llx",
10183 disk_bytenr, disk_num_bytes,
10184 BTRFS_EXTENT_FLAG_DATA);
10185 err |= BACKREF_MISMATCH;
10188 if (file_extent_gen < extent_gen) {
10190 "extent[%llu %llu] backref generation mismatch, wanted: <=%llu, have: %llu",
10191 disk_bytenr, disk_num_bytes, file_extent_gen,
10193 err |= BACKREF_MISMATCH;
10196 /* Check data backref inside that extent item */
10197 item_size = btrfs_item_size_nr(leaf, path.slots[0]);
10198 iref = (struct btrfs_extent_inline_ref *)(ei + 1);
10199 ptr = (unsigned long)iref;
10200 end = (unsigned long)ei + item_size;
10201 while (ptr < end) {
10202 iref = (struct btrfs_extent_inline_ref *)ptr;
10203 type = btrfs_extent_inline_ref_type(leaf, iref);
10204 dref = (struct btrfs_extent_data_ref *)(&iref->offset);
10206 if (type == BTRFS_EXTENT_DATA_REF_KEY) {
10207 ref_root = btrfs_extent_data_ref_root(leaf, dref);
10208 if (ref_root == owner || ref_root == root->objectid)
10209 found_dbackref = 1;
10210 } else if (type == BTRFS_SHARED_DATA_REF_KEY) {
10211 found_dbackref = !check_tree_block_ref(root, NULL,
10212 btrfs_extent_inline_ref_offset(leaf, iref),
10216 if (found_dbackref)
10218 ptr += btrfs_extent_inline_ref_size(type);
10221 /* Didn't found inlined data backref, try EXTENT_DATA_REF_KEY */
10222 if (!found_dbackref) {
10223 btrfs_release_path(&path);
10225 btrfs_init_path(&path);
10226 dbref_key.objectid = btrfs_file_extent_disk_bytenr(eb, fi);
10227 dbref_key.type = BTRFS_EXTENT_DATA_REF_KEY;
10228 dbref_key.offset = hash_extent_data_ref(root->objectid,
10229 fi_key.objectid, fi_key.offset);
10231 ret = btrfs_search_slot(NULL, root->fs_info->extent_root,
10232 &dbref_key, &path, 0, 0);
10234 found_dbackref = 1;
10237 if (!found_dbackref)
10238 err |= BACKREF_MISSING;
10240 btrfs_release_path(&path);
10241 if (err & BACKREF_MISSING) {
10242 error("data extent[%llu %llu] backref lost",
10243 disk_bytenr, disk_num_bytes);
10249 * Get real tree block level for the case like shared block
10250 * Return >= 0 as tree level
10251 * Return <0 for error
10253 static int query_tree_block_level(struct btrfs_fs_info *fs_info, u64 bytenr)
10255 struct extent_buffer *eb;
10256 struct btrfs_path path;
10257 struct btrfs_key key;
10258 struct btrfs_extent_item *ei;
10261 u32 nodesize = btrfs_super_nodesize(fs_info->super_copy);
10266 /* Search extent tree for extent generation and level */
10267 key.objectid = bytenr;
10268 key.type = BTRFS_METADATA_ITEM_KEY;
10269 key.offset = (u64)-1;
10271 btrfs_init_path(&path);
10272 ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, &path, 0, 0);
10275 ret = btrfs_previous_extent_item(fs_info->extent_root, &path, bytenr);
10283 btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
10284 ei = btrfs_item_ptr(path.nodes[0], path.slots[0],
10285 struct btrfs_extent_item);
10286 flags = btrfs_extent_flags(path.nodes[0], ei);
10287 if (!(flags & BTRFS_EXTENT_FLAG_TREE_BLOCK)) {
10292 /* Get transid for later read_tree_block() check */
10293 transid = btrfs_extent_generation(path.nodes[0], ei);
10295 /* Get backref level as one source */
10296 if (key.type == BTRFS_METADATA_ITEM_KEY) {
10297 backref_level = key.offset;
10299 struct btrfs_tree_block_info *info;
10301 info = (struct btrfs_tree_block_info *)(ei + 1);
10302 backref_level = btrfs_tree_block_level(path.nodes[0], info);
10304 btrfs_release_path(&path);
10306 /* Get level from tree block as an alternative source */
10307 eb = read_tree_block_fs_info(fs_info, bytenr, nodesize, transid);
10308 if (!extent_buffer_uptodate(eb)) {
10309 free_extent_buffer(eb);
10312 header_level = btrfs_header_level(eb);
10313 free_extent_buffer(eb);
10315 if (header_level != backref_level)
10317 return header_level;
10320 btrfs_release_path(&path);
10325 * Check if a tree block backref is valid (points to a valid tree block)
10326 * if level == -1, level will be resolved
10327 * Return >0 for any error found and print error message
10329 static int check_tree_block_backref(struct btrfs_fs_info *fs_info, u64 root_id,
10330 u64 bytenr, int level)
10332 struct btrfs_root *root;
10333 struct btrfs_key key;
10334 struct btrfs_path path;
10335 struct extent_buffer *eb;
10336 struct extent_buffer *node;
10337 u32 nodesize = btrfs_super_nodesize(fs_info->super_copy);
10341 /* Query level for level == -1 special case */
10343 level = query_tree_block_level(fs_info, bytenr);
10345 err |= REFERENCER_MISSING;
10349 key.objectid = root_id;
10350 key.type = BTRFS_ROOT_ITEM_KEY;
10351 key.offset = (u64)-1;
10353 root = btrfs_read_fs_root(fs_info, &key);
10354 if (IS_ERR(root)) {
10355 err |= REFERENCER_MISSING;
10359 /* Read out the tree block to get item/node key */
10360 eb = read_tree_block(root, bytenr, root->nodesize, 0);
10361 if (!extent_buffer_uptodate(eb)) {
10362 err |= REFERENCER_MISSING;
10363 free_extent_buffer(eb);
10367 /* Empty tree, no need to check key */
10368 if (!btrfs_header_nritems(eb) && !level) {
10369 free_extent_buffer(eb);
10374 btrfs_node_key_to_cpu(eb, &key, 0);
10376 btrfs_item_key_to_cpu(eb, &key, 0);
10378 free_extent_buffer(eb);
10380 btrfs_init_path(&path);
10381 path.lowest_level = level;
10382 /* Search with the first key, to ensure we can reach it */
10383 ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
10385 err |= REFERENCER_MISSING;
10389 node = path.nodes[level];
10390 if (btrfs_header_bytenr(node) != bytenr) {
10392 "extent [%llu %d] referencer bytenr mismatch, wanted: %llu, have: %llu",
10393 bytenr, nodesize, bytenr,
10394 btrfs_header_bytenr(node));
10395 err |= REFERENCER_MISMATCH;
10397 if (btrfs_header_level(node) != level) {
10399 "extent [%llu %d] referencer level mismatch, wanted: %d, have: %d",
10400 bytenr, nodesize, level,
10401 btrfs_header_level(node));
10402 err |= REFERENCER_MISMATCH;
10406 btrfs_release_path(&path);
10408 if (err & REFERENCER_MISSING) {
10410 error("extent [%llu %d] lost referencer (owner: %llu)",
10411 bytenr, nodesize, root_id);
10414 "extent [%llu %d] lost referencer (owner: %llu, level: %u)",
10415 bytenr, nodesize, root_id, level);
10422 * Check referencer for shared block backref
10423 * If level == -1, this function will resolve the level.
10425 static int check_shared_block_backref(struct btrfs_fs_info *fs_info,
10426 u64 parent, u64 bytenr, int level)
10428 struct extent_buffer *eb;
10429 u32 nodesize = btrfs_super_nodesize(fs_info->super_copy);
10431 int found_parent = 0;
10434 eb = read_tree_block_fs_info(fs_info, parent, nodesize, 0);
10435 if (!extent_buffer_uptodate(eb))
10439 level = query_tree_block_level(fs_info, bytenr);
10443 if (level + 1 != btrfs_header_level(eb))
10446 nr = btrfs_header_nritems(eb);
10447 for (i = 0; i < nr; i++) {
10448 if (bytenr == btrfs_node_blockptr(eb, i)) {
10454 free_extent_buffer(eb);
10455 if (!found_parent) {
10457 "shared extent[%llu %u] lost its parent (parent: %llu, level: %u)",
10458 bytenr, nodesize, parent, level);
10459 return REFERENCER_MISSING;
10465 * Check referencer for normal (inlined) data ref
10466 * If len == 0, it will be resolved by searching in extent tree
10468 static int check_extent_data_backref(struct btrfs_fs_info *fs_info,
10469 u64 root_id, u64 objectid, u64 offset,
10470 u64 bytenr, u64 len, u32 count)
10472 struct btrfs_root *root;
10473 struct btrfs_root *extent_root = fs_info->extent_root;
10474 struct btrfs_key key;
10475 struct btrfs_path path;
10476 struct extent_buffer *leaf;
10477 struct btrfs_file_extent_item *fi;
10478 u32 found_count = 0;
10483 key.objectid = bytenr;
10484 key.type = BTRFS_EXTENT_ITEM_KEY;
10485 key.offset = (u64)-1;
10487 btrfs_init_path(&path);
10488 ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0);
10491 ret = btrfs_previous_extent_item(extent_root, &path, bytenr);
10494 btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
10495 if (key.objectid != bytenr ||
10496 key.type != BTRFS_EXTENT_ITEM_KEY)
10499 btrfs_release_path(&path);
10501 key.objectid = root_id;
10502 key.type = BTRFS_ROOT_ITEM_KEY;
10503 key.offset = (u64)-1;
10504 btrfs_init_path(&path);
10506 root = btrfs_read_fs_root(fs_info, &key);
10510 key.objectid = objectid;
10511 key.type = BTRFS_EXTENT_DATA_KEY;
10513 * It can be nasty as data backref offset is
10514 * file offset - file extent offset, which is smaller or
10515 * equal to original backref offset. The only special case is
10516 * overflow. So we need to special check and do further search.
10518 key.offset = offset & (1ULL << 63) ? 0 : offset;
10520 ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
10525 * Search afterwards to get correct one
10526 * NOTE: As we must do a comprehensive check on the data backref to
10527 * make sure the dref count also matches, we must iterate all file
10528 * extents for that inode.
10531 leaf = path.nodes[0];
10532 slot = path.slots[0];
10534 btrfs_item_key_to_cpu(leaf, &key, slot);
10535 if (key.objectid != objectid || key.type != BTRFS_EXTENT_DATA_KEY)
10537 fi = btrfs_item_ptr(leaf, slot, struct btrfs_file_extent_item);
10539 * Except normal disk bytenr and disk num bytes, we still
10540 * need to do extra check on dbackref offset as
10541 * dbackref offset = file_offset - file_extent_offset
10543 if (btrfs_file_extent_disk_bytenr(leaf, fi) == bytenr &&
10544 btrfs_file_extent_disk_num_bytes(leaf, fi) == len &&
10545 (u64)(key.offset - btrfs_file_extent_offset(leaf, fi)) ==
10549 ret = btrfs_next_item(root, &path);
10554 btrfs_release_path(&path);
10555 if (found_count != count) {
10557 "extent[%llu, %llu] referencer count mismatch (root: %llu, owner: %llu, offset: %llu) wanted: %u, have: %u",
10558 bytenr, len, root_id, objectid, offset, count, found_count);
10559 return REFERENCER_MISSING;
10565 * Check if the referencer of a shared data backref exists
10567 static int check_shared_data_backref(struct btrfs_fs_info *fs_info,
10568 u64 parent, u64 bytenr)
10570 struct extent_buffer *eb;
10571 struct btrfs_key key;
10572 struct btrfs_file_extent_item *fi;
10573 u32 nodesize = btrfs_super_nodesize(fs_info->super_copy);
10575 int found_parent = 0;
10578 eb = read_tree_block_fs_info(fs_info, parent, nodesize, 0);
10579 if (!extent_buffer_uptodate(eb))
10582 nr = btrfs_header_nritems(eb);
10583 for (i = 0; i < nr; i++) {
10584 btrfs_item_key_to_cpu(eb, &key, i);
10585 if (key.type != BTRFS_EXTENT_DATA_KEY)
10588 fi = btrfs_item_ptr(eb, i, struct btrfs_file_extent_item);
10589 if (btrfs_file_extent_type(eb, fi) == BTRFS_FILE_EXTENT_INLINE)
10592 if (btrfs_file_extent_disk_bytenr(eb, fi) == bytenr) {
10599 free_extent_buffer(eb);
10600 if (!found_parent) {
10601 error("shared extent %llu referencer lost (parent: %llu)",
10603 return REFERENCER_MISSING;
10609 * This function will check a given extent item, including its backref and
10610 * itself (like crossing stripe boundary and type)
10612 * Since we don't use extent_record anymore, introduce new error bit
10614 static int check_extent_item(struct btrfs_fs_info *fs_info,
10615 struct extent_buffer *eb, int slot)
10617 struct btrfs_extent_item *ei;
10618 struct btrfs_extent_inline_ref *iref;
10619 struct btrfs_extent_data_ref *dref;
10623 u32 nodesize = btrfs_super_nodesize(fs_info->super_copy);
10624 u32 item_size = btrfs_item_size_nr(eb, slot);
10629 struct btrfs_key key;
10633 btrfs_item_key_to_cpu(eb, &key, slot);
10634 if (key.type == BTRFS_EXTENT_ITEM_KEY)
10635 bytes_used += key.offset;
10637 bytes_used += nodesize;
10639 if (item_size < sizeof(*ei)) {
10641 * COMPAT_EXTENT_TREE_V0 case, but it's already a super
10642 * old thing when on disk format is still un-determined.
10643 * No need to care about it anymore
10645 error("unsupported COMPAT_EXTENT_TREE_V0 detected");
10649 ei = btrfs_item_ptr(eb, slot, struct btrfs_extent_item);
10650 flags = btrfs_extent_flags(eb, ei);
10652 if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK)
10654 if (metadata && check_crossing_stripes(global_info, key.objectid,
10656 error("bad metadata [%llu, %llu) crossing stripe boundary",
10657 key.objectid, key.objectid + nodesize);
10658 err |= CROSSING_STRIPE_BOUNDARY;
10661 ptr = (unsigned long)(ei + 1);
10663 if (metadata && key.type == BTRFS_EXTENT_ITEM_KEY) {
10664 /* Old EXTENT_ITEM metadata */
10665 struct btrfs_tree_block_info *info;
10667 info = (struct btrfs_tree_block_info *)ptr;
10668 level = btrfs_tree_block_level(eb, info);
10669 ptr += sizeof(struct btrfs_tree_block_info);
10671 /* New METADATA_ITEM */
10672 level = key.offset;
10674 end = (unsigned long)ei + item_size;
10677 err |= ITEM_SIZE_MISMATCH;
10681 /* Now check every backref in this extent item */
10683 iref = (struct btrfs_extent_inline_ref *)ptr;
10684 type = btrfs_extent_inline_ref_type(eb, iref);
10685 offset = btrfs_extent_inline_ref_offset(eb, iref);
10687 case BTRFS_TREE_BLOCK_REF_KEY:
10688 ret = check_tree_block_backref(fs_info, offset, key.objectid,
10692 case BTRFS_SHARED_BLOCK_REF_KEY:
10693 ret = check_shared_block_backref(fs_info, offset, key.objectid,
10697 case BTRFS_EXTENT_DATA_REF_KEY:
10698 dref = (struct btrfs_extent_data_ref *)(&iref->offset);
10699 ret = check_extent_data_backref(fs_info,
10700 btrfs_extent_data_ref_root(eb, dref),
10701 btrfs_extent_data_ref_objectid(eb, dref),
10702 btrfs_extent_data_ref_offset(eb, dref),
10703 key.objectid, key.offset,
10704 btrfs_extent_data_ref_count(eb, dref));
10707 case BTRFS_SHARED_DATA_REF_KEY:
10708 ret = check_shared_data_backref(fs_info, offset, key.objectid);
10712 error("extent[%llu %d %llu] has unknown ref type: %d",
10713 key.objectid, key.type, key.offset, type);
10714 err |= UNKNOWN_TYPE;
10718 ptr += btrfs_extent_inline_ref_size(type);
10727 * Check if a dev extent item is referred correctly by its chunk
10729 static int check_dev_extent_item(struct btrfs_fs_info *fs_info,
10730 struct extent_buffer *eb, int slot)
10732 struct btrfs_root *chunk_root = fs_info->chunk_root;
10733 struct btrfs_dev_extent *ptr;
10734 struct btrfs_path path;
10735 struct btrfs_key chunk_key;
10736 struct btrfs_key devext_key;
10737 struct btrfs_chunk *chunk;
10738 struct extent_buffer *l;
10742 int found_chunk = 0;
10745 btrfs_item_key_to_cpu(eb, &devext_key, slot);
10746 ptr = btrfs_item_ptr(eb, slot, struct btrfs_dev_extent);
10747 length = btrfs_dev_extent_length(eb, ptr);
10749 chunk_key.objectid = btrfs_dev_extent_chunk_objectid(eb, ptr);
10750 chunk_key.type = BTRFS_CHUNK_ITEM_KEY;
10751 chunk_key.offset = btrfs_dev_extent_chunk_offset(eb, ptr);
10753 btrfs_init_path(&path);
10754 ret = btrfs_search_slot(NULL, chunk_root, &chunk_key, &path, 0, 0);
10759 chunk = btrfs_item_ptr(l, path.slots[0], struct btrfs_chunk);
10760 if (btrfs_chunk_length(l, chunk) != length)
10763 num_stripes = btrfs_chunk_num_stripes(l, chunk);
10764 for (i = 0; i < num_stripes; i++) {
10765 u64 devid = btrfs_stripe_devid_nr(l, chunk, i);
10766 u64 offset = btrfs_stripe_offset_nr(l, chunk, i);
10768 if (devid == devext_key.objectid &&
10769 offset == devext_key.offset) {
10775 btrfs_release_path(&path);
10776 if (!found_chunk) {
10778 "device extent[%llu, %llu, %llu] did not find the related chunk",
10779 devext_key.objectid, devext_key.offset, length);
10780 return REFERENCER_MISSING;
10786 * Check if the used space is correct with the dev item
10788 static int check_dev_item(struct btrfs_fs_info *fs_info,
10789 struct extent_buffer *eb, int slot)
10791 struct btrfs_root *dev_root = fs_info->dev_root;
10792 struct btrfs_dev_item *dev_item;
10793 struct btrfs_path path;
10794 struct btrfs_key key;
10795 struct btrfs_dev_extent *ptr;
10801 dev_item = btrfs_item_ptr(eb, slot, struct btrfs_dev_item);
10802 dev_id = btrfs_device_id(eb, dev_item);
10803 used = btrfs_device_bytes_used(eb, dev_item);
10805 key.objectid = dev_id;
10806 key.type = BTRFS_DEV_EXTENT_KEY;
10809 btrfs_init_path(&path);
10810 ret = btrfs_search_slot(NULL, dev_root, &key, &path, 0, 0);
10812 btrfs_item_key_to_cpu(eb, &key, slot);
10813 error("cannot find any related dev extent for dev[%llu, %u, %llu]",
10814 key.objectid, key.type, key.offset);
10815 btrfs_release_path(&path);
10816 return REFERENCER_MISSING;
10819 /* Iterate dev_extents to calculate the used space of a device */
10821 btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
10823 if (key.objectid > dev_id)
10825 if (key.type != BTRFS_DEV_EXTENT_KEY || key.objectid != dev_id)
10828 ptr = btrfs_item_ptr(path.nodes[0], path.slots[0],
10829 struct btrfs_dev_extent);
10830 total += btrfs_dev_extent_length(path.nodes[0], ptr);
10832 ret = btrfs_next_item(dev_root, &path);
10836 btrfs_release_path(&path);
10838 if (used != total) {
10839 btrfs_item_key_to_cpu(eb, &key, slot);
10841 "Dev extent's total-byte %llu is not equal to bytes-used %llu in dev[%llu, %u, %llu]",
10842 total, used, BTRFS_ROOT_TREE_OBJECTID,
10843 BTRFS_DEV_EXTENT_KEY, dev_id);
10844 return ACCOUNTING_MISMATCH;
10850 * Check a block group item with its referener (chunk) and its used space
10851 * with extent/metadata item
10853 static int check_block_group_item(struct btrfs_fs_info *fs_info,
10854 struct extent_buffer *eb, int slot)
10856 struct btrfs_root *extent_root = fs_info->extent_root;
10857 struct btrfs_root *chunk_root = fs_info->chunk_root;
10858 struct btrfs_block_group_item *bi;
10859 struct btrfs_block_group_item bg_item;
10860 struct btrfs_path path;
10861 struct btrfs_key bg_key;
10862 struct btrfs_key chunk_key;
10863 struct btrfs_key extent_key;
10864 struct btrfs_chunk *chunk;
10865 struct extent_buffer *leaf;
10866 struct btrfs_extent_item *ei;
10867 u32 nodesize = btrfs_super_nodesize(fs_info->super_copy);
10875 btrfs_item_key_to_cpu(eb, &bg_key, slot);
10876 bi = btrfs_item_ptr(eb, slot, struct btrfs_block_group_item);
10877 read_extent_buffer(eb, &bg_item, (unsigned long)bi, sizeof(bg_item));
10878 used = btrfs_block_group_used(&bg_item);
10879 bg_flags = btrfs_block_group_flags(&bg_item);
10881 chunk_key.objectid = BTRFS_FIRST_CHUNK_TREE_OBJECTID;
10882 chunk_key.type = BTRFS_CHUNK_ITEM_KEY;
10883 chunk_key.offset = bg_key.objectid;
10885 btrfs_init_path(&path);
10886 /* Search for the referencer chunk */
10887 ret = btrfs_search_slot(NULL, chunk_root, &chunk_key, &path, 0, 0);
10890 "block group[%llu %llu] did not find the related chunk item",
10891 bg_key.objectid, bg_key.offset);
10892 err |= REFERENCER_MISSING;
10894 chunk = btrfs_item_ptr(path.nodes[0], path.slots[0],
10895 struct btrfs_chunk);
10896 if (btrfs_chunk_length(path.nodes[0], chunk) !=
10899 "block group[%llu %llu] related chunk item length does not match",
10900 bg_key.objectid, bg_key.offset);
10901 err |= REFERENCER_MISMATCH;
10904 btrfs_release_path(&path);
10906 /* Search from the block group bytenr */
10907 extent_key.objectid = bg_key.objectid;
10908 extent_key.type = 0;
10909 extent_key.offset = 0;
10911 btrfs_init_path(&path);
10912 ret = btrfs_search_slot(NULL, extent_root, &extent_key, &path, 0, 0);
10916 /* Iterate extent tree to account used space */
10918 leaf = path.nodes[0];
10919 btrfs_item_key_to_cpu(leaf, &extent_key, path.slots[0]);
10920 if (extent_key.objectid >= bg_key.objectid + bg_key.offset)
10923 if (extent_key.type != BTRFS_METADATA_ITEM_KEY &&
10924 extent_key.type != BTRFS_EXTENT_ITEM_KEY)
10926 if (extent_key.objectid < bg_key.objectid)
10929 if (extent_key.type == BTRFS_METADATA_ITEM_KEY)
10932 total += extent_key.offset;
10934 ei = btrfs_item_ptr(leaf, path.slots[0],
10935 struct btrfs_extent_item);
10936 flags = btrfs_extent_flags(leaf, ei);
10937 if (flags & BTRFS_EXTENT_FLAG_DATA) {
10938 if (!(bg_flags & BTRFS_BLOCK_GROUP_DATA)) {
10940 "bad extent[%llu, %llu) type mismatch with chunk",
10941 extent_key.objectid,
10942 extent_key.objectid + extent_key.offset);
10943 err |= CHUNK_TYPE_MISMATCH;
10945 } else if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
10946 if (!(bg_flags & (BTRFS_BLOCK_GROUP_SYSTEM |
10947 BTRFS_BLOCK_GROUP_METADATA))) {
10949 "bad extent[%llu, %llu) type mismatch with chunk",
10950 extent_key.objectid,
10951 extent_key.objectid + nodesize);
10952 err |= CHUNK_TYPE_MISMATCH;
10956 ret = btrfs_next_item(extent_root, &path);
10962 btrfs_release_path(&path);
10964 if (total != used) {
10966 "block group[%llu %llu] used %llu but extent items used %llu",
10967 bg_key.objectid, bg_key.offset, used, total);
10968 err |= ACCOUNTING_MISMATCH;
10974 * Check a chunk item.
10975 * Including checking all referred dev_extents and block group
10977 static int check_chunk_item(struct btrfs_fs_info *fs_info,
10978 struct extent_buffer *eb, int slot)
10980 struct btrfs_root *extent_root = fs_info->extent_root;
10981 struct btrfs_root *dev_root = fs_info->dev_root;
10982 struct btrfs_path path;
10983 struct btrfs_key chunk_key;
10984 struct btrfs_key bg_key;
10985 struct btrfs_key devext_key;
10986 struct btrfs_chunk *chunk;
10987 struct extent_buffer *leaf;
10988 struct btrfs_block_group_item *bi;
10989 struct btrfs_block_group_item bg_item;
10990 struct btrfs_dev_extent *ptr;
10991 u32 sectorsize = btrfs_super_sectorsize(fs_info->super_copy);
11003 btrfs_item_key_to_cpu(eb, &chunk_key, slot);
11004 chunk = btrfs_item_ptr(eb, slot, struct btrfs_chunk);
11005 length = btrfs_chunk_length(eb, chunk);
11006 chunk_end = chunk_key.offset + length;
11007 if (!IS_ALIGNED(length, sectorsize)) {
11008 error("chunk[%llu %llu) not aligned to %u",
11009 chunk_key.offset, chunk_end, sectorsize);
11010 err |= BYTES_UNALIGNED;
11014 type = btrfs_chunk_type(eb, chunk);
11015 profile = type & BTRFS_BLOCK_GROUP_PROFILE_MASK;
11016 if (!(type & BTRFS_BLOCK_GROUP_TYPE_MASK)) {
11017 error("chunk[%llu %llu) has no chunk type",
11018 chunk_key.offset, chunk_end);
11019 err |= UNKNOWN_TYPE;
11021 if (profile && (profile & (profile - 1))) {
11022 error("chunk[%llu %llu) multiple profiles detected: %llx",
11023 chunk_key.offset, chunk_end, profile);
11024 err |= UNKNOWN_TYPE;
11027 bg_key.objectid = chunk_key.offset;
11028 bg_key.type = BTRFS_BLOCK_GROUP_ITEM_KEY;
11029 bg_key.offset = length;
11031 btrfs_init_path(&path);
11032 ret = btrfs_search_slot(NULL, extent_root, &bg_key, &path, 0, 0);
11035 "chunk[%llu %llu) did not find the related block group item",
11036 chunk_key.offset, chunk_end);
11037 err |= REFERENCER_MISSING;
11039 leaf = path.nodes[0];
11040 bi = btrfs_item_ptr(leaf, path.slots[0],
11041 struct btrfs_block_group_item);
11042 read_extent_buffer(leaf, &bg_item, (unsigned long)bi,
11044 if (btrfs_block_group_flags(&bg_item) != type) {
11046 "chunk[%llu %llu) related block group item flags mismatch, wanted: %llu, have: %llu",
11047 chunk_key.offset, chunk_end, type,
11048 btrfs_block_group_flags(&bg_item));
11049 err |= REFERENCER_MISSING;
11053 num_stripes = btrfs_chunk_num_stripes(eb, chunk);
11054 for (i = 0; i < num_stripes; i++) {
11055 btrfs_release_path(&path);
11056 btrfs_init_path(&path);
11057 devext_key.objectid = btrfs_stripe_devid_nr(eb, chunk, i);
11058 devext_key.type = BTRFS_DEV_EXTENT_KEY;
11059 devext_key.offset = btrfs_stripe_offset_nr(eb, chunk, i);
11061 ret = btrfs_search_slot(NULL, dev_root, &devext_key, &path,
11064 goto not_match_dev;
11066 leaf = path.nodes[0];
11067 ptr = btrfs_item_ptr(leaf, path.slots[0],
11068 struct btrfs_dev_extent);
11069 objectid = btrfs_dev_extent_chunk_objectid(leaf, ptr);
11070 offset = btrfs_dev_extent_chunk_offset(leaf, ptr);
11071 if (objectid != chunk_key.objectid ||
11072 offset != chunk_key.offset ||
11073 btrfs_dev_extent_length(leaf, ptr) != length)
11074 goto not_match_dev;
11077 err |= BACKREF_MISSING;
11079 "chunk[%llu %llu) stripe %d did not find the related dev extent",
11080 chunk_key.objectid, chunk_end, i);
11083 btrfs_release_path(&path);
11089 * Main entry function to check known items and update related accounting info
11091 static int check_leaf_items(struct btrfs_root *root, struct extent_buffer *eb)
11093 struct btrfs_fs_info *fs_info = root->fs_info;
11094 struct btrfs_key key;
11097 struct btrfs_extent_data_ref *dref;
11102 btrfs_item_key_to_cpu(eb, &key, slot);
11106 case BTRFS_EXTENT_DATA_KEY:
11107 ret = check_extent_data_item(root, eb, slot);
11110 case BTRFS_BLOCK_GROUP_ITEM_KEY:
11111 ret = check_block_group_item(fs_info, eb, slot);
11114 case BTRFS_DEV_ITEM_KEY:
11115 ret = check_dev_item(fs_info, eb, slot);
11118 case BTRFS_CHUNK_ITEM_KEY:
11119 ret = check_chunk_item(fs_info, eb, slot);
11122 case BTRFS_DEV_EXTENT_KEY:
11123 ret = check_dev_extent_item(fs_info, eb, slot);
11126 case BTRFS_EXTENT_ITEM_KEY:
11127 case BTRFS_METADATA_ITEM_KEY:
11128 ret = check_extent_item(fs_info, eb, slot);
11131 case BTRFS_EXTENT_CSUM_KEY:
11132 total_csum_bytes += btrfs_item_size_nr(eb, slot);
11134 case BTRFS_TREE_BLOCK_REF_KEY:
11135 ret = check_tree_block_backref(fs_info, key.offset,
11139 case BTRFS_EXTENT_DATA_REF_KEY:
11140 dref = btrfs_item_ptr(eb, slot, struct btrfs_extent_data_ref);
11141 ret = check_extent_data_backref(fs_info,
11142 btrfs_extent_data_ref_root(eb, dref),
11143 btrfs_extent_data_ref_objectid(eb, dref),
11144 btrfs_extent_data_ref_offset(eb, dref),
11146 btrfs_extent_data_ref_count(eb, dref));
11149 case BTRFS_SHARED_BLOCK_REF_KEY:
11150 ret = check_shared_block_backref(fs_info, key.offset,
11154 case BTRFS_SHARED_DATA_REF_KEY:
11155 ret = check_shared_data_backref(fs_info, key.offset,
11163 if (++slot < btrfs_header_nritems(eb))
11170 * Helper function for later fs/subvol tree check. To determine if a tree
11171 * block should be checked.
11172 * This function will ensure only the direct referencer with lowest rootid to
11173 * check a fs/subvolume tree block.
11175 * Backref check at extent tree would detect errors like missing subvolume
11176 * tree, so we can do aggressive check to reduce duplicated checks.
11178 static int should_check(struct btrfs_root *root, struct extent_buffer *eb)
11180 struct btrfs_root *extent_root = root->fs_info->extent_root;
11181 struct btrfs_key key;
11182 struct btrfs_path path;
11183 struct extent_buffer *leaf;
11185 struct btrfs_extent_item *ei;
11191 struct btrfs_extent_inline_ref *iref;
11194 btrfs_init_path(&path);
11195 key.objectid = btrfs_header_bytenr(eb);
11196 key.type = BTRFS_METADATA_ITEM_KEY;
11197 key.offset = (u64)-1;
11200 * Any failure in backref resolving means we can't determine
11201 * whom the tree block belongs to.
11202 * So in that case, we need to check that tree block
11204 ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0);
11208 ret = btrfs_previous_extent_item(extent_root, &path,
11209 btrfs_header_bytenr(eb));
11213 leaf = path.nodes[0];
11214 slot = path.slots[0];
11215 btrfs_item_key_to_cpu(leaf, &key, slot);
11216 ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
11218 if (key.type == BTRFS_METADATA_ITEM_KEY) {
11219 iref = (struct btrfs_extent_inline_ref *)(ei + 1);
11221 struct btrfs_tree_block_info *info;
11223 info = (struct btrfs_tree_block_info *)(ei + 1);
11224 iref = (struct btrfs_extent_inline_ref *)(info + 1);
11227 item_size = btrfs_item_size_nr(leaf, slot);
11228 ptr = (unsigned long)iref;
11229 end = (unsigned long)ei + item_size;
11230 while (ptr < end) {
11231 iref = (struct btrfs_extent_inline_ref *)ptr;
11232 type = btrfs_extent_inline_ref_type(leaf, iref);
11233 offset = btrfs_extent_inline_ref_offset(leaf, iref);
11236 * We only check the tree block if current root is
11237 * the lowest referencer of it.
11239 if (type == BTRFS_TREE_BLOCK_REF_KEY &&
11240 offset < root->objectid) {
11241 btrfs_release_path(&path);
11245 ptr += btrfs_extent_inline_ref_size(type);
11248 * Normally we should also check keyed tree block ref, but that may be
11249 * very time consuming. Inlined ref should already make us skip a lot
11250 * of refs now. So skip search keyed tree block ref.
11254 btrfs_release_path(&path);
11259 * Traversal function for tree block. We will do:
11260 * 1) Skip shared fs/subvolume tree blocks
11261 * 2) Update related bytes accounting
11262 * 3) Pre-order traversal
11264 static int traverse_tree_block(struct btrfs_root *root,
11265 struct extent_buffer *node)
11267 struct extent_buffer *eb;
11268 struct btrfs_key key;
11269 struct btrfs_key drop_key;
11277 * Skip shared fs/subvolume tree block, in that case they will
11278 * be checked by referencer with lowest rootid
11280 if (is_fstree(root->objectid) && !should_check(root, node))
11283 /* Update bytes accounting */
11284 total_btree_bytes += node->len;
11285 if (fs_root_objectid(btrfs_header_owner(node)))
11286 total_fs_tree_bytes += node->len;
11287 if (btrfs_header_owner(node) == BTRFS_EXTENT_TREE_OBJECTID)
11288 total_extent_tree_bytes += node->len;
11289 if (!found_old_backref &&
11290 btrfs_header_owner(node) == BTRFS_TREE_RELOC_OBJECTID &&
11291 btrfs_header_backref_rev(node) == BTRFS_MIXED_BACKREF_REV &&
11292 !btrfs_header_flag(node, BTRFS_HEADER_FLAG_RELOC))
11293 found_old_backref = 1;
11295 /* pre-order tranversal, check itself first */
11296 level = btrfs_header_level(node);
11297 ret = check_tree_block_ref(root, node, btrfs_header_bytenr(node),
11298 btrfs_header_level(node),
11299 btrfs_header_owner(node));
11303 "check %s failed root %llu bytenr %llu level %d, force continue check",
11304 level ? "node":"leaf", root->objectid,
11305 btrfs_header_bytenr(node), btrfs_header_level(node));
11308 btree_space_waste += btrfs_leaf_free_space(root, node);
11309 ret = check_leaf_items(root, node);
11314 nr = btrfs_header_nritems(node);
11315 btrfs_disk_key_to_cpu(&drop_key, &root->root_item.drop_progress);
11316 btree_space_waste += (BTRFS_NODEPTRS_PER_BLOCK(root) - nr) *
11317 sizeof(struct btrfs_key_ptr);
11319 /* Then check all its children */
11320 for (i = 0; i < nr; i++) {
11321 u64 blocknr = btrfs_node_blockptr(node, i);
11323 btrfs_node_key_to_cpu(node, &key, i);
11324 if (level == root->root_item.drop_level &&
11325 is_dropped_key(&key, &drop_key))
11329 * As a btrfs tree has most 8 levels (0..7), so it's quite safe
11330 * to call the function itself.
11332 eb = read_tree_block(root, blocknr, root->nodesize, 0);
11333 if (extent_buffer_uptodate(eb)) {
11334 ret = traverse_tree_block(root, eb);
11337 free_extent_buffer(eb);
11344 * Low memory usage version check_chunks_and_extents.
11346 static int check_chunks_and_extents_v2(struct btrfs_root *root)
11348 struct btrfs_path path;
11349 struct btrfs_key key;
11350 struct btrfs_root *root1;
11351 struct btrfs_root *cur_root;
11355 root1 = root->fs_info->chunk_root;
11356 ret = traverse_tree_block(root1, root1->node);
11359 root1 = root->fs_info->tree_root;
11360 ret = traverse_tree_block(root1, root1->node);
11363 btrfs_init_path(&path);
11364 key.objectid = BTRFS_EXTENT_TREE_OBJECTID;
11366 key.type = BTRFS_ROOT_ITEM_KEY;
11368 ret = btrfs_search_slot(NULL, root1, &key, &path, 0, 0);
11370 error("cannot find extent treet in tree_root");
11375 btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
11376 if (key.type != BTRFS_ROOT_ITEM_KEY)
11378 key.offset = (u64)-1;
11380 cur_root = btrfs_read_fs_root(root->fs_info, &key);
11381 if (IS_ERR(cur_root) || !cur_root) {
11382 error("failed to read tree: %lld", key.objectid);
11386 ret = traverse_tree_block(cur_root, cur_root->node);
11390 ret = btrfs_next_item(root1, &path);
11396 btrfs_release_path(&path);
11400 static int btrfs_fsck_reinit_root(struct btrfs_trans_handle *trans,
11401 struct btrfs_root *root, int overwrite)
11403 struct extent_buffer *c;
11404 struct extent_buffer *old = root->node;
11407 struct btrfs_disk_key disk_key = {0,0,0};
11413 extent_buffer_get(c);
11416 c = btrfs_alloc_free_block(trans, root,
11418 root->root_key.objectid,
11419 &disk_key, level, 0, 0);
11422 extent_buffer_get(c);
11426 memset_extent_buffer(c, 0, 0, sizeof(struct btrfs_header));
11427 btrfs_set_header_level(c, level);
11428 btrfs_set_header_bytenr(c, c->start);
11429 btrfs_set_header_generation(c, trans->transid);
11430 btrfs_set_header_backref_rev(c, BTRFS_MIXED_BACKREF_REV);
11431 btrfs_set_header_owner(c, root->root_key.objectid);
11433 write_extent_buffer(c, root->fs_info->fsid,
11434 btrfs_header_fsid(), BTRFS_FSID_SIZE);
11436 write_extent_buffer(c, root->fs_info->chunk_tree_uuid,
11437 btrfs_header_chunk_tree_uuid(c),
11440 btrfs_mark_buffer_dirty(c);
11442 * this case can happen in the following case:
11444 * 1.overwrite previous root.
11446 * 2.reinit reloc data root, this is because we skip pin
11447 * down reloc data tree before which means we can allocate
11448 * same block bytenr here.
11450 if (old->start == c->start) {
11451 btrfs_set_root_generation(&root->root_item,
11453 root->root_item.level = btrfs_header_level(root->node);
11454 ret = btrfs_update_root(trans, root->fs_info->tree_root,
11455 &root->root_key, &root->root_item);
11457 free_extent_buffer(c);
11461 free_extent_buffer(old);
11463 add_root_to_dirty_list(root);
11467 static int pin_down_tree_blocks(struct btrfs_fs_info *fs_info,
11468 struct extent_buffer *eb, int tree_root)
11470 struct extent_buffer *tmp;
11471 struct btrfs_root_item *ri;
11472 struct btrfs_key key;
11475 int level = btrfs_header_level(eb);
11481 * If we have pinned this block before, don't pin it again.
11482 * This can not only avoid forever loop with broken filesystem
11483 * but also give us some speedups.
11485 if (test_range_bit(&fs_info->pinned_extents, eb->start,
11486 eb->start + eb->len - 1, EXTENT_DIRTY, 0))
11489 btrfs_pin_extent(fs_info, eb->start, eb->len);
11491 nodesize = btrfs_super_nodesize(fs_info->super_copy);
11492 nritems = btrfs_header_nritems(eb);
11493 for (i = 0; i < nritems; i++) {
11495 btrfs_item_key_to_cpu(eb, &key, i);
11496 if (key.type != BTRFS_ROOT_ITEM_KEY)
11498 /* Skip the extent root and reloc roots */
11499 if (key.objectid == BTRFS_EXTENT_TREE_OBJECTID ||
11500 key.objectid == BTRFS_TREE_RELOC_OBJECTID ||
11501 key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID)
11503 ri = btrfs_item_ptr(eb, i, struct btrfs_root_item);
11504 bytenr = btrfs_disk_root_bytenr(eb, ri);
11507 * If at any point we start needing the real root we
11508 * will have to build a stump root for the root we are
11509 * in, but for now this doesn't actually use the root so
11510 * just pass in extent_root.
11512 tmp = read_tree_block(fs_info->extent_root, bytenr,
11514 if (!extent_buffer_uptodate(tmp)) {
11515 fprintf(stderr, "Error reading root block\n");
11518 ret = pin_down_tree_blocks(fs_info, tmp, 0);
11519 free_extent_buffer(tmp);
11523 bytenr = btrfs_node_blockptr(eb, i);
11525 /* If we aren't the tree root don't read the block */
11526 if (level == 1 && !tree_root) {
11527 btrfs_pin_extent(fs_info, bytenr, nodesize);
11531 tmp = read_tree_block(fs_info->extent_root, bytenr,
11533 if (!extent_buffer_uptodate(tmp)) {
11534 fprintf(stderr, "Error reading tree block\n");
11537 ret = pin_down_tree_blocks(fs_info, tmp, tree_root);
11538 free_extent_buffer(tmp);
11547 static int pin_metadata_blocks(struct btrfs_fs_info *fs_info)
11551 ret = pin_down_tree_blocks(fs_info, fs_info->chunk_root->node, 0);
11555 return pin_down_tree_blocks(fs_info, fs_info->tree_root->node, 1);
11558 static int reset_block_groups(struct btrfs_fs_info *fs_info)
11560 struct btrfs_block_group_cache *cache;
11561 struct btrfs_path path;
11562 struct extent_buffer *leaf;
11563 struct btrfs_chunk *chunk;
11564 struct btrfs_key key;
11568 btrfs_init_path(&path);
11570 key.type = BTRFS_CHUNK_ITEM_KEY;
11572 ret = btrfs_search_slot(NULL, fs_info->chunk_root, &key, &path, 0, 0);
11574 btrfs_release_path(&path);
11579 * We do this in case the block groups were screwed up and had alloc
11580 * bits that aren't actually set on the chunks. This happens with
11581 * restored images every time and could happen in real life I guess.
11583 fs_info->avail_data_alloc_bits = 0;
11584 fs_info->avail_metadata_alloc_bits = 0;
11585 fs_info->avail_system_alloc_bits = 0;
11587 /* First we need to create the in-memory block groups */
11589 if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) {
11590 ret = btrfs_next_leaf(fs_info->chunk_root, &path);
11592 btrfs_release_path(&path);
11600 leaf = path.nodes[0];
11601 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
11602 if (key.type != BTRFS_CHUNK_ITEM_KEY) {
11607 chunk = btrfs_item_ptr(leaf, path.slots[0], struct btrfs_chunk);
11608 btrfs_add_block_group(fs_info, 0,
11609 btrfs_chunk_type(leaf, chunk),
11610 key.objectid, key.offset,
11611 btrfs_chunk_length(leaf, chunk));
11612 set_extent_dirty(&fs_info->free_space_cache, key.offset,
11613 key.offset + btrfs_chunk_length(leaf, chunk),
11619 cache = btrfs_lookup_first_block_group(fs_info, start);
11623 start = cache->key.objectid + cache->key.offset;
11626 btrfs_release_path(&path);
11630 static int reset_balance(struct btrfs_trans_handle *trans,
11631 struct btrfs_fs_info *fs_info)
11633 struct btrfs_root *root = fs_info->tree_root;
11634 struct btrfs_path path;
11635 struct extent_buffer *leaf;
11636 struct btrfs_key key;
11637 int del_slot, del_nr = 0;
11641 btrfs_init_path(&path);
11642 key.objectid = BTRFS_BALANCE_OBJECTID;
11643 key.type = BTRFS_BALANCE_ITEM_KEY;
11645 ret = btrfs_search_slot(trans, root, &key, &path, -1, 1);
11650 goto reinit_data_reloc;
11655 ret = btrfs_del_item(trans, root, &path);
11658 btrfs_release_path(&path);
11660 key.objectid = BTRFS_TREE_RELOC_OBJECTID;
11661 key.type = BTRFS_ROOT_ITEM_KEY;
11663 ret = btrfs_search_slot(trans, root, &key, &path, -1, 1);
11667 if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) {
11672 ret = btrfs_del_items(trans, root, &path,
11679 btrfs_release_path(&path);
11682 ret = btrfs_search_slot(trans, root, &key, &path,
11689 leaf = path.nodes[0];
11690 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
11691 if (key.objectid > BTRFS_TREE_RELOC_OBJECTID)
11693 if (key.objectid != BTRFS_TREE_RELOC_OBJECTID) {
11698 del_slot = path.slots[0];
11707 ret = btrfs_del_items(trans, root, &path, del_slot, del_nr);
11711 btrfs_release_path(&path);
11714 key.objectid = BTRFS_DATA_RELOC_TREE_OBJECTID;
11715 key.type = BTRFS_ROOT_ITEM_KEY;
11716 key.offset = (u64)-1;
11717 root = btrfs_read_fs_root(fs_info, &key);
11718 if (IS_ERR(root)) {
11719 fprintf(stderr, "Error reading data reloc tree\n");
11720 ret = PTR_ERR(root);
11723 record_root_in_trans(trans, root);
11724 ret = btrfs_fsck_reinit_root(trans, root, 0);
11727 ret = btrfs_make_root_dir(trans, root, BTRFS_FIRST_FREE_OBJECTID);
11729 btrfs_release_path(&path);
11733 static int reinit_extent_tree(struct btrfs_trans_handle *trans,
11734 struct btrfs_fs_info *fs_info)
11740 * The only reason we don't do this is because right now we're just
11741 * walking the trees we find and pinning down their bytes, we don't look
11742 * at any of the leaves. In order to do mixed groups we'd have to check
11743 * the leaves of any fs roots and pin down the bytes for any file
11744 * extents we find. Not hard but why do it if we don't have to?
11746 if (btrfs_fs_incompat(fs_info, BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS)) {
11747 fprintf(stderr, "We don't support re-initing the extent tree "
11748 "for mixed block groups yet, please notify a btrfs "
11749 "developer you want to do this so they can add this "
11750 "functionality.\n");
11755 * first we need to walk all of the trees except the extent tree and pin
11756 * down the bytes that are in use so we don't overwrite any existing
11759 ret = pin_metadata_blocks(fs_info);
11761 fprintf(stderr, "error pinning down used bytes\n");
11766 * Need to drop all the block groups since we're going to recreate all
11769 btrfs_free_block_groups(fs_info);
11770 ret = reset_block_groups(fs_info);
11772 fprintf(stderr, "error resetting the block groups\n");
11776 /* Ok we can allocate now, reinit the extent root */
11777 ret = btrfs_fsck_reinit_root(trans, fs_info->extent_root, 0);
11779 fprintf(stderr, "extent root initialization failed\n");
11781 * When the transaction code is updated we should end the
11782 * transaction, but for now progs only knows about commit so
11783 * just return an error.
11789 * Now we have all the in-memory block groups setup so we can make
11790 * allocations properly, and the metadata we care about is safe since we
11791 * pinned all of it above.
11794 struct btrfs_block_group_cache *cache;
11796 cache = btrfs_lookup_first_block_group(fs_info, start);
11799 start = cache->key.objectid + cache->key.offset;
11800 ret = btrfs_insert_item(trans, fs_info->extent_root,
11801 &cache->key, &cache->item,
11802 sizeof(cache->item));
11804 fprintf(stderr, "Error adding block group\n");
11807 btrfs_extent_post_op(trans, fs_info->extent_root);
11810 ret = reset_balance(trans, fs_info);
11812 fprintf(stderr, "error resetting the pending balance\n");
11817 static int recow_extent_buffer(struct btrfs_root *root, struct extent_buffer *eb)
11819 struct btrfs_path path;
11820 struct btrfs_trans_handle *trans;
11821 struct btrfs_key key;
11824 printf("Recowing metadata block %llu\n", eb->start);
11825 key.objectid = btrfs_header_owner(eb);
11826 key.type = BTRFS_ROOT_ITEM_KEY;
11827 key.offset = (u64)-1;
11829 root = btrfs_read_fs_root(root->fs_info, &key);
11830 if (IS_ERR(root)) {
11831 fprintf(stderr, "Couldn't find owner root %llu\n",
11833 return PTR_ERR(root);
11836 trans = btrfs_start_transaction(root, 1);
11838 return PTR_ERR(trans);
11840 btrfs_init_path(&path);
11841 path.lowest_level = btrfs_header_level(eb);
11842 if (path.lowest_level)
11843 btrfs_node_key_to_cpu(eb, &key, 0);
11845 btrfs_item_key_to_cpu(eb, &key, 0);
11847 ret = btrfs_search_slot(trans, root, &key, &path, 0, 1);
11848 btrfs_commit_transaction(trans, root);
11849 btrfs_release_path(&path);
11853 static int delete_bad_item(struct btrfs_root *root, struct bad_item *bad)
11855 struct btrfs_path path;
11856 struct btrfs_trans_handle *trans;
11857 struct btrfs_key key;
11860 printf("Deleting bad item [%llu,%u,%llu]\n", bad->key.objectid,
11861 bad->key.type, bad->key.offset);
11862 key.objectid = bad->root_id;
11863 key.type = BTRFS_ROOT_ITEM_KEY;
11864 key.offset = (u64)-1;
11866 root = btrfs_read_fs_root(root->fs_info, &key);
11867 if (IS_ERR(root)) {
11868 fprintf(stderr, "Couldn't find owner root %llu\n",
11870 return PTR_ERR(root);
11873 trans = btrfs_start_transaction(root, 1);
11875 return PTR_ERR(trans);
11877 btrfs_init_path(&path);
11878 ret = btrfs_search_slot(trans, root, &bad->key, &path, -1, 1);
11884 ret = btrfs_del_item(trans, root, &path);
11886 btrfs_commit_transaction(trans, root);
11887 btrfs_release_path(&path);
11891 static int zero_log_tree(struct btrfs_root *root)
11893 struct btrfs_trans_handle *trans;
11896 trans = btrfs_start_transaction(root, 1);
11897 if (IS_ERR(trans)) {
11898 ret = PTR_ERR(trans);
11901 btrfs_set_super_log_root(root->fs_info->super_copy, 0);
11902 btrfs_set_super_log_root_level(root->fs_info->super_copy, 0);
11903 ret = btrfs_commit_transaction(trans, root);
11907 static int populate_csum(struct btrfs_trans_handle *trans,
11908 struct btrfs_root *csum_root, char *buf, u64 start,
11915 while (offset < len) {
11916 sectorsize = csum_root->sectorsize;
11917 ret = read_extent_data(csum_root, buf, start + offset,
11921 ret = btrfs_csum_file_block(trans, csum_root, start + len,
11922 start + offset, buf, sectorsize);
11925 offset += sectorsize;
11930 static int fill_csum_tree_from_one_fs_root(struct btrfs_trans_handle *trans,
11931 struct btrfs_root *csum_root,
11932 struct btrfs_root *cur_root)
11934 struct btrfs_path path;
11935 struct btrfs_key key;
11936 struct extent_buffer *node;
11937 struct btrfs_file_extent_item *fi;
11944 buf = malloc(cur_root->fs_info->csum_root->sectorsize);
11948 btrfs_init_path(&path);
11952 ret = btrfs_search_slot(NULL, cur_root, &key, &path, 0, 0);
11955 /* Iterate all regular file extents and fill its csum */
11957 btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
11959 if (key.type != BTRFS_EXTENT_DATA_KEY)
11961 node = path.nodes[0];
11962 slot = path.slots[0];
11963 fi = btrfs_item_ptr(node, slot, struct btrfs_file_extent_item);
11964 if (btrfs_file_extent_type(node, fi) != BTRFS_FILE_EXTENT_REG)
11966 start = btrfs_file_extent_disk_bytenr(node, fi);
11967 len = btrfs_file_extent_disk_num_bytes(node, fi);
11969 ret = populate_csum(trans, csum_root, buf, start, len);
11970 if (ret == -EEXIST)
11976 * TODO: if next leaf is corrupted, jump to nearest next valid
11979 ret = btrfs_next_item(cur_root, &path);
11989 btrfs_release_path(&path);
11994 static int fill_csum_tree_from_fs(struct btrfs_trans_handle *trans,
11995 struct btrfs_root *csum_root)
11997 struct btrfs_fs_info *fs_info = csum_root->fs_info;
11998 struct btrfs_path path;
11999 struct btrfs_root *tree_root = fs_info->tree_root;
12000 struct btrfs_root *cur_root;
12001 struct extent_buffer *node;
12002 struct btrfs_key key;
12006 btrfs_init_path(&path);
12007 key.objectid = BTRFS_FS_TREE_OBJECTID;
12009 key.type = BTRFS_ROOT_ITEM_KEY;
12010 ret = btrfs_search_slot(NULL, tree_root, &key, &path, 0, 0);
12019 node = path.nodes[0];
12020 slot = path.slots[0];
12021 btrfs_item_key_to_cpu(node, &key, slot);
12022 if (key.objectid > BTRFS_LAST_FREE_OBJECTID)
12024 if (key.type != BTRFS_ROOT_ITEM_KEY)
12026 if (!is_fstree(key.objectid))
12028 key.offset = (u64)-1;
12030 cur_root = btrfs_read_fs_root(fs_info, &key);
12031 if (IS_ERR(cur_root) || !cur_root) {
12032 fprintf(stderr, "Fail to read fs/subvol tree: %lld\n",
12036 ret = fill_csum_tree_from_one_fs_root(trans, csum_root,
12041 ret = btrfs_next_item(tree_root, &path);
12051 btrfs_release_path(&path);
12055 static int fill_csum_tree_from_extent(struct btrfs_trans_handle *trans,
12056 struct btrfs_root *csum_root)
12058 struct btrfs_root *extent_root = csum_root->fs_info->extent_root;
12059 struct btrfs_path path;
12060 struct btrfs_extent_item *ei;
12061 struct extent_buffer *leaf;
12063 struct btrfs_key key;
12066 btrfs_init_path(&path);
12068 key.type = BTRFS_EXTENT_ITEM_KEY;
12070 ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0);
12072 btrfs_release_path(&path);
12076 buf = malloc(csum_root->sectorsize);
12078 btrfs_release_path(&path);
12083 if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) {
12084 ret = btrfs_next_leaf(extent_root, &path);
12092 leaf = path.nodes[0];
12094 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
12095 if (key.type != BTRFS_EXTENT_ITEM_KEY) {
12100 ei = btrfs_item_ptr(leaf, path.slots[0],
12101 struct btrfs_extent_item);
12102 if (!(btrfs_extent_flags(leaf, ei) &
12103 BTRFS_EXTENT_FLAG_DATA)) {
12108 ret = populate_csum(trans, csum_root, buf, key.objectid,
12115 btrfs_release_path(&path);
12121 * Recalculate the csum and put it into the csum tree.
12123 * Extent tree init will wipe out all the extent info, so in that case, we
12124 * can't depend on extent tree, but use fs tree. If search_fs_tree is set, we
12125 * will use fs/subvol trees to init the csum tree.
12127 static int fill_csum_tree(struct btrfs_trans_handle *trans,
12128 struct btrfs_root *csum_root,
12129 int search_fs_tree)
12131 if (search_fs_tree)
12132 return fill_csum_tree_from_fs(trans, csum_root);
12134 return fill_csum_tree_from_extent(trans, csum_root);
12137 static void free_roots_info_cache(void)
12139 if (!roots_info_cache)
12142 while (!cache_tree_empty(roots_info_cache)) {
12143 struct cache_extent *entry;
12144 struct root_item_info *rii;
12146 entry = first_cache_extent(roots_info_cache);
12149 remove_cache_extent(roots_info_cache, entry);
12150 rii = container_of(entry, struct root_item_info, cache_extent);
12154 free(roots_info_cache);
12155 roots_info_cache = NULL;
12158 static int build_roots_info_cache(struct btrfs_fs_info *info)
12161 struct btrfs_key key;
12162 struct extent_buffer *leaf;
12163 struct btrfs_path path;
12165 if (!roots_info_cache) {
12166 roots_info_cache = malloc(sizeof(*roots_info_cache));
12167 if (!roots_info_cache)
12169 cache_tree_init(roots_info_cache);
12172 btrfs_init_path(&path);
12174 key.type = BTRFS_EXTENT_ITEM_KEY;
12176 ret = btrfs_search_slot(NULL, info->extent_root, &key, &path, 0, 0);
12179 leaf = path.nodes[0];
12182 struct btrfs_key found_key;
12183 struct btrfs_extent_item *ei;
12184 struct btrfs_extent_inline_ref *iref;
12185 int slot = path.slots[0];
12190 struct cache_extent *entry;
12191 struct root_item_info *rii;
12193 if (slot >= btrfs_header_nritems(leaf)) {
12194 ret = btrfs_next_leaf(info->extent_root, &path);
12201 leaf = path.nodes[0];
12202 slot = path.slots[0];
12205 btrfs_item_key_to_cpu(leaf, &found_key, path.slots[0]);
12207 if (found_key.type != BTRFS_EXTENT_ITEM_KEY &&
12208 found_key.type != BTRFS_METADATA_ITEM_KEY)
12211 ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
12212 flags = btrfs_extent_flags(leaf, ei);
12214 if (found_key.type == BTRFS_EXTENT_ITEM_KEY &&
12215 !(flags & BTRFS_EXTENT_FLAG_TREE_BLOCK))
12218 if (found_key.type == BTRFS_METADATA_ITEM_KEY) {
12219 iref = (struct btrfs_extent_inline_ref *)(ei + 1);
12220 level = found_key.offset;
12222 struct btrfs_tree_block_info *binfo;
12224 binfo = (struct btrfs_tree_block_info *)(ei + 1);
12225 iref = (struct btrfs_extent_inline_ref *)(binfo + 1);
12226 level = btrfs_tree_block_level(leaf, binfo);
12230 * For a root extent, it must be of the following type and the
12231 * first (and only one) iref in the item.
12233 type = btrfs_extent_inline_ref_type(leaf, iref);
12234 if (type != BTRFS_TREE_BLOCK_REF_KEY)
12237 root_id = btrfs_extent_inline_ref_offset(leaf, iref);
12238 entry = lookup_cache_extent(roots_info_cache, root_id, 1);
12240 rii = malloc(sizeof(struct root_item_info));
12245 rii->cache_extent.start = root_id;
12246 rii->cache_extent.size = 1;
12247 rii->level = (u8)-1;
12248 entry = &rii->cache_extent;
12249 ret = insert_cache_extent(roots_info_cache, entry);
12252 rii = container_of(entry, struct root_item_info,
12256 ASSERT(rii->cache_extent.start == root_id);
12257 ASSERT(rii->cache_extent.size == 1);
12259 if (level > rii->level || rii->level == (u8)-1) {
12260 rii->level = level;
12261 rii->bytenr = found_key.objectid;
12262 rii->gen = btrfs_extent_generation(leaf, ei);
12263 rii->node_count = 1;
12264 } else if (level == rii->level) {
12272 btrfs_release_path(&path);
12277 static int maybe_repair_root_item(struct btrfs_fs_info *info,
12278 struct btrfs_path *path,
12279 const struct btrfs_key *root_key,
12280 const int read_only_mode)
12282 const u64 root_id = root_key->objectid;
12283 struct cache_extent *entry;
12284 struct root_item_info *rii;
12285 struct btrfs_root_item ri;
12286 unsigned long offset;
12288 entry = lookup_cache_extent(roots_info_cache, root_id, 1);
12291 "Error: could not find extent items for root %llu\n",
12292 root_key->objectid);
12296 rii = container_of(entry, struct root_item_info, cache_extent);
12297 ASSERT(rii->cache_extent.start == root_id);
12298 ASSERT(rii->cache_extent.size == 1);
12300 if (rii->node_count != 1) {
12302 "Error: could not find btree root extent for root %llu\n",
12307 offset = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]);
12308 read_extent_buffer(path->nodes[0], &ri, offset, sizeof(ri));
12310 if (btrfs_root_bytenr(&ri) != rii->bytenr ||
12311 btrfs_root_level(&ri) != rii->level ||
12312 btrfs_root_generation(&ri) != rii->gen) {
12315 * If we're in repair mode but our caller told us to not update
12316 * the root item, i.e. just check if it needs to be updated, don't
12317 * print this message, since the caller will call us again shortly
12318 * for the same root item without read only mode (the caller will
12319 * open a transaction first).
12321 if (!(read_only_mode && repair))
12323 "%sroot item for root %llu,"
12324 " current bytenr %llu, current gen %llu, current level %u,"
12325 " new bytenr %llu, new gen %llu, new level %u\n",
12326 (read_only_mode ? "" : "fixing "),
12328 btrfs_root_bytenr(&ri), btrfs_root_generation(&ri),
12329 btrfs_root_level(&ri),
12330 rii->bytenr, rii->gen, rii->level);
12332 if (btrfs_root_generation(&ri) > rii->gen) {
12334 "root %llu has a root item with a more recent gen (%llu) compared to the found root node (%llu)\n",
12335 root_id, btrfs_root_generation(&ri), rii->gen);
12339 if (!read_only_mode) {
12340 btrfs_set_root_bytenr(&ri, rii->bytenr);
12341 btrfs_set_root_level(&ri, rii->level);
12342 btrfs_set_root_generation(&ri, rii->gen);
12343 write_extent_buffer(path->nodes[0], &ri,
12344 offset, sizeof(ri));
12354 * A regression introduced in the 3.17 kernel (more specifically in 3.17-rc2),
12355 * caused read-only snapshots to be corrupted if they were created at a moment
12356 * when the source subvolume/snapshot had orphan items. The issue was that the
12357 * on-disk root items became incorrect, referring to the pre orphan cleanup root
12358 * node instead of the post orphan cleanup root node.
12359 * So this function, and its callees, just detects and fixes those cases. Even
12360 * though the regression was for read-only snapshots, this function applies to
12361 * any snapshot/subvolume root.
12362 * This must be run before any other repair code - not doing it so, makes other
12363 * repair code delete or modify backrefs in the extent tree for example, which
12364 * will result in an inconsistent fs after repairing the root items.
12366 static int repair_root_items(struct btrfs_fs_info *info)
12368 struct btrfs_path path;
12369 struct btrfs_key key;
12370 struct extent_buffer *leaf;
12371 struct btrfs_trans_handle *trans = NULL;
12374 int need_trans = 0;
12376 btrfs_init_path(&path);
12378 ret = build_roots_info_cache(info);
12382 key.objectid = BTRFS_FIRST_FREE_OBJECTID;
12383 key.type = BTRFS_ROOT_ITEM_KEY;
12388 * Avoid opening and committing transactions if a leaf doesn't have
12389 * any root items that need to be fixed, so that we avoid rotating
12390 * backup roots unnecessarily.
12393 trans = btrfs_start_transaction(info->tree_root, 1);
12394 if (IS_ERR(trans)) {
12395 ret = PTR_ERR(trans);
12400 ret = btrfs_search_slot(trans, info->tree_root, &key, &path,
12404 leaf = path.nodes[0];
12407 struct btrfs_key found_key;
12409 if (path.slots[0] >= btrfs_header_nritems(leaf)) {
12410 int no_more_keys = find_next_key(&path, &key);
12412 btrfs_release_path(&path);
12414 ret = btrfs_commit_transaction(trans,
12426 btrfs_item_key_to_cpu(leaf, &found_key, path.slots[0]);
12428 if (found_key.type != BTRFS_ROOT_ITEM_KEY)
12430 if (found_key.objectid == BTRFS_TREE_RELOC_OBJECTID)
12433 ret = maybe_repair_root_item(info, &path, &found_key,
12438 if (!trans && repair) {
12441 btrfs_release_path(&path);
12451 free_roots_info_cache();
12452 btrfs_release_path(&path);
12454 btrfs_commit_transaction(trans, info->tree_root);
12461 static int clear_free_space_cache(struct btrfs_fs_info *fs_info)
12463 struct btrfs_trans_handle *trans;
12464 struct btrfs_block_group_cache *bg_cache;
12468 /* Clear all free space cache inodes and its extent data */
12470 bg_cache = btrfs_lookup_first_block_group(fs_info, current);
12473 ret = btrfs_clear_free_space_cache(fs_info, bg_cache);
12476 current = bg_cache->key.objectid + bg_cache->key.offset;
12479 /* Don't forget to set cache_generation to -1 */
12480 trans = btrfs_start_transaction(fs_info->tree_root, 0);
12481 if (IS_ERR(trans)) {
12482 error("failed to update super block cache generation");
12483 return PTR_ERR(trans);
12485 btrfs_set_super_cache_generation(fs_info->super_copy, (u64)-1);
12486 btrfs_commit_transaction(trans, fs_info->tree_root);
12491 const char * const cmd_check_usage[] = {
12492 "btrfs check [options] <device>",
12493 "Check structural integrity of a filesystem (unmounted).",
12494 "Check structural integrity of an unmounted filesystem. Verify internal",
12495 "trees' consistency and item connectivity. In the repair mode try to",
12496 "fix the problems found. ",
12497 "WARNING: the repair mode is considered dangerous",
12499 "-s|--super <superblock> use this superblock copy",
12500 "-b|--backup use the first valid backup root copy",
12501 "--repair try to repair the filesystem",
12502 "--readonly run in read-only mode (default)",
12503 "--init-csum-tree create a new CRC tree",
12504 "--init-extent-tree create a new extent tree",
12505 "--mode <MODE> allows choice of memory/IO trade-offs",
12506 " where MODE is one of:",
12507 " original - read inodes and extents to memory (requires",
12508 " more memory, does less IO)",
12509 " lowmem - try to use less memory but read blocks again",
12511 "--check-data-csum verify checksums of data blocks",
12512 "-Q|--qgroup-report print a report on qgroup consistency",
12513 "-E|--subvol-extents <subvolid>",
12514 " print subvolume extents and sharing state",
12515 "-r|--tree-root <bytenr> use the given bytenr for the tree root",
12516 "--chunk-root <bytenr> use the given bytenr for the chunk tree root",
12517 "-p|--progress indicate progress",
12518 "--clear-space-cache v1|v2 clear space cache for v1 or v2",
12522 int cmd_check(int argc, char **argv)
12524 struct cache_tree root_cache;
12525 struct btrfs_root *root;
12526 struct btrfs_fs_info *info;
12529 u64 tree_root_bytenr = 0;
12530 u64 chunk_root_bytenr = 0;
12531 char uuidbuf[BTRFS_UUID_UNPARSED_SIZE];
12535 int init_csum_tree = 0;
12537 int clear_space_cache = 0;
12538 int qgroup_report = 0;
12539 int qgroups_repaired = 0;
12540 unsigned ctree_flags = OPEN_CTREE_EXCLUSIVE;
12544 enum { GETOPT_VAL_REPAIR = 257, GETOPT_VAL_INIT_CSUM,
12545 GETOPT_VAL_INIT_EXTENT, GETOPT_VAL_CHECK_CSUM,
12546 GETOPT_VAL_READONLY, GETOPT_VAL_CHUNK_TREE,
12547 GETOPT_VAL_MODE, GETOPT_VAL_CLEAR_SPACE_CACHE };
12548 static const struct option long_options[] = {
12549 { "super", required_argument, NULL, 's' },
12550 { "repair", no_argument, NULL, GETOPT_VAL_REPAIR },
12551 { "readonly", no_argument, NULL, GETOPT_VAL_READONLY },
12552 { "init-csum-tree", no_argument, NULL,
12553 GETOPT_VAL_INIT_CSUM },
12554 { "init-extent-tree", no_argument, NULL,
12555 GETOPT_VAL_INIT_EXTENT },
12556 { "check-data-csum", no_argument, NULL,
12557 GETOPT_VAL_CHECK_CSUM },
12558 { "backup", no_argument, NULL, 'b' },
12559 { "subvol-extents", required_argument, NULL, 'E' },
12560 { "qgroup-report", no_argument, NULL, 'Q' },
12561 { "tree-root", required_argument, NULL, 'r' },
12562 { "chunk-root", required_argument, NULL,
12563 GETOPT_VAL_CHUNK_TREE },
12564 { "progress", no_argument, NULL, 'p' },
12565 { "mode", required_argument, NULL,
12567 { "clear-space-cache", required_argument, NULL,
12568 GETOPT_VAL_CLEAR_SPACE_CACHE},
12569 { NULL, 0, NULL, 0}
12572 c = getopt_long(argc, argv, "as:br:p", long_options, NULL);
12576 case 'a': /* ignored */ break;
12578 ctree_flags |= OPEN_CTREE_BACKUP_ROOT;
12581 num = arg_strtou64(optarg);
12582 if (num >= BTRFS_SUPER_MIRROR_MAX) {
12584 "super mirror should be less than %d",
12585 BTRFS_SUPER_MIRROR_MAX);
12588 bytenr = btrfs_sb_offset(((int)num));
12589 printf("using SB copy %llu, bytenr %llu\n", num,
12590 (unsigned long long)bytenr);
12596 subvolid = arg_strtou64(optarg);
12599 tree_root_bytenr = arg_strtou64(optarg);
12601 case GETOPT_VAL_CHUNK_TREE:
12602 chunk_root_bytenr = arg_strtou64(optarg);
12605 ctx.progress_enabled = true;
12609 usage(cmd_check_usage);
12610 case GETOPT_VAL_REPAIR:
12611 printf("enabling repair mode\n");
12613 ctree_flags |= OPEN_CTREE_WRITES;
12615 case GETOPT_VAL_READONLY:
12618 case GETOPT_VAL_INIT_CSUM:
12619 printf("Creating a new CRC tree\n");
12620 init_csum_tree = 1;
12622 ctree_flags |= OPEN_CTREE_WRITES;
12624 case GETOPT_VAL_INIT_EXTENT:
12625 init_extent_tree = 1;
12626 ctree_flags |= (OPEN_CTREE_WRITES |
12627 OPEN_CTREE_NO_BLOCK_GROUPS);
12630 case GETOPT_VAL_CHECK_CSUM:
12631 check_data_csum = 1;
12633 case GETOPT_VAL_MODE:
12634 check_mode = parse_check_mode(optarg);
12635 if (check_mode == CHECK_MODE_UNKNOWN) {
12636 error("unknown mode: %s", optarg);
12640 case GETOPT_VAL_CLEAR_SPACE_CACHE:
12641 if (strcmp(optarg, "v1") == 0) {
12642 clear_space_cache = 1;
12643 } else if (strcmp(optarg, "v2") == 0) {
12644 clear_space_cache = 2;
12645 ctree_flags |= OPEN_CTREE_INVALIDATE_FST;
12648 "invalid argument to --clear-space-cache, must be v1 or v2");
12651 ctree_flags |= OPEN_CTREE_WRITES;
12656 if (check_argc_exact(argc - optind, 1))
12657 usage(cmd_check_usage);
12659 if (ctx.progress_enabled) {
12660 ctx.tp = TASK_NOTHING;
12661 ctx.info = task_init(print_status_check, print_status_return, &ctx);
12664 /* This check is the only reason for --readonly to exist */
12665 if (readonly && repair) {
12666 error("repair options are not compatible with --readonly");
12671 * Not supported yet
12673 if (repair && check_mode == CHECK_MODE_LOWMEM) {
12674 error("low memory mode doesn't support repair yet");
12679 cache_tree_init(&root_cache);
12681 if((ret = check_mounted(argv[optind])) < 0) {
12682 error("could not check mount status: %s", strerror(-ret));
12686 error("%s is currently mounted, aborting", argv[optind]);
12692 /* only allow partial opening under repair mode */
12694 ctree_flags |= OPEN_CTREE_PARTIAL;
12696 info = open_ctree_fs_info(argv[optind], bytenr, tree_root_bytenr,
12697 chunk_root_bytenr, ctree_flags);
12699 error("cannot open file system");
12705 global_info = info;
12706 root = info->fs_root;
12707 if (clear_space_cache == 1) {
12708 if (btrfs_fs_compat_ro(info,
12709 BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE)) {
12711 "free space cache v2 detected, use --clear-space-cache v2");
12715 printf("Clearing free space cache\n");
12716 ret = clear_free_space_cache(info);
12718 error("failed to clear free space cache");
12721 printf("Free space cache cleared\n");
12724 } else if (clear_space_cache == 2) {
12725 if (!btrfs_fs_compat_ro(info,
12726 BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE)) {
12727 printf("no free space cache v2 to clear\n");
12731 printf("Clear free space cache v2\n");
12732 ret = btrfs_clear_free_space_tree(info);
12734 error("failed to clear free space cache v2: %d", ret);
12737 printf("free space cache v2 cleared\n");
12743 * repair mode will force us to commit transaction which
12744 * will make us fail to load log tree when mounting.
12746 if (repair && btrfs_super_log_root(info->super_copy)) {
12747 ret = ask_user("repair mode will force to clear out log tree, are you sure?");
12753 ret = zero_log_tree(root);
12756 error("failed to zero log tree: %d", ret);
12761 uuid_unparse(info->super_copy->fsid, uuidbuf);
12762 if (qgroup_report) {
12763 printf("Print quota groups for %s\nUUID: %s\n", argv[optind],
12765 ret = qgroup_verify_all(info);
12772 printf("Print extent state for subvolume %llu on %s\nUUID: %s\n",
12773 subvolid, argv[optind], uuidbuf);
12774 ret = print_extent_state(info, subvolid);
12778 printf("Checking filesystem on %s\nUUID: %s\n", argv[optind], uuidbuf);
12780 if (!extent_buffer_uptodate(info->tree_root->node) ||
12781 !extent_buffer_uptodate(info->dev_root->node) ||
12782 !extent_buffer_uptodate(info->chunk_root->node)) {
12783 error("critical roots corrupted, unable to check the filesystem");
12789 if (init_extent_tree || init_csum_tree) {
12790 struct btrfs_trans_handle *trans;
12792 trans = btrfs_start_transaction(info->extent_root, 0);
12793 if (IS_ERR(trans)) {
12794 error("error starting transaction");
12795 ret = PTR_ERR(trans);
12800 if (init_extent_tree) {
12801 printf("Creating a new extent tree\n");
12802 ret = reinit_extent_tree(trans, info);
12808 if (init_csum_tree) {
12809 printf("Reinitialize checksum tree\n");
12810 ret = btrfs_fsck_reinit_root(trans, info->csum_root, 0);
12812 error("checksum tree initialization failed: %d",
12819 ret = fill_csum_tree(trans, info->csum_root,
12823 error("checksum tree refilling failed: %d", ret);
12828 * Ok now we commit and run the normal fsck, which will add
12829 * extent entries for all of the items it finds.
12831 ret = btrfs_commit_transaction(trans, info->extent_root);
12836 if (!extent_buffer_uptodate(info->extent_root->node)) {
12837 error("critical: extent_root, unable to check the filesystem");
12842 if (!extent_buffer_uptodate(info->csum_root->node)) {
12843 error("critical: csum_root, unable to check the filesystem");
12849 if (!ctx.progress_enabled)
12850 fprintf(stderr, "checking extents\n");
12851 if (check_mode == CHECK_MODE_LOWMEM)
12852 ret = check_chunks_and_extents_v2(root);
12854 ret = check_chunks_and_extents(root);
12858 "errors found in extent allocation tree or chunk allocation");
12860 ret = repair_root_items(info);
12865 fprintf(stderr, "Fixed %d roots.\n", ret);
12867 } else if (ret > 0) {
12869 "Found %d roots with an outdated root item.\n",
12872 "Please run a filesystem check with the option --repair to fix them.\n");
12878 if (!ctx.progress_enabled) {
12879 if (btrfs_fs_compat_ro(info, BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE))
12880 fprintf(stderr, "checking free space tree\n");
12882 fprintf(stderr, "checking free space cache\n");
12884 ret = check_space_cache(root);
12890 * We used to have to have these hole extents in between our real
12891 * extents so if we don't have this flag set we need to make sure there
12892 * are no gaps in the file extents for inodes, otherwise we can just
12893 * ignore it when this happens.
12895 no_holes = btrfs_fs_incompat(root->fs_info,
12896 BTRFS_FEATURE_INCOMPAT_NO_HOLES);
12897 if (!ctx.progress_enabled)
12898 fprintf(stderr, "checking fs roots\n");
12899 if (check_mode == CHECK_MODE_LOWMEM)
12900 ret = check_fs_roots_v2(root->fs_info);
12902 ret = check_fs_roots(root, &root_cache);
12907 fprintf(stderr, "checking csums\n");
12908 ret = check_csums(root);
12913 fprintf(stderr, "checking root refs\n");
12914 /* For low memory mode, check_fs_roots_v2 handles root refs */
12915 if (check_mode != CHECK_MODE_LOWMEM) {
12916 ret = check_root_refs(root, &root_cache);
12922 while (repair && !list_empty(&root->fs_info->recow_ebs)) {
12923 struct extent_buffer *eb;
12925 eb = list_first_entry(&root->fs_info->recow_ebs,
12926 struct extent_buffer, recow);
12927 list_del_init(&eb->recow);
12928 ret = recow_extent_buffer(root, eb);
12934 while (!list_empty(&delete_items)) {
12935 struct bad_item *bad;
12937 bad = list_first_entry(&delete_items, struct bad_item, list);
12938 list_del_init(&bad->list);
12940 ret = delete_bad_item(root, bad);
12946 if (info->quota_enabled) {
12947 fprintf(stderr, "checking quota groups\n");
12948 ret = qgroup_verify_all(info);
12953 ret = repair_qgroups(info, &qgroups_repaired);
12960 if (!list_empty(&root->fs_info->recow_ebs)) {
12961 error("transid errors in file system");
12966 if (found_old_backref) { /*
12967 * there was a disk format change when mixed
12968 * backref was in testing tree. The old format
12969 * existed about one week.
12971 printf("\n * Found old mixed backref format. "
12972 "The old format is not supported! *"
12973 "\n * Please mount the FS in readonly mode, "
12974 "backup data and re-format the FS. *\n\n");
12977 printf("found %llu bytes used err is %d\n",
12978 (unsigned long long)bytes_used, ret);
12979 printf("total csum bytes: %llu\n",(unsigned long long)total_csum_bytes);
12980 printf("total tree bytes: %llu\n",
12981 (unsigned long long)total_btree_bytes);
12982 printf("total fs tree bytes: %llu\n",
12983 (unsigned long long)total_fs_tree_bytes);
12984 printf("total extent tree bytes: %llu\n",
12985 (unsigned long long)total_extent_tree_bytes);
12986 printf("btree space waste bytes: %llu\n",
12987 (unsigned long long)btree_space_waste);
12988 printf("file data blocks allocated: %llu\n referenced %llu\n",
12989 (unsigned long long)data_bytes_allocated,
12990 (unsigned long long)data_bytes_referenced);
12992 free_qgroup_counts();
12993 free_root_recs_tree(&root_cache);
12997 if (ctx.progress_enabled)
12998 task_deinit(ctx.info);