mirror of https://gitee.com/openkylin/linux.git
Merge branch 'btrfs-3.0' into for-linus
This commit is contained in:
commit
2cf4ce7c2a
|
@ -4125,7 +4125,8 @@ static int btrfs_real_readdir(struct file *filp, void *dirent,
|
||||||
|
|
||||||
/* special case for "." */
|
/* special case for "." */
|
||||||
if (filp->f_pos == 0) {
|
if (filp->f_pos == 0) {
|
||||||
over = filldir(dirent, ".", 1, 1, btrfs_ino(inode), DT_DIR);
|
over = filldir(dirent, ".", 1,
|
||||||
|
filp->f_pos, btrfs_ino(inode), DT_DIR);
|
||||||
if (over)
|
if (over)
|
||||||
return 0;
|
return 0;
|
||||||
filp->f_pos = 1;
|
filp->f_pos = 1;
|
||||||
|
@ -4134,7 +4135,7 @@ static int btrfs_real_readdir(struct file *filp, void *dirent,
|
||||||
if (filp->f_pos == 1) {
|
if (filp->f_pos == 1) {
|
||||||
u64 pino = parent_ino(filp->f_path.dentry);
|
u64 pino = parent_ino(filp->f_path.dentry);
|
||||||
over = filldir(dirent, "..", 2,
|
over = filldir(dirent, "..", 2,
|
||||||
2, pino, DT_DIR);
|
filp->f_pos, pino, DT_DIR);
|
||||||
if (over)
|
if (over)
|
||||||
return 0;
|
return 0;
|
||||||
filp->f_pos = 2;
|
filp->f_pos = 2;
|
||||||
|
|
|
@ -2177,6 +2177,11 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,
|
||||||
if (!(src_file->f_mode & FMODE_READ))
|
if (!(src_file->f_mode & FMODE_READ))
|
||||||
goto out_fput;
|
goto out_fput;
|
||||||
|
|
||||||
|
/* don't make the dst file partly checksummed */
|
||||||
|
if ((BTRFS_I(src)->flags & BTRFS_INODE_NODATASUM) !=
|
||||||
|
(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM))
|
||||||
|
goto out_fput;
|
||||||
|
|
||||||
ret = -EISDIR;
|
ret = -EISDIR;
|
||||||
if (S_ISDIR(src->i_mode) || S_ISDIR(inode->i_mode))
|
if (S_ISDIR(src->i_mode) || S_ISDIR(inode->i_mode))
|
||||||
goto out_fput;
|
goto out_fput;
|
||||||
|
@ -2226,6 +2231,10 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* truncate page cache pages from target inode range */
|
||||||
|
truncate_inode_pages_range(&inode->i_data, destoff,
|
||||||
|
PAGE_CACHE_ALIGN(destoff + len) - 1);
|
||||||
|
|
||||||
/* do any pending delalloc/csum calc on src, one way or
|
/* do any pending delalloc/csum calc on src, one way or
|
||||||
another, and lock file content */
|
another, and lock file content */
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -2242,10 +2251,6 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,
|
||||||
btrfs_wait_ordered_range(src, off, len);
|
btrfs_wait_ordered_range(src, off, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* truncate page cache pages from target inode range */
|
|
||||||
truncate_inode_pages_range(&inode->i_data, off,
|
|
||||||
ALIGN(off + len, PAGE_CACHE_SIZE) - 1);
|
|
||||||
|
|
||||||
/* clone data */
|
/* clone data */
|
||||||
key.objectid = btrfs_ino(src);
|
key.objectid = btrfs_ino(src);
|
||||||
key.type = BTRFS_EXTENT_DATA_KEY;
|
key.type = BTRFS_EXTENT_DATA_KEY;
|
||||||
|
@ -2442,7 +2447,6 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,
|
||||||
if (endoff > inode->i_size)
|
if (endoff > inode->i_size)
|
||||||
btrfs_i_size_write(inode, endoff);
|
btrfs_i_size_write(inode, endoff);
|
||||||
|
|
||||||
BTRFS_I(inode)->flags = BTRFS_I(src)->flags;
|
|
||||||
ret = btrfs_update_inode(trans, root, inode);
|
ret = btrfs_update_inode(trans, root, inode);
|
||||||
BUG_ON(ret);
|
BUG_ON(ret);
|
||||||
btrfs_end_transaction(trans, root);
|
btrfs_end_transaction(trans, root);
|
||||||
|
|
Loading…
Reference in New Issue