Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
51e6ce82
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
51e6ce82
编写于
7月 18, 2018
作者:
M
Miklos Szeredi
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'dedupe-cleanup' into overlayfs-next
Following series for stacking overlay files depends on this mini series.
上级
9951934d
1b4f42a1
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
74 addition
and
84 deletion
+74
-84
fs/btrfs/ctree.h
fs/btrfs/ctree.h
+3
-2
fs/btrfs/ioctl.c
fs/btrfs/ioctl.c
+4
-7
fs/ocfs2/file.c
fs/ocfs2/file.c
+6
-11
fs/read_write.c
fs/read_write.c
+53
-41
fs/xfs/xfs_file.c
fs/xfs/xfs_file.c
+7
-22
include/linux/fs.h
include/linux/fs.h
+1
-1
未找到文件。
fs/btrfs/ctree.h
浏览文件 @
51e6ce82
...
...
@@ -3247,8 +3247,9 @@ void btrfs_get_block_group_info(struct list_head *groups_list,
struct
btrfs_ioctl_space_info
*
space
);
void
btrfs_update_ioctl_balance_args
(
struct
btrfs_fs_info
*
fs_info
,
struct
btrfs_ioctl_balance_args
*
bargs
);
ssize_t
btrfs_dedupe_file_range
(
struct
file
*
src_file
,
u64
loff
,
u64
olen
,
struct
file
*
dst_file
,
u64
dst_loff
);
int
btrfs_dedupe_file_range
(
struct
file
*
src_file
,
loff_t
src_loff
,
struct
file
*
dst_file
,
loff_t
dst_loff
,
u64
olen
);
/* file.c */
int
__init
btrfs_auto_defrag_init
(
void
);
...
...
fs/btrfs/ioctl.c
浏览文件 @
51e6ce82
...
...
@@ -3600,13 +3600,13 @@ static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen,
return
ret
;
}
ssize_t
btrfs_dedupe_file_range
(
struct
file
*
src_file
,
u64
loff
,
u64
olen
,
struct
file
*
dst_file
,
u64
dst_loff
)
int
btrfs_dedupe_file_range
(
struct
file
*
src_file
,
loff_t
src_loff
,
struct
file
*
dst_file
,
loff_t
dst_loff
,
u64
olen
)
{
struct
inode
*
src
=
file_inode
(
src_file
);
struct
inode
*
dst
=
file_inode
(
dst_file
);
u64
bs
=
BTRFS_I
(
src
)
->
root
->
fs_info
->
sb
->
s_blocksize
;
ssize_t
res
;
if
(
WARN_ON_ONCE
(
bs
<
PAGE_SIZE
))
{
/*
...
...
@@ -3617,10 +3617,7 @@ ssize_t btrfs_dedupe_file_range(struct file *src_file, u64 loff, u64 olen,
return
-
EINVAL
;
}
res
=
btrfs_extent_same
(
src
,
loff
,
olen
,
dst
,
dst_loff
);
if
(
res
)
return
res
;
return
olen
;
return
btrfs_extent_same
(
src
,
src_loff
,
olen
,
dst
,
dst_loff
);
}
static
int
clone_finish_inode_update
(
struct
btrfs_trans_handle
*
trans
,
...
...
fs/ocfs2/file.c
浏览文件 @
51e6ce82
...
...
@@ -2537,19 +2537,14 @@ static int ocfs2_file_clone_range(struct file *file_in,
len
,
false
);
}
static
ssize_t
ocfs2_file_dedupe_range
(
struct
file
*
src_file
,
u64
loff
,
u64
len
,
struct
file
*
dst_file
,
u64
dst_loff
)
static
int
ocfs2_file_dedupe_range
(
struct
file
*
file_in
,
loff_t
pos_in
,
struct
file
*
file_out
,
loff_t
pos_out
,
u64
len
)
{
int
error
;
error
=
ocfs2_reflink_remap_range
(
src_file
,
loff
,
dst_file
,
dst_loff
,
return
ocfs2_reflink_remap_range
(
file_in
,
pos_in
,
file_out
,
pos_out
,
len
,
true
);
if
(
error
)
return
error
;
return
len
;
}
const
struct
inode_operations
ocfs2_file_iops
=
{
...
...
fs/read_write.c
浏览文件 @
51e6ce82
...
...
@@ -1964,6 +1964,44 @@ int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
}
EXPORT_SYMBOL
(
vfs_dedupe_file_range_compare
);
static
int
vfs_dedupe_file_range_one
(
struct
file
*
src_file
,
loff_t
src_pos
,
struct
file
*
dst_file
,
loff_t
dst_pos
,
u64
len
)
{
s64
ret
;
ret
=
mnt_want_write_file
(
dst_file
);
if
(
ret
)
return
ret
;
ret
=
clone_verify_area
(
dst_file
,
dst_pos
,
len
,
true
);
if
(
ret
<
0
)
goto
out_drop_write
;
ret
=
-
EINVAL
;
if
(
!
(
capable
(
CAP_SYS_ADMIN
)
||
(
dst_file
->
f_mode
&
FMODE_WRITE
)))
goto
out_drop_write
;
ret
=
-
EXDEV
;
if
(
src_file
->
f_path
.
mnt
!=
dst_file
->
f_path
.
mnt
)
goto
out_drop_write
;
ret
=
-
EISDIR
;
if
(
S_ISDIR
(
file_inode
(
dst_file
)
->
i_mode
))
goto
out_drop_write
;
ret
=
-
EINVAL
;
if
(
!
dst_file
->
f_op
->
dedupe_file_range
)
goto
out_drop_write
;
ret
=
dst_file
->
f_op
->
dedupe_file_range
(
src_file
,
src_pos
,
dst_file
,
dst_pos
,
len
);
out_drop_write:
mnt_drop_write_file
(
dst_file
);
return
ret
;
}
int
vfs_dedupe_file_range
(
struct
file
*
file
,
struct
file_dedupe_range
*
same
)
{
struct
file_dedupe_range_info
*
info
;
...
...
@@ -1972,11 +2010,8 @@ int vfs_dedupe_file_range(struct file *file, struct file_dedupe_range *same)
u64
len
;
int
i
;
int
ret
;
bool
is_admin
=
capable
(
CAP_SYS_ADMIN
);
u16
count
=
same
->
dest_count
;
struct
file
*
dst_file
;
loff_t
dst_off
;
ssize_t
deduped
;
int
deduped
;
if
(
!
(
file
->
f_mode
&
FMODE_READ
))
return
-
EINVAL
;
...
...
@@ -2003,6 +2038,9 @@ int vfs_dedupe_file_range(struct file *file, struct file_dedupe_range *same)
if
(
off
+
len
>
i_size_read
(
src
))
return
-
EINVAL
;
/* Arbitrary 1G limit on a single dedupe request, can be raised. */
len
=
min_t
(
u64
,
len
,
1
<<
30
);
/* pre-format output fields to sane values */
for
(
i
=
0
;
i
<
count
;
i
++
)
{
same
->
info
[
i
].
bytes_deduped
=
0ULL
;
...
...
@@ -2010,54 +2048,28 @@ int vfs_dedupe_file_range(struct file *file, struct file_dedupe_range *same)
}
for
(
i
=
0
,
info
=
same
->
info
;
i
<
count
;
i
++
,
info
++
)
{
struct
inode
*
dst
;
struct
fd
dst_fd
=
fdget
(
info
->
dest_fd
);
struct
file
*
dst_file
=
dst_fd
.
file
;
dst_file
=
dst_fd
.
file
;
if
(
!
dst_file
)
{
info
->
status
=
-
EBADF
;
goto
next_loop
;
}
dst
=
file_inode
(
dst_file
);
ret
=
mnt_want_write_file
(
dst_file
);
if
(
ret
)
{
info
->
status
=
ret
;
goto
next_fdput
;
}
dst_off
=
info
->
dest_offset
;
ret
=
clone_verify_area
(
dst_file
,
dst_off
,
len
,
true
);
if
(
ret
<
0
)
{
info
->
status
=
ret
;
goto
next_file
;
}
ret
=
0
;
if
(
info
->
reserved
)
{
info
->
status
=
-
EINVAL
;
}
else
if
(
!
(
is_admin
||
(
dst_file
->
f_mode
&
FMODE_WRITE
)))
{
info
->
status
=
-
EINVAL
;
}
else
if
(
file
->
f_path
.
mnt
!=
dst_file
->
f_path
.
mnt
)
{
info
->
status
=
-
EXDEV
;
}
else
if
(
S_ISDIR
(
dst
->
i_mode
))
{
info
->
status
=
-
EISDIR
;
}
else
if
(
dst_file
->
f_op
->
dedupe_file_range
==
NULL
)
{
info
->
status
=
-
EINVAL
;
}
else
{
deduped
=
dst_file
->
f_op
->
dedupe_file_range
(
file
,
off
,
len
,
dst_file
,
info
->
dest_offset
);
if
(
deduped
==
-
EBADE
)
info
->
status
=
FILE_DEDUPE_RANGE_DIFFERS
;
else
if
(
deduped
<
0
)
info
->
status
=
deduped
;
else
info
->
bytes_deduped
+=
deduped
;
goto
next_fdput
;
}
next_file:
mnt_drop_write_file
(
dst_file
);
deduped
=
vfs_dedupe_file_range_one
(
file
,
off
,
dst_file
,
info
->
dest_offset
,
len
);
if
(
deduped
==
-
EBADE
)
info
->
status
=
FILE_DEDUPE_RANGE_DIFFERS
;
else
if
(
deduped
<
0
)
info
->
status
=
deduped
;
else
info
->
bytes_deduped
=
len
;
next_fdput:
fdput
(
dst_fd
);
next_loop:
...
...
fs/xfs/xfs_file.c
浏览文件 @
51e6ce82
...
...
@@ -933,31 +933,16 @@ xfs_file_clone_range(
len
,
false
);
}
STATIC
ssize_
t
STATIC
in
t
xfs_file_dedupe_range
(
struct
file
*
src_file
,
u64
loff
,
u64
len
,
struct
file
*
dst_file
,
u64
dst_loff
)
struct
file
*
file_in
,
loff_t
pos_in
,
struct
file
*
file_out
,
loff_t
pos_out
,
u64
len
)
{
struct
inode
*
srci
=
file_inode
(
src_file
);
u64
max_dedupe
;
int
error
;
/*
* Since we have to read all these pages in to compare them, cut
* it off at MAX_RW_COUNT/2 rounded down to the nearest block.
* That means we won't do more than MAX_RW_COUNT IO per request.
*/
max_dedupe
=
(
MAX_RW_COUNT
>>
1
)
&
~
(
i_blocksize
(
srci
)
-
1
);
if
(
len
>
max_dedupe
)
len
=
max_dedupe
;
error
=
xfs_reflink_remap_range
(
src_file
,
loff
,
dst_file
,
dst_loff
,
return
xfs_reflink_remap_range
(
file_in
,
pos_in
,
file_out
,
pos_out
,
len
,
true
);
if
(
error
)
return
error
;
return
len
;
}
STATIC
int
...
...
include/linux/fs.h
浏览文件 @
51e6ce82
...
...
@@ -1751,7 +1751,7 @@ struct file_operations {
loff_t
,
size_t
,
unsigned
int
);
int
(
*
clone_file_range
)(
struct
file
*
,
loff_t
,
struct
file
*
,
loff_t
,
u64
);
ssize_t
(
*
dedupe_file_range
)(
struct
file
*
,
u64
,
u64
,
struct
file
*
,
int
(
*
dedupe_file_range
)(
struct
file
*
,
loff_t
,
struct
file
*
,
loff_t
,
u64
);
}
__randomize_layout
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录