Btrfs: calc file extent num_bytes correctly in file clone
PATCH 1/1 Btrfs: calc file extent num_bytes correctly in file clone
# touch /mnt/dst
# clone_range -s 8192 -l 4096 /mnt/src /mnt/dst
# ls -l /mnt/dst
-rw-r--r-- 1 root root 4096 dst
# umount /mnt
# btrfs-debug-tree /dev/sda7
...
item 11 key (258 EXTENT_DATA 0) itemoff 3230 itemsize 53
extent data disk byte 12582912 nr 49152
extent data offset 8192 nr 12288 ram 49152
extent compression 0num_bytes should be 4096 not 12288.
Signed-off-by Li Zefan <[email protected]>
--- fs/btrfs/ioctl.c | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-)
fs/btrfs/ioctl.c +10 -3
@@ -2331,14 +2331,21 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,if (type ==BTRFS_FILE_EXTENT_REG || type ==BTRFS_FILE_EXTENT_PREALLOC ) { +/* +* a | --- range to clone ---| b +* | ------------- extent ------------- | +*/ + +/* substract range b */ +if (key.offset + datal > off + len) + datal = off + len - key.offset; + +/* substract range a */ if (off > key.offset) { datao += off - key.offset; datal -= off - key.offset; } -if (key.offset + datal > off + len) - datal = off + len - key.offset; - ret = btrfs_drop_extents(trans, inode, new_key.offset, new_key.offset + datal,
Signature · 1 line
1.7.3.1
minor, typos in comments s/substract/subtract/
Quoted 14 lines · Li Zefan
fs/btrfs/ioctl.c +6
-0@@ -2331,14 +2331,21 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,if (type ==BTRFS_FILE_EXTENT_REG || type ==BTRFS_FILE_EXTENT_PREALLOC ) { +/* +* a | --- range to clone ---| b +* | ------------- extent ------------- | +*/ + +/* substract range b */
...
Quoted 4 lines
fs/btrfs/ioctl.c +4
-0+if (key.offset + datal > off + len) + datal = off + len - key.offset; + +/* substract range a */
...
Quoted 11 lines
fs/btrfs/ioctl.c +0
-3if (off > key.offset) { datao += off - key.offset; datal -= off - key.offset; } -if (key.offset + datal > off + len) - datal = off + len - key.offset; - ret = btrfs_drop_extents(trans, inode, new_key.offset, new_key.offset + datal,