2 * Copyright (C) 2007 Oracle. All rights reserved.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public
6 * License v2 as published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
13 * You should have received a copy of the GNU General Public
14 * License along with this program; if not, write to the
15 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16 * Boston, MA 021110-1307, USA.
19 #define _XOPEN_SOURCE 500
24 #include "kerncompat.h"
27 #include "print-tree.h"
28 #include "transaction.h"
32 static u64 bytes_used
= 0;
33 static u64 total_csum_bytes
= 0;
34 static u64 total_btree_bytes
= 0;
35 static u64 total_fs_tree_bytes
= 0;
36 static u64 btree_space_waste
= 0;
37 static u64 data_bytes_allocated
= 0;
38 static u64 data_bytes_referenced
= 0;
39 static int found_old_backref
= 0;
41 struct extent_backref
{
42 struct list_head list
;
43 unsigned int is_data
:1;
44 unsigned int found_extent_tree
:1;
45 unsigned int full_backref
:1;
46 unsigned int found_ref
:1;
50 struct extent_backref node
;
62 struct extent_backref node
;
69 struct extent_record
{
70 struct list_head backrefs
;
71 struct cache_extent cache
;
72 struct btrfs_disk_key parent_key
;
77 unsigned int content_checked
:1;
78 unsigned int owner_ref_checked
:1;
79 unsigned int is_root
:1;
82 struct inode_backref
{
83 struct list_head list
;
84 unsigned int found_dir_item
:1;
85 unsigned int found_dir_index
:1;
86 unsigned int found_inode_ref
:1;
87 unsigned int filetype
:8;
95 #define REF_ERR_NO_DIR_ITEM (1 << 0)
96 #define REF_ERR_NO_DIR_INDEX (1 << 1)
97 #define REF_ERR_NO_INODE_REF (1 << 2)
98 #define REF_ERR_DUP_DIR_ITEM (1 << 3)
99 #define REF_ERR_DUP_DIR_INDEX (1 << 4)
100 #define REF_ERR_DUP_INODE_REF (1 << 5)
101 #define REF_ERR_INDEX_UNMATCH (1 << 6)
102 #define REF_ERR_FILETYPE_UNMATCH (1 << 7)
103 #define REF_ERR_NAME_TOO_LONG (1 << 8) // 100
104 #define REF_ERR_NO_ROOT_REF (1 << 9)
105 #define REF_ERR_NO_ROOT_BACKREF (1 << 10)
106 #define REF_ERR_DUP_ROOT_REF (1 << 11)
107 #define REF_ERR_DUP_ROOT_BACKREF (1 << 12)
109 struct inode_record
{
110 struct list_head backrefs
;
111 unsigned int checked
:1;
112 unsigned int merging
:1;
113 unsigned int found_inode_item
:1;
114 unsigned int found_dir_item
:1;
115 unsigned int found_file_extent
:1;
116 unsigned int found_csum_item
:1;
117 unsigned int some_csum_missing
:1;
118 unsigned int nodatasum
:1;
131 u64 first_extent_gap
;
136 #define I_ERR_NO_INODE_ITEM (1 << 0)
137 #define I_ERR_NO_ORPHAN_ITEM (1 << 1)
138 #define I_ERR_DUP_INODE_ITEM (1 << 2)
139 #define I_ERR_DUP_DIR_INDEX (1 << 3)
140 #define I_ERR_ODD_DIR_ITEM (1 << 4)
141 #define I_ERR_ODD_FILE_EXTENT (1 << 5)
142 #define I_ERR_BAD_FILE_EXTENT (1 << 6)
143 #define I_ERR_FILE_EXTENT_OVERLAP (1 << 7)
144 #define I_ERR_FILE_EXTENT_DISCOUNT (1 << 8) // 100
145 #define I_ERR_DIR_ISIZE_WRONG (1 << 9)
146 #define I_ERR_FILE_NBYTES_WRONG (1 << 10) // 400
147 #define I_ERR_ODD_CSUM_ITEM (1 << 11)
148 #define I_ERR_SOME_CSUM_MISSING (1 << 12)
149 #define I_ERR_LINK_COUNT_WRONG (1 << 13)
151 struct root_backref
{
152 struct list_head list
;
153 unsigned int found_dir_item
:1;
154 unsigned int found_dir_index
:1;
155 unsigned int found_back_ref
:1;
156 unsigned int found_forward_ref
:1;
157 unsigned int reachable
:1;
167 struct list_head backrefs
;
168 struct cache_extent cache
;
169 unsigned int found_root_item
:1;
175 struct cache_extent cache
;
180 struct cache_extent cache
;
181 struct cache_tree root_cache
;
182 struct cache_tree inode_cache
;
183 struct inode_record
*current
;
192 struct walk_control
{
193 struct cache_tree shared
;
194 struct shared_node
*nodes
[BTRFS_MAX_LEVEL
];
199 static u8
imode_to_type(u32 imode
)
202 static unsigned char btrfs_type_by_mode
[S_IFMT
>> S_SHIFT
] = {
203 [S_IFREG
>> S_SHIFT
] = BTRFS_FT_REG_FILE
,
204 [S_IFDIR
>> S_SHIFT
] = BTRFS_FT_DIR
,
205 [S_IFCHR
>> S_SHIFT
] = BTRFS_FT_CHRDEV
,
206 [S_IFBLK
>> S_SHIFT
] = BTRFS_FT_BLKDEV
,
207 [S_IFIFO
>> S_SHIFT
] = BTRFS_FT_FIFO
,
208 [S_IFSOCK
>> S_SHIFT
] = BTRFS_FT_SOCK
,
209 [S_IFLNK
>> S_SHIFT
] = BTRFS_FT_SYMLINK
,
212 return btrfs_type_by_mode
[(imode
& S_IFMT
) >> S_SHIFT
];
216 static struct inode_record
*clone_inode_rec(struct inode_record
*orig_rec
)
218 struct inode_record
*rec
;
219 struct inode_backref
*backref
;
220 struct inode_backref
*orig
;
223 rec
= malloc(sizeof(*rec
));
224 memcpy(rec
, orig_rec
, sizeof(*rec
));
226 INIT_LIST_HEAD(&rec
->backrefs
);
228 list_for_each_entry(orig
, &orig_rec
->backrefs
, list
) {
229 size
= sizeof(*orig
) + orig
->namelen
+ 1;
230 backref
= malloc(size
);
231 memcpy(backref
, orig
, size
);
232 list_add_tail(&backref
->list
, &rec
->backrefs
);
237 static struct inode_record
*get_inode_rec(struct cache_tree
*inode_cache
,
240 struct ptr_node
*node
;
241 struct cache_extent
*cache
;
242 struct inode_record
*rec
= NULL
;
245 cache
= find_cache_extent(inode_cache
, ino
, 1);
247 node
= container_of(cache
, struct ptr_node
, cache
);
249 if (mod
&& rec
->refs
> 1) {
250 node
->data
= clone_inode_rec(rec
);
255 rec
= calloc(1, sizeof(*rec
));
257 rec
->extent_start
= (u64
)-1;
258 rec
->first_extent_gap
= (u64
)-1;
260 INIT_LIST_HEAD(&rec
->backrefs
);
262 node
= malloc(sizeof(*node
));
263 node
->cache
.start
= ino
;
264 node
->cache
.size
= 1;
267 ret
= insert_existing_cache_extent(inode_cache
, &node
->cache
);
273 static void free_inode_rec(struct inode_record
*rec
)
275 struct inode_backref
*backref
;
280 while (!list_empty(&rec
->backrefs
)) {
281 backref
= list_entry(rec
->backrefs
.next
,
282 struct inode_backref
, list
);
283 list_del(&backref
->list
);
289 static int can_free_inode_rec(struct inode_record
*rec
)
291 if (!rec
->errors
&& rec
->checked
&& rec
->found_inode_item
&&
292 rec
->nlink
== rec
->found_link
&& list_empty(&rec
->backrefs
))
297 static void maybe_free_inode_rec(struct cache_tree
*inode_cache
,
298 struct inode_record
*rec
)
300 struct cache_extent
*cache
;
301 struct inode_backref
*tmp
, *backref
;
302 struct ptr_node
*node
;
303 unsigned char filetype
;
305 if (!rec
->found_inode_item
)
308 filetype
= imode_to_type(rec
->imode
);
309 list_for_each_entry_safe(backref
, tmp
, &rec
->backrefs
, list
) {
310 if (backref
->found_dir_item
&& backref
->found_dir_index
) {
311 if (backref
->filetype
!= filetype
)
312 backref
->errors
|= REF_ERR_FILETYPE_UNMATCH
;
313 if (!backref
->errors
&& backref
->found_inode_ref
) {
314 list_del(&backref
->list
);
320 if (!rec
->checked
|| rec
->merging
)
323 if (S_ISDIR(rec
->imode
)) {
324 if (rec
->found_size
!= rec
->isize
)
325 rec
->errors
|= I_ERR_DIR_ISIZE_WRONG
;
326 if (rec
->found_file_extent
)
327 rec
->errors
|= I_ERR_ODD_FILE_EXTENT
;
328 } else if (S_ISREG(rec
->imode
) || S_ISLNK(rec
->imode
)) {
329 if (rec
->found_dir_item
)
330 rec
->errors
|= I_ERR_ODD_DIR_ITEM
;
331 if (rec
->found_size
!= rec
->nbytes
)
332 rec
->errors
|= I_ERR_FILE_NBYTES_WRONG
;
333 if (rec
->extent_start
== (u64
)-1 || rec
->extent_start
> 0)
334 rec
->first_extent_gap
= 0;
335 if (rec
->nlink
> 0 && (rec
->extent_end
< rec
->isize
||
336 rec
->first_extent_gap
< rec
->isize
))
337 rec
->errors
|= I_ERR_FILE_EXTENT_DISCOUNT
;
340 if (S_ISREG(rec
->imode
) || S_ISLNK(rec
->imode
)) {
341 if (rec
->found_csum_item
&& rec
->nodatasum
)
342 rec
->errors
|= I_ERR_ODD_CSUM_ITEM
;
343 if (rec
->some_csum_missing
&& !rec
->nodatasum
)
344 rec
->errors
|= I_ERR_SOME_CSUM_MISSING
;
347 BUG_ON(rec
->refs
!= 1);
348 if (can_free_inode_rec(rec
)) {
349 cache
= find_cache_extent(inode_cache
, rec
->ino
, 1);
350 node
= container_of(cache
, struct ptr_node
, cache
);
351 BUG_ON(node
->data
!= rec
);
352 remove_cache_extent(inode_cache
, &node
->cache
);
358 static int check_orphan_item(struct btrfs_root
*root
, u64 ino
)
360 struct btrfs_path path
;
361 struct btrfs_key key
;
364 key
.objectid
= BTRFS_ORPHAN_OBJECTID
;
365 key
.type
= BTRFS_ORPHAN_ITEM_KEY
;
368 btrfs_init_path(&path
);
369 ret
= btrfs_search_slot(NULL
, root
, &key
, &path
, 0, 0);
370 btrfs_release_path(root
, &path
);
376 static int process_inode_item(struct extent_buffer
*eb
,
377 int slot
, struct btrfs_key
*key
,
378 struct shared_node
*active_node
)
380 struct inode_record
*rec
;
381 struct btrfs_inode_item
*item
;
383 rec
= active_node
->current
;
384 BUG_ON(rec
->ino
!= key
->objectid
|| rec
->refs
> 1);
385 if (rec
->found_inode_item
) {
386 rec
->errors
|= I_ERR_DUP_INODE_ITEM
;
389 item
= btrfs_item_ptr(eb
, slot
, struct btrfs_inode_item
);
390 rec
->nlink
= btrfs_inode_nlink(eb
, item
);
391 rec
->isize
= btrfs_inode_size(eb
, item
);
392 rec
->nbytes
= btrfs_inode_nbytes(eb
, item
);
393 rec
->imode
= btrfs_inode_mode(eb
, item
);
394 if (btrfs_inode_flags(eb
, item
) & BTRFS_INODE_NODATASUM
)
396 rec
->found_inode_item
= 1;
398 rec
->errors
|= I_ERR_NO_ORPHAN_ITEM
;
399 maybe_free_inode_rec(&active_node
->inode_cache
, rec
);
403 static struct inode_backref
*get_inode_backref(struct inode_record
*rec
,
405 int namelen
, u64 dir
)
407 struct inode_backref
*backref
;
409 list_for_each_entry(backref
, &rec
->backrefs
, list
) {
410 if (backref
->dir
!= dir
|| backref
->namelen
!= namelen
)
412 if (memcmp(name
, backref
->name
, namelen
))
417 backref
= malloc(sizeof(*backref
) + namelen
+ 1);
418 memset(backref
, 0, sizeof(*backref
));
420 backref
->namelen
= namelen
;
421 memcpy(backref
->name
, name
, namelen
);
422 backref
->name
[namelen
] = '\0';
423 list_add_tail(&backref
->list
, &rec
->backrefs
);
428 static int add_inode_backref(struct cache_tree
*inode_cache
,
429 u64 ino
, u64 dir
, u64 index
,
430 const char *name
, int namelen
,
431 int filetype
, int itemtype
, int errors
)
433 struct inode_record
*rec
;
434 struct inode_backref
*backref
;
436 rec
= get_inode_rec(inode_cache
, ino
, 1);
437 backref
= get_inode_backref(rec
, name
, namelen
, dir
);
439 backref
->errors
|= errors
;
440 if (itemtype
== BTRFS_DIR_INDEX_KEY
) {
441 if (backref
->found_dir_index
)
442 backref
->errors
|= REF_ERR_DUP_DIR_INDEX
;
443 if (backref
->found_inode_ref
&& backref
->index
!= index
)
444 backref
->errors
|= REF_ERR_INDEX_UNMATCH
;
445 if (backref
->found_dir_item
&& backref
->filetype
!= filetype
)
446 backref
->errors
|= REF_ERR_FILETYPE_UNMATCH
;
448 backref
->index
= index
;
449 backref
->filetype
= filetype
;
450 backref
->found_dir_index
= 1;
451 } else if (itemtype
== BTRFS_DIR_ITEM_KEY
) {
452 if (backref
->found_dir_item
)
453 backref
->errors
|= REF_ERR_DUP_DIR_ITEM
;
454 if (backref
->found_dir_index
&& backref
->filetype
!= filetype
)
455 backref
->errors
|= REF_ERR_FILETYPE_UNMATCH
;
457 backref
->filetype
= filetype
;
458 backref
->found_dir_item
= 1;
459 } else if (itemtype
== BTRFS_INODE_REF_KEY
) {
460 if (backref
->found_inode_ref
)
461 backref
->errors
|= REF_ERR_DUP_INODE_REF
;
462 if (backref
->found_dir_index
&& backref
->index
!= index
)
463 backref
->errors
|= REF_ERR_INDEX_UNMATCH
;
465 backref
->index
= index
;
466 backref
->found_inode_ref
= 1;
471 maybe_free_inode_rec(inode_cache
, rec
);
475 static int merge_inode_recs(struct inode_record
*src
, struct inode_record
*dst
,
476 struct cache_tree
*dst_cache
)
478 struct inode_backref
*backref
;
481 list_for_each_entry(backref
, &src
->backrefs
, list
) {
482 if (backref
->found_dir_index
) {
483 add_inode_backref(dst_cache
, dst
->ino
, backref
->dir
,
484 backref
->index
, backref
->name
,
485 backref
->namelen
, backref
->filetype
,
486 BTRFS_DIR_INDEX_KEY
, backref
->errors
);
488 if (backref
->found_dir_item
) {
489 add_inode_backref(dst_cache
, dst
->ino
,
490 backref
->dir
, 0, backref
->name
,
491 backref
->namelen
, backref
->filetype
,
492 BTRFS_DIR_ITEM_KEY
, backref
->errors
);
494 if (backref
->found_inode_ref
) {
495 add_inode_backref(dst_cache
, dst
->ino
,
496 backref
->dir
, backref
->index
,
497 backref
->name
, backref
->namelen
, 0,
498 BTRFS_INODE_REF_KEY
, backref
->errors
);
502 if (src
->found_dir_item
)
503 dst
->found_dir_item
= 1;
504 if (src
->found_file_extent
)
505 dst
->found_file_extent
= 1;
506 if (src
->found_csum_item
)
507 dst
->found_csum_item
= 1;
508 if (src
->some_csum_missing
)
509 dst
->some_csum_missing
= 1;
510 if (dst
->first_extent_gap
> src
->first_extent_gap
)
511 dst
->first_extent_gap
= src
->first_extent_gap
;
513 dst
->found_size
+= src
->found_size
;
514 if (src
->extent_start
!= (u64
)-1) {
515 if (dst
->extent_start
== (u64
)-1) {
516 dst
->extent_start
= src
->extent_start
;
517 dst
->extent_end
= src
->extent_end
;
519 if (dst
->extent_end
> src
->extent_start
)
520 dst
->errors
|= I_ERR_FILE_EXTENT_OVERLAP
;
521 else if (dst
->extent_end
< src
->extent_start
&&
522 dst
->extent_end
< dst
->first_extent_gap
)
523 dst
->first_extent_gap
= dst
->extent_end
;
524 if (dst
->extent_end
< src
->extent_end
)
525 dst
->extent_end
= src
->extent_end
;
529 dst
->errors
|= src
->errors
;
530 if (src
->found_inode_item
) {
531 if (!dst
->found_inode_item
) {
532 dst
->nlink
= src
->nlink
;
533 dst
->isize
= src
->isize
;
534 dst
->nbytes
= src
->nbytes
;
535 dst
->imode
= src
->imode
;
536 dst
->nodatasum
= src
->nodatasum
;
537 dst
->found_inode_item
= 1;
539 dst
->errors
|= I_ERR_DUP_INODE_ITEM
;
547 static int splice_shared_node(struct shared_node
*src_node
,
548 struct shared_node
*dst_node
)
550 struct cache_extent
*cache
;
551 struct ptr_node
*node
, *ins
;
552 struct cache_tree
*src
, *dst
;
553 struct inode_record
*rec
, *conflict
;
558 if (--src_node
->refs
== 0)
560 if (src_node
->current
)
561 current_ino
= src_node
->current
->ino
;
563 src
= &src_node
->root_cache
;
564 dst
= &dst_node
->root_cache
;
566 cache
= find_first_cache_extent(src
, 0);
568 node
= container_of(cache
, struct ptr_node
, cache
);
570 cache
= next_cache_extent(cache
);
573 remove_cache_extent(src
, &node
->cache
);
576 ins
= malloc(sizeof(*ins
));
577 ins
->cache
.start
= node
->cache
.start
;
578 ins
->cache
.size
= node
->cache
.size
;
582 ret
= insert_existing_cache_extent(dst
, &ins
->cache
);
583 if (ret
== -EEXIST
) {
584 WARN_ON(src
== &src_node
->root_cache
);
585 conflict
= get_inode_rec(dst
, rec
->ino
, 1);
586 merge_inode_recs(rec
, conflict
, dst
);
588 conflict
->checked
= 1;
589 if (dst_node
->current
== conflict
)
590 dst_node
->current
= NULL
;
592 maybe_free_inode_rec(dst
, conflict
);
600 if (src
== &src_node
->root_cache
) {
601 src
= &src_node
->inode_cache
;
602 dst
= &dst_node
->inode_cache
;
606 if (current_ino
> 0 && (!dst_node
->current
||
607 current_ino
> dst_node
->current
->ino
)) {
608 if (dst_node
->current
) {
609 dst_node
->current
->checked
= 1;
610 maybe_free_inode_rec(dst
, dst_node
->current
);
612 dst_node
->current
= get_inode_rec(dst
, current_ino
, 1);
617 static void free_inode_recs(struct cache_tree
*inode_cache
)
619 struct cache_extent
*cache
;
620 struct ptr_node
*node
;
621 struct inode_record
*rec
;
624 cache
= find_first_cache_extent(inode_cache
, 0);
627 node
= container_of(cache
, struct ptr_node
, cache
);
629 remove_cache_extent(inode_cache
, &node
->cache
);
635 static struct shared_node
*find_shared_node(struct cache_tree
*shared
,
638 struct cache_extent
*cache
;
639 struct shared_node
*node
;
641 cache
= find_cache_extent(shared
, bytenr
, 1);
643 node
= container_of(cache
, struct shared_node
, cache
);
649 static int add_shared_node(struct cache_tree
*shared
, u64 bytenr
, u32 refs
)
652 struct shared_node
*node
;
654 node
= calloc(1, sizeof(*node
));
655 node
->cache
.start
= bytenr
;
656 node
->cache
.size
= 1;
657 cache_tree_init(&node
->root_cache
);
658 cache_tree_init(&node
->inode_cache
);
661 ret
= insert_existing_cache_extent(shared
, &node
->cache
);
666 static int enter_shared_node(struct btrfs_root
*root
, u64 bytenr
, u32 refs
,
667 struct walk_control
*wc
, int level
)
669 struct shared_node
*node
;
670 struct shared_node
*dest
;
672 if (level
== wc
->active_node
)
675 BUG_ON(wc
->active_node
<= level
);
676 node
= find_shared_node(&wc
->shared
, bytenr
);
678 add_shared_node(&wc
->shared
, bytenr
, refs
);
679 node
= find_shared_node(&wc
->shared
, bytenr
);
680 wc
->nodes
[level
] = node
;
681 wc
->active_node
= level
;
685 if (wc
->root_level
== wc
->active_node
&&
686 btrfs_root_refs(&root
->root_item
) == 0) {
687 if (--node
->refs
== 0) {
688 free_inode_recs(&node
->root_cache
);
689 free_inode_recs(&node
->inode_cache
);
690 remove_cache_extent(&wc
->shared
, &node
->cache
);
696 dest
= wc
->nodes
[wc
->active_node
];
697 splice_shared_node(node
, dest
);
698 if (node
->refs
== 0) {
699 remove_cache_extent(&wc
->shared
, &node
->cache
);
705 static int leave_shared_node(struct btrfs_root
*root
,
706 struct walk_control
*wc
, int level
)
708 struct shared_node
*node
;
709 struct shared_node
*dest
;
712 if (level
== wc
->root_level
)
715 for (i
= level
+ 1; i
< BTRFS_MAX_LEVEL
; i
++) {
719 BUG_ON(i
>= BTRFS_MAX_LEVEL
);
721 node
= wc
->nodes
[wc
->active_node
];
722 wc
->nodes
[wc
->active_node
] = NULL
;
725 dest
= wc
->nodes
[wc
->active_node
];
726 if (wc
->active_node
< wc
->root_level
||
727 btrfs_root_refs(&root
->root_item
) > 0) {
728 BUG_ON(node
->refs
<= 1);
729 splice_shared_node(node
, dest
);
731 BUG_ON(node
->refs
< 2);
737 static int process_dir_item(struct extent_buffer
*eb
,
738 int slot
, struct btrfs_key
*key
,
739 struct shared_node
*active_node
)
749 struct btrfs_dir_item
*di
;
750 struct inode_record
*rec
;
751 struct cache_tree
*root_cache
;
752 struct cache_tree
*inode_cache
;
753 struct btrfs_key location
;
754 char namebuf
[BTRFS_NAME_LEN
];
756 root_cache
= &active_node
->root_cache
;
757 inode_cache
= &active_node
->inode_cache
;
758 rec
= active_node
->current
;
759 rec
->found_dir_item
= 1;
761 di
= btrfs_item_ptr(eb
, slot
, struct btrfs_dir_item
);
762 total
= btrfs_item_size_nr(eb
, slot
);
763 while (cur
< total
) {
765 btrfs_dir_item_key_to_cpu(eb
, di
, &location
);
766 name_len
= btrfs_dir_name_len(eb
, di
);
767 data_len
= btrfs_dir_data_len(eb
, di
);
768 filetype
= btrfs_dir_type(eb
, di
);
770 rec
->found_size
+= name_len
;
771 if (name_len
<= BTRFS_NAME_LEN
) {
775 len
= BTRFS_NAME_LEN
;
776 error
= REF_ERR_NAME_TOO_LONG
;
778 read_extent_buffer(eb
, namebuf
, (unsigned long)(di
+ 1), len
);
780 if (location
.type
== BTRFS_INODE_ITEM_KEY
) {
781 add_inode_backref(inode_cache
, location
.objectid
,
782 key
->objectid
, key
->offset
, namebuf
,
783 len
, filetype
, key
->type
, error
);
784 } else if (location
.type
== BTRFS_ROOT_ITEM_KEY
) {
785 add_inode_backref(root_cache
, location
.objectid
,
786 key
->objectid
, key
->offset
, namebuf
,
787 len
, filetype
, key
->type
, error
);
789 fprintf(stderr
, "warning line %d\n", __LINE__
);
792 len
= sizeof(*di
) + name_len
+ data_len
;
793 di
= (struct btrfs_dir_item
*)((char *)di
+ len
);
796 if (key
->type
== BTRFS_DIR_INDEX_KEY
&& nritems
> 1)
797 rec
->errors
|= I_ERR_DUP_DIR_INDEX
;
802 static int process_inode_ref(struct extent_buffer
*eb
,
803 int slot
, struct btrfs_key
*key
,
804 struct shared_node
*active_node
)
812 struct cache_tree
*inode_cache
;
813 struct btrfs_inode_ref
*ref
;
814 char namebuf
[BTRFS_NAME_LEN
];
816 inode_cache
= &active_node
->inode_cache
;
818 ref
= btrfs_item_ptr(eb
, slot
, struct btrfs_inode_ref
);
819 total
= btrfs_item_size_nr(eb
, slot
);
820 while (cur
< total
) {
821 name_len
= btrfs_inode_ref_name_len(eb
, ref
);
822 index
= btrfs_inode_ref_index(eb
, ref
);
823 if (name_len
<= BTRFS_NAME_LEN
) {
827 len
= BTRFS_NAME_LEN
;
828 error
= REF_ERR_NAME_TOO_LONG
;
830 read_extent_buffer(eb
, namebuf
, (unsigned long)(ref
+ 1), len
);
831 add_inode_backref(inode_cache
, key
->objectid
, key
->offset
,
832 index
, namebuf
, len
, 0, key
->type
, error
);
834 len
= sizeof(*ref
) + name_len
;
835 ref
= (struct btrfs_inode_ref
*)((char *)ref
+ len
);
841 static u64
count_csum_range(struct btrfs_root
*root
, u64 start
, u64 len
)
843 struct btrfs_key key
;
844 struct btrfs_path path
;
845 struct extent_buffer
*leaf
;
850 u16 csum_size
= btrfs_super_csum_size(&root
->fs_info
->super_copy
);
852 btrfs_init_path(&path
);
854 key
.objectid
= BTRFS_EXTENT_CSUM_OBJECTID
;
856 key
.type
= BTRFS_EXTENT_CSUM_KEY
;
858 ret
= btrfs_search_slot(NULL
, root
->fs_info
->csum_root
,
861 if (ret
> 0 && path
.slots
[0] > 0) {
862 leaf
= path
.nodes
[0];
863 btrfs_item_key_to_cpu(leaf
, &key
, path
.slots
[0] - 1);
864 if (key
.objectid
== BTRFS_EXTENT_CSUM_OBJECTID
&&
865 key
.type
== BTRFS_EXTENT_CSUM_KEY
)
870 leaf
= path
.nodes
[0];
871 if (path
.slots
[0] >= btrfs_header_nritems(leaf
)) {
872 ret
= btrfs_next_leaf(root
->fs_info
->csum_root
, &path
);
876 leaf
= path
.nodes
[0];
879 btrfs_item_key_to_cpu(leaf
, &key
, path
.slots
[0]);
880 if (key
.objectid
!= BTRFS_EXTENT_CSUM_OBJECTID
||
881 key
.type
!= BTRFS_EXTENT_CSUM_KEY
)
884 btrfs_item_key_to_cpu(leaf
, &key
, path
.slots
[0]);
885 if (key
.offset
>= start
+ len
)
888 if (key
.offset
> start
)
891 size
= btrfs_item_size_nr(leaf
, path
.slots
[0]);
892 csum_end
= key
.offset
+ (size
/ csum_size
) * root
->sectorsize
;
893 if (csum_end
> start
) {
894 size
= min(csum_end
- start
, len
);
902 btrfs_release_path(root
->fs_info
->csum_root
, &path
);
906 static int process_file_extent(struct btrfs_root
*root
,
907 struct extent_buffer
*eb
,
908 int slot
, struct btrfs_key
*key
,
909 struct shared_node
*active_node
)
911 struct inode_record
*rec
;
912 struct btrfs_file_extent_item
*fi
;
915 u64 extent_offset
= 0;
916 u64 mask
= root
->sectorsize
- 1;
919 rec
= active_node
->current
;
920 BUG_ON(rec
->ino
!= key
->objectid
|| rec
->refs
> 1);
921 rec
->found_file_extent
= 1;
923 if (rec
->extent_start
== (u64
)-1) {
924 rec
->extent_start
= key
->offset
;
925 rec
->extent_end
= key
->offset
;
928 if (rec
->extent_end
> key
->offset
)
929 rec
->errors
|= I_ERR_FILE_EXTENT_OVERLAP
;
930 else if (rec
->extent_end
< key
->offset
&&
931 rec
->extent_end
< rec
->first_extent_gap
)
932 rec
->first_extent_gap
= rec
->extent_end
;
934 fi
= btrfs_item_ptr(eb
, slot
, struct btrfs_file_extent_item
);
935 extent_type
= btrfs_file_extent_type(eb
, fi
);
937 if (extent_type
== BTRFS_FILE_EXTENT_INLINE
) {
938 num_bytes
= btrfs_file_extent_inline_len(eb
, fi
);
940 rec
->errors
|= I_ERR_BAD_FILE_EXTENT
;
941 rec
->found_size
+= num_bytes
;
942 num_bytes
= (num_bytes
+ mask
) & ~mask
;
943 } else if (extent_type
== BTRFS_FILE_EXTENT_REG
||
944 extent_type
== BTRFS_FILE_EXTENT_PREALLOC
) {
945 num_bytes
= btrfs_file_extent_num_bytes(eb
, fi
);
946 disk_bytenr
= btrfs_file_extent_disk_bytenr(eb
, fi
);
947 extent_offset
= btrfs_file_extent_offset(eb
, fi
);
948 if (num_bytes
== 0 || (num_bytes
& mask
))
949 rec
->errors
|= I_ERR_BAD_FILE_EXTENT
;
950 if (num_bytes
+ extent_offset
>
951 btrfs_file_extent_ram_bytes(eb
, fi
))
952 rec
->errors
|= I_ERR_BAD_FILE_EXTENT
;
953 if (extent_type
== BTRFS_FILE_EXTENT_PREALLOC
&&
954 (btrfs_file_extent_compression(eb
, fi
) ||
955 btrfs_file_extent_encryption(eb
, fi
) ||
956 btrfs_file_extent_other_encoding(eb
, fi
)))
957 rec
->errors
|= I_ERR_BAD_FILE_EXTENT
;
959 rec
->found_size
+= num_bytes
;
961 rec
->errors
|= I_ERR_BAD_FILE_EXTENT
;
963 rec
->extent_end
= key
->offset
+ num_bytes
;
965 if (disk_bytenr
> 0) {
967 if (btrfs_file_extent_compression(eb
, fi
))
968 num_bytes
= btrfs_file_extent_disk_num_bytes(eb
, fi
);
970 disk_bytenr
+= extent_offset
;
972 found
= count_csum_range(root
, disk_bytenr
, num_bytes
);
973 if (extent_type
== BTRFS_FILE_EXTENT_REG
) {
975 rec
->found_csum_item
= 1;
976 if (found
< num_bytes
)
977 rec
->some_csum_missing
= 1;
978 } else if (extent_type
== BTRFS_FILE_EXTENT_PREALLOC
) {
980 rec
->errors
|= I_ERR_ODD_CSUM_ITEM
;
986 static int process_one_leaf(struct btrfs_root
*root
, struct extent_buffer
*eb
,
987 struct walk_control
*wc
)
989 struct btrfs_key key
;
993 struct cache_tree
*inode_cache
;
994 struct shared_node
*active_node
;
996 if (wc
->root_level
== wc
->active_node
&&
997 btrfs_root_refs(&root
->root_item
) == 0)
1000 active_node
= wc
->nodes
[wc
->active_node
];
1001 inode_cache
= &active_node
->inode_cache
;
1002 nritems
= btrfs_header_nritems(eb
);
1003 for (i
= 0; i
< nritems
; i
++) {
1004 btrfs_item_key_to_cpu(eb
, &key
, i
);
1005 if (active_node
->current
== NULL
||
1006 active_node
->current
->ino
< key
.objectid
) {
1007 if (active_node
->current
) {
1008 active_node
->current
->checked
= 1;
1009 maybe_free_inode_rec(inode_cache
,
1010 active_node
->current
);
1012 active_node
->current
= get_inode_rec(inode_cache
,
1016 case BTRFS_DIR_ITEM_KEY
:
1017 case BTRFS_DIR_INDEX_KEY
:
1018 ret
= process_dir_item(eb
, i
, &key
, active_node
);
1020 case BTRFS_INODE_REF_KEY
:
1021 ret
= process_inode_ref(eb
, i
, &key
, active_node
);
1023 case BTRFS_INODE_ITEM_KEY
:
1024 ret
= process_inode_item(eb
, i
, &key
, active_node
);
1026 case BTRFS_EXTENT_DATA_KEY
:
1027 ret
= process_file_extent(root
, eb
, i
, &key
,
1037 static void reada_walk_down(struct btrfs_root
*root
,
1038 struct extent_buffer
*node
, int slot
)
1048 level
= btrfs_header_level(node
);
1052 nritems
= btrfs_header_nritems(node
);
1053 blocksize
= btrfs_level_size(root
, level
- 1);
1054 for (i
= slot
; i
< nritems
; i
++) {
1055 bytenr
= btrfs_node_blockptr(node
, i
);
1056 ptr_gen
= btrfs_node_ptr_generation(node
, i
);
1057 ret
= readahead_tree_block(root
, bytenr
, blocksize
, ptr_gen
);
1063 static int walk_down_tree(struct btrfs_root
*root
, struct btrfs_path
*path
,
1064 struct walk_control
*wc
, int *level
)
1068 struct extent_buffer
*next
;
1069 struct extent_buffer
*cur
;
1074 WARN_ON(*level
< 0);
1075 WARN_ON(*level
>= BTRFS_MAX_LEVEL
);
1076 ret
= btrfs_lookup_extent_info(NULL
, root
,
1077 path
->nodes
[*level
]->start
,
1078 path
->nodes
[*level
]->len
, &refs
, NULL
);
1081 ret
= enter_shared_node(root
, path
->nodes
[*level
]->start
,
1087 while (*level
>= 0) {
1088 WARN_ON(*level
< 0);
1089 WARN_ON(*level
>= BTRFS_MAX_LEVEL
);
1090 cur
= path
->nodes
[*level
];
1092 if (btrfs_header_level(cur
) != *level
)
1095 if (path
->slots
[*level
] >= btrfs_header_nritems(cur
))
1098 ret
= process_one_leaf(root
, cur
, wc
);
1101 bytenr
= btrfs_node_blockptr(cur
, path
->slots
[*level
]);
1102 ptr_gen
= btrfs_node_ptr_generation(cur
, path
->slots
[*level
]);
1103 blocksize
= btrfs_level_size(root
, *level
- 1);
1104 ret
= btrfs_lookup_extent_info(NULL
, root
, bytenr
, blocksize
,
1109 ret
= enter_shared_node(root
, bytenr
, refs
,
1112 path
->slots
[*level
]++;
1117 next
= btrfs_find_tree_block(root
, bytenr
, blocksize
);
1118 if (!next
|| !btrfs_buffer_uptodate(next
, ptr_gen
)) {
1119 free_extent_buffer(next
);
1120 reada_walk_down(root
, cur
, path
->slots
[*level
]);
1121 next
= read_tree_block(root
, bytenr
, blocksize
,
1125 *level
= *level
- 1;
1126 free_extent_buffer(path
->nodes
[*level
]);
1127 path
->nodes
[*level
] = next
;
1128 path
->slots
[*level
] = 0;
1131 path
->slots
[*level
] = btrfs_header_nritems(path
->nodes
[*level
]);
1135 static int walk_up_tree(struct btrfs_root
*root
, struct btrfs_path
*path
,
1136 struct walk_control
*wc
, int *level
)
1139 struct extent_buffer
*leaf
;
1141 for (i
= *level
; i
< BTRFS_MAX_LEVEL
- 1 && path
->nodes
[i
]; i
++) {
1142 leaf
= path
->nodes
[i
];
1143 if (path
->slots
[i
] + 1 < btrfs_header_nritems(leaf
)) {
1148 free_extent_buffer(path
->nodes
[*level
]);
1149 path
->nodes
[*level
] = NULL
;
1150 BUG_ON(*level
> wc
->active_node
);
1151 if (*level
== wc
->active_node
)
1152 leave_shared_node(root
, wc
, *level
);
1159 static int check_root_dir(struct inode_record
*rec
)
1161 struct inode_backref
*backref
;
1164 if (!rec
->found_inode_item
|| rec
->errors
)
1166 if (rec
->nlink
!= 1 || rec
->found_link
!= 1)
1168 if (list_empty(&rec
->backrefs
))
1170 backref
= list_entry(rec
->backrefs
.next
, struct inode_backref
, list
);
1171 if (!backref
->found_inode_ref
)
1173 if (backref
->index
!= 0 || backref
->namelen
!= 2 ||
1174 memcmp(backref
->name
, "..", 2))
1176 if (backref
->found_dir_index
|| backref
->found_dir_item
)
1183 static int check_inode_recs(struct btrfs_root
*root
,
1184 struct cache_tree
*inode_cache
)
1186 struct cache_extent
*cache
;
1187 struct ptr_node
*node
;
1188 struct inode_record
*rec
;
1189 struct inode_backref
*backref
;
1192 u64 root_dirid
= btrfs_root_dirid(&root
->root_item
);
1194 if (btrfs_root_refs(&root
->root_item
) == 0) {
1195 if (!cache_tree_empty(inode_cache
))
1196 fprintf(stderr
, "warning line %d\n", __LINE__
);
1200 rec
= get_inode_rec(inode_cache
, root_dirid
, 0);
1202 ret
= check_root_dir(rec
);
1204 fprintf(stderr
, "root %llu root dir %llu error\n",
1205 (unsigned long long)root
->root_key
.objectid
,
1206 (unsigned long long)root_dirid
);
1210 fprintf(stderr
, "root %llu root dir %llu not found\n",
1211 (unsigned long long)root
->root_key
.objectid
,
1212 (unsigned long long)root_dirid
);
1216 cache
= find_first_cache_extent(inode_cache
, 0);
1219 node
= container_of(cache
, struct ptr_node
, cache
);
1221 remove_cache_extent(inode_cache
, &node
->cache
);
1223 if (rec
->ino
== root_dirid
||
1224 rec
->ino
== BTRFS_ORPHAN_OBJECTID
) {
1225 free_inode_rec(rec
);
1229 if (rec
->errors
& I_ERR_NO_ORPHAN_ITEM
) {
1230 ret
= check_orphan_item(root
, rec
->ino
);
1232 rec
->errors
&= ~I_ERR_NO_ORPHAN_ITEM
;
1233 if (can_free_inode_rec(rec
)) {
1234 free_inode_rec(rec
);
1240 if (!rec
->found_inode_item
)
1241 rec
->errors
|= I_ERR_NO_INODE_ITEM
;
1242 if (rec
->found_link
!= rec
->nlink
)
1243 rec
->errors
|= I_ERR_LINK_COUNT_WRONG
;
1244 fprintf(stderr
, "root %llu inode %llu errors %x\n",
1245 (unsigned long long) root
->root_key
.objectid
,
1246 (unsigned long long) rec
->ino
, rec
->errors
);
1247 list_for_each_entry(backref
, &rec
->backrefs
, list
) {
1248 if (!backref
->found_dir_item
)
1249 backref
->errors
|= REF_ERR_NO_DIR_ITEM
;
1250 if (!backref
->found_dir_index
)
1251 backref
->errors
|= REF_ERR_NO_DIR_INDEX
;
1252 if (!backref
->found_inode_ref
)
1253 backref
->errors
|= REF_ERR_NO_INODE_REF
;
1254 fprintf(stderr
, "\tunresolved ref dir %llu index %llu"
1255 " namelen %u name %s filetype %d error %x\n",
1256 (unsigned long long)backref
->dir
,
1257 (unsigned long long)backref
->index
,
1258 backref
->namelen
, backref
->name
,
1259 backref
->filetype
, backref
->errors
);
1261 free_inode_rec(rec
);
1263 return (error
> 0) ? -1 : 0;
1266 static struct root_record
*get_root_rec(struct cache_tree
*root_cache
,
1269 struct cache_extent
*cache
;
1270 struct root_record
*rec
= NULL
;
1273 cache
= find_cache_extent(root_cache
, objectid
, 1);
1275 rec
= container_of(cache
, struct root_record
, cache
);
1277 rec
= calloc(1, sizeof(*rec
));
1278 rec
->objectid
= objectid
;
1279 INIT_LIST_HEAD(&rec
->backrefs
);
1280 rec
->cache
.start
= objectid
;
1281 rec
->cache
.size
= 1;
1283 ret
= insert_existing_cache_extent(root_cache
, &rec
->cache
);
1289 static struct root_backref
*get_root_backref(struct root_record
*rec
,
1290 u64 ref_root
, u64 dir
, u64 index
,
1291 const char *name
, int namelen
)
1293 struct root_backref
*backref
;
1295 list_for_each_entry(backref
, &rec
->backrefs
, list
) {
1296 if (backref
->ref_root
!= ref_root
|| backref
->dir
!= dir
||
1297 backref
->namelen
!= namelen
)
1299 if (memcmp(name
, backref
->name
, namelen
))
1304 backref
= malloc(sizeof(*backref
) + namelen
+ 1);
1305 memset(backref
, 0, sizeof(*backref
));
1306 backref
->ref_root
= ref_root
;
1308 backref
->index
= index
;
1309 backref
->namelen
= namelen
;
1310 memcpy(backref
->name
, name
, namelen
);
1311 backref
->name
[namelen
] = '\0';
1312 list_add_tail(&backref
->list
, &rec
->backrefs
);
1316 static void free_root_recs(struct cache_tree
*root_cache
)
1318 struct cache_extent
*cache
;
1319 struct root_record
*rec
;
1320 struct root_backref
*backref
;
1323 cache
= find_first_cache_extent(root_cache
, 0);
1326 rec
= container_of(cache
, struct root_record
, cache
);
1327 remove_cache_extent(root_cache
, &rec
->cache
);
1329 while (!list_empty(&rec
->backrefs
)) {
1330 backref
= list_entry(rec
->backrefs
.next
,
1331 struct root_backref
, list
);
1332 list_del(&backref
->list
);
1339 static int add_root_backref(struct cache_tree
*root_cache
,
1340 u64 root_id
, u64 ref_root
, u64 dir
, u64 index
,
1341 const char *name
, int namelen
,
1342 int item_type
, int errors
)
1344 struct root_record
*rec
;
1345 struct root_backref
*backref
;
1347 rec
= get_root_rec(root_cache
, root_id
);
1348 backref
= get_root_backref(rec
, ref_root
, dir
, index
, name
, namelen
);
1350 backref
->errors
|= errors
;
1352 if (item_type
!= BTRFS_DIR_ITEM_KEY
) {
1353 if (backref
->found_dir_index
|| backref
->found_back_ref
||
1354 backref
->found_forward_ref
) {
1355 if (backref
->index
!= index
)
1356 backref
->errors
|= REF_ERR_INDEX_UNMATCH
;
1358 backref
->index
= index
;
1362 if (item_type
== BTRFS_DIR_ITEM_KEY
) {
1363 backref
->found_dir_item
= 1;
1364 backref
->reachable
= 1;
1366 } else if (item_type
== BTRFS_DIR_INDEX_KEY
) {
1367 backref
->found_dir_index
= 1;
1368 } else if (item_type
== BTRFS_ROOT_REF_KEY
) {
1369 if (backref
->found_forward_ref
)
1370 backref
->errors
|= REF_ERR_DUP_ROOT_REF
;
1371 backref
->found_forward_ref
= 1;
1372 } else if (item_type
== BTRFS_ROOT_BACKREF_KEY
) {
1373 if (backref
->found_back_ref
)
1374 backref
->errors
|= REF_ERR_DUP_ROOT_BACKREF
;
1375 backref
->found_back_ref
= 1;
1383 static int merge_root_recs(struct btrfs_root
*root
,
1384 struct cache_tree
*src_cache
,
1385 struct cache_tree
*dst_cache
)
1387 struct cache_extent
*cache
;
1388 struct ptr_node
*node
;
1389 struct inode_record
*rec
;
1390 struct inode_backref
*backref
;
1392 if (root
->root_key
.objectid
== BTRFS_TREE_RELOC_OBJECTID
) {
1393 free_inode_recs(src_cache
);
1398 cache
= find_first_cache_extent(src_cache
, 0);
1401 node
= container_of(cache
, struct ptr_node
, cache
);
1403 remove_cache_extent(src_cache
, &node
->cache
);
1406 list_for_each_entry(backref
, &rec
->backrefs
, list
) {
1407 BUG_ON(backref
->found_inode_ref
);
1408 if (backref
->found_dir_item
)
1409 add_root_backref(dst_cache
, rec
->ino
,
1410 root
->root_key
.objectid
, backref
->dir
,
1411 backref
->index
, backref
->name
,
1412 backref
->namelen
, BTRFS_DIR_ITEM_KEY
,
1414 if (backref
->found_dir_index
)
1415 add_root_backref(dst_cache
, rec
->ino
,
1416 root
->root_key
.objectid
, backref
->dir
,
1417 backref
->index
, backref
->name
,
1418 backref
->namelen
, BTRFS_DIR_INDEX_KEY
,
1421 free_inode_rec(rec
);
1426 static int check_root_refs(struct btrfs_root
*root
,
1427 struct cache_tree
*root_cache
)
1429 struct root_record
*rec
;
1430 struct root_record
*ref_root
;
1431 struct root_backref
*backref
;
1432 struct cache_extent
*cache
;
1438 rec
= get_root_rec(root_cache
, BTRFS_FS_TREE_OBJECTID
);
1441 /* fixme: this can not detect circular references */
1444 cache
= find_first_cache_extent(root_cache
, 0);
1448 rec
= container_of(cache
, struct root_record
, cache
);
1449 cache
= next_cache_extent(cache
);
1451 if (rec
->found_ref
== 0)
1454 list_for_each_entry(backref
, &rec
->backrefs
, list
) {
1455 if (!backref
->reachable
)
1458 ref_root
= get_root_rec(root_cache
,
1460 if (ref_root
->found_ref
> 0)
1463 backref
->reachable
= 0;
1465 if (rec
->found_ref
== 0)
1471 cache
= find_first_cache_extent(root_cache
, 0);
1475 rec
= container_of(cache
, struct root_record
, cache
);
1476 cache
= next_cache_extent(cache
);
1478 if (rec
->found_ref
== 0 &&
1479 rec
->objectid
>= BTRFS_FIRST_FREE_OBJECTID
&&
1480 rec
->objectid
<= BTRFS_LAST_FREE_OBJECTID
) {
1481 ret
= check_orphan_item(root
->fs_info
->tree_root
,
1486 fprintf(stderr
, "fs tree %llu not referenced\n",
1487 (unsigned long long)rec
->objectid
);
1491 if (rec
->found_ref
> 0 && !rec
->found_root_item
)
1493 list_for_each_entry(backref
, &rec
->backrefs
, list
) {
1494 if (!backref
->found_dir_item
)
1495 backref
->errors
|= REF_ERR_NO_DIR_ITEM
;
1496 if (!backref
->found_dir_index
)
1497 backref
->errors
|= REF_ERR_NO_DIR_INDEX
;
1498 if (!backref
->found_back_ref
)
1499 backref
->errors
|= REF_ERR_NO_ROOT_BACKREF
;
1500 if (!backref
->found_forward_ref
)
1501 backref
->errors
|= REF_ERR_NO_ROOT_REF
;
1502 if (backref
->reachable
&& backref
->errors
)
1509 fprintf(stderr
, "fs tree %llu refs %u %s\n",
1510 (unsigned long long)rec
->objectid
, rec
->found_ref
,
1511 rec
->found_root_item
? "" : "not found");
1513 list_for_each_entry(backref
, &rec
->backrefs
, list
) {
1514 if (!backref
->reachable
)
1516 if (!backref
->errors
&& rec
->found_root_item
)
1518 fprintf(stderr
, "\tunresolved ref root %llu dir %llu"
1519 " index %llu namelen %u name %s error %x\n",
1520 (unsigned long long)backref
->ref_root
,
1521 (unsigned long long)backref
->dir
,
1522 (unsigned long long)backref
->index
,
1523 backref
->namelen
, backref
->name
,
1527 return errors
> 0 ? 1 : 0;
1530 static int process_root_ref(struct extent_buffer
*eb
, int slot
,
1531 struct btrfs_key
*key
,
1532 struct cache_tree
*root_cache
)
1538 struct btrfs_root_ref
*ref
;
1539 char namebuf
[BTRFS_NAME_LEN
];
1542 ref
= btrfs_item_ptr(eb
, slot
, struct btrfs_root_ref
);
1544 dirid
= btrfs_root_ref_dirid(eb
, ref
);
1545 index
= btrfs_root_ref_sequence(eb
, ref
);
1546 name_len
= btrfs_root_ref_name_len(eb
, ref
);
1548 if (name_len
<= BTRFS_NAME_LEN
) {
1552 len
= BTRFS_NAME_LEN
;
1553 error
= REF_ERR_NAME_TOO_LONG
;
1555 read_extent_buffer(eb
, namebuf
, (unsigned long)(ref
+ 1), len
);
1557 if (key
->type
== BTRFS_ROOT_REF_KEY
) {
1558 add_root_backref(root_cache
, key
->offset
, key
->objectid
, dirid
,
1559 index
, namebuf
, len
, key
->type
, error
);
1561 add_root_backref(root_cache
, key
->objectid
, key
->offset
, dirid
,
1562 index
, namebuf
, len
, key
->type
, error
);
1567 static int check_fs_root(struct btrfs_root
*root
,
1568 struct cache_tree
*root_cache
,
1569 struct walk_control
*wc
)
1574 struct btrfs_path path
;
1575 struct shared_node root_node
;
1576 struct root_record
*rec
;
1577 struct btrfs_root_item
*root_item
= &root
->root_item
;
1579 if (root
->root_key
.objectid
!= BTRFS_TREE_RELOC_OBJECTID
) {
1580 rec
= get_root_rec(root_cache
, root
->root_key
.objectid
);
1581 if (btrfs_root_refs(root_item
) > 0)
1582 rec
->found_root_item
= 1;
1585 btrfs_init_path(&path
);
1586 memset(&root_node
, 0, sizeof(root_node
));
1587 cache_tree_init(&root_node
.root_cache
);
1588 cache_tree_init(&root_node
.inode_cache
);
1590 level
= btrfs_header_level(root
->node
);
1591 memset(wc
->nodes
, 0, sizeof(wc
->nodes
));
1592 wc
->nodes
[level
] = &root_node
;
1593 wc
->active_node
= level
;
1594 wc
->root_level
= level
;
1596 if (btrfs_root_refs(root_item
) > 0 ||
1597 btrfs_disk_key_objectid(&root_item
->drop_progress
) == 0) {
1598 path
.nodes
[level
] = root
->node
;
1599 extent_buffer_get(root
->node
);
1600 path
.slots
[level
] = 0;
1602 struct btrfs_key key
;
1603 struct btrfs_disk_key found_key
;
1605 btrfs_disk_key_to_cpu(&key
, &root_item
->drop_progress
);
1606 level
= root_item
->drop_level
;
1607 path
.lowest_level
= level
;
1608 wret
= btrfs_search_slot(NULL
, root
, &key
, &path
, 0, 0);
1610 btrfs_node_key(path
.nodes
[level
], &found_key
,
1612 WARN_ON(memcmp(&found_key
, &root_item
->drop_progress
,
1613 sizeof(found_key
)));
1617 wret
= walk_down_tree(root
, &path
, wc
, &level
);
1623 wret
= walk_up_tree(root
, &path
, wc
, &level
);
1629 btrfs_release_path(root
, &path
);
1631 merge_root_recs(root
, &root_node
.root_cache
, root_cache
);
1633 if (root_node
.current
) {
1634 root_node
.current
->checked
= 1;
1635 maybe_free_inode_rec(&root_node
.inode_cache
,
1639 ret
= check_inode_recs(root
, &root_node
.inode_cache
);
1643 static int fs_root_objectid(u64 objectid
)
1645 if (objectid
== BTRFS_FS_TREE_OBJECTID
||
1646 objectid
== BTRFS_TREE_RELOC_OBJECTID
||
1647 objectid
== BTRFS_DATA_RELOC_TREE_OBJECTID
||
1648 (objectid
>= BTRFS_FIRST_FREE_OBJECTID
&&
1649 objectid
<= BTRFS_LAST_FREE_OBJECTID
))
1654 static int check_fs_roots(struct btrfs_root
*root
,
1655 struct cache_tree
*root_cache
)
1657 struct btrfs_path path
;
1658 struct btrfs_key key
;
1659 struct walk_control wc
;
1660 struct extent_buffer
*leaf
;
1661 struct btrfs_root
*tmp_root
;
1662 struct btrfs_root
*tree_root
= root
->fs_info
->tree_root
;
1666 memset(&wc
, 0, sizeof(wc
));
1667 cache_tree_init(&wc
.shared
);
1668 btrfs_init_path(&path
);
1672 key
.type
= BTRFS_ROOT_ITEM_KEY
;
1673 ret
= btrfs_search_slot(NULL
, tree_root
, &key
, &path
, 0, 0);
1676 leaf
= path
.nodes
[0];
1677 if (path
.slots
[0] >= btrfs_header_nritems(leaf
)) {
1678 ret
= btrfs_next_leaf(tree_root
, &path
);
1681 leaf
= path
.nodes
[0];
1683 btrfs_item_key_to_cpu(leaf
, &key
, path
.slots
[0]);
1684 if (key
.type
== BTRFS_ROOT_ITEM_KEY
&&
1685 fs_root_objectid(key
.objectid
)) {
1686 tmp_root
= btrfs_read_fs_root_no_cache(root
->fs_info
,
1688 ret
= check_fs_root(tmp_root
, root_cache
, &wc
);
1691 btrfs_free_fs_root(root
->fs_info
, tmp_root
);
1692 } else if (key
.type
== BTRFS_ROOT_REF_KEY
||
1693 key
.type
== BTRFS_ROOT_BACKREF_KEY
) {
1694 process_root_ref(leaf
, path
.slots
[0], &key
,
1699 btrfs_release_path(tree_root
, &path
);
1701 if (!cache_tree_empty(&wc
.shared
))
1702 fprintf(stderr
, "warning line %d\n", __LINE__
);
1707 static int check_node(struct btrfs_root
*root
,
1708 struct btrfs_disk_key
*parent_key
,
1709 struct extent_buffer
*buf
)
1712 struct btrfs_key cpukey
;
1713 struct btrfs_disk_key key
;
1714 u32 nritems
= btrfs_header_nritems(buf
);
1716 if (nritems
== 0 || nritems
> BTRFS_NODEPTRS_PER_BLOCK(root
))
1718 if (parent_key
->type
) {
1719 btrfs_node_key(buf
, &key
, 0);
1720 if (memcmp(parent_key
, &key
, sizeof(key
)))
1723 for (i
= 0; nritems
> 1 && i
< nritems
- 2; i
++) {
1724 btrfs_node_key(buf
, &key
, i
);
1725 btrfs_node_key_to_cpu(buf
, &cpukey
, i
+ 1);
1726 if (btrfs_comp_keys(&key
, &cpukey
) >= 0)
1732 static int check_leaf(struct btrfs_root
*root
,
1733 struct btrfs_disk_key
*parent_key
,
1734 struct extent_buffer
*buf
)
1737 struct btrfs_key cpukey
;
1738 struct btrfs_disk_key key
;
1739 u32 nritems
= btrfs_header_nritems(buf
);
1741 if (btrfs_header_level(buf
) != 0) {
1742 fprintf(stderr
, "leaf is not a leaf %llu\n",
1743 (unsigned long long)btrfs_header_bytenr(buf
));
1746 if (btrfs_leaf_free_space(root
, buf
) < 0) {
1747 fprintf(stderr
, "leaf free space incorrect %llu %d\n",
1748 (unsigned long long)btrfs_header_bytenr(buf
),
1749 btrfs_leaf_free_space(root
, buf
));
1756 btrfs_item_key(buf
, &key
, 0);
1757 if (parent_key
->type
&& memcmp(parent_key
, &key
, sizeof(key
))) {
1758 fprintf(stderr
, "leaf parent key incorrect %llu\n",
1759 (unsigned long long)btrfs_header_bytenr(buf
));
1762 for (i
= 0; nritems
> 1 && i
< nritems
- 2; i
++) {
1763 btrfs_item_key(buf
, &key
, i
);
1764 btrfs_item_key_to_cpu(buf
, &cpukey
, i
+ 1);
1765 if (btrfs_comp_keys(&key
, &cpukey
) >= 0) {
1766 fprintf(stderr
, "bad key ordering %d %d\n", i
, i
+1);
1769 if (btrfs_item_offset_nr(buf
, i
) !=
1770 btrfs_item_end_nr(buf
, i
+ 1)) {
1771 fprintf(stderr
, "incorrect offsets %u %u\n",
1772 btrfs_item_offset_nr(buf
, i
),
1773 btrfs_item_end_nr(buf
, i
+ 1));
1776 if (i
== 0 && btrfs_item_end_nr(buf
, i
) !=
1777 BTRFS_LEAF_DATA_SIZE(root
)) {
1778 fprintf(stderr
, "bad item end %u wanted %u\n",
1779 btrfs_item_end_nr(buf
, i
),
1780 (unsigned)BTRFS_LEAF_DATA_SIZE(root
));
1787 static int all_backpointers_checked(struct extent_record
*rec
, int print_errs
)
1789 struct list_head
*cur
= rec
->backrefs
.next
;
1790 struct extent_backref
*back
;
1791 struct tree_backref
*tback
;
1792 struct data_backref
*dback
;
1796 while(cur
!= &rec
->backrefs
) {
1797 back
= list_entry(cur
, struct extent_backref
, list
);
1799 if (!back
->found_extent_tree
) {
1803 if (back
->is_data
) {
1804 dback
= (struct data_backref
*)back
;
1805 fprintf(stderr
, "Backref %llu %s %llu"
1806 " owner %llu offset %llu num_refs %lu"
1807 " not found in extent tree\n",
1808 (unsigned long long)rec
->start
,
1809 back
->full_backref
?
1811 back
->full_backref
?
1812 (unsigned long long)dback
->parent
:
1813 (unsigned long long)dback
->root
,
1814 (unsigned long long)dback
->owner
,
1815 (unsigned long long)dback
->offset
,
1816 (unsigned long)dback
->num_refs
);
1818 tback
= (struct tree_backref
*)back
;
1819 fprintf(stderr
, "Backref %llu parent %llu"
1820 " root %llu not found in extent tree\n",
1821 (unsigned long long)rec
->start
,
1822 (unsigned long long)tback
->parent
,
1823 (unsigned long long)tback
->root
);
1826 if (!back
->is_data
&& !back
->found_ref
) {
1830 tback
= (struct tree_backref
*)back
;
1831 fprintf(stderr
, "Backref %llu %s %llu not referenced\n",
1832 (unsigned long long)rec
->start
,
1833 back
->full_backref
? "parent" : "root",
1834 back
->full_backref
?
1835 (unsigned long long)tback
->parent
:
1836 (unsigned long long)tback
->root
);
1838 if (back
->is_data
) {
1839 dback
= (struct data_backref
*)back
;
1840 if (dback
->found_ref
!= dback
->num_refs
) {
1844 fprintf(stderr
, "Incorrect local backref count"
1845 " on %llu %s %llu owner %llu"
1846 " offset %llu found %u wanted %u\n",
1847 (unsigned long long)rec
->start
,
1848 back
->full_backref
?
1850 back
->full_backref
?
1851 (unsigned long long)dback
->parent
:
1852 (unsigned long long)dback
->root
,
1853 (unsigned long long)dback
->owner
,
1854 (unsigned long long)dback
->offset
,
1855 dback
->found_ref
, dback
->num_refs
);
1858 if (!back
->is_data
) {
1861 dback
= (struct data_backref
*)back
;
1862 found
+= dback
->found_ref
;
1865 if (found
!= rec
->refs
) {
1869 fprintf(stderr
, "Incorrect global backref count "
1870 "on %llu found %llu wanted %llu\n",
1871 (unsigned long long)rec
->start
,
1872 (unsigned long long)found
,
1873 (unsigned long long)rec
->refs
);
1879 static int free_all_extent_backrefs(struct extent_record
*rec
)
1881 struct extent_backref
*back
;
1882 struct list_head
*cur
;
1883 while (!list_empty(&rec
->backrefs
)) {
1884 cur
= rec
->backrefs
.next
;
1885 back
= list_entry(cur
, struct extent_backref
, list
);
1892 static int maybe_free_extent_rec(struct cache_tree
*extent_cache
,
1893 struct extent_record
*rec
)
1895 if (rec
->content_checked
&& rec
->owner_ref_checked
&&
1896 rec
->extent_item_refs
== rec
->refs
&& rec
->refs
> 0 &&
1897 !all_backpointers_checked(rec
, 0)) {
1898 remove_cache_extent(extent_cache
, &rec
->cache
);
1899 free_all_extent_backrefs(rec
);
1905 static int check_owner_ref(struct btrfs_root
*root
,
1906 struct extent_record
*rec
,
1907 struct extent_buffer
*buf
)
1909 struct extent_backref
*node
;
1910 struct tree_backref
*back
;
1911 struct btrfs_root
*ref_root
;
1912 struct btrfs_key key
;
1913 struct btrfs_path path
;
1918 list_for_each_entry(node
, &rec
->backrefs
, list
) {
1921 if (!node
->found_ref
)
1923 if (node
->full_backref
)
1925 back
= (struct tree_backref
*)node
;
1926 if (btrfs_header_owner(buf
) == back
->root
)
1929 BUG_ON(rec
->is_root
);
1931 /* try to find the block by search corresponding fs tree */
1932 key
.objectid
= btrfs_header_owner(buf
);
1933 key
.type
= BTRFS_ROOT_ITEM_KEY
;
1934 key
.offset
= (u64
)-1;
1936 ref_root
= btrfs_read_fs_root(root
->fs_info
, &key
);
1937 BUG_ON(IS_ERR(ref_root
));
1939 level
= btrfs_header_level(buf
);
1941 btrfs_item_key_to_cpu(buf
, &key
, 0);
1943 btrfs_node_key_to_cpu(buf
, &key
, 0);
1945 btrfs_init_path(&path
);
1946 path
.lowest_level
= level
+ 1;
1947 ret
= btrfs_search_slot(NULL
, ref_root
, &key
, &path
, 0, 0);
1949 if (buf
->start
== btrfs_node_blockptr(path
.nodes
[level
+ 1],
1950 path
.slots
[level
+ 1]))
1951 rec
->owner_ref_checked
= 1;
1953 btrfs_release_path(ref_root
, &path
);
1954 return found
? 0 : 1;
1957 static int check_block(struct btrfs_root
*root
,
1958 struct cache_tree
*extent_cache
,
1959 struct extent_buffer
*buf
, u64 flags
)
1961 struct extent_record
*rec
;
1962 struct cache_extent
*cache
;
1965 cache
= find_cache_extent(extent_cache
, buf
->start
, buf
->len
);
1968 rec
= container_of(cache
, struct extent_record
, cache
);
1969 if (btrfs_is_leaf(buf
)) {
1970 ret
= check_leaf(root
, &rec
->parent_key
, buf
);
1972 ret
= check_node(root
, &rec
->parent_key
, buf
);
1975 fprintf(stderr
, "bad block %llu\n",
1976 (unsigned long long)buf
->start
);
1978 rec
->content_checked
= 1;
1979 if (flags
& BTRFS_BLOCK_FLAG_FULL_BACKREF
)
1980 rec
->owner_ref_checked
= 1;
1982 ret
= check_owner_ref(root
, rec
, buf
);
1984 rec
->owner_ref_checked
= 1;
1988 maybe_free_extent_rec(extent_cache
, rec
);
1992 static struct tree_backref
*find_tree_backref(struct extent_record
*rec
,
1993 u64 parent
, u64 root
)
1995 struct list_head
*cur
= rec
->backrefs
.next
;
1996 struct extent_backref
*node
;
1997 struct tree_backref
*back
;
1999 while(cur
!= &rec
->backrefs
) {
2000 node
= list_entry(cur
, struct extent_backref
, list
);
2004 back
= (struct tree_backref
*)node
;
2006 if (!node
->full_backref
)
2008 if (parent
== back
->parent
)
2011 if (node
->full_backref
)
2013 if (back
->root
== root
)
2020 static struct tree_backref
*alloc_tree_backref(struct extent_record
*rec
,
2021 u64 parent
, u64 root
)
2023 struct tree_backref
*ref
= malloc(sizeof(*ref
));
2024 memset(&ref
->node
, 0, sizeof(ref
->node
));
2026 ref
->parent
= parent
;
2027 ref
->node
.full_backref
= 1;
2030 ref
->node
.full_backref
= 0;
2032 list_add_tail(&ref
->node
.list
, &rec
->backrefs
);
2036 static struct data_backref
*find_data_backref(struct extent_record
*rec
,
2037 u64 parent
, u64 root
,
2038 u64 owner
, u64 offset
)
2040 struct list_head
*cur
= rec
->backrefs
.next
;
2041 struct extent_backref
*node
;
2042 struct data_backref
*back
;
2044 while(cur
!= &rec
->backrefs
) {
2045 node
= list_entry(cur
, struct extent_backref
, list
);
2049 back
= (struct data_backref
*)node
;
2051 if (!node
->full_backref
)
2053 if (parent
== back
->parent
)
2056 if (node
->full_backref
)
2058 if (back
->root
== root
&& back
->owner
== owner
&&
2059 back
->offset
== offset
)
2066 static struct data_backref
*alloc_data_backref(struct extent_record
*rec
,
2067 u64 parent
, u64 root
,
2068 u64 owner
, u64 offset
)
2070 struct data_backref
*ref
= malloc(sizeof(*ref
));
2071 memset(&ref
->node
, 0, sizeof(ref
->node
));
2072 ref
->node
.is_data
= 1;
2074 ref
->parent
= parent
;
2077 ref
->node
.full_backref
= 1;
2081 ref
->offset
= offset
;
2082 ref
->node
.full_backref
= 0;
2086 list_add_tail(&ref
->node
.list
, &rec
->backrefs
);
2090 static int add_extent_rec(struct cache_tree
*extent_cache
,
2091 struct btrfs_key
*parent_key
,
2092 u64 start
, u64 nr
, u64 extent_item_refs
,
2093 int is_root
, int inc_ref
, int set_checked
)
2095 struct extent_record
*rec
;
2096 struct cache_extent
*cache
;
2099 cache
= find_cache_extent(extent_cache
, start
, nr
);
2101 rec
= container_of(cache
, struct extent_record
, cache
);
2107 if (start
!= rec
->start
) {
2108 fprintf(stderr
, "warning, start mismatch %llu %llu\n",
2109 (unsigned long long)rec
->start
,
2110 (unsigned long long)start
);
2113 if (extent_item_refs
) {
2114 if (rec
->extent_item_refs
) {
2115 fprintf(stderr
, "block %llu rec "
2116 "extent_item_refs %llu, passed %llu\n",
2117 (unsigned long long)start
,
2118 (unsigned long long)
2119 rec
->extent_item_refs
,
2120 (unsigned long long)extent_item_refs
);
2122 rec
->extent_item_refs
= extent_item_refs
;
2127 rec
->content_checked
= 1;
2128 rec
->owner_ref_checked
= 1;
2132 btrfs_cpu_key_to_disk(&rec
->parent_key
, parent_key
);
2134 maybe_free_extent_rec(extent_cache
, rec
);
2137 rec
= malloc(sizeof(*rec
));
2140 rec
->content_checked
= 0;
2141 rec
->owner_ref_checked
= 0;
2142 INIT_LIST_HEAD(&rec
->backrefs
);
2154 if (extent_item_refs
)
2155 rec
->extent_item_refs
= extent_item_refs
;
2157 rec
->extent_item_refs
= 0;
2160 btrfs_cpu_key_to_disk(&rec
->parent_key
, parent_key
);
2162 memset(&rec
->parent_key
, 0, sizeof(*parent_key
));
2164 rec
->cache
.start
= start
;
2165 rec
->cache
.size
= nr
;
2166 ret
= insert_existing_cache_extent(extent_cache
, &rec
->cache
);
2170 rec
->content_checked
= 1;
2171 rec
->owner_ref_checked
= 1;
2176 static int add_tree_backref(struct cache_tree
*extent_cache
, u64 bytenr
,
2177 u64 parent
, u64 root
, int found_ref
)
2179 struct extent_record
*rec
;
2180 struct tree_backref
*back
;
2181 struct cache_extent
*cache
;
2183 cache
= find_cache_extent(extent_cache
, bytenr
, 1);
2185 add_extent_rec(extent_cache
, NULL
, bytenr
, 1, 0, 0, 0, 0);
2186 cache
= find_cache_extent(extent_cache
, bytenr
, 1);
2191 rec
= container_of(cache
, struct extent_record
, cache
);
2192 if (rec
->start
!= bytenr
) {
2196 back
= find_tree_backref(rec
, parent
, root
);
2198 back
= alloc_tree_backref(rec
, parent
, root
);
2201 if (back
->node
.found_ref
) {
2202 fprintf(stderr
, "Extent back ref already exists "
2203 "for %llu parent %llu root %llu \n",
2204 (unsigned long long)bytenr
,
2205 (unsigned long long)parent
,
2206 (unsigned long long)root
);
2208 back
->node
.found_ref
= 1;
2210 if (back
->node
.found_extent_tree
) {
2211 fprintf(stderr
, "Extent back ref already exists "
2212 "for %llu parent %llu root %llu \n",
2213 (unsigned long long)bytenr
,
2214 (unsigned long long)parent
,
2215 (unsigned long long)root
);
2217 back
->node
.found_extent_tree
= 1;
2222 static int add_data_backref(struct cache_tree
*extent_cache
, u64 bytenr
,
2223 u64 parent
, u64 root
, u64 owner
, u64 offset
,
2224 u32 num_refs
, int found_ref
)
2226 struct extent_record
*rec
;
2227 struct data_backref
*back
;
2228 struct cache_extent
*cache
;
2230 cache
= find_cache_extent(extent_cache
, bytenr
, 1);
2232 add_extent_rec(extent_cache
, NULL
, bytenr
, 1, 0, 0, 0, 0);
2233 cache
= find_cache_extent(extent_cache
, bytenr
, 1);
2238 rec
= container_of(cache
, struct extent_record
, cache
);
2239 if (rec
->start
!= bytenr
) {
2242 back
= find_data_backref(rec
, parent
, root
, owner
, offset
);
2244 back
= alloc_data_backref(rec
, parent
, root
, owner
, offset
);
2247 BUG_ON(num_refs
!= 1);
2248 back
->node
.found_ref
= 1;
2249 back
->found_ref
+= 1;
2251 if (back
->node
.found_extent_tree
) {
2252 fprintf(stderr
, "Extent back ref already exists "
2253 "for %llu parent %llu root %llu"
2254 "owner %llu offset %llu num_refs %lu\n",
2255 (unsigned long long)bytenr
,
2256 (unsigned long long)parent
,
2257 (unsigned long long)root
,
2258 (unsigned long long)owner
,
2259 (unsigned long long)offset
,
2260 (unsigned long)num_refs
);
2262 back
->num_refs
= num_refs
;
2263 back
->node
.found_extent_tree
= 1;
2268 static int add_pending(struct cache_tree
*pending
,
2269 struct cache_tree
*seen
, u64 bytenr
, u32 size
)
2272 ret
= insert_cache_extent(seen
, bytenr
, size
);
2275 insert_cache_extent(pending
, bytenr
, size
);
2279 static int pick_next_pending(struct cache_tree
*pending
,
2280 struct cache_tree
*reada
,
2281 struct cache_tree
*nodes
,
2282 u64 last
, struct block_info
*bits
, int bits_nr
,
2285 unsigned long node_start
= last
;
2286 struct cache_extent
*cache
;
2289 cache
= find_first_cache_extent(reada
, 0);
2291 bits
[0].start
= cache
->start
;
2292 bits
[1].size
= cache
->size
;
2297 if (node_start
> 32768)
2298 node_start
-= 32768;
2300 cache
= find_first_cache_extent(nodes
, node_start
);
2302 cache
= find_first_cache_extent(nodes
, 0);
2305 cache
= find_first_cache_extent(pending
, 0);
2310 bits
[ret
].start
= cache
->start
;
2311 bits
[ret
].size
= cache
->size
;
2312 cache
= next_cache_extent(cache
);
2314 } while (cache
&& ret
< bits_nr
);
2320 bits
[ret
].start
= cache
->start
;
2321 bits
[ret
].size
= cache
->size
;
2322 cache
= next_cache_extent(cache
);
2324 } while (cache
&& ret
< bits_nr
);
2326 if (bits_nr
- ret
> 8) {
2327 u64 lookup
= bits
[0].start
+ bits
[0].size
;
2328 struct cache_extent
*next
;
2329 next
= find_first_cache_extent(pending
, lookup
);
2331 if (next
->start
- lookup
> 32768)
2333 bits
[ret
].start
= next
->start
;
2334 bits
[ret
].size
= next
->size
;
2335 lookup
= next
->start
+ next
->size
;
2339 next
= next_cache_extent(next
);
2347 #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
2348 static int process_extent_ref_v0(struct cache_tree
*extent_cache
,
2349 struct extent_buffer
*leaf
, int slot
)
2351 struct btrfs_extent_ref_v0
*ref0
;
2352 struct btrfs_key key
;
2354 btrfs_item_key_to_cpu(leaf
, &key
, slot
);
2355 ref0
= btrfs_item_ptr(leaf
, slot
, struct btrfs_extent_ref_v0
);
2356 if (btrfs_ref_objectid_v0(leaf
, ref0
) < BTRFS_FIRST_FREE_OBJECTID
) {
2357 add_tree_backref(extent_cache
, key
.objectid
, key
.offset
,
2360 add_data_backref(extent_cache
, key
.objectid
, key
.offset
, 0,
2361 0, 0, btrfs_ref_count_v0(leaf
, ref0
), 0);
2367 static int process_extent_item(struct cache_tree
*extent_cache
,
2368 struct extent_buffer
*eb
, int slot
)
2370 struct btrfs_extent_item
*ei
;
2371 struct btrfs_extent_inline_ref
*iref
;
2372 struct btrfs_extent_data_ref
*dref
;
2373 struct btrfs_shared_data_ref
*sref
;
2374 struct btrfs_key key
;
2378 u32 item_size
= btrfs_item_size_nr(eb
, slot
);
2382 btrfs_item_key_to_cpu(eb
, &key
, slot
);
2384 if (item_size
< sizeof(*ei
)) {
2385 #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
2386 struct btrfs_extent_item_v0
*ei0
;
2387 BUG_ON(item_size
!= sizeof(*ei0
));
2388 ei0
= btrfs_item_ptr(eb
, slot
, struct btrfs_extent_item_v0
);
2389 refs
= btrfs_extent_refs_v0(eb
, ei0
);
2393 return add_extent_rec(extent_cache
, NULL
, key
.objectid
,
2394 key
.offset
, refs
, 0, 0, 0);
2397 ei
= btrfs_item_ptr(eb
, slot
, struct btrfs_extent_item
);
2398 refs
= btrfs_extent_refs(eb
, ei
);
2400 add_extent_rec(extent_cache
, NULL
, key
.objectid
, key
.offset
,
2403 ptr
= (unsigned long)(ei
+ 1);
2404 if (btrfs_extent_flags(eb
, ei
) & BTRFS_EXTENT_FLAG_TREE_BLOCK
)
2405 ptr
+= sizeof(struct btrfs_tree_block_info
);
2407 end
= (unsigned long)ei
+ item_size
;
2409 iref
= (struct btrfs_extent_inline_ref
*)ptr
;
2410 type
= btrfs_extent_inline_ref_type(eb
, iref
);
2411 offset
= btrfs_extent_inline_ref_offset(eb
, iref
);
2413 case BTRFS_TREE_BLOCK_REF_KEY
:
2414 add_tree_backref(extent_cache
, key
.objectid
,
2417 case BTRFS_SHARED_BLOCK_REF_KEY
:
2418 add_tree_backref(extent_cache
, key
.objectid
,
2421 case BTRFS_EXTENT_DATA_REF_KEY
:
2422 dref
= (struct btrfs_extent_data_ref
*)(&iref
->offset
);
2423 add_data_backref(extent_cache
, key
.objectid
, 0,
2424 btrfs_extent_data_ref_root(eb
, dref
),
2425 btrfs_extent_data_ref_objectid(eb
,
2427 btrfs_extent_data_ref_offset(eb
, dref
),
2428 btrfs_extent_data_ref_count(eb
, dref
),
2431 case BTRFS_SHARED_DATA_REF_KEY
:
2432 sref
= (struct btrfs_shared_data_ref
*)(iref
+ 1);
2433 add_data_backref(extent_cache
, key
.objectid
, offset
,
2435 btrfs_shared_data_ref_count(eb
, sref
),
2441 ptr
+= btrfs_extent_inline_ref_size(type
);
2447 static int run_next_block(struct btrfs_root
*root
,
2448 struct block_info
*bits
,
2451 struct cache_tree
*pending
,
2452 struct cache_tree
*seen
,
2453 struct cache_tree
*reada
,
2454 struct cache_tree
*nodes
,
2455 struct cache_tree
*extent_cache
)
2457 struct extent_buffer
*buf
;
2466 struct btrfs_key key
;
2467 struct cache_extent
*cache
;
2470 ret
= pick_next_pending(pending
, reada
, nodes
, *last
, bits
,
2471 bits_nr
, &reada_bits
);
2476 for(i
= 0; i
< ret
; i
++) {
2477 insert_cache_extent(reada
, bits
[i
].start
,
2480 /* fixme, get the parent transid */
2481 readahead_tree_block(root
, bits
[i
].start
,
2485 *last
= bits
[0].start
;
2486 bytenr
= bits
[0].start
;
2487 size
= bits
[0].size
;
2489 cache
= find_cache_extent(pending
, bytenr
, size
);
2491 remove_cache_extent(pending
, cache
);
2494 cache
= find_cache_extent(reada
, bytenr
, size
);
2496 remove_cache_extent(reada
, cache
);
2499 cache
= find_cache_extent(nodes
, bytenr
, size
);
2501 remove_cache_extent(nodes
, cache
);
2505 /* fixme, get the real parent transid */
2506 buf
= read_tree_block(root
, bytenr
, size
, 0);
2507 nritems
= btrfs_header_nritems(buf
);
2509 ret
= btrfs_lookup_extent_info(NULL
, root
, bytenr
, size
, NULL
, &flags
);
2511 if (flags
& BTRFS_BLOCK_FLAG_FULL_BACKREF
) {
2516 owner
= btrfs_header_owner(buf
);
2519 ret
= check_block(root
, extent_cache
, buf
, flags
);
2521 if (btrfs_is_leaf(buf
)) {
2522 btree_space_waste
+= btrfs_leaf_free_space(root
, buf
);
2523 for (i
= 0; i
< nritems
; i
++) {
2524 struct btrfs_file_extent_item
*fi
;
2525 btrfs_item_key_to_cpu(buf
, &key
, i
);
2526 if (key
.type
== BTRFS_EXTENT_ITEM_KEY
) {
2527 process_extent_item(extent_cache
, buf
, i
);
2530 if (key
.type
== BTRFS_EXTENT_CSUM_KEY
) {
2532 btrfs_item_size_nr(buf
, i
);
2535 if (key
.type
== BTRFS_BLOCK_GROUP_ITEM_KEY
) {
2536 struct btrfs_block_group_item
*bi
;
2537 bi
= btrfs_item_ptr(buf
, i
,
2538 struct btrfs_block_group_item
);
2540 fprintf(stderr
,"block group %Lu %Lu used %Lu ",
2541 btrfs_disk_key_objectid(disk_key
),
2542 btrfs_disk_key_offset(disk_key
),
2543 btrfs_block_group_used(bi
));
2544 fprintf(stderr
, "flags %x\n", bi
->flags
);
2548 if (key
.type
== BTRFS_EXTENT_REF_V0_KEY
) {
2549 #ifdef BTRFS_COMPAT_EXTENT_TREE_V0
2550 process_extent_ref_v0(extent_cache
, buf
, i
);
2557 if (key
.type
== BTRFS_TREE_BLOCK_REF_KEY
) {
2558 add_tree_backref(extent_cache
, key
.objectid
, 0,
2562 if (key
.type
== BTRFS_SHARED_BLOCK_REF_KEY
) {
2563 add_tree_backref(extent_cache
, key
.objectid
,
2567 if (key
.type
== BTRFS_EXTENT_DATA_REF_KEY
) {
2568 struct btrfs_extent_data_ref
*ref
;
2569 ref
= btrfs_item_ptr(buf
, i
,
2570 struct btrfs_extent_data_ref
);
2571 add_data_backref(extent_cache
,
2573 btrfs_extent_data_ref_root(buf
, ref
),
2574 btrfs_extent_data_ref_objectid(buf
,
2576 btrfs_extent_data_ref_offset(buf
, ref
),
2577 btrfs_extent_data_ref_count(buf
, ref
),
2581 if (key
.type
== BTRFS_SHARED_DATA_REF_KEY
) {
2582 struct btrfs_shared_data_ref
*ref
;
2583 ref
= btrfs_item_ptr(buf
, i
,
2584 struct btrfs_shared_data_ref
);
2585 add_data_backref(extent_cache
,
2586 key
.objectid
, key
.offset
, 0, 0, 0,
2587 btrfs_shared_data_ref_count(buf
, ref
),
2591 if (key
.type
!= BTRFS_EXTENT_DATA_KEY
)
2593 fi
= btrfs_item_ptr(buf
, i
,
2594 struct btrfs_file_extent_item
);
2595 if (btrfs_file_extent_type(buf
, fi
) ==
2596 BTRFS_FILE_EXTENT_INLINE
)
2598 if (btrfs_file_extent_disk_bytenr(buf
, fi
) == 0)
2601 data_bytes_allocated
+=
2602 btrfs_file_extent_disk_num_bytes(buf
, fi
);
2603 if (data_bytes_allocated
< root
->sectorsize
) {
2606 data_bytes_referenced
+=
2607 btrfs_file_extent_num_bytes(buf
, fi
);
2608 ret
= add_extent_rec(extent_cache
, NULL
,
2609 btrfs_file_extent_disk_bytenr(buf
, fi
),
2610 btrfs_file_extent_disk_num_bytes(buf
, fi
),
2612 add_data_backref(extent_cache
,
2613 btrfs_file_extent_disk_bytenr(buf
, fi
),
2614 parent
, owner
, key
.objectid
, key
.offset
-
2615 btrfs_file_extent_offset(buf
, fi
), 1, 1);
2620 level
= btrfs_header_level(buf
);
2621 for (i
= 0; i
< nritems
; i
++) {
2622 u64 ptr
= btrfs_node_blockptr(buf
, i
);
2623 u32 size
= btrfs_level_size(root
, level
- 1);
2624 btrfs_node_key_to_cpu(buf
, &key
, i
);
2625 ret
= add_extent_rec(extent_cache
, &key
,
2626 ptr
, size
, 0, 0, 1, 0);
2629 add_tree_backref(extent_cache
, ptr
, parent
,
2633 add_pending(nodes
, seen
, ptr
, size
);
2635 add_pending(pending
, seen
, ptr
, size
);
2638 btree_space_waste
+= (BTRFS_NODEPTRS_PER_BLOCK(root
) -
2639 nritems
) * sizeof(struct btrfs_key_ptr
);
2641 total_btree_bytes
+= buf
->len
;
2642 if (fs_root_objectid(btrfs_header_owner(buf
)))
2643 total_fs_tree_bytes
+= buf
->len
;
2644 if (!found_old_backref
&&
2645 btrfs_header_owner(buf
) == BTRFS_TREE_RELOC_OBJECTID
&&
2646 btrfs_header_backref_rev(buf
) == BTRFS_MIXED_BACKREF_REV
&&
2647 !btrfs_header_flag(buf
, BTRFS_HEADER_FLAG_RELOC
))
2648 found_old_backref
= 1;
2649 free_extent_buffer(buf
);
2653 static int add_root_to_pending(struct extent_buffer
*buf
,
2654 struct block_info
*bits
,
2656 struct cache_tree
*extent_cache
,
2657 struct cache_tree
*pending
,
2658 struct cache_tree
*seen
,
2659 struct cache_tree
*reada
,
2660 struct cache_tree
*nodes
,
2661 struct btrfs_key
*root_key
)
2663 if (btrfs_header_level(buf
) > 0)
2664 add_pending(nodes
, seen
, buf
->start
, buf
->len
);
2666 add_pending(pending
, seen
, buf
->start
, buf
->len
);
2667 add_extent_rec(extent_cache
, NULL
, buf
->start
, buf
->len
,
2670 if (root_key
->objectid
== BTRFS_TREE_RELOC_OBJECTID
||
2671 btrfs_header_backref_rev(buf
) < BTRFS_MIXED_BACKREF_REV
)
2672 add_tree_backref(extent_cache
, buf
->start
, buf
->start
, 0, 1);
2674 add_tree_backref(extent_cache
, buf
->start
, 0,
2675 root_key
->objectid
, 1);
2679 static int check_extent_refs(struct btrfs_root
*root
,
2680 struct cache_tree
*extent_cache
)
2682 struct extent_record
*rec
;
2683 struct cache_extent
*cache
;
2687 cache
= find_first_cache_extent(extent_cache
, 0);
2690 rec
= container_of(cache
, struct extent_record
, cache
);
2691 if (rec
->refs
!= rec
->extent_item_refs
) {
2692 fprintf(stderr
, "ref mismatch on [%llu %llu] ",
2693 (unsigned long long)rec
->start
,
2694 (unsigned long long)rec
->nr
);
2695 fprintf(stderr
, "extent item %llu, found %llu\n",
2696 (unsigned long long)rec
->extent_item_refs
,
2697 (unsigned long long)rec
->refs
);
2700 if (all_backpointers_checked(rec
, 1)) {
2701 fprintf(stderr
, "backpointer mismatch on [%llu %llu]\n",
2702 (unsigned long long)rec
->start
,
2703 (unsigned long long)rec
->nr
);
2707 if (!rec
->owner_ref_checked
) {
2708 fprintf(stderr
, "owner ref check failed [%llu %llu]\n",
2709 (unsigned long long)rec
->start
,
2710 (unsigned long long)rec
->nr
);
2714 remove_cache_extent(extent_cache
, cache
);
2715 free_all_extent_backrefs(rec
);
2721 static int check_extents(struct btrfs_root
*root
)
2723 struct cache_tree extent_cache
;
2724 struct cache_tree seen
;
2725 struct cache_tree pending
;
2726 struct cache_tree reada
;
2727 struct cache_tree nodes
;
2728 struct btrfs_path path
;
2729 struct btrfs_key key
;
2730 struct btrfs_key found_key
;
2733 struct block_info
*bits
;
2735 struct extent_buffer
*leaf
;
2737 struct btrfs_root_item ri
;
2739 cache_tree_init(&extent_cache
);
2740 cache_tree_init(&seen
);
2741 cache_tree_init(&pending
);
2742 cache_tree_init(&nodes
);
2743 cache_tree_init(&reada
);
2746 bits
= malloc(bits_nr
* sizeof(struct block_info
));
2752 add_root_to_pending(root
->fs_info
->tree_root
->node
, bits
, bits_nr
,
2753 &extent_cache
, &pending
, &seen
, &reada
, &nodes
,
2754 &root
->fs_info
->tree_root
->root_key
);
2756 add_root_to_pending(root
->fs_info
->chunk_root
->node
, bits
, bits_nr
,
2757 &extent_cache
, &pending
, &seen
, &reada
, &nodes
,
2758 &root
->fs_info
->chunk_root
->root_key
);
2760 btrfs_init_path(&path
);
2763 btrfs_set_key_type(&key
, BTRFS_ROOT_ITEM_KEY
);
2764 ret
= btrfs_search_slot(NULL
, root
->fs_info
->tree_root
,
2768 leaf
= path
.nodes
[0];
2769 slot
= path
.slots
[0];
2770 if (slot
>= btrfs_header_nritems(path
.nodes
[0])) {
2771 ret
= btrfs_next_leaf(root
, &path
);
2774 leaf
= path
.nodes
[0];
2775 slot
= path
.slots
[0];
2777 btrfs_item_key_to_cpu(leaf
, &found_key
, path
.slots
[0]);
2778 if (btrfs_key_type(&found_key
) == BTRFS_ROOT_ITEM_KEY
) {
2779 unsigned long offset
;
2780 struct extent_buffer
*buf
;
2782 offset
= btrfs_item_ptr_offset(leaf
, path
.slots
[0]);
2783 read_extent_buffer(leaf
, &ri
, offset
, sizeof(ri
));
2784 buf
= read_tree_block(root
->fs_info
->tree_root
,
2785 btrfs_root_bytenr(&ri
),
2786 btrfs_level_size(root
,
2787 btrfs_root_level(&ri
)), 0);
2788 add_root_to_pending(buf
, bits
, bits_nr
, &extent_cache
,
2789 &pending
, &seen
, &reada
, &nodes
,
2791 free_extent_buffer(buf
);
2795 btrfs_release_path(root
, &path
);
2797 ret
= run_next_block(root
, bits
, bits_nr
, &last
, &pending
,
2798 &seen
, &reada
, &nodes
, &extent_cache
);
2802 ret
= check_extent_refs(root
, &extent_cache
);
2806 static void print_usage(void)
2808 fprintf(stderr
, "usage: btrfsck dev\n");
2809 fprintf(stderr
, "%s\n", BTRFS_BUILD_VERSION
);
2813 int main(int ac
, char **av
)
2815 struct cache_tree root_cache
;
2816 struct btrfs_root
*root
;
2823 cache_tree_init(&root_cache
);
2824 root
= open_ctree(av
[1], 0, 0);
2829 ret
= check_extents(root
);
2832 ret
= check_fs_roots(root
, &root_cache
);
2836 ret
= check_root_refs(root
, &root_cache
);
2838 free_root_recs(&root_cache
);
2841 if (found_old_backref
) {
2843 * there was a disk format change when mixed
2844 * backref was in testing tree. The old format
2845 * existed about one week.
2847 printf("\n * Found old mixed backref format. "
2848 "The old format is not supported! *"
2849 "\n * Please mount the FS in readonly mode, "
2850 "backup data and re-format the FS. *\n\n");
2853 printf("found %llu bytes used err is %d\n",
2854 (unsigned long long)bytes_used
, ret
);
2855 printf("total csum bytes: %llu\n",(unsigned long long)total_csum_bytes
);
2856 printf("total tree bytes: %llu\n",
2857 (unsigned long long)total_btree_bytes
);
2858 printf("total fs tree bytes: %llu\n",
2859 (unsigned long long)total_fs_tree_bytes
);
2860 printf("btree space waste bytes: %llu\n",
2861 (unsigned long long)btree_space_waste
);
2862 printf("file data blocks allocated: %llu\n referenced %llu\n",
2863 (unsigned long long)data_bytes_allocated
,
2864 (unsigned long long)data_bytes_referenced
);
2865 printf("%s\n", BTRFS_BUILD_VERSION
);