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