Skip to content

Commit 17793e3

Browse files
Miao XieChris Mason
Miao Xie
authored and
Chris Mason
committed
Btrfs-progs: extend the extent cache for the device extent
As we know, btrfs can manage several devices in the same fs, so [offset, size] is not sufficient for unique identification of an device extent, we need the device id to identify the device extents which have the same offset and size, but are not in the same device. So, we added a member variant named objectid into the extent cache, and introduced some functions to make the extent cache be suitable to manage the device extent. Signed-off-by: Miao Xie <miaox@cn.fujitsu.com> Signed-off-by: Chris Mason <chris.mason@fusionio.com>
1 parent ff04981 commit 17793e3

File tree

5 files changed

+192
-90
lines changed

5 files changed

+192
-90
lines changed

cmds-check.c

+42-54
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ static struct inode_record *get_inode_rec(struct cache_tree *inode_cache,
268268
struct inode_record *rec = NULL;
269269
int ret;
270270

271-
cache = find_cache_extent(inode_cache, ino, 1);
271+
cache = lookup_cache_extent(inode_cache, ino, 1);
272272
if (cache) {
273273
node = container_of(cache, struct ptr_node, cache);
274274
rec = node->data;
@@ -375,7 +375,7 @@ static void maybe_free_inode_rec(struct cache_tree *inode_cache,
375375

376376
BUG_ON(rec->refs != 1);
377377
if (can_free_inode_rec(rec)) {
378-
cache = find_cache_extent(inode_cache, rec->ino, 1);
378+
cache = lookup_cache_extent(inode_cache, rec->ino, 1);
379379
node = container_of(cache, struct ptr_node, cache);
380380
BUG_ON(node->data != rec);
381381
remove_cache_extent(inode_cache, &node->cache);
@@ -598,7 +598,7 @@ static int splice_shared_node(struct shared_node *src_node,
598598
src = &src_node->root_cache;
599599
dst = &dst_node->root_cache;
600600
again:
601-
cache = find_first_cache_extent(src, 0);
601+
cache = search_cache_extent(src, 0);
602602
while (cache) {
603603
node = container_of(cache, struct ptr_node, cache);
604604
rec = node->data;
@@ -667,7 +667,7 @@ static struct shared_node *find_shared_node(struct cache_tree *shared,
667667
struct cache_extent *cache;
668668
struct shared_node *node;
669669

670-
cache = find_cache_extent(shared, bytenr, 1);
670+
cache = lookup_cache_extent(shared, bytenr, 1);
671671
if (cache) {
672672
node = container_of(cache, struct shared_node, cache);
673673
return node;
@@ -1355,7 +1355,7 @@ static int check_inode_recs(struct btrfs_root *root,
13551355
}
13561356

13571357
while (1) {
1358-
cache = find_first_cache_extent(inode_cache, 0);
1358+
cache = search_cache_extent(inode_cache, 0);
13591359
if (!cache)
13601360
break;
13611361
node = container_of(cache, struct ptr_node, cache);
@@ -1412,7 +1412,7 @@ static struct root_record *get_root_rec(struct cache_tree *root_cache,
14121412
struct root_record *rec = NULL;
14131413
int ret;
14141414

1415-
cache = find_cache_extent(root_cache, objectid, 1);
1415+
cache = lookup_cache_extent(root_cache, objectid, 1);
14161416
if (cache) {
14171417
rec = container_of(cache, struct root_record, cache);
14181418
} else {
@@ -1536,7 +1536,7 @@ static int merge_root_recs(struct btrfs_root *root,
15361536
}
15371537

15381538
while (1) {
1539-
cache = find_first_cache_extent(src_cache, 0);
1539+
cache = search_cache_extent(src_cache, 0);
15401540
if (!cache)
15411541
break;
15421542
node = container_of(cache, struct ptr_node, cache);
@@ -1586,7 +1586,7 @@ static int check_root_refs(struct btrfs_root *root,
15861586
/* fixme: this can not detect circular references */
15871587
while (loop) {
15881588
loop = 0;
1589-
cache = find_first_cache_extent(root_cache, 0);
1589+
cache = search_cache_extent(root_cache, 0);
15901590
while (1) {
15911591
if (!cache)
15921592
break;
@@ -1613,7 +1613,7 @@ static int check_root_refs(struct btrfs_root *root,
16131613
}
16141614
}
16151615

1616-
cache = find_first_cache_extent(root_cache, 0);
1616+
cache = search_cache_extent(root_cache, 0);
16171617
while (1) {
16181618
if (!cache)
16191619
break;
@@ -1989,14 +1989,14 @@ static int free_all_extent_backrefs(struct extent_record *rec)
19891989
return 0;
19901990
}
19911991

1992-
static void free_extent_cache(struct btrfs_fs_info *fs_info,
1993-
struct cache_tree *extent_cache)
1992+
static void free_extent_record_cache(struct btrfs_fs_info *fs_info,
1993+
struct cache_tree *extent_cache)
19941994
{
19951995
struct cache_extent *cache;
19961996
struct extent_record *rec;
19971997

19981998
while (1) {
1999-
cache = find_first_cache_extent(extent_cache, 0);
1999+
cache = first_cache_extent(extent_cache);
20002000
if (!cache)
20012001
break;
20022002
rec = container_of(cache, struct extent_record, cache);
@@ -2108,7 +2108,7 @@ static int record_bad_block_io(struct btrfs_fs_info *info,
21082108
struct cache_extent *cache;
21092109
struct btrfs_key key;
21102110

2111-
cache = find_cache_extent(extent_cache, start, len);
2111+
cache = lookup_cache_extent(extent_cache, start, len);
21122112
if (!cache)
21132113
return 0;
21142114

@@ -2130,7 +2130,7 @@ static int check_block(struct btrfs_root *root,
21302130
int ret = 1;
21312131
int level;
21322132

2133-
cache = find_cache_extent(extent_cache, buf->start, buf->len);
2133+
cache = lookup_cache_extent(extent_cache, buf->start, buf->len);
21342134
if (!cache)
21352135
return 1;
21362136
rec = container_of(cache, struct extent_record, cache);
@@ -2293,7 +2293,7 @@ static int add_extent_rec(struct cache_tree *extent_cache,
22932293
int ret = 0;
22942294
int dup = 0;
22952295

2296-
cache = find_cache_extent(extent_cache, start, nr);
2296+
cache = lookup_cache_extent(extent_cache, start, nr);
22972297
if (cache) {
22982298
rec = container_of(cache, struct extent_record, cache);
22992299
if (inc_ref)
@@ -2418,11 +2418,11 @@ static int add_tree_backref(struct cache_tree *extent_cache, u64 bytenr,
24182418
struct tree_backref *back;
24192419
struct cache_extent *cache;
24202420

2421-
cache = find_cache_extent(extent_cache, bytenr, 1);
2421+
cache = lookup_cache_extent(extent_cache, bytenr, 1);
24222422
if (!cache) {
24232423
add_extent_rec(extent_cache, NULL, bytenr,
24242424
1, 0, 0, 0, 0, 1, 0, 0);
2425-
cache = find_cache_extent(extent_cache, bytenr, 1);
2425+
cache = lookup_cache_extent(extent_cache, bytenr, 1);
24262426
if (!cache)
24272427
abort();
24282428
}
@@ -2466,11 +2466,11 @@ static int add_data_backref(struct cache_tree *extent_cache, u64 bytenr,
24662466
struct data_backref *back;
24672467
struct cache_extent *cache;
24682468

2469-
cache = find_cache_extent(extent_cache, bytenr, 1);
2469+
cache = lookup_cache_extent(extent_cache, bytenr, 1);
24702470
if (!cache) {
24712471
add_extent_rec(extent_cache, NULL, bytenr, 1, 0, 0, 0, 0,
24722472
0, 0, max_size);
2473-
cache = find_cache_extent(extent_cache, bytenr, 1);
2473+
cache = lookup_cache_extent(extent_cache, bytenr, 1);
24742474
if (!cache)
24752475
abort();
24762476
}
@@ -2545,7 +2545,7 @@ static int pick_next_pending(struct cache_tree *pending,
25452545
struct cache_extent *cache;
25462546
int ret;
25472547

2548-
cache = find_first_cache_extent(reada, 0);
2548+
cache = search_cache_extent(reada, 0);
25492549
if (cache) {
25502550
bits[0].start = cache->start;
25512551
bits[1].size = cache->size;
@@ -2556,12 +2556,12 @@ static int pick_next_pending(struct cache_tree *pending,
25562556
if (node_start > 32768)
25572557
node_start -= 32768;
25582558

2559-
cache = find_first_cache_extent(nodes, node_start);
2559+
cache = search_cache_extent(nodes, node_start);
25602560
if (!cache)
2561-
cache = find_first_cache_extent(nodes, 0);
2561+
cache = search_cache_extent(nodes, 0);
25622562

25632563
if (!cache) {
2564-
cache = find_first_cache_extent(pending, 0);
2564+
cache = search_cache_extent(pending, 0);
25652565
if (!cache)
25662566
return 0;
25672567
ret = 0;
@@ -2585,7 +2585,7 @@ static int pick_next_pending(struct cache_tree *pending,
25852585
if (bits_nr - ret > 8) {
25862586
u64 lookup = bits[0].start + bits[0].size;
25872587
struct cache_extent *next;
2588-
next = find_first_cache_extent(pending, lookup);
2588+
next = search_cache_extent(pending, lookup);
25892589
while(next) {
25902590
if (next->start - lookup > 32768)
25912591
break;
@@ -3182,17 +3182,17 @@ static int run_next_block(struct btrfs_root *root,
31823182
bytenr = bits[0].start;
31833183
size = bits[0].size;
31843184

3185-
cache = find_cache_extent(pending, bytenr, size);
3185+
cache = lookup_cache_extent(pending, bytenr, size);
31863186
if (cache) {
31873187
remove_cache_extent(pending, cache);
31883188
free(cache);
31893189
}
3190-
cache = find_cache_extent(reada, bytenr, size);
3190+
cache = lookup_cache_extent(reada, bytenr, size);
31913191
if (cache) {
31923192
remove_cache_extent(reada, cache);
31933193
free(cache);
31943194
}
3195-
cache = find_cache_extent(nodes, bytenr, size);
3195+
cache = lookup_cache_extent(nodes, bytenr, size);
31963196
if (cache) {
31973197
remove_cache_extent(nodes, cache);
31983198
free(cache);
@@ -3400,7 +3400,7 @@ static int free_extent_hook(struct btrfs_trans_handle *trans,
34003400
struct cache_tree *extent_cache = root->fs_info->fsck_extent_cache;
34013401

34023402
is_data = owner >= BTRFS_FIRST_FREE_OBJECTID;
3403-
cache = find_cache_extent(extent_cache, bytenr, num_bytes);
3403+
cache = lookup_cache_extent(extent_cache, bytenr, num_bytes);
34043404
if (!cache)
34053405
return 0;
34063406

@@ -4070,8 +4070,8 @@ static int process_duplicates(struct btrfs_root *root,
40704070
good->refs = rec->refs;
40714071
list_splice_init(&rec->backrefs, &good->backrefs);
40724072
while (1) {
4073-
cache = find_cache_extent(extent_cache, good->start,
4074-
good->nr);
4073+
cache = lookup_cache_extent(extent_cache, good->start,
4074+
good->nr);
40754075
if (!cache)
40764076
break;
40774077
tmp = container_of(cache, struct extent_record, cache);
@@ -4244,7 +4244,8 @@ static int fixup_extent_refs(struct btrfs_trans_handle *trans,
42444244
goto out;
42454245

42464246
/* was this block corrupt? If so, don't add references to it */
4247-
cache = find_cache_extent(info->corrupt_blocks, rec->start, rec->max_size);
4247+
cache = lookup_cache_extent(info->corrupt_blocks,
4248+
rec->start, rec->max_size);
42484249
if (cache) {
42494250
ret = 0;
42504251
goto out;
@@ -4348,7 +4349,7 @@ static int prune_corrupt_blocks(struct btrfs_trans_handle *trans,
43484349
struct cache_extent *cache;
43494350
struct btrfs_corrupt_block *corrupt;
43504351

4351-
cache = find_first_cache_extent(info->corrupt_blocks, 0);
4352+
cache = search_cache_extent(info->corrupt_blocks, 0);
43524353
while (1) {
43534354
if (!cache)
43544355
break;
@@ -4407,7 +4408,7 @@ static int check_block_groups(struct btrfs_trans_handle *trans,
44074408
/* this isn't quite working */
44084409
return 0;
44094410

4410-
ce = find_first_cache_extent(&map_tree->cache_tree, 0);
4411+
ce = search_cache_extent(&map_tree->cache_tree, 0);
44114412
while (1) {
44124413
if (!ce)
44134414
break;
@@ -4463,7 +4464,7 @@ static int check_extent_refs(struct btrfs_trans_handle *trans,
44634464
* In the worst case, this will be all the
44644465
* extents in the FS
44654466
*/
4466-
cache = find_first_cache_extent(extent_cache, 0);
4467+
cache = search_cache_extent(extent_cache, 0);
44674468
while(cache) {
44684469
rec = container_of(cache, struct extent_record, cache);
44694470
btrfs_pin_extent(root->fs_info,
@@ -4472,7 +4473,7 @@ static int check_extent_refs(struct btrfs_trans_handle *trans,
44724473
}
44734474

44744475
/* pin down all the corrupted blocks too */
4475-
cache = find_first_cache_extent(root->fs_info->corrupt_blocks, 0);
4476+
cache = search_cache_extent(root->fs_info->corrupt_blocks, 0);
44764477
while(cache) {
44774478
rec = container_of(cache, struct extent_record, cache);
44784479
btrfs_pin_extent(root->fs_info,
@@ -4522,7 +4523,7 @@ static int check_extent_refs(struct btrfs_trans_handle *trans,
45224523

45234524
while(1) {
45244525
fixed = 0;
4525-
cache = find_first_cache_extent(extent_cache, 0);
4526+
cache = search_cache_extent(extent_cache, 0);
45264527
if (!cache)
45274528
break;
45284529
rec = container_of(cache, struct extent_record, cache);
@@ -4594,19 +4595,6 @@ static int check_extent_refs(struct btrfs_trans_handle *trans,
45944595
return err;
45954596
}
45964597

4597-
static void free_cache_tree(struct cache_tree *tree)
4598-
{
4599-
struct cache_extent *cache;
4600-
4601-
while (1) {
4602-
cache = find_first_cache_extent(tree, 0);
4603-
if (!cache)
4604-
break;
4605-
remove_cache_extent(tree, cache);
4606-
free(cache);
4607-
}
4608-
}
4609-
46104598
static int check_extents(struct btrfs_root *root, int repair)
46114599
{
46124600
struct cache_tree extent_cache;
@@ -4716,11 +4704,11 @@ static int check_extents(struct btrfs_root *root, int repair)
47164704
}
47174705

47184706
free_corrupt_blocks_tree(root->fs_info->corrupt_blocks);
4719-
free_cache_tree(&seen);
4720-
free_cache_tree(&pending);
4721-
free_cache_tree(&reada);
4722-
free_cache_tree(&nodes);
4723-
free_extent_cache(root->fs_info, &extent_cache);
4707+
free_extent_cache_tree(&seen);
4708+
free_extent_cache_tree(&pending);
4709+
free_extent_cache_tree(&reada);
4710+
free_extent_cache_tree(&nodes);
4711+
free_extent_record_cache(root->fs_info, &extent_cache);
47244712
goto again;
47254713
}
47264714

0 commit comments

Comments
 (0)