diff options
author | Li Zefan <lizf@cn.fujitsu.com> | 2011-09-11 16:52:25 +0200 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2011-09-11 16:52:25 +0200 |
commit | d525e8ab022cb000e6e31a515ba8c3cf0d9c6130 (patch) | |
tree | afaa93134ca050e1169ed8fe68442b4522d9112e /fs/btrfs/ioctl.c | |
parent | Btrfs: calc file extent num_bytes correctly in file clone (diff) | |
download | linux-d525e8ab022cb000e6e31a515ba8c3cf0d9c6130.tar.xz linux-d525e8ab022cb000e6e31a515ba8c3cf0d9c6130.zip |
Btrfs: add dummy extent if dst offset excceeds file end in
You can see there's no file extent with range [0, 4096]. Check this by
btrfsck:
# btrfsck /dev/sda7
root 5 inode 258 errors 100
...
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/ioctl.c')
-rw-r--r-- | fs/btrfs/ioctl.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 028a4b8c12cd..63b4de1626d2 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -2228,6 +2228,12 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, !IS_ALIGNED(destoff, bs)) goto out_unlock; + if (destoff > inode->i_size) { + ret = btrfs_cont_expand(inode, inode->i_size, destoff); + if (ret) + goto out_unlock; + } + /* do any pending delalloc/csum calc on src, one way or another, and lock file content */ while (1) { |