Skip to content

Commit

Permalink
btrfs: use correct offset for reloc_inode in prealloc_file_extent_clu…
Browse files Browse the repository at this point in the history
…ster()

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: Wang Xiaoguang <wangxg.fnst@cn.fujitsu.com>
Reviewed-by: Josef Bacik <jbacik@fb.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Chris Mason <clm@fb.com>
  • Loading branch information
Wang Xiaoguang authored and Chris Mason committed Aug 25, 2016
1 parent df2c95f commit dcb40c1
Showing 1 changed file with 6 additions and 4 deletions.
10 changes: 6 additions & 4 deletions fs/btrfs/relocation.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;
Expand Down

0 comments on commit dcb40c1

Please sign in to comment.