Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 86ff7ffc authored by Stefan Behrens's avatar Stefan Behrens Committed by Josef Bacik
Browse files

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: default avatarStefan Behrens <sbehrens@giantdisaster.de>
parent 3d136a11
Loading
Loading
Loading
Loading
+22 −3
Original line number Diff line number Diff line
@@ -1428,6 +1428,28 @@ static int btrfsic_handle_extent_data(

	file_extent_item_offset = offsetof(struct btrfs_leaf, items) +
				  item_offset;
	if (file_extent_item_offset +
	    offsetof(struct btrfs_file_extent_item, disk_num_bytes) >
	    block_ctx->len) {
		printk(KERN_INFO
		       "btrfsic: file item out of bounce at logical %llu, dev %s\n",
		       block_ctx->start, block_ctx->dev->name);
		return -1;
	}

	btrfsic_read_from_block_data(block_ctx, &file_extent_item,
		file_extent_item_offset,
		offsetof(struct btrfs_file_extent_item, disk_num_bytes));
	if (BTRFS_FILE_EXTENT_REG != file_extent_item.type ||
	    ((u64)0) == le64_to_cpu(file_extent_item.disk_bytenr)) {
		if (state->print_mask & BTRFSIC_PRINT_MASK_VERY_VERBOSE)
			printk(KERN_INFO "extent_data: type %u, disk_bytenr = %llu\n",
			       file_extent_item.type,
			       (unsigned long long)
			       le64_to_cpu(file_extent_item.disk_bytenr));
		return 0;
	}

	if (file_extent_item_offset + sizeof(struct btrfs_file_extent_item) >
	    block_ctx->len) {
		printk(KERN_INFO
@@ -1452,9 +1474,6 @@ static int btrfsic_handle_extent_data(
		       le64_to_cpu(file_extent_item.disk_bytenr),
		       (unsigned long long)le64_to_cpu(file_extent_item.offset),
		       (unsigned long long)num_bytes);
	if (BTRFS_FILE_EXTENT_REG != file_extent_item.type ||
	    ((u64)0) == le64_to_cpu(file_extent_item.disk_bytenr))
		return 0;
	while (num_bytes > 0) {
		u32 chunk_len;
		int num_copies;