diff options
author | Liu Bo <liub.liubo@gmail.com> | 2012-09-07 22:01:28 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@fusionio.com> | 2012-10-01 15:19:18 -0400 |
commit | 69917e431210f8712fe050f47b7561e7dae89521 (patch) | |
tree | 52a81d3c70d3a768d2d7756984dd16898ce12e50 /fs/btrfs/scrub.c | |
parent | dea7d76ecbfb53cda6aadd9bed33e87d255c5b02 (diff) |
Btrfs: fix a bug in parsing return value in logical resolve
In logical resolve, we parse extent_from_logical()'s 'ret' as a kind of flag.
It is possible to lose our errors because
(-EXXXX & BTRFS_EXTENT_FLAG_TREE_BLOCK) is true.
I'm not sure if it is on purpose, it just looks too hacky if it is.
I'd rather use a real flag and a 'ret' to catch errors.
Acked-by: Jan Schmidt <list.btrfs@jan-o-sch.net>
Signed-off-by: Liu Bo <liub.liubo@gmail.com>
Diffstat (limited to 'fs/btrfs/scrub.c')
-rw-r--r-- | fs/btrfs/scrub.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 4e9eafe01c55..d3bb901ade42 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c | |||
@@ -352,13 +352,14 @@ static void scrub_print_warning(const char *errstr, struct scrub_block *sblock) | |||
352 | struct extent_buffer *eb; | 352 | struct extent_buffer *eb; |
353 | struct btrfs_extent_item *ei; | 353 | struct btrfs_extent_item *ei; |
354 | struct scrub_warning swarn; | 354 | struct scrub_warning swarn; |
355 | u32 item_size; | 355 | unsigned long ptr = 0; |
356 | int ret; | 356 | u64 extent_item_pos; |
357 | u64 flags = 0; | ||
357 | u64 ref_root; | 358 | u64 ref_root; |
359 | u32 item_size; | ||
358 | u8 ref_level; | 360 | u8 ref_level; |
359 | unsigned long ptr = 0; | ||
360 | const int bufsize = 4096; | 361 | const int bufsize = 4096; |
361 | u64 extent_item_pos; | 362 | int ret; |
362 | 363 | ||
363 | path = btrfs_alloc_path(); | 364 | path = btrfs_alloc_path(); |
364 | 365 | ||
@@ -375,7 +376,8 @@ static void scrub_print_warning(const char *errstr, struct scrub_block *sblock) | |||
375 | if (!path || !swarn.scratch_buf || !swarn.msg_buf) | 376 | if (!path || !swarn.scratch_buf || !swarn.msg_buf) |
376 | goto out; | 377 | goto out; |
377 | 378 | ||
378 | ret = extent_from_logical(fs_info, swarn.logical, path, &found_key); | 379 | ret = extent_from_logical(fs_info, swarn.logical, path, &found_key, |
380 | &flags); | ||
379 | if (ret < 0) | 381 | if (ret < 0) |
380 | goto out; | 382 | goto out; |
381 | 383 | ||
@@ -387,7 +389,7 @@ static void scrub_print_warning(const char *errstr, struct scrub_block *sblock) | |||
387 | item_size = btrfs_item_size_nr(eb, path->slots[0]); | 389 | item_size = btrfs_item_size_nr(eb, path->slots[0]); |
388 | btrfs_release_path(path); | 390 | btrfs_release_path(path); |
389 | 391 | ||
390 | if (ret & BTRFS_EXTENT_FLAG_TREE_BLOCK) { | 392 | if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) { |
391 | do { | 393 | do { |
392 | ret = tree_backref_for_extent(&ptr, eb, ei, item_size, | 394 | ret = tree_backref_for_extent(&ptr, eb, ei, item_size, |
393 | &ref_root, &ref_level); | 395 | &ref_root, &ref_level); |