2 * Copyright (C) 2013 FUJITSU LIMITED. All rights reserved.
3 * Written by Miao Xie <miaox@cn.fujitsu.com>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public
7 * License v2 as published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public
15 * License along with this program; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 021110-1307, USA.
20 #ifndef __CHUNK_CHECK_H__
21 #define __CHUNK_CHECK_H__
23 #if BTRFS_FLAT_INCLUDES
24 #include "kerncompat.h"
25 #include "extent-cache.h"
28 #include <btrfs/kerncompat.h>
29 #include <btrfs/extent-cache.h>
30 #include <btrfs/list.h>
31 #endif /* BTRFS_FLAT_INCLUDES */
33 struct block_group_record
{
34 struct cache_extent cache
;
35 /* Used to identify the orphan block groups */
36 struct list_head list
;
47 struct block_group_tree
{
48 struct cache_tree tree
;
49 struct list_head block_groups
;
52 struct device_record
{
71 u8 dev_uuid
[BTRFS_UUID_SIZE
];
75 struct cache_extent cache
;
77 struct list_head list
;
78 struct list_head dextents
;
79 struct block_group_record
*bg_rec
;
96 struct stripe stripes
[0];
99 struct device_extent_record
{
100 struct cache_extent cache
;
102 * Used to identify the orphan device extents (the device extents
103 * don't belong to a chunk or a device)
105 struct list_head chunk_list
;
106 struct list_head device_list
;
119 struct device_extent_tree
{
120 struct cache_tree tree
;
123 * When checking the chunk information, we move the device extents
124 * that has its chunk to the chunk's device extents list. After the
125 * check, if there are still some device extents in no_chunk_orphans,
126 * it means there are some device extents which don't belong to any
129 * The usage of no_device_orphans is the same as the first one, but it
130 * is for the device information check.
132 struct list_head no_chunk_orphans
;
133 struct list_head no_device_orphans
;
136 static inline unsigned long btrfs_chunk_record_size(int num_stripes
)
138 return sizeof(struct chunk_record
) +
139 sizeof(struct stripe
) * num_stripes
;
141 void free_chunk_cache_tree(struct cache_tree
*chunk_cache
);
143 u64
calc_stripe_length(u64 type
, u64 length
, int num_stripes
);
144 /* For block group tree */
145 static inline void block_group_tree_init(struct block_group_tree
*tree
)
147 cache_tree_init(&tree
->tree
);
148 INIT_LIST_HEAD(&tree
->block_groups
);
151 int insert_block_group_record(struct block_group_tree
*tree
,
152 struct block_group_record
*bg_rec
);
153 void free_block_group_tree(struct block_group_tree
*tree
);
155 /* For device extent tree */
156 static inline void device_extent_tree_init(struct device_extent_tree
*tree
)
158 cache_tree_init(&tree
->tree
);
159 INIT_LIST_HEAD(&tree
->no_chunk_orphans
);
160 INIT_LIST_HEAD(&tree
->no_device_orphans
);
163 int insert_device_extent_record(struct device_extent_tree
*tree
,
164 struct device_extent_record
*de_rec
);
165 void free_device_extent_tree(struct device_extent_tree
*tree
);
168 /* Create various in-memory record by on-disk data */
169 struct chunk_record
*btrfs_new_chunk_record(struct extent_buffer
*leaf
,
170 struct btrfs_key
*key
,
172 struct block_group_record
*
173 btrfs_new_block_group_record(struct extent_buffer
*leaf
, struct btrfs_key
*key
,
175 struct device_extent_record
*
176 btrfs_new_device_extent_record(struct extent_buffer
*leaf
,
177 struct btrfs_key
*key
, int slot
);
179 int check_chunks(struct cache_tree
*chunk_cache
,
180 struct block_group_tree
*block_group_cache
,
181 struct device_extent_tree
*dev_extent_cache
,
182 struct list_head
*good
, struct list_head
*bad
, int silent
);