diff options
author | Stefan Behrens <sbehrens@giantdisaster.de> | 2012-04-24 12:10:16 -0400 |
---|---|---|
committer | Josef Bacik <josef@redhat.com> | 2012-05-30 10:23:43 -0400 |
commit | 86ff7ffce0b93aed14df4c8dcedd05bb5e2fdfbc (patch) | |
tree | 2d770c05a6d4539a0defe9a43449362383109b10 /fs/btrfs/check-integrity.c | |
parent | 3d136a1131c66f7d26fb171e4c5b0b8baacd3129 (diff) |
Btrfs: fix runtime warning in check-integrity check data mode
If a file_extent_item was located at the very end of a leaf and there was
not enough space to hold a full item, but there was enough space to hold
one of type BTRFS_FILE_EXTENT_INLINE or PREALLOC, and it was only such a
short item, a warning was printed anyway. This check is now fixed.
Signed-off-by: Stefan Behrens <sbehrens@giantdisaster.de>
Diffstat (limited to 'fs/btrfs/check-integrity.c')
-rw-r--r-- | fs/btrfs/check-integrity.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index 7f6cc359e440..ed7618389327 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c | |||
@@ -1428,6 +1428,28 @@ static int btrfsic_handle_extent_data( | |||
1428 | 1428 | ||
1429 | file_extent_item_offset = offsetof(struct btrfs_leaf, items) + | 1429 | file_extent_item_offset = offsetof(struct btrfs_leaf, items) + |
1430 | item_offset; | 1430 | item_offset; |
1431 | if (file_extent_item_offset + | ||
1432 | offsetof(struct btrfs_file_extent_item, disk_num_bytes) > | ||
1433 | block_ctx->len) { | ||
1434 | printk(KERN_INFO | ||
1435 | "btrfsic: file item out of bounce at logical %llu, dev %s\n", | ||
1436 | block_ctx->start, block_ctx->dev->name); | ||
1437 | return -1; | ||
1438 | } | ||
1439 | |||
1440 | btrfsic_read_from_block_data(block_ctx, &file_extent_item, | ||
1441 | file_extent_item_offset, | ||
1442 | offsetof(struct btrfs_file_extent_item, disk_num_bytes)); | ||
1443 | if (BTRFS_FILE_EXTENT_REG != file_extent_item.type || | ||
1444 | ((u64)0) == le64_to_cpu(file_extent_item.disk_bytenr)) { | ||
1445 | if (state->print_mask & BTRFSIC_PRINT_MASK_VERY_VERBOSE) | ||
1446 | printk(KERN_INFO "extent_data: type %u, disk_bytenr = %llu\n", | ||
1447 | file_extent_item.type, | ||
1448 | (unsigned long long) | ||
1449 | le64_to_cpu(file_extent_item.disk_bytenr)); | ||
1450 | return 0; | ||
1451 | } | ||
1452 | |||
1431 | if (file_extent_item_offset + sizeof(struct btrfs_file_extent_item) > | 1453 | if (file_extent_item_offset + sizeof(struct btrfs_file_extent_item) > |
1432 | block_ctx->len) { | 1454 | block_ctx->len) { |
1433 | printk(KERN_INFO | 1455 | printk(KERN_INFO |
@@ -1452,9 +1474,6 @@ static int btrfsic_handle_extent_data( | |||
1452 | le64_to_cpu(file_extent_item.disk_bytenr), | 1474 | le64_to_cpu(file_extent_item.disk_bytenr), |
1453 | (unsigned long long)le64_to_cpu(file_extent_item.offset), | 1475 | (unsigned long long)le64_to_cpu(file_extent_item.offset), |
1454 | (unsigned long long)num_bytes); | 1476 | (unsigned long long)num_bytes); |
1455 | if (BTRFS_FILE_EXTENT_REG != file_extent_item.type || | ||
1456 | ((u64)0) == le64_to_cpu(file_extent_item.disk_bytenr)) | ||
1457 | return 0; | ||
1458 | while (num_bytes > 0) { | 1477 | while (num_bytes > 0) { |
1459 | u32 chunk_len; | 1478 | u32 chunk_len; |
1460 | int num_copies; | 1479 | int num_copies; |