path: root/btrfs-convert.c
diff options
authorQu Wenruo <>2016-06-02 15:22:49 +0800
committerDavid Sterba <>2016-06-07 18:15:19 +0200
commit9aae31f1248f68c2f6e19b8616f043e539723b9f (patch)
treed9deeaf0d930546a2152f9b9f503a38089c80b95 /btrfs-convert.c
parentdb6f9251e509107755c7014e7358469409a0d5fe (diff)
btrfs-progs: convert: Fix a bug which fails to insert hole file extent
When copying inode, if there is a file referring part of a hole range, convert will fail. The problem is, when calculating real extent bytenr, it doesn't check if the original extent is a hole. In case the orinal extent is a hole, we still calculate bytenr using file_pos - found_extent_file_pos, causing non-zero value, and later btrfs_record_file_extent() detects that we are pointing to non-exist extent and aborts convert. Fix it by checking the disk_bytenr before calculating real disk bytenr. Signed-off-by: Qu Wenruo <> Signed-off-by: David Sterba <>
Diffstat (limited to 'btrfs-convert.c')
1 files changed, 5 insertions, 1 deletions
diff --git a/btrfs-convert.c b/btrfs-convert.c
index beec5d7d..b18de59d 100644
--- a/btrfs-convert.c
+++ b/btrfs-convert.c
@@ -572,7 +572,11 @@ static int record_file_blocks(struct blk_iterate_data *data,
BUG_ON(cur_off - key.offset >= extent_num_bytes);
- real_disk_bytenr = cur_off - key.offset + extent_disk_bytenr;
+ if (extent_disk_bytenr)
+ real_disk_bytenr = cur_off - key.offset +
+ extent_disk_bytenr;
+ else
+ real_disk_bytenr = 0;
cur_len = min(key.offset + extent_num_bytes,
old_disk_bytenr + num_bytes) - cur_off;
ret = btrfs_record_file_extent(data->trans, data->root,