aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/check-integrity.c
diff options
context:
space:
mode:
authorStefan Behrens <sbehrens@giantdisaster.de>2012-04-24 12:10:16 -0400
committerJosef Bacik <josef@redhat.com>2012-05-30 10:23:43 -0400
commit86ff7ffce0b93aed14df4c8dcedd05bb5e2fdfbc (patch)
tree2d770c05a6d4539a0defe9a43449362383109b10 /fs/btrfs/check-integrity.c
parent3d136a1131c66f7d26fb171e4c5b0b8baacd3129 (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.c25
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;