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