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