Btrfs-progs: List all subvolumes by default
[platform/upstream/btrfs-progs.git] / btrfsck.c
1 /*
2  * Copyright (C) 2007 Oracle.  All rights reserved.
3  *
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.
7  *
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.
12  *
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.
17  */
18
19 #define _XOPEN_SOURCE 500
20 #define _GNU_SOURCE 1
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <unistd.h>
24 #include <fcntl.h>
25 #include <sys/types.h>
26 #include <sys/stat.h>
27 #include <unistd.h>
28 #include <getopt.h>
29 #include "kerncompat.h"
30 #include "ctree.h"
31 #include "volumes.h"
32 #include "repair.h"
33 #include "disk-io.h"
34 #include "print-tree.h"
35 #include "transaction.h"
36 #include "list.h"
37 #include "version.h"
38 #include "utils.h"
39
40 static u64 bytes_used = 0;
41 static u64 total_csum_bytes = 0;
42 static u64 total_btree_bytes = 0;
43 static u64 total_fs_tree_bytes = 0;
44 static u64 btree_space_waste = 0;
45 static u64 data_bytes_allocated = 0;
46 static u64 data_bytes_referenced = 0;
47 static int found_old_backref = 0;
48
49 struct extent_backref {
50         struct list_head list;
51         unsigned int is_data:1;
52         unsigned int found_extent_tree:1;
53         unsigned int full_backref:1;
54         unsigned int found_ref:1;
55 };
56
57 struct data_backref {
58         struct extent_backref node;
59         union {
60                 u64 parent;
61                 u64 root;
62         };
63         u64 owner;
64         u64 offset;
65         u32 num_refs;
66         u32 found_ref;
67 };
68
69 struct tree_backref {
70         struct extent_backref node;
71         union {
72                 u64 parent;
73                 u64 root;
74         };
75 };
76
77 struct extent_record {
78         struct list_head backrefs;
79         struct cache_extent cache;
80         struct btrfs_disk_key parent_key;
81         u64 start;
82         u64 max_size;
83         u64 nr;
84         u64 refs;
85         u64 extent_item_refs;
86         u64 generation;
87         u64 info_objectid;
88         u8 info_level;
89         unsigned int content_checked:1;
90         unsigned int owner_ref_checked:1;
91         unsigned int is_root:1;
92 };
93
94 struct inode_backref {
95         struct list_head list;
96         unsigned int found_dir_item:1;
97         unsigned int found_dir_index:1;
98         unsigned int found_inode_ref:1;
99         unsigned int filetype:8;
100         int errors;
101         unsigned int ref_type;
102         u64 dir;
103         u64 index;
104         u16 namelen;
105         char name[0];
106 };
107
108 #define REF_ERR_NO_DIR_ITEM             (1 << 0)
109 #define REF_ERR_NO_DIR_INDEX            (1 << 1)
110 #define REF_ERR_NO_INODE_REF            (1 << 2)
111 #define REF_ERR_DUP_DIR_ITEM            (1 << 3)
112 #define REF_ERR_DUP_DIR_INDEX           (1 << 4)
113 #define REF_ERR_DUP_INODE_REF           (1 << 5)
114 #define REF_ERR_INDEX_UNMATCH           (1 << 6)
115 #define REF_ERR_FILETYPE_UNMATCH        (1 << 7)
116 #define REF_ERR_NAME_TOO_LONG           (1 << 8) // 100
117 #define REF_ERR_NO_ROOT_REF             (1 << 9)
118 #define REF_ERR_NO_ROOT_BACKREF         (1 << 10)
119 #define REF_ERR_DUP_ROOT_REF            (1 << 11)
120 #define REF_ERR_DUP_ROOT_BACKREF        (1 << 12)
121
122 struct inode_record {
123         struct list_head backrefs;
124         unsigned int checked:1;
125         unsigned int merging:1;
126         unsigned int found_inode_item:1;
127         unsigned int found_dir_item:1;
128         unsigned int found_file_extent:1;
129         unsigned int found_csum_item:1;
130         unsigned int some_csum_missing:1;
131         unsigned int nodatasum:1;
132         int errors;
133
134         u64 ino;
135         u32 nlink;
136         u32 imode;
137         u64 isize;
138         u64 nbytes;
139
140         u32 found_link;
141         u64 found_size;
142         u64 extent_start;
143         u64 extent_end;
144         u64 first_extent_gap;
145
146         u32 refs;
147 };
148
149 #define I_ERR_NO_INODE_ITEM             (1 << 0)
150 #define I_ERR_NO_ORPHAN_ITEM            (1 << 1)
151 #define I_ERR_DUP_INODE_ITEM            (1 << 2)
152 #define I_ERR_DUP_DIR_INDEX             (1 << 3)
153 #define I_ERR_ODD_DIR_ITEM              (1 << 4)
154 #define I_ERR_ODD_FILE_EXTENT           (1 << 5)
155 #define I_ERR_BAD_FILE_EXTENT           (1 << 6)
156 #define I_ERR_FILE_EXTENT_OVERLAP       (1 << 7)
157 #define I_ERR_FILE_EXTENT_DISCOUNT      (1 << 8) // 100
158 #define I_ERR_DIR_ISIZE_WRONG           (1 << 9)
159 #define I_ERR_FILE_NBYTES_WRONG         (1 << 10) // 400
160 #define I_ERR_ODD_CSUM_ITEM             (1 << 11)
161 #define I_ERR_SOME_CSUM_MISSING         (1 << 12)
162 #define I_ERR_LINK_COUNT_WRONG          (1 << 13)
163
164 struct root_backref {
165         struct list_head list;
166         unsigned int found_dir_item:1;
167         unsigned int found_dir_index:1;
168         unsigned int found_back_ref:1;
169         unsigned int found_forward_ref:1;
170         unsigned int reachable:1;
171         int errors;
172         u64 ref_root;
173         u64 dir;
174         u64 index;
175         u16 namelen;
176         char name[0];
177 };
178
179 struct root_record {
180         struct list_head backrefs;
181         struct cache_extent cache;
182         unsigned int found_root_item:1;
183         u64 objectid;
184         u32 found_ref;
185 };
186
187 struct ptr_node {
188         struct cache_extent cache;
189         void *data;
190 };
191
192 struct shared_node {
193         struct cache_extent cache;
194         struct cache_tree root_cache;
195         struct cache_tree inode_cache;
196         struct inode_record *current;
197         u32 refs;
198 };
199
200 struct block_info {
201         u64 start;
202         u32 size;
203 };
204
205 struct walk_control {
206         struct cache_tree shared;
207         struct shared_node *nodes[BTRFS_MAX_LEVEL];
208         int active_node;
209         int root_level;
210 };
211
212 static u8 imode_to_type(u32 imode)
213 {
214 #define S_SHIFT 12
215         static unsigned char btrfs_type_by_mode[S_IFMT >> S_SHIFT] = {
216                 [S_IFREG >> S_SHIFT]    = BTRFS_FT_REG_FILE,
217                 [S_IFDIR >> S_SHIFT]    = BTRFS_FT_DIR,
218                 [S_IFCHR >> S_SHIFT]    = BTRFS_FT_CHRDEV,
219                 [S_IFBLK >> S_SHIFT]    = BTRFS_FT_BLKDEV,
220                 [S_IFIFO >> S_SHIFT]    = BTRFS_FT_FIFO,
221                 [S_IFSOCK >> S_SHIFT]   = BTRFS_FT_SOCK,
222                 [S_IFLNK >> S_SHIFT]    = BTRFS_FT_SYMLINK,
223         };
224
225         return btrfs_type_by_mode[(imode & S_IFMT) >> S_SHIFT];
226 #undef S_SHIFT
227 }
228
229 static struct inode_record *clone_inode_rec(struct inode_record *orig_rec)
230 {
231         struct inode_record *rec;
232         struct inode_backref *backref;
233         struct inode_backref *orig;
234         size_t size;
235
236         rec = malloc(sizeof(*rec));
237         memcpy(rec, orig_rec, sizeof(*rec));
238         rec->refs = 1;
239         INIT_LIST_HEAD(&rec->backrefs);
240
241         list_for_each_entry(orig, &orig_rec->backrefs, list) {
242                 size = sizeof(*orig) + orig->namelen + 1;
243                 backref = malloc(size);
244                 memcpy(backref, orig, size);
245                 list_add_tail(&backref->list, &rec->backrefs);
246         }
247         return rec;
248 }
249
250 static struct inode_record *get_inode_rec(struct cache_tree *inode_cache,
251                                           u64 ino, int mod)
252 {
253         struct ptr_node *node;
254         struct cache_extent *cache;
255         struct inode_record *rec = NULL;
256         int ret;
257
258         cache = find_cache_extent(inode_cache, ino, 1);
259         if (cache) {
260                 node = container_of(cache, struct ptr_node, cache);
261                 rec = node->data;
262                 if (mod && rec->refs > 1) {
263                         node->data = clone_inode_rec(rec);
264                         rec->refs--;
265                         rec = node->data;
266                 }
267         } else if (mod) {
268                 rec = calloc(1, sizeof(*rec));
269                 rec->ino = ino;
270                 rec->extent_start = (u64)-1;
271                 rec->first_extent_gap = (u64)-1;
272                 rec->refs = 1;
273                 INIT_LIST_HEAD(&rec->backrefs);
274
275                 node = malloc(sizeof(*node));
276                 node->cache.start = ino;
277                 node->cache.size = 1;
278                 node->data = rec;
279
280                 if (ino == BTRFS_FREE_INO_OBJECTID)
281                         rec->found_link = 1;
282
283                 ret = insert_existing_cache_extent(inode_cache, &node->cache);
284                 BUG_ON(ret);
285         }
286         return rec;
287 }
288
289 static void free_inode_rec(struct inode_record *rec)
290 {
291         struct inode_backref *backref;
292
293         if (--rec->refs > 0)
294                 return;
295
296         while (!list_empty(&rec->backrefs)) {
297                 backref = list_entry(rec->backrefs.next,
298                                      struct inode_backref, list);
299                 list_del(&backref->list);
300                 free(backref);
301         }
302         free(rec);
303 }
304
305 static int can_free_inode_rec(struct inode_record *rec)
306 {
307         if (!rec->errors && rec->checked && rec->found_inode_item &&
308             rec->nlink == rec->found_link && list_empty(&rec->backrefs))
309                 return 1;
310         return 0;
311 }
312
313 static void maybe_free_inode_rec(struct cache_tree *inode_cache,
314                                  struct inode_record *rec)
315 {
316         struct cache_extent *cache;
317         struct inode_backref *tmp, *backref;
318         struct ptr_node *node;
319         unsigned char filetype;
320
321         if (!rec->found_inode_item)
322                 return;
323
324         filetype = imode_to_type(rec->imode);
325         list_for_each_entry_safe(backref, tmp, &rec->backrefs, list) {
326                 if (backref->found_dir_item && backref->found_dir_index) {
327                         if (backref->filetype != filetype)
328                                 backref->errors |= REF_ERR_FILETYPE_UNMATCH;
329                         if (!backref->errors && backref->found_inode_ref) {
330                                 list_del(&backref->list);
331                                 free(backref);
332                         }
333                 }
334         }
335
336         if (!rec->checked || rec->merging)
337                 return;
338
339         if (S_ISDIR(rec->imode)) {
340                 if (rec->found_size != rec->isize)
341                         rec->errors |= I_ERR_DIR_ISIZE_WRONG;
342                 if (rec->found_file_extent)
343                         rec->errors |= I_ERR_ODD_FILE_EXTENT;
344         } else if (S_ISREG(rec->imode) || S_ISLNK(rec->imode)) {
345                 if (rec->found_dir_item)
346                         rec->errors |= I_ERR_ODD_DIR_ITEM;
347                 if (rec->found_size != rec->nbytes)
348                         rec->errors |= I_ERR_FILE_NBYTES_WRONG;
349                 if (rec->extent_start == (u64)-1 || rec->extent_start > 0)
350                         rec->first_extent_gap = 0;
351                 if (rec->nlink > 0 && (rec->extent_end < rec->isize ||
352                     rec->first_extent_gap < rec->isize))
353                         rec->errors |= I_ERR_FILE_EXTENT_DISCOUNT;
354         }
355
356         if (S_ISREG(rec->imode) || S_ISLNK(rec->imode)) {
357                 if (rec->found_csum_item && rec->nodatasum)
358                         rec->errors |= I_ERR_ODD_CSUM_ITEM;
359                 if (rec->some_csum_missing && !rec->nodatasum)
360                         rec->errors |= I_ERR_SOME_CSUM_MISSING;
361         }
362
363         BUG_ON(rec->refs != 1);
364         if (can_free_inode_rec(rec)) {
365                 cache = find_cache_extent(inode_cache, rec->ino, 1);
366                 node = container_of(cache, struct ptr_node, cache);
367                 BUG_ON(node->data != rec);
368                 remove_cache_extent(inode_cache, &node->cache);
369                 free(node);
370                 free_inode_rec(rec);
371         }
372 }
373
374 static int check_orphan_item(struct btrfs_root *root, u64 ino)
375 {
376         struct btrfs_path path;
377         struct btrfs_key key;
378         int ret;
379
380         key.objectid = BTRFS_ORPHAN_OBJECTID;
381         key.type = BTRFS_ORPHAN_ITEM_KEY;
382         key.offset = ino;
383
384         btrfs_init_path(&path);
385         ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
386         btrfs_release_path(root, &path);
387         if (ret > 0)
388                 ret = -ENOENT;
389         return ret;
390 }
391
392 static int process_inode_item(struct extent_buffer *eb,
393                               int slot, struct btrfs_key *key,
394                               struct shared_node *active_node)
395 {
396         struct inode_record *rec;
397         struct btrfs_inode_item *item;
398
399         rec = active_node->current;
400         BUG_ON(rec->ino != key->objectid || rec->refs > 1);
401         if (rec->found_inode_item) {
402                 rec->errors |= I_ERR_DUP_INODE_ITEM;
403                 return 1;
404         }
405         item = btrfs_item_ptr(eb, slot, struct btrfs_inode_item);
406         rec->nlink = btrfs_inode_nlink(eb, item);
407         rec->isize = btrfs_inode_size(eb, item);
408         rec->nbytes = btrfs_inode_nbytes(eb, item);
409         rec->imode = btrfs_inode_mode(eb, item);
410         if (btrfs_inode_flags(eb, item) & BTRFS_INODE_NODATASUM)
411                 rec->nodatasum = 1;
412         rec->found_inode_item = 1;
413         if (rec->nlink == 0)
414                 rec->errors |= I_ERR_NO_ORPHAN_ITEM;
415         maybe_free_inode_rec(&active_node->inode_cache, rec);
416         return 0;
417 }
418
419 static struct inode_backref *get_inode_backref(struct inode_record *rec,
420                                                 const char *name,
421                                                 int namelen, u64 dir)
422 {
423         struct inode_backref *backref;
424
425         list_for_each_entry(backref, &rec->backrefs, list) {
426                 if (backref->dir != dir || backref->namelen != namelen)
427                         continue;
428                 if (memcmp(name, backref->name, namelen))
429                         continue;
430                 return backref;
431         }
432
433         backref = malloc(sizeof(*backref) + namelen + 1);
434         memset(backref, 0, sizeof(*backref));
435         backref->dir = dir;
436         backref->namelen = namelen;
437         memcpy(backref->name, name, namelen);
438         backref->name[namelen] = '\0';
439         list_add_tail(&backref->list, &rec->backrefs);
440         return backref;
441 }
442
443 static int add_inode_backref(struct cache_tree *inode_cache,
444                              u64 ino, u64 dir, u64 index,
445                              const char *name, int namelen,
446                              int filetype, int itemtype, int errors)
447 {
448         struct inode_record *rec;
449         struct inode_backref *backref;
450
451         rec = get_inode_rec(inode_cache, ino, 1);
452         backref = get_inode_backref(rec, name, namelen, dir);
453         if (errors)
454                 backref->errors |= errors;
455         if (itemtype == BTRFS_DIR_INDEX_KEY) {
456                 if (backref->found_dir_index)
457                         backref->errors |= REF_ERR_DUP_DIR_INDEX;
458                 if (backref->found_inode_ref && backref->index != index)
459                         backref->errors |= REF_ERR_INDEX_UNMATCH;
460                 if (backref->found_dir_item && backref->filetype != filetype)
461                         backref->errors |= REF_ERR_FILETYPE_UNMATCH;
462
463                 backref->index = index;
464                 backref->filetype = filetype;
465                 backref->found_dir_index = 1;
466         } else if (itemtype == BTRFS_DIR_ITEM_KEY) {
467                 rec->found_link++;
468                 if (backref->found_dir_item)
469                         backref->errors |= REF_ERR_DUP_DIR_ITEM;
470                 if (backref->found_dir_index && backref->filetype != filetype)
471                         backref->errors |= REF_ERR_FILETYPE_UNMATCH;
472
473                 backref->filetype = filetype;
474                 backref->found_dir_item = 1;
475         } else if ((itemtype == BTRFS_INODE_REF_KEY) ||
476                    (itemtype == BTRFS_INODE_EXTREF_KEY)) {
477                 if (backref->found_inode_ref)
478                         backref->errors |= REF_ERR_DUP_INODE_REF;
479                 if (backref->found_dir_index && backref->index != index)
480                         backref->errors |= REF_ERR_INDEX_UNMATCH;
481
482                 backref->ref_type = itemtype;
483                 backref->index = index;
484                 backref->found_inode_ref = 1;
485         } else {
486                 BUG_ON(1);
487         }
488
489         maybe_free_inode_rec(inode_cache, rec);
490         return 0;
491 }
492
493 static int merge_inode_recs(struct inode_record *src, struct inode_record *dst,
494                             struct cache_tree *dst_cache)
495 {
496         struct inode_backref *backref;
497         u32 dir_count = 0;
498
499         dst->merging = 1;
500         list_for_each_entry(backref, &src->backrefs, list) {
501                 if (backref->found_dir_index) {
502                         add_inode_backref(dst_cache, dst->ino, backref->dir,
503                                         backref->index, backref->name,
504                                         backref->namelen, backref->filetype,
505                                         BTRFS_DIR_INDEX_KEY, backref->errors);
506                 }
507                 if (backref->found_dir_item) {
508                         dir_count++;
509                         add_inode_backref(dst_cache, dst->ino,
510                                         backref->dir, 0, backref->name,
511                                         backref->namelen, backref->filetype,
512                                         BTRFS_DIR_ITEM_KEY, backref->errors);
513                 }
514                 if (backref->found_inode_ref) {
515                         add_inode_backref(dst_cache, dst->ino,
516                                         backref->dir, backref->index,
517                                         backref->name, backref->namelen, 0,
518                                         backref->ref_type, backref->errors);
519                 }
520         }
521
522         if (src->found_dir_item)
523                 dst->found_dir_item = 1;
524         if (src->found_file_extent)
525                 dst->found_file_extent = 1;
526         if (src->found_csum_item)
527                 dst->found_csum_item = 1;
528         if (src->some_csum_missing)
529                 dst->some_csum_missing = 1;
530         if (dst->first_extent_gap > src->first_extent_gap)
531                 dst->first_extent_gap = src->first_extent_gap;
532
533         BUG_ON(src->found_link < dir_count);
534         dst->found_link += src->found_link - dir_count;
535         dst->found_size += src->found_size;
536         if (src->extent_start != (u64)-1) {
537                 if (dst->extent_start == (u64)-1) {
538                         dst->extent_start = src->extent_start;
539                         dst->extent_end = src->extent_end;
540                 } else {
541                         if (dst->extent_end > src->extent_start)
542                                 dst->errors |= I_ERR_FILE_EXTENT_OVERLAP;
543                         else if (dst->extent_end < src->extent_start &&
544                                  dst->extent_end < dst->first_extent_gap)
545                                 dst->first_extent_gap = dst->extent_end;
546                         if (dst->extent_end < src->extent_end)
547                                 dst->extent_end = src->extent_end;
548                 }
549         }
550
551         dst->errors |= src->errors;
552         if (src->found_inode_item) {
553                 if (!dst->found_inode_item) {
554                         dst->nlink = src->nlink;
555                         dst->isize = src->isize;
556                         dst->nbytes = src->nbytes;
557                         dst->imode = src->imode;
558                         dst->nodatasum = src->nodatasum;
559                         dst->found_inode_item = 1;
560                 } else {
561                         dst->errors |= I_ERR_DUP_INODE_ITEM;
562                 }
563         }
564         dst->merging = 0;
565
566         return 0;
567 }
568
569 static int splice_shared_node(struct shared_node *src_node,
570                               struct shared_node *dst_node)
571 {
572         struct cache_extent *cache;
573         struct ptr_node *node, *ins;
574         struct cache_tree *src, *dst;
575         struct inode_record *rec, *conflict;
576         u64 current_ino = 0;
577         int splice = 0;
578         int ret;
579
580         if (--src_node->refs == 0)
581                 splice = 1;
582         if (src_node->current)
583                 current_ino = src_node->current->ino;
584
585         src = &src_node->root_cache;
586         dst = &dst_node->root_cache;
587 again:
588         cache = find_first_cache_extent(src, 0);
589         while (cache) {
590                 node = container_of(cache, struct ptr_node, cache);
591                 rec = node->data;
592                 cache = next_cache_extent(cache);
593
594                 if (splice) {
595                         remove_cache_extent(src, &node->cache);
596                         ins = node;
597                 } else {
598                         ins = malloc(sizeof(*ins));
599                         ins->cache.start = node->cache.start;
600                         ins->cache.size = node->cache.size;
601                         ins->data = rec;
602                         rec->refs++;
603                 }
604                 ret = insert_existing_cache_extent(dst, &ins->cache);
605                 if (ret == -EEXIST) {
606                         conflict = get_inode_rec(dst, rec->ino, 1);
607                         merge_inode_recs(rec, conflict, dst);
608                         if (rec->checked) {
609                                 conflict->checked = 1;
610                                 if (dst_node->current == conflict)
611                                         dst_node->current = NULL;
612                         }
613                         maybe_free_inode_rec(dst, conflict);
614                         free_inode_rec(rec);
615                         free(ins);
616                 } else {
617                         BUG_ON(ret);
618                 }
619         }
620
621         if (src == &src_node->root_cache) {
622                 src = &src_node->inode_cache;
623                 dst = &dst_node->inode_cache;
624                 goto again;
625         }
626
627         if (current_ino > 0 && (!dst_node->current ||
628             current_ino > dst_node->current->ino)) {
629                 if (dst_node->current) {
630                         dst_node->current->checked = 1;
631                         maybe_free_inode_rec(dst, dst_node->current);
632                 }
633                 dst_node->current = get_inode_rec(dst, current_ino, 1);
634         }
635         return 0;
636 }
637
638 static void free_inode_recs(struct cache_tree *inode_cache)
639 {
640         struct cache_extent *cache;
641         struct ptr_node *node;
642         struct inode_record *rec;
643
644         while (1) {
645                 cache = find_first_cache_extent(inode_cache, 0);
646                 if (!cache)
647                         break;
648                 node = container_of(cache, struct ptr_node, cache);
649                 rec = node->data;
650                 remove_cache_extent(inode_cache, &node->cache);
651                 free(node);
652                 free_inode_rec(rec);
653         }
654 }
655
656 static struct shared_node *find_shared_node(struct cache_tree *shared,
657                                             u64 bytenr)
658 {
659         struct cache_extent *cache;
660         struct shared_node *node;
661
662         cache = find_cache_extent(shared, bytenr, 1);
663         if (cache) {
664                 node = container_of(cache, struct shared_node, cache);
665                 return node;
666         }
667         return NULL;
668 }
669
670 static int add_shared_node(struct cache_tree *shared, u64 bytenr, u32 refs)
671 {
672         int ret;
673         struct shared_node *node;
674
675         node = calloc(1, sizeof(*node));
676         node->cache.start = bytenr;
677         node->cache.size = 1;
678         cache_tree_init(&node->root_cache);
679         cache_tree_init(&node->inode_cache);
680         node->refs = refs;
681
682         ret = insert_existing_cache_extent(shared, &node->cache);
683         BUG_ON(ret);
684         return 0;
685 }
686
687 static int enter_shared_node(struct btrfs_root *root, u64 bytenr, u32 refs,
688                              struct walk_control *wc, int level)
689 {
690         struct shared_node *node;
691         struct shared_node *dest;
692
693         if (level == wc->active_node)
694                 return 0;
695
696         BUG_ON(wc->active_node <= level);
697         node = find_shared_node(&wc->shared, bytenr);
698         if (!node) {
699                 add_shared_node(&wc->shared, bytenr, refs);
700                 node = find_shared_node(&wc->shared, bytenr);
701                 wc->nodes[level] = node;
702                 wc->active_node = level;
703                 return 0;
704         }
705
706         if (wc->root_level == wc->active_node &&
707             btrfs_root_refs(&root->root_item) == 0) {
708                 if (--node->refs == 0) {
709                         free_inode_recs(&node->root_cache);
710                         free_inode_recs(&node->inode_cache);
711                         remove_cache_extent(&wc->shared, &node->cache);
712                         free(node);
713                 }
714                 return 1;
715         }
716
717         dest = wc->nodes[wc->active_node];
718         splice_shared_node(node, dest);
719         if (node->refs == 0) {
720                 remove_cache_extent(&wc->shared, &node->cache);
721                 free(node);
722         }
723         return 1;
724 }
725
726 static int leave_shared_node(struct btrfs_root *root,
727                              struct walk_control *wc, int level)
728 {
729         struct shared_node *node;
730         struct shared_node *dest;
731         int i;
732
733         if (level == wc->root_level)
734                 return 0;
735
736         for (i = level + 1; i < BTRFS_MAX_LEVEL; i++) {
737                 if (wc->nodes[i])
738                         break;
739         }
740         BUG_ON(i >= BTRFS_MAX_LEVEL);
741
742         node = wc->nodes[wc->active_node];
743         wc->nodes[wc->active_node] = NULL;
744         wc->active_node = i;
745
746         dest = wc->nodes[wc->active_node];
747         if (wc->active_node < wc->root_level ||
748             btrfs_root_refs(&root->root_item) > 0) {
749                 BUG_ON(node->refs <= 1);
750                 splice_shared_node(node, dest);
751         } else {
752                 BUG_ON(node->refs < 2);
753                 node->refs--;
754         }
755         return 0;
756 }
757
758 static int is_child_root(struct btrfs_root *root, u64 parent_root_id,
759                          u64 child_root_id)
760 {
761         struct btrfs_path path;
762         struct btrfs_key key;
763         struct extent_buffer *leaf;
764         int has_parent = 0;
765         int ret;
766
767         btrfs_init_path(&path);
768
769         key.objectid = parent_root_id;
770         key.type = BTRFS_ROOT_REF_KEY;
771         key.offset = child_root_id;
772         ret = btrfs_search_slot(NULL, root->fs_info->tree_root, &key, &path,
773                                 0, 0);
774         BUG_ON(ret < 0);
775         btrfs_release_path(root, &path);
776         if (!ret)
777                 return 1;
778
779         key.objectid = child_root_id;
780         key.type = BTRFS_ROOT_BACKREF_KEY;
781         key.offset = 0;
782         ret = btrfs_search_slot(NULL, root->fs_info->tree_root, &key, &path,
783                                 0, 0);
784         BUG_ON(ret <= 0);
785
786         while (1) {
787                 leaf = path.nodes[0];
788                 if (path.slots[0] >= btrfs_header_nritems(leaf)) {
789                         ret = btrfs_next_leaf(root->fs_info->tree_root, &path);
790                         BUG_ON(ret < 0);
791
792                         if (ret > 0)
793                                 break;
794                         leaf = path.nodes[0];
795                 }
796
797                 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
798                 if (key.objectid != child_root_id ||
799                     key.type != BTRFS_ROOT_BACKREF_KEY)
800                         break;
801
802                 has_parent = 1;
803
804                 if (key.offset == parent_root_id) {
805                         btrfs_release_path(root, &path);
806                         return 1;
807                 }
808
809                 path.slots[0]++;
810         }
811
812         btrfs_release_path(root, &path);
813         return has_parent? 0 : -1;
814 }
815
816 static int process_dir_item(struct btrfs_root *root,
817                             struct extent_buffer *eb,
818                             int slot, struct btrfs_key *key,
819                             struct shared_node *active_node)
820 {
821         u32 total;
822         u32 cur = 0;
823         u32 len;
824         u32 name_len;
825         u32 data_len;
826         int error;
827         int nritems = 0;
828         int filetype;
829         struct btrfs_dir_item *di;
830         struct inode_record *rec;
831         struct cache_tree *root_cache;
832         struct cache_tree *inode_cache;
833         struct btrfs_key location;
834         char namebuf[BTRFS_NAME_LEN];
835
836         root_cache = &active_node->root_cache;
837         inode_cache = &active_node->inode_cache;
838         rec = active_node->current;
839         rec->found_dir_item = 1;
840
841         di = btrfs_item_ptr(eb, slot, struct btrfs_dir_item);
842         total = btrfs_item_size_nr(eb, slot);
843         while (cur < total) {
844                 nritems++;
845                 btrfs_dir_item_key_to_cpu(eb, di, &location);
846                 name_len = btrfs_dir_name_len(eb, di);
847                 data_len = btrfs_dir_data_len(eb, di);
848                 filetype = btrfs_dir_type(eb, di);
849
850                 rec->found_size += name_len;
851                 if (name_len <= BTRFS_NAME_LEN) {
852                         len = name_len;
853                         error = 0;
854                 } else {
855                         len = BTRFS_NAME_LEN;
856                         error = REF_ERR_NAME_TOO_LONG;
857                 }
858                 read_extent_buffer(eb, namebuf, (unsigned long)(di + 1), len);
859
860                 if (location.type == BTRFS_INODE_ITEM_KEY) {
861                         add_inode_backref(inode_cache, location.objectid,
862                                           key->objectid, key->offset, namebuf,
863                                           len, filetype, key->type, error);
864                 } else if (location.type == BTRFS_ROOT_ITEM_KEY) {
865                         add_inode_backref(root_cache, location.objectid,
866                                           key->objectid, key->offset,
867                                           namebuf, len, filetype,
868                                           key->type, error);
869                 } else {
870                         fprintf(stderr, "warning line %d\n", __LINE__);
871                 }
872
873                 len = sizeof(*di) + name_len + data_len;
874                 di = (struct btrfs_dir_item *)((char *)di + len);
875                 cur += len;
876         }
877         if (key->type == BTRFS_DIR_INDEX_KEY && nritems > 1)
878                 rec->errors |= I_ERR_DUP_DIR_INDEX;
879
880         return 0;
881 }
882
883 static int process_inode_ref(struct extent_buffer *eb,
884                              int slot, struct btrfs_key *key,
885                              struct shared_node *active_node)
886 {
887         u32 total;
888         u32 cur = 0;
889         u32 len;
890         u32 name_len;
891         u64 index;
892         int error;
893         struct cache_tree *inode_cache;
894         struct btrfs_inode_ref *ref;
895         char namebuf[BTRFS_NAME_LEN];
896
897         inode_cache = &active_node->inode_cache;
898
899         ref = btrfs_item_ptr(eb, slot, struct btrfs_inode_ref);
900         total = btrfs_item_size_nr(eb, slot);
901         while (cur < total) {
902                 name_len = btrfs_inode_ref_name_len(eb, ref);
903                 index = btrfs_inode_ref_index(eb, ref);
904                 if (name_len <= BTRFS_NAME_LEN) {
905                         len = name_len;
906                         error = 0;
907                 } else {
908                         len = BTRFS_NAME_LEN;
909                         error = REF_ERR_NAME_TOO_LONG;
910                 }
911                 read_extent_buffer(eb, namebuf, (unsigned long)(ref + 1), len);
912                 add_inode_backref(inode_cache, key->objectid, key->offset,
913                                   index, namebuf, len, 0, key->type, error);
914
915                 len = sizeof(*ref) + name_len;
916                 ref = (struct btrfs_inode_ref *)((char *)ref + len);
917                 cur += len;
918         }
919         return 0;
920 }
921
922 static int process_inode_extref(struct extent_buffer *eb,
923                                 int slot, struct btrfs_key *key,
924                                 struct shared_node *active_node)
925 {
926         u32 total;
927         u32 cur = 0;
928         u32 len;
929         u32 name_len;
930         u64 index;
931         u64 parent;
932         int error;
933         struct cache_tree *inode_cache;
934         struct btrfs_inode_extref *extref;
935         char namebuf[BTRFS_NAME_LEN];
936
937         inode_cache = &active_node->inode_cache;
938
939         extref = btrfs_item_ptr(eb, slot, struct btrfs_inode_extref);
940         total = btrfs_item_size_nr(eb, slot);
941         while (cur < total) {
942                 name_len = btrfs_inode_extref_name_len(eb, extref);
943                 index = btrfs_inode_extref_index(eb, extref);
944                 parent = btrfs_inode_extref_parent(eb, extref);
945                 if (name_len <= BTRFS_NAME_LEN) {
946                         len = name_len;
947                         error = 0;
948                 } else {
949                         len = BTRFS_NAME_LEN;
950                         error = REF_ERR_NAME_TOO_LONG;
951                 }
952                 read_extent_buffer(eb, namebuf,
953                                    (unsigned long)(extref + 1), len);
954                 add_inode_backref(inode_cache, key->objectid, parent,
955                                   index, namebuf, len, 0, key->type, error);
956
957                 len = sizeof(*extref) + name_len;
958                 extref = (struct btrfs_inode_extref *)((char *)extref + len);
959                 cur += len;
960         }
961         return 0;
962
963 }
964
965 static u64 count_csum_range(struct btrfs_root *root, u64 start, u64 len)
966 {
967         struct btrfs_key key;
968         struct btrfs_path path;
969         struct extent_buffer *leaf;
970         int ret ;
971         size_t size;
972         u64 found = 0;
973         u64 csum_end;
974         u16 csum_size = btrfs_super_csum_size(&root->fs_info->super_copy);
975
976         btrfs_init_path(&path);
977
978         key.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
979         key.offset = start;
980         key.type = BTRFS_EXTENT_CSUM_KEY;
981
982         ret = btrfs_search_slot(NULL, root->fs_info->csum_root,
983                                 &key, &path, 0, 0);
984         BUG_ON(ret < 0);
985         if (ret > 0 && path.slots[0] > 0) {
986                 leaf = path.nodes[0];
987                 btrfs_item_key_to_cpu(leaf, &key, path.slots[0] - 1);
988                 if (key.objectid == BTRFS_EXTENT_CSUM_OBJECTID &&
989                     key.type == BTRFS_EXTENT_CSUM_KEY)
990                         path.slots[0]--;
991         }
992
993         while (len > 0) {
994                 leaf = path.nodes[0];
995                 if (path.slots[0] >= btrfs_header_nritems(leaf)) {
996                         ret = btrfs_next_leaf(root->fs_info->csum_root, &path);
997                         BUG_ON(ret < 0);
998                         if (ret > 0)
999                                 break;
1000                         leaf = path.nodes[0];
1001                 }
1002
1003                 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
1004                 if (key.objectid != BTRFS_EXTENT_CSUM_OBJECTID ||
1005                     key.type != BTRFS_EXTENT_CSUM_KEY)
1006                         break;
1007
1008                 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
1009                 if (key.offset >= start + len)
1010                         break;
1011
1012                 if (key.offset > start)
1013                         start = key.offset;
1014
1015                 size = btrfs_item_size_nr(leaf, path.slots[0]);
1016                 csum_end = key.offset + (size / csum_size) * root->sectorsize;
1017                 if (csum_end > start) {
1018                         size = min(csum_end - start, len);
1019                         len -= size;
1020                         start += size;
1021                         found += size;
1022                 }
1023
1024                 path.slots[0]++;
1025         }
1026         btrfs_release_path(root->fs_info->csum_root, &path);
1027         return found;
1028 }
1029
1030 static int process_file_extent(struct btrfs_root *root,
1031                                 struct extent_buffer *eb,
1032                                 int slot, struct btrfs_key *key,
1033                                 struct shared_node *active_node)
1034 {
1035         struct inode_record *rec;
1036         struct btrfs_file_extent_item *fi;
1037         u64 num_bytes = 0;
1038         u64 disk_bytenr = 0;
1039         u64 extent_offset = 0;
1040         u64 mask = root->sectorsize - 1;
1041         int extent_type;
1042
1043         rec = active_node->current;
1044         BUG_ON(rec->ino != key->objectid || rec->refs > 1);
1045         rec->found_file_extent = 1;
1046
1047         if (rec->extent_start == (u64)-1) {
1048                 rec->extent_start = key->offset;
1049                 rec->extent_end = key->offset;
1050         }
1051
1052         if (rec->extent_end > key->offset)
1053                 rec->errors |= I_ERR_FILE_EXTENT_OVERLAP;
1054         else if (rec->extent_end < key->offset &&
1055                  rec->extent_end < rec->first_extent_gap)
1056                 rec->first_extent_gap = rec->extent_end;
1057
1058         fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
1059         extent_type = btrfs_file_extent_type(eb, fi);
1060
1061         if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
1062                 num_bytes = btrfs_file_extent_inline_len(eb, fi);
1063                 if (num_bytes == 0)
1064                         rec->errors |= I_ERR_BAD_FILE_EXTENT;
1065                 rec->found_size += num_bytes;
1066                 num_bytes = (num_bytes + mask) & ~mask;
1067         } else if (extent_type == BTRFS_FILE_EXTENT_REG ||
1068                    extent_type == BTRFS_FILE_EXTENT_PREALLOC) {
1069                 num_bytes = btrfs_file_extent_num_bytes(eb, fi);
1070                 disk_bytenr = btrfs_file_extent_disk_bytenr(eb, fi);
1071                 extent_offset = btrfs_file_extent_offset(eb, fi);
1072                 if (num_bytes == 0 || (num_bytes & mask))
1073                         rec->errors |= I_ERR_BAD_FILE_EXTENT;
1074                 if (num_bytes + extent_offset >
1075                     btrfs_file_extent_ram_bytes(eb, fi))
1076                         rec->errors |= I_ERR_BAD_FILE_EXTENT;
1077                 if (extent_type == BTRFS_FILE_EXTENT_PREALLOC &&
1078                     (btrfs_file_extent_compression(eb, fi) ||
1079                      btrfs_file_extent_encryption(eb, fi) ||
1080                      btrfs_file_extent_other_encoding(eb, fi)))
1081                         rec->errors |= I_ERR_BAD_FILE_EXTENT;
1082                 if (disk_bytenr > 0)
1083                         rec->found_size += num_bytes;
1084         } else {
1085                 rec->errors |= I_ERR_BAD_FILE_EXTENT;
1086         }
1087         rec->extent_end = key->offset + num_bytes;
1088
1089         if (disk_bytenr > 0) {
1090                 u64 found;
1091                 if (btrfs_file_extent_compression(eb, fi))
1092                         num_bytes = btrfs_file_extent_disk_num_bytes(eb, fi);
1093                 else
1094                         disk_bytenr += extent_offset;
1095
1096                 found = count_csum_range(root, disk_bytenr, num_bytes);
1097                 if (extent_type == BTRFS_FILE_EXTENT_REG) {
1098                         if (found > 0)
1099                                 rec->found_csum_item = 1;
1100                         if (found < num_bytes)
1101                                 rec->some_csum_missing = 1;
1102                 } else if (extent_type == BTRFS_FILE_EXTENT_PREALLOC) {
1103                         if (found > 0)
1104                                 rec->errors |= I_ERR_ODD_CSUM_ITEM;
1105                 }
1106         }
1107         return 0;
1108 }
1109
1110 static int process_one_leaf(struct btrfs_root *root, struct extent_buffer *eb,
1111                             struct walk_control *wc)
1112 {
1113         struct btrfs_key key;
1114         u32 nritems;
1115         int i;
1116         int ret = 0;
1117         struct cache_tree *inode_cache;
1118         struct shared_node *active_node;
1119
1120         if (wc->root_level == wc->active_node &&
1121             btrfs_root_refs(&root->root_item) == 0)
1122                 return 0;
1123
1124         active_node = wc->nodes[wc->active_node];
1125         inode_cache = &active_node->inode_cache;
1126         nritems = btrfs_header_nritems(eb);
1127         for (i = 0; i < nritems; i++) {
1128                 btrfs_item_key_to_cpu(eb, &key, i);
1129
1130                 if (key.objectid == BTRFS_FREE_SPACE_OBJECTID)
1131                         continue;
1132
1133                 if (active_node->current == NULL ||
1134                     active_node->current->ino < key.objectid) {
1135                         if (active_node->current) {
1136                                 active_node->current->checked = 1;
1137                                 maybe_free_inode_rec(inode_cache,
1138                                                      active_node->current);
1139                         }
1140                         active_node->current = get_inode_rec(inode_cache,
1141                                                              key.objectid, 1);
1142                 }
1143                 switch (key.type) {
1144                 case BTRFS_DIR_ITEM_KEY:
1145                 case BTRFS_DIR_INDEX_KEY:
1146                         ret = process_dir_item(root, eb, i, &key, active_node);
1147                         break;
1148                 case BTRFS_INODE_REF_KEY:
1149                         ret = process_inode_ref(eb, i, &key, active_node);
1150                         break;
1151                 case BTRFS_INODE_EXTREF_KEY:
1152                         ret = process_inode_extref(eb, i, &key, active_node);
1153                         break;
1154                 case BTRFS_INODE_ITEM_KEY:
1155                         ret = process_inode_item(eb, i, &key, active_node);
1156                         break;
1157                 case BTRFS_EXTENT_DATA_KEY:
1158                         ret = process_file_extent(root, eb, i, &key,
1159                                                   active_node);
1160                         break;
1161                 default:
1162                         break;
1163                 };
1164         }
1165         return ret;
1166 }
1167
1168 static void reada_walk_down(struct btrfs_root *root,
1169                             struct extent_buffer *node, int slot)
1170 {
1171         u64 bytenr;
1172         u64 ptr_gen;
1173         u32 nritems;
1174         u32 blocksize;
1175         int i;
1176         int ret;
1177         int level;
1178
1179         level = btrfs_header_level(node);
1180         if (level != 1)
1181                 return;
1182
1183         nritems = btrfs_header_nritems(node);
1184         blocksize = btrfs_level_size(root, level - 1);
1185         for (i = slot; i < nritems; i++) {
1186                 bytenr = btrfs_node_blockptr(node, i);
1187                 ptr_gen = btrfs_node_ptr_generation(node, i);
1188                 ret = readahead_tree_block(root, bytenr, blocksize, ptr_gen);
1189                 if (ret)
1190                         break;
1191         }
1192 }
1193
1194 static int walk_down_tree(struct btrfs_root *root, struct btrfs_path *path,
1195                           struct walk_control *wc, int *level)
1196 {
1197         u64 bytenr;
1198         u64 ptr_gen;
1199         struct extent_buffer *next;
1200         struct extent_buffer *cur;
1201         u32 blocksize;
1202         int ret;
1203         u64 refs;
1204
1205         WARN_ON(*level < 0);
1206         WARN_ON(*level >= BTRFS_MAX_LEVEL);
1207         ret = btrfs_lookup_extent_info(NULL, root,
1208                                        path->nodes[*level]->start,
1209                                        path->nodes[*level]->len, &refs, NULL);
1210         if (ret < 0)
1211                 goto out;
1212
1213         if (refs > 1) {
1214                 ret = enter_shared_node(root, path->nodes[*level]->start,
1215                                         refs, wc, *level);
1216                 if (ret > 0)
1217                         goto out;
1218         }
1219
1220         while (*level >= 0) {
1221                 WARN_ON(*level < 0);
1222                 WARN_ON(*level >= BTRFS_MAX_LEVEL);
1223                 cur = path->nodes[*level];
1224
1225                 if (btrfs_header_level(cur) != *level)
1226                         WARN_ON(1);
1227
1228                 if (path->slots[*level] >= btrfs_header_nritems(cur))
1229                         break;
1230                 if (*level == 0) {
1231                         ret = process_one_leaf(root, cur, wc);
1232                         break;
1233                 }
1234                 bytenr = btrfs_node_blockptr(cur, path->slots[*level]);
1235                 ptr_gen = btrfs_node_ptr_generation(cur, path->slots[*level]);
1236                 blocksize = btrfs_level_size(root, *level - 1);
1237                 ret = btrfs_lookup_extent_info(NULL, root, bytenr, blocksize,
1238                                                &refs, NULL);
1239                 if (ret < 0)
1240                         refs = 0;
1241
1242                 if (refs > 1) {
1243                         ret = enter_shared_node(root, bytenr, refs,
1244                                                 wc, *level - 1);
1245                         if (ret > 0) {
1246                                 path->slots[*level]++;
1247                                 continue;
1248                         }
1249                 }
1250
1251                 next = btrfs_find_tree_block(root, bytenr, blocksize);
1252                 if (!next || !btrfs_buffer_uptodate(next, ptr_gen)) {
1253                         free_extent_buffer(next);
1254                         reada_walk_down(root, cur, path->slots[*level]);
1255                         next = read_tree_block(root, bytenr, blocksize,
1256                                                ptr_gen);
1257                 }
1258
1259                 *level = *level - 1;
1260                 free_extent_buffer(path->nodes[*level]);
1261                 path->nodes[*level] = next;
1262                 path->slots[*level] = 0;
1263         }
1264 out:
1265         path->slots[*level] = btrfs_header_nritems(path->nodes[*level]);
1266         return 0;
1267 }
1268
1269 static int walk_up_tree(struct btrfs_root *root, struct btrfs_path *path,
1270                         struct walk_control *wc, int *level)
1271 {
1272         int i;
1273         struct extent_buffer *leaf;
1274
1275         for (i = *level; i < BTRFS_MAX_LEVEL - 1 && path->nodes[i]; i++) {
1276                 leaf = path->nodes[i];
1277                 if (path->slots[i] + 1 < btrfs_header_nritems(leaf)) {
1278                         path->slots[i]++;
1279                         *level = i;
1280                         return 0;
1281                 } else {
1282                         free_extent_buffer(path->nodes[*level]);
1283                         path->nodes[*level] = NULL;
1284                         BUG_ON(*level > wc->active_node);
1285                         if (*level == wc->active_node)
1286                                 leave_shared_node(root, wc, *level);
1287                         *level = i + 1;
1288                 }
1289         }
1290         return 1;
1291 }
1292
1293 static int check_root_dir(struct inode_record *rec)
1294 {
1295         struct inode_backref *backref;
1296         int ret = -1;
1297
1298         if (!rec->found_inode_item || rec->errors)
1299                 goto out;
1300         if (rec->nlink != 1 || rec->found_link != 0)
1301                 goto out;
1302         if (list_empty(&rec->backrefs))
1303                 goto out;
1304         backref = list_entry(rec->backrefs.next, struct inode_backref, list);
1305         if (!backref->found_inode_ref)
1306                 goto out;
1307         if (backref->index != 0 || backref->namelen != 2 ||
1308             memcmp(backref->name, "..", 2))
1309                 goto out;
1310         if (backref->found_dir_index || backref->found_dir_item)
1311                 goto out;
1312         ret = 0;
1313 out:
1314         return ret;
1315 }
1316
1317 static int check_inode_recs(struct btrfs_root *root,
1318                             struct cache_tree *inode_cache)
1319 {
1320         struct cache_extent *cache;
1321         struct ptr_node *node;
1322         struct inode_record *rec;
1323         struct inode_backref *backref;
1324         int ret;
1325         u64 error = 0;
1326         u64 root_dirid = btrfs_root_dirid(&root->root_item);
1327
1328         if (btrfs_root_refs(&root->root_item) == 0) {
1329                 if (!cache_tree_empty(inode_cache))
1330                         fprintf(stderr, "warning line %d\n", __LINE__);
1331                 return 0;
1332         }
1333
1334         rec = get_inode_rec(inode_cache, root_dirid, 0);
1335         if (rec) {
1336                 ret = check_root_dir(rec);
1337                 if (ret) {
1338                         fprintf(stderr, "root %llu root dir %llu error\n",
1339                                 (unsigned long long)root->root_key.objectid,
1340                                 (unsigned long long)root_dirid);
1341                         error++;
1342                 }
1343         } else {
1344                 fprintf(stderr, "root %llu root dir %llu not found\n",
1345                         (unsigned long long)root->root_key.objectid,
1346                         (unsigned long long)root_dirid);
1347         }
1348
1349         while (1) {
1350                 cache = find_first_cache_extent(inode_cache, 0);
1351                 if (!cache)
1352                         break;
1353                 node = container_of(cache, struct ptr_node, cache);
1354                 rec = node->data;
1355                 remove_cache_extent(inode_cache, &node->cache);
1356                 free(node);
1357                 if (rec->ino == root_dirid ||
1358                     rec->ino == BTRFS_ORPHAN_OBJECTID) {
1359                         free_inode_rec(rec);
1360                         continue;
1361                 }
1362
1363                 if (rec->errors & I_ERR_NO_ORPHAN_ITEM) {
1364                         ret = check_orphan_item(root, rec->ino);
1365                         if (ret == 0)
1366                                 rec->errors &= ~I_ERR_NO_ORPHAN_ITEM;
1367                         if (can_free_inode_rec(rec)) {
1368                                 free_inode_rec(rec);
1369                                 continue;
1370                         }
1371                 }
1372
1373                 error++;
1374                 if (!rec->found_inode_item)
1375                         rec->errors |= I_ERR_NO_INODE_ITEM;
1376                 if (rec->found_link != rec->nlink)
1377                         rec->errors |= I_ERR_LINK_COUNT_WRONG;
1378                 fprintf(stderr, "root %llu inode %llu errors %x\n",
1379                         (unsigned long long) root->root_key.objectid,
1380                         (unsigned long long) rec->ino, rec->errors);
1381                 list_for_each_entry(backref, &rec->backrefs, list) {
1382                         if (!backref->found_dir_item)
1383                                 backref->errors |= REF_ERR_NO_DIR_ITEM;
1384                         if (!backref->found_dir_index)
1385                                 backref->errors |= REF_ERR_NO_DIR_INDEX;
1386                         if (!backref->found_inode_ref)
1387                                 backref->errors |= REF_ERR_NO_INODE_REF;
1388                         fprintf(stderr, "\tunresolved ref dir %llu index %llu"
1389                                 " namelen %u name %s filetype %d error %x\n",
1390                                 (unsigned long long)backref->dir,
1391                                 (unsigned long long)backref->index,
1392                                 backref->namelen, backref->name,
1393                                 backref->filetype, backref->errors);
1394                 }
1395                 free_inode_rec(rec);
1396         }
1397         return (error > 0) ? -1 : 0;
1398 }
1399
1400 static struct root_record *get_root_rec(struct cache_tree *root_cache,
1401                                         u64 objectid)
1402 {
1403         struct cache_extent *cache;
1404         struct root_record *rec = NULL;
1405         int ret;
1406
1407         cache = find_cache_extent(root_cache, objectid, 1);
1408         if (cache) {
1409                 rec = container_of(cache, struct root_record, cache);
1410         } else {
1411                 rec = calloc(1, sizeof(*rec));
1412                 rec->objectid = objectid;
1413                 INIT_LIST_HEAD(&rec->backrefs);
1414                 rec->cache.start = objectid;
1415                 rec->cache.size = 1;
1416
1417                 ret = insert_existing_cache_extent(root_cache, &rec->cache);
1418                 BUG_ON(ret);
1419         }
1420         return rec;
1421 }
1422
1423 static struct root_backref *get_root_backref(struct root_record *rec,
1424                                              u64 ref_root, u64 dir, u64 index,
1425                                              const char *name, int namelen)
1426 {
1427         struct root_backref *backref;
1428
1429         list_for_each_entry(backref, &rec->backrefs, list) {
1430                 if (backref->ref_root != ref_root || backref->dir != dir ||
1431                     backref->namelen != namelen)
1432                         continue;
1433                 if (memcmp(name, backref->name, namelen))
1434                         continue;
1435                 return backref;
1436         }
1437
1438         backref = malloc(sizeof(*backref) + namelen + 1);
1439         memset(backref, 0, sizeof(*backref));
1440         backref->ref_root = ref_root;
1441         backref->dir = dir;
1442         backref->index = index;
1443         backref->namelen = namelen;
1444         memcpy(backref->name, name, namelen);
1445         backref->name[namelen] = '\0';
1446         list_add_tail(&backref->list, &rec->backrefs);
1447         return backref;
1448 }
1449
1450 static void free_root_recs(struct cache_tree *root_cache)
1451 {
1452         struct cache_extent *cache;
1453         struct root_record *rec;
1454         struct root_backref *backref;
1455
1456         while (1) {
1457                 cache = find_first_cache_extent(root_cache, 0);
1458                 if (!cache)
1459                         break;
1460                 rec = container_of(cache, struct root_record, cache);
1461                 remove_cache_extent(root_cache, &rec->cache);
1462
1463                 while (!list_empty(&rec->backrefs)) {
1464                         backref = list_entry(rec->backrefs.next,
1465                                              struct root_backref, list);
1466                         list_del(&backref->list);
1467                         free(backref);
1468                 }
1469                 kfree(rec);
1470         }
1471 }
1472
1473 static int add_root_backref(struct cache_tree *root_cache,
1474                             u64 root_id, u64 ref_root, u64 dir, u64 index,
1475                             const char *name, int namelen,
1476                             int item_type, int errors)
1477 {
1478         struct root_record *rec;
1479         struct root_backref *backref;
1480
1481         rec = get_root_rec(root_cache, root_id);
1482         backref = get_root_backref(rec, ref_root, dir, index, name, namelen);
1483
1484         backref->errors |= errors;
1485
1486         if (item_type != BTRFS_DIR_ITEM_KEY) {
1487                 if (backref->found_dir_index || backref->found_back_ref ||
1488                     backref->found_forward_ref) {
1489                         if (backref->index != index)
1490                                 backref->errors |= REF_ERR_INDEX_UNMATCH;
1491                 } else {
1492                         backref->index = index;
1493                 }
1494         }
1495
1496         if (item_type == BTRFS_DIR_ITEM_KEY) {
1497                 backref->found_dir_item = 1;
1498                 backref->reachable = 1;
1499                 rec->found_ref++;
1500         } else if (item_type == BTRFS_DIR_INDEX_KEY) {
1501                 backref->found_dir_index = 1;
1502         } else if (item_type == BTRFS_ROOT_REF_KEY) {
1503                 if (backref->found_forward_ref)
1504                         backref->errors |= REF_ERR_DUP_ROOT_REF;
1505                 backref->found_forward_ref = 1;
1506         } else if (item_type == BTRFS_ROOT_BACKREF_KEY) {
1507                 if (backref->found_back_ref)
1508                         backref->errors |= REF_ERR_DUP_ROOT_BACKREF;
1509                 backref->found_back_ref = 1;
1510         } else {
1511                 BUG_ON(1);
1512         }
1513
1514         return 0;
1515 }
1516
1517 static int merge_root_recs(struct btrfs_root *root,
1518                            struct cache_tree *src_cache,
1519                            struct cache_tree *dst_cache)
1520 {
1521         struct cache_extent *cache;
1522         struct ptr_node *node;
1523         struct inode_record *rec;
1524         struct inode_backref *backref;
1525
1526         if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) {
1527                 free_inode_recs(src_cache);
1528                 return 0;
1529         }
1530
1531         while (1) {
1532                 cache = find_first_cache_extent(src_cache, 0);
1533                 if (!cache)
1534                         break;
1535                 node = container_of(cache, struct ptr_node, cache);
1536                 rec = node->data;
1537                 remove_cache_extent(src_cache, &node->cache);
1538                 free(node);
1539
1540                 if (!is_child_root(root, root->objectid, rec->ino))
1541                         goto skip;
1542
1543                 list_for_each_entry(backref, &rec->backrefs, list) {
1544                         BUG_ON(backref->found_inode_ref);
1545                         if (backref->found_dir_item)
1546                                 add_root_backref(dst_cache, rec->ino,
1547                                         root->root_key.objectid, backref->dir,
1548                                         backref->index, backref->name,
1549                                         backref->namelen, BTRFS_DIR_ITEM_KEY,
1550                                         backref->errors);
1551                         if (backref->found_dir_index)
1552                                 add_root_backref(dst_cache, rec->ino,
1553                                         root->root_key.objectid, backref->dir,
1554                                         backref->index, backref->name,
1555                                         backref->namelen, BTRFS_DIR_INDEX_KEY,
1556                                         backref->errors);
1557                 }
1558 skip:
1559                 free_inode_rec(rec);
1560         }
1561         return 0;
1562 }
1563
1564 static int check_root_refs(struct btrfs_root *root,
1565                            struct cache_tree *root_cache)
1566 {
1567         struct root_record *rec;
1568         struct root_record *ref_root;
1569         struct root_backref *backref;
1570         struct cache_extent *cache;
1571         int loop = 1;
1572         int ret;
1573         int error;
1574         int errors = 0;
1575
1576         rec = get_root_rec(root_cache, BTRFS_FS_TREE_OBJECTID);
1577         rec->found_ref = 1;
1578
1579         /* fixme: this can not detect circular references */
1580         while (loop) {
1581                 loop = 0;
1582                 cache = find_first_cache_extent(root_cache, 0);
1583                 while (1) {
1584                         if (!cache)
1585                                 break;
1586                         rec = container_of(cache, struct root_record, cache);
1587                         cache = next_cache_extent(cache);
1588
1589                         if (rec->found_ref == 0)
1590                                 continue;
1591
1592                         list_for_each_entry(backref, &rec->backrefs, list) {
1593                                 if (!backref->reachable)
1594                                         continue;
1595
1596                                 ref_root = get_root_rec(root_cache,
1597                                                         backref->ref_root);
1598                                 if (ref_root->found_ref > 0)
1599                                         continue;
1600
1601                                 backref->reachable = 0;
1602                                 rec->found_ref--;
1603                                 if (rec->found_ref == 0)
1604                                         loop = 1;
1605                         }
1606                 }
1607         }
1608
1609         cache = find_first_cache_extent(root_cache, 0);
1610         while (1) {
1611                 if (!cache)
1612                         break;
1613                 rec = container_of(cache, struct root_record, cache);
1614                 cache = next_cache_extent(cache);
1615
1616                 if (rec->found_ref == 0 &&
1617                     rec->objectid >= BTRFS_FIRST_FREE_OBJECTID &&
1618                     rec->objectid <= BTRFS_LAST_FREE_OBJECTID) {
1619                         ret = check_orphan_item(root->fs_info->tree_root,
1620                                                 rec->objectid);
1621                         if (ret == 0)
1622                                 continue;
1623                         errors++;
1624                         fprintf(stderr, "fs tree %llu not referenced\n",
1625                                 (unsigned long long)rec->objectid);
1626                 }
1627
1628                 error = 0;
1629                 if (rec->found_ref > 0 && !rec->found_root_item)
1630                         error = 1;
1631                 list_for_each_entry(backref, &rec->backrefs, list) {
1632                         if (!backref->found_dir_item)
1633                                 backref->errors |= REF_ERR_NO_DIR_ITEM;
1634                         if (!backref->found_dir_index)
1635                                 backref->errors |= REF_ERR_NO_DIR_INDEX;
1636                         if (!backref->found_back_ref)
1637                                 backref->errors |= REF_ERR_NO_ROOT_BACKREF;
1638                         if (!backref->found_forward_ref)
1639                                 backref->errors |= REF_ERR_NO_ROOT_REF;
1640                         if (backref->reachable && backref->errors)
1641                                 error = 1;
1642                 }
1643                 if (!error)
1644                         continue;
1645
1646                 errors++;
1647                 fprintf(stderr, "fs tree %llu refs %u %s\n",
1648                         (unsigned long long)rec->objectid, rec->found_ref,
1649                          rec->found_root_item ? "" : "not found");
1650
1651                 list_for_each_entry(backref, &rec->backrefs, list) {
1652                         if (!backref->reachable)
1653                                 continue;
1654                         if (!backref->errors && rec->found_root_item)
1655                                 continue;
1656                         fprintf(stderr, "\tunresolved ref root %llu dir %llu"
1657                                 " index %llu namelen %u name %s error %x\n",
1658                                 (unsigned long long)backref->ref_root,
1659                                 (unsigned long long)backref->dir,
1660                                 (unsigned long long)backref->index,
1661                                 backref->namelen, backref->name,
1662                                 backref->errors);
1663                 }
1664         }
1665         return errors > 0 ? 1 : 0;
1666 }
1667
1668 static int process_root_ref(struct extent_buffer *eb, int slot,
1669                             struct btrfs_key *key,
1670                             struct cache_tree *root_cache)
1671 {
1672         u64 dirid;
1673         u64 index;
1674         u32 len;
1675         u32 name_len;
1676         struct btrfs_root_ref *ref;
1677         char namebuf[BTRFS_NAME_LEN];
1678         int error;
1679
1680         ref = btrfs_item_ptr(eb, slot, struct btrfs_root_ref);
1681
1682         dirid = btrfs_root_ref_dirid(eb, ref);
1683         index = btrfs_root_ref_sequence(eb, ref);
1684         name_len = btrfs_root_ref_name_len(eb, ref);
1685
1686         if (name_len <= BTRFS_NAME_LEN) {
1687                 len = name_len;
1688                 error = 0;
1689         } else {
1690                 len = BTRFS_NAME_LEN;
1691                 error = REF_ERR_NAME_TOO_LONG;
1692         }
1693         read_extent_buffer(eb, namebuf, (unsigned long)(ref + 1), len);
1694
1695         if (key->type == BTRFS_ROOT_REF_KEY) {
1696                 add_root_backref(root_cache, key->offset, key->objectid, dirid,
1697                                  index, namebuf, len, key->type, error);
1698         } else {
1699                 add_root_backref(root_cache, key->objectid, key->offset, dirid,
1700                                  index, namebuf, len, key->type, error);
1701         }
1702         return 0;
1703 }
1704
1705 static int check_fs_root(struct btrfs_root *root,
1706                          struct cache_tree *root_cache,
1707                          struct walk_control *wc)
1708 {
1709         int ret = 0;
1710         int wret;
1711         int level;
1712         struct btrfs_path path;
1713         struct shared_node root_node;
1714         struct root_record *rec;
1715         struct btrfs_root_item *root_item = &root->root_item;
1716
1717         if (root->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID) {
1718                 rec = get_root_rec(root_cache, root->root_key.objectid);
1719                 if (btrfs_root_refs(root_item) > 0)
1720                         rec->found_root_item = 1;
1721         }
1722
1723         btrfs_init_path(&path);
1724         memset(&root_node, 0, sizeof(root_node));
1725         cache_tree_init(&root_node.root_cache);
1726         cache_tree_init(&root_node.inode_cache);
1727
1728         level = btrfs_header_level(root->node);
1729         memset(wc->nodes, 0, sizeof(wc->nodes));
1730         wc->nodes[level] = &root_node;
1731         wc->active_node = level;
1732         wc->root_level = level;
1733
1734         if (btrfs_root_refs(root_item) > 0 ||
1735             btrfs_disk_key_objectid(&root_item->drop_progress) == 0) {
1736                 path.nodes[level] = root->node;
1737                 extent_buffer_get(root->node);
1738                 path.slots[level] = 0;
1739         } else {
1740                 struct btrfs_key key;
1741                 struct btrfs_disk_key found_key;
1742
1743                 btrfs_disk_key_to_cpu(&key, &root_item->drop_progress);
1744                 level = root_item->drop_level;
1745                 path.lowest_level = level;
1746                 wret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
1747                 BUG_ON(wret < 0);
1748                 btrfs_node_key(path.nodes[level], &found_key,
1749                                 path.slots[level]);
1750                 WARN_ON(memcmp(&found_key, &root_item->drop_progress,
1751                                         sizeof(found_key)));
1752         }
1753
1754         while (1) {
1755                 wret = walk_down_tree(root, &path, wc, &level);
1756                 if (wret < 0)
1757                         ret = wret;
1758                 if (wret != 0)
1759                         break;
1760
1761                 wret = walk_up_tree(root, &path, wc, &level);
1762                 if (wret < 0)
1763                         ret = wret;
1764                 if (wret != 0)
1765                         break;
1766         }
1767         btrfs_release_path(root, &path);
1768
1769         merge_root_recs(root, &root_node.root_cache, root_cache);
1770
1771         if (root_node.current) {
1772                 root_node.current->checked = 1;
1773                 maybe_free_inode_rec(&root_node.inode_cache,
1774                                 root_node.current);
1775         }
1776
1777         ret = check_inode_recs(root, &root_node.inode_cache);
1778         return ret;
1779 }
1780
1781 static int fs_root_objectid(u64 objectid)
1782 {
1783         if (objectid == BTRFS_FS_TREE_OBJECTID ||
1784             objectid == BTRFS_TREE_RELOC_OBJECTID ||
1785             objectid == BTRFS_DATA_RELOC_TREE_OBJECTID ||
1786             (objectid >= BTRFS_FIRST_FREE_OBJECTID &&
1787              objectid <= BTRFS_LAST_FREE_OBJECTID))
1788                 return 1;
1789         return 0;
1790 }
1791
1792 static int check_fs_roots(struct btrfs_root *root,
1793                           struct cache_tree *root_cache)
1794 {
1795         struct btrfs_path path;
1796         struct btrfs_key key;
1797         struct walk_control wc;
1798         struct extent_buffer *leaf;
1799         struct btrfs_root *tmp_root;
1800         struct btrfs_root *tree_root = root->fs_info->tree_root;
1801         int ret;
1802         int err = 0;
1803
1804         memset(&wc, 0, sizeof(wc));
1805         cache_tree_init(&wc.shared);
1806         btrfs_init_path(&path);
1807
1808         key.offset = 0;
1809         key.objectid = 0;
1810         key.type = BTRFS_ROOT_ITEM_KEY;
1811         ret = btrfs_search_slot(NULL, tree_root, &key, &path, 0, 0);
1812         BUG_ON(ret < 0);
1813         while (1) {
1814                 leaf = path.nodes[0];
1815                 if (path.slots[0] >= btrfs_header_nritems(leaf)) {
1816                         ret = btrfs_next_leaf(tree_root, &path);
1817                         if (ret != 0)
1818                                 break;
1819                         leaf = path.nodes[0];
1820                 }
1821                 btrfs_item_key_to_cpu(leaf, &key, path.slots[0]);
1822                 if (key.type == BTRFS_ROOT_ITEM_KEY &&
1823                     fs_root_objectid(key.objectid)) {
1824                         tmp_root = btrfs_read_fs_root_no_cache(root->fs_info,
1825                                                                &key);
1826                         ret = check_fs_root(tmp_root, root_cache, &wc);
1827                         if (ret)
1828                                 err = 1;
1829                         btrfs_free_fs_root(root->fs_info, tmp_root);
1830                 } else if (key.type == BTRFS_ROOT_REF_KEY ||
1831                            key.type == BTRFS_ROOT_BACKREF_KEY) {
1832                         process_root_ref(leaf, path.slots[0], &key,
1833                                          root_cache);
1834                 }
1835                 path.slots[0]++;
1836         }
1837         btrfs_release_path(tree_root, &path);
1838
1839         if (!cache_tree_empty(&wc.shared))
1840                 fprintf(stderr, "warning line %d\n", __LINE__);
1841
1842         return err;
1843 }
1844
1845 static int all_backpointers_checked(struct extent_record *rec, int print_errs)
1846 {
1847         struct list_head *cur = rec->backrefs.next;
1848         struct extent_backref *back;
1849         struct tree_backref *tback;
1850         struct data_backref *dback;
1851         u64 found = 0;
1852         int err = 0;
1853
1854         while(cur != &rec->backrefs) {
1855                 back = list_entry(cur, struct extent_backref, list);
1856                 cur = cur->next;
1857                 if (!back->found_extent_tree) {
1858                         err = 1;
1859                         if (!print_errs)
1860                                 goto out;
1861                         if (back->is_data) {
1862                                 dback = (struct data_backref *)back;
1863                                 fprintf(stderr, "Backref %llu %s %llu"
1864                                         " owner %llu offset %llu num_refs %lu"
1865                                         " not found in extent tree\n",
1866                                         (unsigned long long)rec->start,
1867                                         back->full_backref ?
1868                                         "parent" : "root",
1869                                         back->full_backref ?
1870                                         (unsigned long long)dback->parent:
1871                                         (unsigned long long)dback->root,
1872                                         (unsigned long long)dback->owner,
1873                                         (unsigned long long)dback->offset,
1874                                         (unsigned long)dback->num_refs);
1875                         } else {
1876                                 tback = (struct tree_backref *)back;
1877                                 fprintf(stderr, "Backref %llu parent %llu"
1878                                         " root %llu not found in extent tree\n",
1879                                         (unsigned long long)rec->start,
1880                                         (unsigned long long)tback->parent,
1881                                         (unsigned long long)tback->root);
1882                         }
1883                 }
1884                 if (!back->is_data && !back->found_ref) {
1885                         err = 1;
1886                         if (!print_errs)
1887                                 goto out;
1888                         tback = (struct tree_backref *)back;
1889                         fprintf(stderr, "Backref %llu %s %llu not referenced back %p\n",
1890                                 (unsigned long long)rec->start,
1891                                 back->full_backref ? "parent" : "root",
1892                                 back->full_backref ?
1893                                 (unsigned long long)tback->parent :
1894                                 (unsigned long long)tback->root, back);
1895                 }
1896                 if (back->is_data) {
1897                         dback = (struct data_backref *)back;
1898                         if (dback->found_ref != dback->num_refs) {
1899                                 err = 1;
1900                                 if (!print_errs)
1901                                         goto out;
1902                                 fprintf(stderr, "Incorrect local backref count"
1903                                         " on %llu %s %llu owner %llu"
1904                                         " offset %llu found %u wanted %u back %p\n",
1905                                         (unsigned long long)rec->start,
1906                                         back->full_backref ?
1907                                         "parent" : "root",
1908                                         back->full_backref ? 
1909                                         (unsigned long long)dback->parent:
1910                                         (unsigned long long)dback->root,
1911                                         (unsigned long long)dback->owner,
1912                                         (unsigned long long)dback->offset,
1913                                         dback->found_ref, dback->num_refs, back);
1914                         }
1915                 }
1916                 if (!back->is_data) {
1917                         found += 1;
1918                 } else {
1919                         dback = (struct data_backref *)back;
1920                         found += dback->found_ref;
1921                 }
1922         }
1923         if (found != rec->refs) {
1924                 err = 1;
1925                 if (!print_errs)
1926                         goto out;
1927                 fprintf(stderr, "Incorrect global backref count "
1928                         "on %llu found %llu wanted %llu\n",
1929                         (unsigned long long)rec->start,
1930                         (unsigned long long)found,
1931                         (unsigned long long)rec->refs);
1932         }
1933 out:
1934         return err;
1935 }
1936
1937 static int free_all_extent_backrefs(struct extent_record *rec)
1938 {
1939         struct extent_backref *back;
1940         struct list_head *cur;
1941         while (!list_empty(&rec->backrefs)) {
1942                 cur = rec->backrefs.next;
1943                 back = list_entry(cur, struct extent_backref, list);
1944                 list_del(cur);
1945                 free(back);
1946         }
1947         return 0;
1948 }
1949
1950 static int maybe_free_extent_rec(struct cache_tree *extent_cache,
1951                                  struct extent_record *rec)
1952 {
1953         if (rec->content_checked && rec->owner_ref_checked &&
1954             rec->extent_item_refs == rec->refs && rec->refs > 0 &&
1955             !all_backpointers_checked(rec, 0)) {
1956                 remove_cache_extent(extent_cache, &rec->cache);
1957                 free_all_extent_backrefs(rec);
1958                 free(rec);
1959         }
1960         return 0;
1961 }
1962
1963 static int check_owner_ref(struct btrfs_root *root,
1964                             struct extent_record *rec,
1965                             struct extent_buffer *buf)
1966 {
1967         struct extent_backref *node;
1968         struct tree_backref *back;
1969         struct btrfs_root *ref_root;
1970         struct btrfs_key key;
1971         struct btrfs_path path;
1972         int level;
1973         int found = 0;
1974
1975         list_for_each_entry(node, &rec->backrefs, list) {
1976                 if (node->is_data)
1977                         continue;
1978                 if (!node->found_ref)
1979                         continue;
1980                 if (node->full_backref)
1981                         continue;
1982                 back = (struct tree_backref *)node;
1983                 if (btrfs_header_owner(buf) == back->root)
1984                         return 0;
1985         }
1986         BUG_ON(rec->is_root);
1987
1988         /* try to find the block by search corresponding fs tree */
1989         key.objectid = btrfs_header_owner(buf);
1990         key.type = BTRFS_ROOT_ITEM_KEY;
1991         key.offset = (u64)-1;
1992
1993         ref_root = btrfs_read_fs_root(root->fs_info, &key);
1994         BUG_ON(IS_ERR(ref_root));
1995
1996         level = btrfs_header_level(buf);
1997         if (level == 0)
1998                 btrfs_item_key_to_cpu(buf, &key, 0);
1999         else
2000                 btrfs_node_key_to_cpu(buf, &key, 0);
2001
2002         btrfs_init_path(&path);
2003         path.lowest_level = level + 1;
2004         btrfs_search_slot(NULL, ref_root, &key, &path, 0, 0);
2005
2006         if (buf->start == btrfs_node_blockptr(path.nodes[level + 1],
2007                                               path.slots[level + 1]))
2008                 found = 1;
2009
2010         btrfs_release_path(ref_root, &path);
2011         return found ? 0 : 1;
2012 }
2013
2014 static int is_extent_tree_record(struct extent_record *rec)
2015 {
2016         struct list_head *cur = rec->backrefs.next;
2017         struct extent_backref *node;
2018         struct tree_backref *back;
2019         int is_extent = 0;
2020
2021         while(cur != &rec->backrefs) {
2022                 node = list_entry(cur, struct extent_backref, list);
2023                 cur = cur->next;
2024                 if (node->is_data)
2025                         return 0;
2026                 back = (struct tree_backref *)node;
2027                 if (node->full_backref)
2028                         return 0;
2029                 if (back->root == BTRFS_EXTENT_TREE_OBJECTID)
2030                         is_extent = 1;
2031         }
2032         return is_extent;
2033 }
2034
2035
2036 static int record_bad_block_io(struct btrfs_fs_info *info,
2037                                struct cache_tree *extent_cache,
2038                                u64 start, u64 len)
2039 {
2040         struct extent_record *rec;
2041         struct cache_extent *cache;
2042         struct btrfs_key key;
2043
2044         cache = find_cache_extent(extent_cache, start, len);
2045         if (!cache)
2046                 return 0;
2047
2048         rec = container_of(cache, struct extent_record, cache);
2049         if (!is_extent_tree_record(rec))
2050                 return 0;
2051
2052         btrfs_disk_key_to_cpu(&key, &rec->parent_key);
2053         return btrfs_add_corrupt_extent_record(info, &key, start, len, 0);
2054 }
2055
2056 static int check_block(struct btrfs_root *root,
2057                        struct cache_tree *extent_cache,
2058                        struct extent_buffer *buf, u64 flags)
2059 {
2060         struct extent_record *rec;
2061         struct cache_extent *cache;
2062         struct btrfs_key key;
2063         int ret = 1;
2064         int level;
2065
2066         cache = find_cache_extent(extent_cache, buf->start, buf->len);
2067         if (!cache)
2068                 return 1;
2069         rec = container_of(cache, struct extent_record, cache);
2070         rec->generation = btrfs_header_generation(buf);
2071
2072         level = btrfs_header_level(buf);
2073         if (btrfs_header_nritems(buf) > 0) {
2074
2075                 if (level == 0)
2076                         btrfs_item_key_to_cpu(buf, &key, 0);
2077                 else
2078                         btrfs_node_key_to_cpu(buf, &key, 0);
2079
2080                 rec->info_objectid = key.objectid;
2081         }
2082         rec->info_level = level;
2083
2084         if (btrfs_is_leaf(buf))
2085                 ret = btrfs_check_leaf(root, &rec->parent_key, buf);
2086         else
2087                 ret = btrfs_check_node(root, &rec->parent_key, buf);
2088
2089         if (ret) {
2090                 fprintf(stderr, "bad block %llu\n",
2091                         (unsigned long long)buf->start);
2092         } else {
2093                 rec->content_checked = 1;
2094                 if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)
2095                         rec->owner_ref_checked = 1;
2096                 else {
2097                         ret = check_owner_ref(root, rec, buf);
2098                         if (!ret)
2099                                 rec->owner_ref_checked = 1;
2100                 }
2101         }
2102         if (!ret)
2103                 maybe_free_extent_rec(extent_cache, rec);
2104         return ret;
2105 }
2106
2107 static struct tree_backref *find_tree_backref(struct extent_record *rec,
2108                                                 u64 parent, u64 root)
2109 {
2110         struct list_head *cur = rec->backrefs.next;
2111         struct extent_backref *node;
2112         struct tree_backref *back;
2113
2114         while(cur != &rec->backrefs) {
2115                 node = list_entry(cur, struct extent_backref, list);
2116                 cur = cur->next;
2117                 if (node->is_data)
2118                         continue;
2119                 back = (struct tree_backref *)node;
2120                 if (parent > 0) {
2121                         if (!node->full_backref)
2122                                 continue;
2123                         if (parent == back->parent)
2124                                 return back;
2125                 } else {
2126                         if (node->full_backref)
2127                                 continue;
2128                         if (back->root == root)
2129                                 return back;
2130                 }
2131         }
2132         return NULL;
2133 }
2134
2135 static struct tree_backref *alloc_tree_backref(struct extent_record *rec,
2136                                                 u64 parent, u64 root)
2137 {
2138         struct tree_backref *ref = malloc(sizeof(*ref));
2139         memset(&ref->node, 0, sizeof(ref->node));
2140         if (parent > 0) {
2141                 ref->parent = parent;
2142                 ref->node.full_backref = 1;
2143         } else {
2144                 ref->root = root;
2145                 ref->node.full_backref = 0;
2146         }
2147         list_add_tail(&ref->node.list, &rec->backrefs);
2148
2149         return ref;
2150 }
2151
2152 static struct data_backref *find_data_backref(struct extent_record *rec,
2153                                                 u64 parent, u64 root,
2154                                                 u64 owner, u64 offset)
2155 {
2156         struct list_head *cur = rec->backrefs.next;
2157         struct extent_backref *node;
2158         struct data_backref *back;
2159
2160         while(cur != &rec->backrefs) {
2161                 node = list_entry(cur, struct extent_backref, list);
2162                 cur = cur->next;
2163                 if (!node->is_data)
2164                         continue;
2165                 back = (struct data_backref *)node;
2166                 if (parent > 0) {
2167                         if (!node->full_backref)
2168                                 continue;
2169                         if (parent == back->parent)
2170                                 return back;
2171                 } else {
2172                         if (node->full_backref)
2173                                 continue;
2174                         if (back->root == root && back->owner == owner &&
2175                             back->offset == offset)
2176                                 return back;
2177                 }
2178         }
2179         return NULL;
2180 }
2181
2182 static struct data_backref *alloc_data_backref(struct extent_record *rec,
2183                                                 u64 parent, u64 root,
2184                                                 u64 owner, u64 offset,
2185                                                 u64 max_size)
2186 {
2187         struct data_backref *ref = malloc(sizeof(*ref));
2188         memset(&ref->node, 0, sizeof(ref->node));
2189         ref->node.is_data = 1;
2190
2191         if (parent > 0) {
2192                 ref->parent = parent;
2193                 ref->owner = 0;
2194                 ref->offset = 0;
2195                 ref->node.full_backref = 1;
2196         } else {
2197                 ref->root = root;
2198                 ref->owner = owner;
2199                 ref->offset = offset;
2200                 ref->node.full_backref = 0;
2201         }
2202         ref->found_ref = 0;
2203         ref->num_refs = 0;
2204         list_add_tail(&ref->node.list, &rec->backrefs);
2205         if (max_size > rec->max_size)
2206                 rec->max_size = max_size;
2207         return ref;
2208 }
2209
2210 static int add_extent_rec(struct cache_tree *extent_cache,
2211                           struct btrfs_key *parent_key,
2212                           u64 start, u64 nr, u64 extent_item_refs,
2213                           int is_root, int inc_ref, int set_checked,
2214                           u64 max_size)
2215 {
2216         struct extent_record *rec;
2217         struct cache_extent *cache;
2218         int ret = 0;
2219
2220         cache = find_cache_extent(extent_cache, start, nr);
2221         if (cache) {
2222                 rec = container_of(cache, struct extent_record, cache);
2223                 if (inc_ref)
2224                         rec->refs++;
2225                 if (rec->nr == 1)
2226                         rec->nr = max(nr, max_size);
2227
2228                 if (start != rec->start) {
2229                         fprintf(stderr, "warning, start mismatch %llu %llu\n",
2230                                 (unsigned long long)rec->start,
2231                                 (unsigned long long)start);
2232                         ret = 1;
2233                 }
2234                 if (extent_item_refs) {
2235                         if (rec->extent_item_refs) {
2236                                 fprintf(stderr, "block %llu rec "
2237                                         "extent_item_refs %llu, passed %llu\n",
2238                                         (unsigned long long)start,
2239                                         (unsigned long long)
2240                                                         rec->extent_item_refs,
2241                                         (unsigned long long)extent_item_refs);
2242                         }
2243                         rec->extent_item_refs = extent_item_refs;
2244                 }
2245                 if (is_root)
2246                         rec->is_root = 1;
2247                 if (set_checked) {
2248                         rec->content_checked = 1;
2249                         rec->owner_ref_checked = 1;
2250                 }
2251
2252                 if (parent_key)
2253                         btrfs_cpu_key_to_disk(&rec->parent_key, parent_key);
2254
2255                 if (rec->max_size < max_size)
2256                         rec->max_size = max_size;
2257
2258                 maybe_free_extent_rec(extent_cache, rec);
2259                 return ret;
2260         }
2261         rec = malloc(sizeof(*rec));
2262         rec->start = start;
2263         rec->max_size = max_size;
2264         rec->nr = max(nr, max_size);
2265         rec->content_checked = 0;
2266         rec->owner_ref_checked = 0;
2267         INIT_LIST_HEAD(&rec->backrefs);
2268
2269         if (is_root)
2270                 rec->is_root = 1;
2271         else
2272                 rec->is_root = 0;
2273
2274         if (inc_ref)
2275                 rec->refs = 1;
2276         else
2277                 rec->refs = 0;
2278
2279         if (extent_item_refs)
2280                 rec->extent_item_refs = extent_item_refs;
2281         else
2282                 rec->extent_item_refs = 0;
2283
2284         if (parent_key)
2285                 btrfs_cpu_key_to_disk(&rec->parent_key, parent_key);
2286         else
2287                 memset(&rec->parent_key, 0, sizeof(*parent_key));
2288
2289         rec->cache.start = start;
2290         rec->cache.size = nr;
2291         ret = insert_existing_cache_extent(extent_cache, &rec->cache);
2292         BUG_ON(ret);
2293         bytes_used += nr;
2294         if (set_checked) {
2295                 rec->content_checked = 1;
2296                 rec->owner_ref_checked = 1;
2297         }
2298         return ret;
2299 }
2300
2301 static int add_tree_backref(struct cache_tree *extent_cache, u64 bytenr,
2302                             u64 parent, u64 root, int found_ref)
2303 {
2304         struct extent_record *rec;
2305         struct tree_backref *back;
2306         struct cache_extent *cache;
2307
2308         cache = find_cache_extent(extent_cache, bytenr, 1);
2309         if (!cache) {
2310                 add_extent_rec(extent_cache, NULL, bytenr, 1, 0, 0, 0, 0, 0);
2311                 cache = find_cache_extent(extent_cache, bytenr, 1);
2312                 if (!cache)
2313                         abort();
2314         }
2315
2316         rec = container_of(cache, struct extent_record, cache);
2317         if (rec->start != bytenr) {
2318                 abort();
2319         }
2320
2321         back = find_tree_backref(rec, parent, root);
2322         if (!back)
2323                 back = alloc_tree_backref(rec, parent, root);
2324
2325         if (found_ref) {
2326                 if (back->node.found_ref) {
2327                         fprintf(stderr, "Extent back ref already exists "
2328                                 "for %llu parent %llu root %llu \n",
2329                                 (unsigned long long)bytenr,
2330                                 (unsigned long long)parent,
2331                                 (unsigned long long)root);
2332                 }
2333                 back->node.found_ref = 1;
2334         } else {
2335                 if (back->node.found_extent_tree) {
2336                         fprintf(stderr, "Extent back ref already exists "
2337                                 "for %llu parent %llu root %llu \n",
2338                                 (unsigned long long)bytenr,
2339                                 (unsigned long long)parent,
2340                                 (unsigned long long)root);
2341                 }
2342                 back->node.found_extent_tree = 1;
2343         }
2344         return 0;
2345 }
2346
2347 static int add_data_backref(struct cache_tree *extent_cache, u64 bytenr,
2348                             u64 parent, u64 root, u64 owner, u64 offset,
2349                             u32 num_refs, int found_ref, u64 max_size)
2350 {
2351         struct extent_record *rec;
2352         struct data_backref *back;
2353         struct cache_extent *cache;
2354
2355         cache = find_cache_extent(extent_cache, bytenr, 1);
2356         if (!cache) {
2357                 add_extent_rec(extent_cache, NULL, bytenr, 1, 0, 0, 0, 0,
2358                                max_size);
2359                 cache = find_cache_extent(extent_cache, bytenr, 1);
2360                 if (!cache)
2361                         abort();
2362         }
2363
2364         rec = container_of(cache, struct extent_record, cache);
2365         if (rec->start != bytenr) {
2366                 abort();
2367         }
2368         if (rec->max_size < max_size)
2369                 rec->max_size = max_size;
2370
2371         back = find_data_backref(rec, parent, root, owner, offset);
2372         if (!back)
2373                 back = alloc_data_backref(rec, parent, root, owner, offset,
2374                                           max_size);
2375
2376         if (found_ref) {
2377                 BUG_ON(num_refs != 1);
2378                 back->node.found_ref = 1;
2379                 back->found_ref += 1;
2380         } else {
2381                 if (back->node.found_extent_tree) {
2382                         fprintf(stderr, "Extent back ref already exists "
2383                                 "for %llu parent %llu root %llu"
2384                                 "owner %llu offset %llu num_refs %lu\n",
2385                                 (unsigned long long)bytenr,
2386                                 (unsigned long long)parent,
2387                                 (unsigned long long)root,
2388                                 (unsigned long long)owner,
2389                                 (unsigned long long)offset,
2390                                 (unsigned long)num_refs);
2391                 }
2392                 back->num_refs = num_refs;
2393                 back->node.found_extent_tree = 1;
2394         }
2395         return 0;
2396 }
2397
2398 static int add_pending(struct cache_tree *pending,
2399                        struct cache_tree *seen, u64 bytenr, u32 size)
2400 {
2401         int ret;
2402         ret = insert_cache_extent(seen, bytenr, size);
2403         if (ret)
2404                 return ret;
2405         insert_cache_extent(pending, bytenr, size);
2406         return 0;
2407 }
2408
2409 static int pick_next_pending(struct cache_tree *pending,
2410                         struct cache_tree *reada,
2411                         struct cache_tree *nodes,
2412                         u64 last, struct block_info *bits, int bits_nr,
2413                         int *reada_bits)
2414 {
2415         unsigned long node_start = last;
2416         struct cache_extent *cache;
2417         int ret;
2418
2419         cache = find_first_cache_extent(reada, 0);
2420         if (cache) {
2421                 bits[0].start = cache->start;
2422                 bits[1].size = cache->size;
2423                 *reada_bits = 1;
2424                 return 1;
2425         }
2426         *reada_bits = 0;
2427         if (node_start > 32768)
2428                 node_start -= 32768;
2429
2430         cache = find_first_cache_extent(nodes, node_start);
2431         if (!cache)
2432                 cache = find_first_cache_extent(nodes, 0);
2433
2434         if (!cache) {
2435                  cache = find_first_cache_extent(pending, 0);
2436                  if (!cache)
2437                          return 0;
2438                  ret = 0;
2439                  do {
2440                          bits[ret].start = cache->start;
2441                          bits[ret].size = cache->size;
2442                          cache = next_cache_extent(cache);
2443                          ret++;
2444                  } while (cache && ret < bits_nr);
2445                  return ret;
2446         }
2447
2448         ret = 0;
2449         do {
2450                 bits[ret].start = cache->start;
2451                 bits[ret].size = cache->size;
2452                 cache = next_cache_extent(cache);
2453                 ret++;
2454         } while (cache && ret < bits_nr);
2455
2456         if (bits_nr - ret > 8) {
2457                 u64 lookup = bits[0].start + bits[0].size;
2458                 struct cache_extent *next;
2459                 next = find_first_cache_extent(pending, lookup);
2460                 while(next) {
2461                         if (next->start - lookup > 32768)
2462                                 break;
2463                         bits[ret].start = next->start;
2464                         bits[ret].size = next->size;
2465                         lookup = next->start + next->size;
2466                         ret++;
2467                         if (ret == bits_nr)
2468                                 break;
2469                         next = next_cache_extent(next);
2470                         if (!next)
2471                                 break;
2472                 }
2473         }
2474         return ret;
2475 }
2476
2477 #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
2478 static int process_extent_ref_v0(struct cache_tree *extent_cache,
2479                                  struct extent_buffer *leaf, int slot)
2480 {
2481         struct btrfs_extent_ref_v0 *ref0;
2482         struct btrfs_key key;
2483
2484         btrfs_item_key_to_cpu(leaf, &key, slot);
2485         ref0 = btrfs_item_ptr(leaf, slot, struct btrfs_extent_ref_v0);
2486         if (btrfs_ref_objectid_v0(leaf, ref0) < BTRFS_FIRST_FREE_OBJECTID) {
2487                 add_tree_backref(extent_cache, key.objectid, key.offset, 0, 0);
2488         } else {
2489                 add_data_backref(extent_cache, key.objectid, key.offset, 0,
2490                                  0, 0, btrfs_ref_count_v0(leaf, ref0), 0, 0);
2491         }
2492         return 0;
2493 }
2494 #endif
2495
2496 static int process_extent_item(struct cache_tree *extent_cache,
2497                                struct extent_buffer *eb, int slot)
2498 {
2499         struct btrfs_extent_item *ei;
2500         struct btrfs_extent_inline_ref *iref;
2501         struct btrfs_extent_data_ref *dref;
2502         struct btrfs_shared_data_ref *sref;
2503         struct btrfs_key key;
2504         unsigned long end;
2505         unsigned long ptr;
2506         int type;
2507         u32 item_size = btrfs_item_size_nr(eb, slot);
2508         u64 refs = 0;
2509         u64 offset;
2510
2511         btrfs_item_key_to_cpu(eb, &key, slot);
2512
2513         if (item_size < sizeof(*ei)) {
2514 #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
2515                 struct btrfs_extent_item_v0 *ei0;
2516                 BUG_ON(item_size != sizeof(*ei0));
2517                 ei0 = btrfs_item_ptr(eb, slot, struct btrfs_extent_item_v0);
2518                 refs = btrfs_extent_refs_v0(eb, ei0);
2519 #else
2520                 BUG();
2521 #endif
2522                 return add_extent_rec(extent_cache, NULL, key.objectid,
2523                                       key.offset, refs, 0, 0, 0, key.offset);
2524         }
2525
2526         ei = btrfs_item_ptr(eb, slot, struct btrfs_extent_item);
2527         refs = btrfs_extent_refs(eb, ei);
2528
2529         add_extent_rec(extent_cache, NULL, key.objectid, key.offset,
2530                        refs, 0, 0, 0, key.offset);
2531
2532         ptr = (unsigned long)(ei + 1);
2533         if (btrfs_extent_flags(eb, ei) & BTRFS_EXTENT_FLAG_TREE_BLOCK)
2534                 ptr += sizeof(struct btrfs_tree_block_info);
2535
2536         end = (unsigned long)ei + item_size;
2537         while (ptr < end) {
2538                 iref = (struct btrfs_extent_inline_ref *)ptr;
2539                 type = btrfs_extent_inline_ref_type(eb, iref);
2540                 offset = btrfs_extent_inline_ref_offset(eb, iref);
2541                 switch (type) {
2542                 case BTRFS_TREE_BLOCK_REF_KEY:
2543                         add_tree_backref(extent_cache, key.objectid,
2544                                          0, offset, 0);
2545                         break;
2546                 case BTRFS_SHARED_BLOCK_REF_KEY:
2547                         add_tree_backref(extent_cache, key.objectid,
2548                                          offset, 0, 0);
2549                         break;
2550                 case BTRFS_EXTENT_DATA_REF_KEY:
2551                         dref = (struct btrfs_extent_data_ref *)(&iref->offset);
2552                         add_data_backref(extent_cache, key.objectid, 0,
2553                                         btrfs_extent_data_ref_root(eb, dref),
2554                                         btrfs_extent_data_ref_objectid(eb,
2555                                                                        dref),
2556                                         btrfs_extent_data_ref_offset(eb, dref),
2557                                         btrfs_extent_data_ref_count(eb, dref),
2558                                         0, key.offset);
2559                         break;
2560                 case BTRFS_SHARED_DATA_REF_KEY:
2561                         sref = (struct btrfs_shared_data_ref *)(iref + 1);
2562                         add_data_backref(extent_cache, key.objectid, offset,
2563                                         0, 0, 0,
2564                                         btrfs_shared_data_ref_count(eb, sref),
2565                                         0, key.offset);
2566                         break;
2567                 default:
2568                         fprintf(stderr, "corrupt extent record: key %Lu %u %Lu\n",
2569                                 key.objectid, key.type, key.offset);
2570                         goto out;
2571                 }
2572                 ptr += btrfs_extent_inline_ref_size(type);
2573         }
2574         WARN_ON(ptr > end);
2575 out:
2576         return 0;
2577 }
2578
2579 static int run_next_block(struct btrfs_root *root,
2580                           struct block_info *bits,
2581                           int bits_nr,
2582                           u64 *last,
2583                           struct cache_tree *pending,
2584                           struct cache_tree *seen,
2585                           struct cache_tree *reada,
2586                           struct cache_tree *nodes,
2587                           struct cache_tree *extent_cache)
2588 {
2589         struct extent_buffer *buf;
2590         u64 bytenr;
2591         u32 size;
2592         u64 parent;
2593         u64 owner;
2594         u64 flags;
2595         int ret;
2596         int i;
2597         int nritems;
2598         struct btrfs_key key;
2599         struct cache_extent *cache;
2600         int reada_bits;
2601
2602         ret = pick_next_pending(pending, reada, nodes, *last, bits,
2603                                 bits_nr, &reada_bits);
2604         if (ret == 0) {
2605                 return 1;
2606         }
2607         if (!reada_bits) {
2608                 for(i = 0; i < ret; i++) {
2609                         insert_cache_extent(reada, bits[i].start,
2610                                             bits[i].size);
2611
2612                         /* fixme, get the parent transid */
2613                         readahead_tree_block(root, bits[i].start,
2614                                              bits[i].size, 0);
2615                 }
2616         }
2617         *last = bits[0].start;
2618         bytenr = bits[0].start;
2619         size = bits[0].size;
2620
2621         cache = find_cache_extent(pending, bytenr, size);
2622         if (cache) {
2623                 remove_cache_extent(pending, cache);
2624                 free(cache);
2625         }
2626         cache = find_cache_extent(reada, bytenr, size);
2627         if (cache) {
2628                 remove_cache_extent(reada, cache);
2629                 free(cache);
2630         }
2631         cache = find_cache_extent(nodes, bytenr, size);
2632         if (cache) {
2633                 remove_cache_extent(nodes, cache);
2634                 free(cache);
2635         }
2636
2637         /* fixme, get the real parent transid */
2638         buf = read_tree_block(root, bytenr, size, 0);
2639         if (!extent_buffer_uptodate(buf)) {
2640                 record_bad_block_io(root->fs_info,
2641                                     extent_cache, bytenr, size);
2642                 free_extent_buffer(buf);
2643                 goto out;
2644         }
2645
2646         nritems = btrfs_header_nritems(buf);
2647
2648         ret = btrfs_lookup_extent_info(NULL, root, bytenr, size, NULL, &flags);
2649         if (ret < 0)
2650                 flags = BTRFS_BLOCK_FLAG_FULL_BACKREF;
2651
2652         if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF) {
2653                 parent = bytenr;
2654                 owner = 0;
2655         } else {
2656                 parent = 0;
2657                 owner = btrfs_header_owner(buf);
2658         }
2659
2660         ret = check_block(root, extent_cache, buf, flags);
2661         if (ret)
2662                 goto out;
2663
2664         if (btrfs_is_leaf(buf)) {
2665                 btree_space_waste += btrfs_leaf_free_space(root, buf);
2666                 for (i = 0; i < nritems; i++) {
2667                         struct btrfs_file_extent_item *fi;
2668                         btrfs_item_key_to_cpu(buf, &key, i);
2669                         if (key.type == BTRFS_EXTENT_ITEM_KEY) {
2670                                 process_extent_item(extent_cache, buf, i);
2671                                 continue;
2672                         }
2673                         if (key.type == BTRFS_EXTENT_CSUM_KEY) {
2674                                 total_csum_bytes +=
2675                                         btrfs_item_size_nr(buf, i);
2676                                 continue;
2677                         }
2678                         if (key.type == BTRFS_BLOCK_GROUP_ITEM_KEY) {
2679                                 continue;
2680                         }
2681                         if (key.type == BTRFS_EXTENT_REF_V0_KEY) {
2682 #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
2683                                 process_extent_ref_v0(extent_cache, buf, i);
2684 #else
2685                                 BUG();
2686 #endif
2687                                 continue;
2688                         }
2689
2690                         if (key.type == BTRFS_TREE_BLOCK_REF_KEY) {
2691                                 add_tree_backref(extent_cache, key.objectid, 0,
2692                                                  key.offset, 0);
2693                                 continue;
2694                         }
2695                         if (key.type == BTRFS_SHARED_BLOCK_REF_KEY) {
2696                                 add_tree_backref(extent_cache, key.objectid,
2697                                                  key.offset, 0, 0);
2698                                 continue;
2699                         }
2700                         if (key.type == BTRFS_EXTENT_DATA_REF_KEY) {
2701                                 struct btrfs_extent_data_ref *ref;
2702                                 ref = btrfs_item_ptr(buf, i,
2703                                                 struct btrfs_extent_data_ref);
2704                                 add_data_backref(extent_cache,
2705                                         key.objectid, 0,
2706                                         btrfs_extent_data_ref_root(buf, ref),
2707                                         btrfs_extent_data_ref_objectid(buf,
2708                                                                        ref),
2709                                         btrfs_extent_data_ref_offset(buf, ref),
2710                                         btrfs_extent_data_ref_count(buf, ref),
2711                                         0, root->sectorsize);
2712                                 continue;
2713                         }
2714                         if (key.type == BTRFS_SHARED_DATA_REF_KEY) {
2715                                 struct btrfs_shared_data_ref *ref;
2716                                 ref = btrfs_item_ptr(buf, i,
2717                                                 struct btrfs_shared_data_ref);
2718                                 add_data_backref(extent_cache,
2719                                         key.objectid, key.offset, 0, 0, 0, 
2720                                         btrfs_shared_data_ref_count(buf, ref),
2721                                         0, root->sectorsize);
2722                                 continue;
2723                         }
2724                         if (key.type != BTRFS_EXTENT_DATA_KEY)
2725                                 continue;
2726                         fi = btrfs_item_ptr(buf, i,
2727                                             struct btrfs_file_extent_item);
2728                         if (btrfs_file_extent_type(buf, fi) ==
2729                             BTRFS_FILE_EXTENT_INLINE)
2730                                 continue;
2731                         if (btrfs_file_extent_disk_bytenr(buf, fi) == 0)
2732                                 continue;
2733
2734                         data_bytes_allocated +=
2735                                 btrfs_file_extent_disk_num_bytes(buf, fi);
2736                         if (data_bytes_allocated < root->sectorsize) {
2737                                 abort();
2738                         }
2739                         data_bytes_referenced +=
2740                                 btrfs_file_extent_num_bytes(buf, fi);
2741                         ret = add_extent_rec(extent_cache, NULL,
2742                                    btrfs_file_extent_disk_bytenr(buf, fi),
2743                                    btrfs_file_extent_disk_num_bytes(buf, fi),
2744                                    0, 0, 1, 1,
2745                                    btrfs_file_extent_disk_num_bytes(buf, fi));
2746                         add_data_backref(extent_cache,
2747                                 btrfs_file_extent_disk_bytenr(buf, fi),
2748                                 parent, owner, key.objectid, key.offset -
2749                                 btrfs_file_extent_offset(buf, fi), 1, 1,
2750                                 btrfs_file_extent_disk_num_bytes(buf, fi));
2751                         BUG_ON(ret);
2752                 }
2753         } else {
2754                 int level;
2755                 struct btrfs_key first_key;
2756
2757                 first_key.objectid = 0;
2758
2759                 if (nritems > 0)
2760                         btrfs_item_key_to_cpu(buf, &first_key, 0);
2761                 level = btrfs_header_level(buf);
2762                 for (i = 0; i < nritems; i++) {
2763                         u64 ptr = btrfs_node_blockptr(buf, i);
2764                         u32 size = btrfs_level_size(root, level - 1);
2765                         btrfs_node_key_to_cpu(buf, &key, i);
2766                         ret = add_extent_rec(extent_cache, &key,
2767                                              ptr, size, 0, 0, 1, 0, size);
2768                         BUG_ON(ret);
2769
2770                         add_tree_backref(extent_cache, ptr, parent, owner, 1);
2771
2772                         if (level > 1) {
2773                                 add_pending(nodes, seen, ptr, size);
2774                         } else {
2775                                 add_pending(pending, seen, ptr, size);
2776                         }
2777                 }
2778                 btree_space_waste += (BTRFS_NODEPTRS_PER_BLOCK(root) -
2779                                       nritems) * sizeof(struct btrfs_key_ptr);
2780         }
2781         total_btree_bytes += buf->len;
2782         if (fs_root_objectid(btrfs_header_owner(buf)))
2783                 total_fs_tree_bytes += buf->len;
2784         if (!found_old_backref &&
2785             btrfs_header_owner(buf) == BTRFS_TREE_RELOC_OBJECTID &&
2786             btrfs_header_backref_rev(buf) == BTRFS_MIXED_BACKREF_REV &&
2787             !btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC))
2788                 found_old_backref = 1;
2789 out:
2790         free_extent_buffer(buf);
2791         return 0;
2792 }
2793
2794 static int add_root_to_pending(struct extent_buffer *buf,
2795                                struct block_info *bits,
2796                                int bits_nr,
2797                                struct cache_tree *extent_cache,
2798                                struct cache_tree *pending,
2799                                struct cache_tree *seen,
2800                                struct cache_tree *reada,
2801                                struct cache_tree *nodes,
2802                                struct btrfs_key *root_key)
2803 {
2804         if (btrfs_header_level(buf) > 0)
2805                 add_pending(nodes, seen, buf->start, buf->len);
2806         else
2807                 add_pending(pending, seen, buf->start, buf->len);
2808         add_extent_rec(extent_cache, NULL, buf->start, buf->len,
2809                        0, 1, 1, 0, buf->len);
2810
2811         if (root_key->objectid == BTRFS_TREE_RELOC_OBJECTID ||
2812             btrfs_header_backref_rev(buf) < BTRFS_MIXED_BACKREF_REV)
2813                 add_tree_backref(extent_cache, buf->start, buf->start,
2814                                  0, 1);
2815         else
2816                 add_tree_backref(extent_cache, buf->start, 0,
2817                                  root_key->objectid, 1);
2818         return 0;
2819 }
2820
2821 /* as we fix the tree, we might be deleting blocks that
2822  * we're tracking for repair.  This hook makes sure we
2823  * remove any backrefs for blocks as we are fixing them.
2824  */
2825 static int free_extent_hook(struct btrfs_trans_handle *trans,
2826                             struct btrfs_root *root,
2827                             u64 bytenr, u64 num_bytes, u64 parent,
2828                             u64 root_objectid, u64 owner, u64 offset,
2829                             int refs_to_drop)
2830 {
2831         struct extent_record *rec;
2832         struct cache_extent *cache;
2833         int is_data;
2834         struct cache_tree *extent_cache = root->fs_info->fsck_extent_cache;
2835
2836         is_data = owner >= BTRFS_FIRST_FREE_OBJECTID;
2837         cache = find_cache_extent(extent_cache, bytenr, num_bytes);
2838         if (!cache)
2839                 return 0;
2840
2841         rec = container_of(cache, struct extent_record, cache);
2842         if (is_data) {
2843                 struct data_backref *back;
2844                 back = find_data_backref(rec, parent, root_objectid, owner,
2845                                          offset);
2846                 if (!back)
2847                         goto out;
2848                 if (back->node.found_ref) {
2849                         back->found_ref -= refs_to_drop;
2850                         if (rec->refs)
2851                                 rec->refs -= refs_to_drop;
2852                 }
2853                 if (back->node.found_extent_tree) {
2854                         back->num_refs -= refs_to_drop;
2855                         if (rec->extent_item_refs)
2856                                 rec->extent_item_refs -= refs_to_drop;
2857                 }
2858                 if (back->found_ref == 0)
2859                         back->node.found_ref = 0;
2860                 if (back->num_refs == 0)
2861                         back->node.found_extent_tree = 0;
2862
2863                 if (!back->node.found_extent_tree && back->node.found_ref) {
2864                         list_del(&back->node.list);
2865                         free(back);
2866                 }
2867         } else {
2868                 struct tree_backref *back;
2869                 back = find_tree_backref(rec, parent, root_objectid);
2870                 if (!back)
2871                         goto out;
2872                 if (back->node.found_ref) {
2873                         if (rec->refs)
2874                                 rec->refs--;
2875                         back->node.found_ref = 0;
2876                 }
2877                 if (back->node.found_extent_tree) {
2878                         if (rec->extent_item_refs)
2879                                 rec->extent_item_refs--;
2880                         back->node.found_extent_tree = 0;
2881                 }
2882                 if (!back->node.found_extent_tree && back->node.found_ref) {
2883                         list_del(&back->node.list);
2884                         free(back);
2885                 }
2886         }
2887         maybe_free_extent_rec(extent_cache, rec);
2888 out:
2889         return 0;
2890 }
2891
2892 static int delete_extent_records(struct btrfs_trans_handle *trans,
2893                                  struct btrfs_root *root,
2894                                  struct btrfs_path *path,
2895                                  u64 bytenr, u64 new_len)
2896 {
2897         struct btrfs_key key;
2898         struct btrfs_key found_key;
2899         struct extent_buffer *leaf;
2900         int ret;
2901         int slot;
2902
2903
2904         key.objectid = bytenr;
2905         key.type = (u8)-1;
2906         key.offset = (u64)-1;
2907
2908         while(1) {
2909                 ret = btrfs_search_slot(trans, root->fs_info->extent_root,
2910                                         &key, path, 0, 1);
2911                 if (ret < 0)
2912                         break;
2913
2914                 if (ret > 0) {
2915                         ret = 0;
2916                         if (path->slots[0] == 0)
2917                                 break;
2918                         path->slots[0]--;
2919                 }
2920                 ret = 0;
2921
2922                 leaf = path->nodes[0];
2923                 slot = path->slots[0];
2924
2925                 btrfs_item_key_to_cpu(leaf, &found_key, slot);
2926                 if (found_key.objectid != bytenr)
2927                         break;
2928
2929                 if (found_key.type != BTRFS_EXTENT_ITEM_KEY &&
2930                     found_key.type != BTRFS_TREE_BLOCK_REF_KEY &&
2931                     found_key.type != BTRFS_EXTENT_DATA_REF_KEY &&
2932                     found_key.type != BTRFS_EXTENT_REF_V0_KEY &&
2933                     found_key.type != BTRFS_SHARED_BLOCK_REF_KEY &&
2934                     found_key.type != BTRFS_SHARED_DATA_REF_KEY) {
2935                         btrfs_release_path(NULL, path);
2936                         if (found_key.type == 0) {
2937                                 if (found_key.offset == 0)
2938                                         break;
2939                                 key.offset = found_key.offset - 1;
2940                                 key.type = found_key.type;
2941                         }
2942                         key.type = found_key.type - 1;
2943                         key.offset = (u64)-1;
2944                         continue;
2945                 }
2946
2947                 fprintf(stderr, "repair deleting extent record: key %Lu %u %Lu\n",
2948                         found_key.objectid, found_key.type, found_key.offset);
2949
2950                 ret = btrfs_del_item(trans, root->fs_info->extent_root, path);
2951                 if (ret)
2952                         break;
2953                 btrfs_release_path(NULL, path);
2954
2955                 if (found_key.type == BTRFS_EXTENT_ITEM_KEY) {
2956                         ret = btrfs_update_block_group(trans, root, bytenr,
2957                                                        found_key.offset, 0, 0);
2958                         if (ret)
2959                                 break;
2960                 }
2961         }
2962
2963         btrfs_release_path(NULL, path);
2964         return ret;
2965 }
2966
2967 /*
2968  * for a single backref, this will allocate a new extent
2969  * and add the backref to it.
2970  */
2971 static int record_extent(struct btrfs_trans_handle *trans,
2972                          struct btrfs_fs_info *info,
2973                          struct btrfs_path *path,
2974                          struct extent_record *rec,
2975                          struct extent_backref *back,
2976                          int allocated, u64 flags)
2977 {
2978         int ret;
2979         struct btrfs_root *extent_root = info->extent_root;
2980         struct extent_buffer *leaf;
2981         struct btrfs_key ins_key;
2982         struct btrfs_extent_item *ei;
2983         struct tree_backref *tback;
2984         struct data_backref *dback;
2985         struct btrfs_tree_block_info *bi;
2986
2987         if (!back->is_data)
2988                 rec->max_size = max_t(u64, rec->max_size,
2989                                     info->extent_root->leafsize);
2990
2991         if (!allocated) {
2992                 u32 item_size = sizeof(*ei);
2993
2994                 if (!back->is_data)
2995                         item_size += sizeof(*bi);
2996
2997                 ins_key.objectid = rec->start;
2998                 ins_key.offset = rec->max_size;
2999                 ins_key.type = BTRFS_EXTENT_ITEM_KEY;
3000
3001                 ret = btrfs_insert_empty_item(trans, extent_root, path,
3002                                         &ins_key, item_size);
3003                 if (ret)
3004                         goto fail;
3005
3006                 leaf = path->nodes[0];
3007                 ei = btrfs_item_ptr(leaf, path->slots[0],
3008                                     struct btrfs_extent_item);
3009
3010                 btrfs_set_extent_refs(leaf, ei, 0);
3011                 btrfs_set_extent_generation(leaf, ei, rec->generation);
3012
3013                 if (back->is_data) {
3014                         btrfs_set_extent_flags(leaf, ei,
3015                                                BTRFS_EXTENT_FLAG_DATA);
3016                 } else {
3017                         struct btrfs_disk_key copy_key;;
3018
3019                         tback = (struct tree_backref *)back;
3020                         bi = (struct btrfs_tree_block_info *)(ei + 1);
3021                         memset_extent_buffer(leaf, 0, (unsigned long)bi,
3022                                              sizeof(*bi));
3023                         memset(&copy_key, 0, sizeof(copy_key));
3024
3025                         copy_key.objectid = le64_to_cpu(rec->info_objectid);
3026                         btrfs_set_tree_block_level(leaf, bi, rec->info_level);
3027                         btrfs_set_tree_block_key(leaf, bi, &copy_key);
3028
3029                         btrfs_set_extent_flags(leaf, ei,
3030                                                BTRFS_EXTENT_FLAG_TREE_BLOCK | flags);
3031                 }
3032
3033                 btrfs_mark_buffer_dirty(leaf);
3034                 ret = btrfs_update_block_group(trans, extent_root, rec->start,
3035                                                rec->max_size, 1, 0);
3036                 if (ret)
3037                         goto fail;
3038                 btrfs_release_path(NULL, path);
3039         }
3040
3041         if (back->is_data) {
3042                 u64 parent;
3043                 int i;
3044
3045                 dback = (struct data_backref *)back;
3046                 if (back->full_backref)
3047                         parent = dback->parent;
3048                 else
3049                         parent = 0;
3050
3051                 for (i = 0; i < dback->found_ref; i++) {
3052                         /* if parent != 0, we're doing a full backref
3053                          * passing BTRFS_FIRST_FREE_OBJECTID as the owner
3054                          * just makes the backref allocator create a data
3055                          * backref
3056                          */
3057                         ret = btrfs_inc_extent_ref(trans, info->extent_root,
3058                                                    rec->start, rec->max_size,
3059                                                    parent,
3060                                                    dback->root,
3061                                                    parent ?
3062                                                    BTRFS_FIRST_FREE_OBJECTID :
3063                                                    dback->owner,
3064                                                    dback->offset);
3065                         if (ret)
3066                                 break;
3067                 }
3068                 fprintf(stderr, "adding new data backref"
3069                                 " on %llu %s %llu owner %llu"
3070                                 " offset %llu found %d\n",
3071                                 (unsigned long long)rec->start,
3072                                 back->full_backref ?
3073                                 "parent" : "root",
3074                                 back->full_backref ?
3075                                 (unsigned long long)parent :
3076                                 (unsigned long long)dback->root,
3077                                 (unsigned long long)dback->owner,
3078                                 (unsigned long long)dback->offset,
3079                                 dback->found_ref);
3080         } else {
3081                 u64 parent;
3082
3083                 tback = (struct tree_backref *)back;
3084                 if (back->full_backref)
3085                         parent = tback->parent;
3086                 else
3087                         parent = 0;
3088
3089                 ret = btrfs_inc_extent_ref(trans, info->extent_root,
3090                                            rec->start, rec->max_size,
3091                                            parent, tback->root, 0, 0);
3092                 fprintf(stderr, "adding new tree backref on "
3093                         "start %llu len %llu parent %llu root %llu\n",
3094                         rec->start, rec->max_size, tback->parent, tback->root);
3095         }
3096         if (ret)
3097                 goto fail;
3098 fail:
3099         btrfs_release_path(NULL, path);
3100         return ret;
3101 }
3102
3103 /*
3104  * when an incorrect extent item is found, this will delete
3105  * all of the existing entries for it and recreate them
3106  * based on what the tree scan found.
3107  */
3108 static int fixup_extent_refs(struct btrfs_trans_handle *trans,
3109                              struct btrfs_fs_info *info,
3110                              struct extent_record *rec)
3111 {
3112         int ret;
3113         struct btrfs_path *path;
3114         struct list_head *cur = rec->backrefs.next;
3115         struct cache_extent *cache;
3116         struct extent_backref *back;
3117         int allocated = 0;
3118         u64 flags = 0;
3119
3120         /* remember our flags for recreating the extent */
3121         ret = btrfs_lookup_extent_info(NULL, info->extent_root, rec->start,
3122                                        rec->max_size, NULL, &flags);
3123         if (ret < 0)
3124                 flags = BTRFS_BLOCK_FLAG_FULL_BACKREF;
3125
3126         path = btrfs_alloc_path();
3127
3128         /* step one, delete all the existing records */
3129         ret = delete_extent_records(trans, info->extent_root, path,
3130                                     rec->start, rec->max_size);
3131
3132         if (ret < 0)
3133                 goto out;
3134
3135         /* was this block corrupt?  If so, don't add references to it */
3136         cache = find_cache_extent(info->corrupt_blocks, rec->start, rec->max_size);
3137         if (cache) {
3138                 ret = 0;
3139                 goto out;
3140         }
3141
3142         /* step two, recreate all the refs we did find */
3143         while(cur != &rec->backrefs) {
3144                 back = list_entry(cur, struct extent_backref, list);
3145                 cur = cur->next;
3146
3147                 /*
3148                  * if we didn't find any references, don't create a
3149                  * new extent record
3150                  */
3151                 if (!back->found_ref)
3152                         continue;
3153
3154                 ret = record_extent(trans, info, path, rec, back, allocated, flags);
3155                 allocated = 1;
3156
3157                 if (ret)
3158                         goto out;
3159         }
3160 out:
3161         btrfs_free_path(path);
3162         return ret;
3163 }
3164
3165 /* right now we only prune from the extent allocation tree */
3166 static int prune_one_block(struct btrfs_trans_handle *trans,
3167                            struct btrfs_fs_info *info,
3168                            struct btrfs_corrupt_block *corrupt)
3169 {
3170         int ret;
3171         struct btrfs_path path;
3172         struct extent_buffer *eb;
3173         u64 found;
3174         int slot;
3175         int nritems;
3176         int level = corrupt->level + 1;
3177
3178         btrfs_init_path(&path);
3179 again:
3180         /* we want to stop at the parent to our busted block */
3181         path.lowest_level = level;
3182
3183         ret = btrfs_search_slot(trans, info->extent_root,
3184                                 &corrupt->key, &path, -1, 1);
3185
3186         if (ret < 0)
3187                 goto out;
3188
3189         eb = path.nodes[level];
3190         if (!eb) {
3191                 ret = -ENOENT;
3192                 goto out;
3193         }
3194
3195         /*
3196          * hopefully the search gave us the block we want to prune,
3197          * lets try that first
3198          */
3199         slot = path.slots[level];
3200         found =  btrfs_node_blockptr(eb, slot);
3201         if (found == corrupt->cache.start)
3202                 goto del_ptr;
3203
3204         nritems = btrfs_header_nritems(eb);
3205
3206         /* the search failed, lets scan this node and hope we find it */
3207         for (slot = 0; slot < nritems; slot++) {
3208                 found =  btrfs_node_blockptr(eb, slot);
3209                 if (found == corrupt->cache.start)
3210                         goto del_ptr;
3211         }
3212         /*
3213          * we couldn't find the bad block.  TODO, search all the nodes for pointers
3214          * to this block
3215          */
3216         if (eb == info->extent_root->node) {
3217                 ret = -ENOENT;
3218                 goto out;
3219         } else {
3220                 level++;
3221                 btrfs_release_path(NULL, &path);
3222                 goto again;
3223         }
3224
3225 del_ptr:
3226         printk("deleting pointer to block %Lu\n", corrupt->cache.start);
3227         ret = btrfs_del_ptr(trans, info->extent_root, &path, level, slot);
3228
3229 out:
3230         btrfs_release_path(NULL, &path);
3231         return ret;
3232 }
3233
3234 static int prune_corrupt_blocks(struct btrfs_trans_handle *trans,
3235                                 struct btrfs_fs_info *info)
3236 {
3237         struct cache_extent *cache;
3238         struct btrfs_corrupt_block *corrupt;
3239
3240         cache = find_first_cache_extent(info->corrupt_blocks, 0);
3241         while (1) {
3242                 if (!cache)
3243                         break;
3244                 corrupt = container_of(cache, struct btrfs_corrupt_block, cache);
3245                 prune_one_block(trans, info, corrupt);
3246                 cache = next_cache_extent(cache);
3247         }
3248         return 0;
3249 }
3250
3251 static void free_corrupt_blocks(struct btrfs_fs_info *info)
3252 {
3253         struct cache_extent *cache;
3254         struct btrfs_corrupt_block *corrupt;
3255
3256         while (1) {
3257                 cache = find_first_cache_extent(info->corrupt_blocks, 0);
3258                 if (!cache)
3259                         break;
3260                 corrupt = container_of(cache, struct btrfs_corrupt_block, cache);
3261                 remove_cache_extent(info->corrupt_blocks, cache);
3262                 free(corrupt);
3263         }
3264 }
3265
3266 static int check_block_group(struct btrfs_trans_handle *trans,
3267                               struct btrfs_fs_info *info,
3268                               struct map_lookup *map,
3269                               int *reinit)
3270 {
3271         struct btrfs_key key;
3272         struct btrfs_path path;
3273         int ret;
3274
3275         key.objectid = map->ce.start;
3276         key.offset = map->ce.size;
3277         key.type = BTRFS_BLOCK_GROUP_ITEM_KEY;
3278
3279         btrfs_init_path(&path);
3280         ret = btrfs_search_slot(NULL, info->extent_root,
3281                                 &key, &path, 0, 0);
3282         btrfs_release_path(NULL, &path);
3283         if (ret <= 0)
3284                 goto out;
3285
3286         ret = btrfs_make_block_group(trans, info->extent_root, 0, map->type,
3287                                BTRFS_FIRST_CHUNK_TREE_OBJECTID,
3288                                key.objectid, key.offset);
3289         *reinit = 1;
3290 out:
3291         return ret;
3292 }
3293
3294 static int check_block_groups(struct btrfs_trans_handle *trans,
3295                               struct btrfs_fs_info *info, int *reinit)
3296 {
3297         struct cache_extent *ce;
3298         struct map_lookup *map;
3299         struct btrfs_mapping_tree *map_tree = &info->mapping_tree;
3300
3301         /* this isn't quite working */
3302         return 0;
3303
3304         ce = find_first_cache_extent(&map_tree->cache_tree, 0);
3305         while (1) {
3306                 if (!ce)
3307                         break;
3308                 map = container_of(ce, struct map_lookup, ce);
3309                 check_block_group(trans, info, map, reinit);
3310                 ce = next_cache_extent(ce);
3311         }
3312         return 0;
3313 }
3314
3315 static int check_extent_refs(struct btrfs_trans_handle *trans,
3316                              struct btrfs_root *root,
3317                              struct cache_tree *extent_cache, int repair)
3318 {
3319         struct extent_record *rec;
3320         struct cache_extent *cache;
3321         int err = 0;
3322         int ret = 0;
3323         int fixed = 0;
3324         int reinit = 0;
3325
3326         if (repair) {
3327                 /*
3328                  * if we're doing a repair, we have to make sure
3329                  * we don't allocate from the problem extents.
3330                  * In the worst case, this will be all the
3331                  * extents in the FS
3332                  */
3333                 cache = find_first_cache_extent(extent_cache, 0);
3334                 while(cache) {
3335                         rec = container_of(cache, struct extent_record, cache);
3336                         btrfs_pin_extent(root->fs_info,
3337                                          rec->start, rec->max_size);
3338                         cache = next_cache_extent(cache);
3339                 }
3340
3341                 /* pin down all the corrupted blocks too */
3342                 cache = find_first_cache_extent(root->fs_info->corrupt_blocks, 0);
3343                 while(cache) {
3344                         rec = container_of(cache, struct extent_record, cache);
3345                         btrfs_pin_extent(root->fs_info,
3346                                          rec->start, rec->max_size);
3347                         cache = next_cache_extent(cache);
3348                 }
3349                 prune_corrupt_blocks(trans, root->fs_info);
3350                 check_block_groups(trans, root->fs_info, &reinit);
3351                 if (reinit)
3352                         btrfs_read_block_groups(root->fs_info->extent_root);
3353         }
3354         while(1) {
3355                 fixed = 0;
3356                 cache = find_first_cache_extent(extent_cache, 0);
3357                 if (!cache)
3358                         break;
3359                 rec = container_of(cache, struct extent_record, cache);
3360                 if (rec->refs != rec->extent_item_refs) {
3361                         fprintf(stderr, "ref mismatch on [%llu %llu] ",
3362                                 (unsigned long long)rec->start,
3363                                 (unsigned long long)rec->nr);
3364                         fprintf(stderr, "extent item %llu, found %llu\n",
3365                                 (unsigned long long)rec->extent_item_refs,
3366                                 (unsigned long long)rec->refs);
3367                         if (!fixed && repair) {
3368                                 ret = fixup_extent_refs(trans, root->fs_info, rec);
3369                                 if (ret)
3370                                         goto repair_abort;
3371                                 fixed = 1;
3372                         }
3373                         err = 1;
3374
3375                 }
3376                 if (all_backpointers_checked(rec, 1)) {
3377                         fprintf(stderr, "backpointer mismatch on [%llu %llu]\n",
3378                                 (unsigned long long)rec->start,
3379                                 (unsigned long long)rec->nr);
3380
3381                         if (!fixed && repair) {
3382                                 ret = fixup_extent_refs(trans, root->fs_info, rec);
3383                                 if (ret)
3384                                         goto repair_abort;
3385                                 fixed = 1;
3386                         }
3387
3388                         err = 1;
3389                 }
3390                 if (!rec->owner_ref_checked) {
3391                         fprintf(stderr, "owner ref check failed [%llu %llu]\n",
3392                                 (unsigned long long)rec->start,
3393                                 (unsigned long long)rec->nr);
3394                         if (!fixed && repair) {
3395                                 ret = fixup_extent_refs(trans, root->fs_info, rec);
3396                                 if (ret)
3397                                         goto repair_abort;
3398                                 fixed = 1;
3399                         }
3400                         err = 1;
3401                 }
3402
3403                 remove_cache_extent(extent_cache, cache);
3404                 free_all_extent_backrefs(rec);
3405                 free(rec);
3406         }
3407 repair_abort:
3408         if (repair) {
3409                 if (ret) {
3410                         fprintf(stderr, "failed to repair damaged filesystem, aborting\n");
3411                         exit(1);
3412                 } else {
3413                         btrfs_fix_block_accounting(trans, root);
3414                 }
3415                 if (err)
3416                         fprintf(stderr, "repaired damaged extent references\n");
3417                 return ret;
3418         }
3419         return err;
3420 }
3421
3422 static int check_extents(struct btrfs_trans_handle *trans,
3423                          struct btrfs_root *root, int repair)
3424 {
3425         struct cache_tree extent_cache;
3426         struct cache_tree seen;
3427         struct cache_tree pending;
3428         struct cache_tree reada;
3429         struct cache_tree nodes;
3430         struct cache_tree corrupt_blocks;
3431         struct btrfs_path path;
3432         struct btrfs_key key;
3433         struct btrfs_key found_key;
3434         int ret;
3435         u64 last = 0;
3436         struct block_info *bits;
3437         int bits_nr;
3438         struct extent_buffer *leaf;
3439         int slot;
3440         struct btrfs_root_item ri;
3441
3442         cache_tree_init(&extent_cache);
3443         cache_tree_init(&seen);
3444         cache_tree_init(&pending);
3445         cache_tree_init(&nodes);
3446         cache_tree_init(&reada);
3447         cache_tree_init(&corrupt_blocks);
3448
3449         if (repair) {
3450                 root->fs_info->fsck_extent_cache = &extent_cache;
3451                 root->fs_info->free_extent_hook = free_extent_hook;
3452                 root->fs_info->corrupt_blocks = &corrupt_blocks;
3453         }
3454
3455         bits_nr = 1024;
3456         bits = malloc(bits_nr * sizeof(struct block_info));
3457         if (!bits) {
3458                 perror("malloc");
3459                 exit(1);
3460         }
3461
3462         add_root_to_pending(root->fs_info->tree_root->node, bits, bits_nr,
3463                             &extent_cache, &pending, &seen, &reada, &nodes,
3464                             &root->fs_info->tree_root->root_key);
3465
3466         add_root_to_pending(root->fs_info->chunk_root->node, bits, bits_nr,
3467                             &extent_cache, &pending, &seen, &reada, &nodes,
3468                             &root->fs_info->chunk_root->root_key);
3469
3470         btrfs_init_path(&path);
3471         key.offset = 0;
3472         key.objectid = 0;
3473         btrfs_set_key_type(&key, BTRFS_ROOT_ITEM_KEY);
3474         ret = btrfs_search_slot(NULL, root->fs_info->tree_root,
3475                                         &key, &path, 0, 0);
3476         BUG_ON(ret < 0);
3477         while(1) {
3478                 leaf = path.nodes[0];
3479                 slot = path.slots[0];
3480                 if (slot >= btrfs_header_nritems(path.nodes[0])) {
3481                         ret = btrfs_next_leaf(root, &path);
3482                         if (ret != 0)
3483                                 break;
3484                         leaf = path.nodes[0];
3485                         slot = path.slots[0];
3486                 }
3487                 btrfs_item_key_to_cpu(leaf, &found_key, path.slots[0]);
3488                 if (btrfs_key_type(&found_key) == BTRFS_ROOT_ITEM_KEY) {
3489                         unsigned long offset;
3490                         struct extent_buffer *buf;
3491
3492                         offset = btrfs_item_ptr_offset(leaf, path.slots[0]);
3493                         read_extent_buffer(leaf, &ri, offset, sizeof(ri));
3494                         buf = read_tree_block(root->fs_info->tree_root,
3495                                               btrfs_root_bytenr(&ri),
3496                                               btrfs_level_size(root,
3497                                                btrfs_root_level(&ri)), 0);
3498                         add_root_to_pending(buf, bits, bits_nr, &extent_cache,
3499                                             &pending, &seen, &reada, &nodes,
3500                                             &found_key);
3501                         free_extent_buffer(buf);
3502                 }
3503                 path.slots[0]++;
3504         }
3505         btrfs_release_path(root, &path);
3506         while(1) {
3507                 ret = run_next_block(root, bits, bits_nr, &last, &pending,
3508                                      &seen, &reada, &nodes, &extent_cache);
3509                 if (ret != 0)
3510                         break;
3511         }
3512         ret = check_extent_refs(trans, root, &extent_cache, repair);
3513
3514         if (repair) {
3515                 free_corrupt_blocks(root->fs_info);
3516                 root->fs_info->fsck_extent_cache = NULL;
3517                 root->fs_info->free_extent_hook = NULL;
3518                 root->fs_info->corrupt_blocks = NULL;
3519         }
3520
3521         return ret;
3522 }
3523
3524 static void print_usage(void)
3525 {
3526         fprintf(stderr, "usage: btrfsck dev\n");
3527         fprintf(stderr, "%s\n", BTRFS_BUILD_VERSION);
3528         exit(1);
3529 }
3530
3531 static struct option long_options[] = {
3532         { "super", 1, NULL, 's' },
3533         { "repair", 0, NULL, 0 },
3534         { "init-csum-tree", 0, NULL, 0 },
3535         { "init-extent-tree", 0, NULL, 0 },
3536         { 0, 0, 0, 0}
3537 };
3538
3539 int main(int ac, char **av)
3540 {
3541         struct cache_tree root_cache;
3542         struct btrfs_root *root;
3543         struct btrfs_fs_info *info;
3544         struct btrfs_trans_handle *trans = NULL;
3545         u64 bytenr = 0;
3546         int ret;
3547         int num;
3548         int repair = 0;
3549         int option_index = 0;
3550         int init_csum_tree = 0;
3551         int rw = 0;
3552
3553         while(1) {
3554                 int c;
3555                 c = getopt_long(ac, av, "as:", long_options,
3556                                 &option_index);
3557                 if (c < 0)
3558                         break;
3559                 switch(c) {
3560                         case 'a': /* ignored */ break;
3561                         case 's':
3562                                 num = atol(optarg);
3563                                 bytenr = btrfs_sb_offset(num);
3564                                 printf("using SB copy %d, bytenr %llu\n", num,
3565                                        (unsigned long long)bytenr);
3566                                 break;
3567                         case '?':
3568                                 print_usage();
3569                 }
3570                 if (option_index == 1) {
3571                         printf("enabling repair mode\n");
3572                         repair = 1;
3573                         rw = 1;
3574                 } else if (option_index == 2) {
3575                         printf("Creating a new CRC tree\n");
3576                         init_csum_tree = 1;
3577                         rw = 1;
3578                 }
3579
3580         }
3581         ac = ac - optind;
3582
3583         if (ac != 1)
3584                 print_usage();
3585
3586         radix_tree_init();
3587         cache_tree_init(&root_cache);
3588
3589         if((ret = check_mounted(av[optind])) < 0) {
3590                 fprintf(stderr, "Could not check mount status: %s\n", strerror(-ret));
3591                 return ret;
3592         } else if(ret) {
3593                 fprintf(stderr, "%s is currently mounted. Aborting.\n", av[optind]);
3594                 return -EBUSY;
3595         }
3596
3597         info = open_ctree_fs_info(av[optind], bytenr, rw, 1);
3598
3599         if (info == NULL)
3600                 return 1;
3601
3602         if (!extent_buffer_uptodate(info->tree_root->node) ||
3603             !extent_buffer_uptodate(info->dev_root->node) ||
3604             !extent_buffer_uptodate(info->extent_root->node) ||
3605             !extent_buffer_uptodate(info->chunk_root->node)) {
3606                 fprintf(stderr, "Critical roots corrupted, unable to fsck the FS\n");
3607                 return -EIO;
3608         }
3609
3610         root = info->fs_root;
3611
3612         fprintf(stderr, "checking extents\n");
3613         if (rw)
3614                 trans = btrfs_start_transaction(root, 1);
3615
3616         if (init_csum_tree) {
3617                 fprintf(stderr, "Reinit crc root\n");
3618                 ret = btrfs_fsck_reinit_root(trans, info->csum_root);
3619                 if (ret) {
3620                         fprintf(stderr, "crc root initialization failed\n");
3621                         return -EIO;
3622                 }
3623                 goto out;
3624         }
3625         ret = check_extents(trans, root, repair);
3626         if (ret)
3627                 fprintf(stderr, "Errors found in extent allocation tree\n");
3628
3629         fprintf(stderr, "checking fs roots\n");
3630         ret = check_fs_roots(root, &root_cache);
3631         if (ret)
3632                 goto out;
3633
3634         fprintf(stderr, "checking root refs\n");
3635         ret = check_root_refs(root, &root_cache);
3636 out:
3637         free_root_recs(&root_cache);
3638         if (rw) {
3639                 ret = btrfs_commit_transaction(trans, root);
3640                 if (ret)
3641                         exit(1);
3642         }
3643         close_ctree(root);
3644
3645         if (found_old_backref) { /*
3646                  * there was a disk format change when mixed
3647                  * backref was in testing tree. The old format
3648                  * existed about one week.
3649                  */
3650                 printf("\n * Found old mixed backref format. "
3651                        "The old format is not supported! *"
3652                        "\n * Please mount the FS in readonly mode, "
3653                        "backup data and re-format the FS. *\n\n");
3654                 ret = 1;
3655         }
3656         printf("found %llu bytes used err is %d\n",
3657                (unsigned long long)bytes_used, ret);
3658         printf("total csum bytes: %llu\n",(unsigned long long)total_csum_bytes);
3659         printf("total tree bytes: %llu\n",
3660                (unsigned long long)total_btree_bytes);
3661         printf("total fs tree bytes: %llu\n",
3662                (unsigned long long)total_fs_tree_bytes);
3663         printf("btree space waste bytes: %llu\n",
3664                (unsigned long long)btree_space_waste);
3665         printf("file data blocks allocated: %llu\n referenced %llu\n",
3666                 (unsigned long long)data_bytes_allocated,
3667                 (unsigned long long)data_bytes_referenced);
3668         printf("%s\n", BTRFS_BUILD_VERSION);
3669         return ret;
3670 }