diff options
-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; |