Commit dcb40c19 authored by Wang Xiaoguang's avatar Wang Xiaoguang Committed by Chris Mason
Browse files

btrfs: use correct offset for reloc_inode in prealloc_file_extent_cluster()



In prealloc_file_extent_cluster(), btrfs_check_data_free_space() uses
wrong file offset for reloc_inode, it uses cluster->start and cluster->end,
which indeed are extent's bytenr. The correct value should be
cluster->[start|end] minus block group's start bytenr.

start bytenr   cluster->start
|              |     extent      |   extent   | ...| extent |
|----------------------------------------------------------------|
|                block group reloc_inode                         |

Signed-off-by: default avatarWang Xiaoguang <wangxg.fnst@cn.fujitsu.com>
Reviewed-by: default avatarJosef Bacik <jbacik@fb.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarChris Mason <clm@fb.com>
parent df2c95f3
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -3038,12 +3038,14 @@ int prealloc_file_extent_cluster(struct inode *inode,
	u64 num_bytes;
	int nr = 0;
	int ret = 0;
	u64 prealloc_start = cluster->start - offset;
	u64 prealloc_end = cluster->end - offset;

	BUG_ON(cluster->start != cluster->boundary[0]);
	inode_lock(inode);

	ret = btrfs_check_data_free_space(inode, cluster->start,
					  cluster->end + 1 - cluster->start);
	ret = btrfs_check_data_free_space(inode, prealloc_start,
					  prealloc_end + 1 - prealloc_start);
	if (ret)
		goto out;

@@ -3064,8 +3066,8 @@ int prealloc_file_extent_cluster(struct inode *inode,
			break;
		nr++;
	}
	btrfs_free_reserved_data_space(inode, cluster->start,
				       cluster->end + 1 - cluster->start);
	btrfs_free_reserved_data_space(inode, prealloc_start,
				       prealloc_end + 1 - prealloc_start);
out:
	inode_unlock(inode);
	return ret;