Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
143c8c91
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
143c8c91
编写于
11月 25, 2011
作者:
A
Al Viro
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
vfs: mnt_ns moved to struct mount
Signed-off-by:
N
Al Viro
<
viro@zeniv.linux.org.uk
>
上级
900148dc
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
30 addition
and
29 deletion
+30
-29
fs/dcache.c
fs/dcache.c
+1
-1
fs/mount.h
fs/mount.h
+1
-0
fs/namespace.c
fs/namespace.c
+23
-22
fs/pnode.c
fs/pnode.c
+5
-5
include/linux/mount.h
include/linux/mount.h
+0
-1
未找到文件。
fs/dcache.c
浏览文件 @
143c8c91
...
...
@@ -2503,7 +2503,7 @@ static int prepend_path(const struct path *path,
if
(
!
slash
)
error
=
prepend
(
buffer
,
buflen
,
"/"
,
1
);
if
(
!
error
)
error
=
vfsmnt
->
mnt_ns
?
1
:
2
;
error
=
real_mount
(
vfsmnt
)
->
mnt_ns
?
1
:
2
;
goto
out
;
}
...
...
fs/mount.h
浏览文件 @
143c8c91
...
...
@@ -25,6 +25,7 @@ struct mount {
struct
list_head
mnt_slave_list
;
/* list of slave mounts */
struct
list_head
mnt_slave
;
/* slave list entry */
struct
mount
*
mnt_master
;
/* slave is on master->mnt_slave_list */
struct
mnt_namespace
*
mnt_ns
;
/* containing namespace */
};
static
inline
struct
mount
*
real_mount
(
struct
vfsmount
*
mnt
)
...
...
fs/namespace.c
浏览文件 @
143c8c91
...
...
@@ -505,7 +505,7 @@ struct vfsmount *lookup_mnt(struct path *path)
}
}
static
inline
int
check_mnt
(
struct
vfs
mount
*
mnt
)
static
inline
int
check_mnt
(
struct
mount
*
mnt
)
{
return
mnt
->
mnt_ns
==
current
->
nsproxy
->
mnt_ns
;
}
...
...
@@ -614,13 +614,13 @@ static void commit_tree(struct mount *mnt)
struct
mount
*
parent
=
mnt
->
mnt_parent
;
struct
mount
*
m
;
LIST_HEAD
(
head
);
struct
mnt_namespace
*
n
=
parent
->
mnt
.
mnt
_ns
;
struct
mnt_namespace
*
n
=
parent
->
mnt_ns
;
BUG_ON
(
parent
==
mnt
);
list_add_tail
(
&
head
,
&
mnt
->
mnt
.
mnt_list
);
list_for_each_entry
(
m
,
&
head
,
mnt
.
mnt_list
)
{
m
->
mnt
.
mnt
_ns
=
n
;
m
->
mnt_ns
=
n
;
__mnt_make_longterm
(
m
);
}
...
...
@@ -1234,8 +1234,8 @@ void umount_tree(struct mount *mnt, int propagate, struct list_head *kill)
list_for_each_entry
(
p
,
&
tmp_list
,
mnt_hash
)
{
list_del_init
(
&
p
->
mnt_expire
);
list_del_init
(
&
p
->
mnt
.
mnt_list
);
__touch_mnt_namespace
(
p
->
mnt
.
mnt
_ns
);
p
->
mnt
.
mnt
_ns
=
NULL
;
__touch_mnt_namespace
(
p
->
mnt_ns
);
p
->
mnt_ns
=
NULL
;
__mnt_make_shortterm
(
p
);
list_del_init
(
&
p
->
mnt_child
);
if
(
mnt_has_parent
(
p
))
{
...
...
@@ -1367,7 +1367,7 @@ SYSCALL_DEFINE2(umount, char __user *, name, int, flags)
retval
=
-
EINVAL
;
if
(
path
.
dentry
!=
path
.
mnt
->
mnt_root
)
goto
dput_and_out
;
if
(
!
check_mnt
(
path
.
mnt
))
if
(
!
check_mnt
(
mnt
))
goto
dput_and_out
;
retval
=
-
EPERM
;
...
...
@@ -1619,7 +1619,7 @@ static int attach_recursive_mnt(struct mount *source_mnt,
if
(
parent_path
)
{
detach_mnt
(
source_mnt
,
parent_path
);
attach_mnt
(
source_mnt
,
path
);
touch_mnt_namespace
(
parent_path
->
mnt
->
mnt_ns
);
touch_mnt_namespace
(
source_
mnt
->
mnt_ns
);
}
else
{
mnt_set_mountpoint
(
dest_mnt
,
dest_dentry
,
source_mnt
);
commit_tree
(
source_mnt
);
...
...
@@ -1765,7 +1765,7 @@ static int do_loopback(struct path *path, char *old_name,
if
(
IS_MNT_UNBINDABLE
(
old_path
.
mnt
))
goto
out2
;
if
(
!
check_mnt
(
path
->
mnt
)
||
!
check_mnt
(
old_path
.
mnt
))
if
(
!
check_mnt
(
real_mount
(
path
->
mnt
))
||
!
check_mnt
(
old
))
goto
out2
;
err
=
-
ENOMEM
;
...
...
@@ -1818,11 +1818,12 @@ static int do_remount(struct path *path, int flags, int mnt_flags,
{
int
err
;
struct
super_block
*
sb
=
path
->
mnt
->
mnt_sb
;
struct
mount
*
mnt
=
real_mount
(
path
->
mnt
);
if
(
!
capable
(
CAP_SYS_ADMIN
))
return
-
EPERM
;
if
(
!
check_mnt
(
path
->
mnt
))
if
(
!
check_mnt
(
mnt
))
return
-
EINVAL
;
if
(
path
->
dentry
!=
path
->
mnt
->
mnt_root
)
...
...
@@ -1839,14 +1840,14 @@ static int do_remount(struct path *path, int flags, int mnt_flags,
err
=
do_remount_sb
(
sb
,
flags
,
data
,
0
);
if
(
!
err
)
{
br_write_lock
(
vfsmount_lock
);
mnt_flags
|=
path
->
mnt
->
mnt_flags
&
MNT_PROPAGATION_MASK
;
path
->
mnt
->
mnt_flags
=
mnt_flags
;
mnt_flags
|=
mnt
->
mnt
.
mnt_flags
&
MNT_PROPAGATION_MASK
;
mnt
->
mnt
.
mnt_flags
=
mnt_flags
;
br_write_unlock
(
vfsmount_lock
);
}
up_write
(
&
sb
->
s_umount
);
if
(
!
err
)
{
br_write_lock
(
vfsmount_lock
);
touch_mnt_namespace
(
path
->
mnt
->
mnt_ns
);
touch_mnt_namespace
(
mnt
->
mnt_ns
);
br_write_unlock
(
vfsmount_lock
);
}
return
err
;
...
...
@@ -1880,8 +1881,10 @@ static int do_move_mount(struct path *path, char *old_name)
if
(
err
<
0
)
goto
out
;
old
=
real_mount
(
old_path
.
mnt
);
err
=
-
EINVAL
;
if
(
!
check_mnt
(
path
->
mnt
)
||
!
check_mnt
(
old_path
.
mnt
))
if
(
!
check_mnt
(
real_mount
(
path
->
mnt
))
||
!
check_mnt
(
old
))
goto
out1
;
if
(
d_unlinked
(
path
->
dentry
))
...
...
@@ -1891,8 +1894,6 @@ static int do_move_mount(struct path *path, char *old_name)
if
(
old_path
.
dentry
!=
old_path
.
mnt
->
mnt_root
)
goto
out1
;
old
=
real_mount
(
old_path
.
mnt
);
if
(
!
mnt_has_parent
(
old
))
goto
out1
;
...
...
@@ -1984,7 +1985,7 @@ static int do_add_mount(struct mount *newmnt, struct path *path, int mnt_flags)
return
err
;
err
=
-
EINVAL
;
if
(
!
(
mnt_flags
&
MNT_SHRINKABLE
)
&&
!
check_mnt
(
path
->
mnt
))
if
(
!
(
mnt_flags
&
MNT_SHRINKABLE
)
&&
!
check_mnt
(
real_mount
(
path
->
mnt
)
))
goto
unlock
;
/* Refuse the same filesystem on the same mount point */
...
...
@@ -2112,7 +2113,7 @@ void mark_mounts_for_expiry(struct list_head *mounts)
}
while
(
!
list_empty
(
&
graveyard
))
{
mnt
=
list_first_entry
(
&
graveyard
,
struct
mount
,
mnt_expire
);
touch_mnt_namespace
(
mnt
->
mnt
.
mnt
_ns
);
touch_mnt_namespace
(
mnt
->
mnt_ns
);
umount_tree
(
mnt
,
1
,
&
umounts
);
}
br_write_unlock
(
vfsmount_lock
);
...
...
@@ -2185,7 +2186,7 @@ static void shrink_submounts(struct mount *mnt, struct list_head *umounts)
while
(
!
list_empty
(
&
graveyard
))
{
m
=
list_first_entry
(
&
graveyard
,
struct
mount
,
mnt_expire
);
touch_mnt_namespace
(
m
->
mnt
.
mnt
_ns
);
touch_mnt_namespace
(
m
->
mnt_ns
);
umount_tree
(
m
,
1
,
umounts
);
}
}
...
...
@@ -2423,7 +2424,7 @@ static struct mnt_namespace *dup_mnt_ns(struct mnt_namespace *mnt_ns,
p
=
real_mount
(
mnt_ns
->
root
);
q
=
new
;
while
(
p
)
{
q
->
mnt
.
mnt
_ns
=
new_ns
;
q
->
mnt_ns
=
new_ns
;
__mnt_make_longterm
(
q
);
if
(
fs
)
{
if
(
&
p
->
mnt
==
fs
->
root
.
mnt
)
{
...
...
@@ -2479,7 +2480,7 @@ static struct mnt_namespace *create_mnt_ns(struct vfsmount *mnt)
new_ns
=
alloc_mnt_ns
();
if
(
!
IS_ERR
(
new_ns
))
{
mnt
->
mnt_ns
=
new_ns
;
real_mount
(
mnt
)
->
mnt_ns
=
new_ns
;
__mnt_make_longterm
(
real_mount
(
mnt
));
new_ns
->
root
=
mnt
;
list_add
(
&
new_ns
->
list
,
&
new_ns
->
root
->
mnt_list
);
...
...
@@ -2644,7 +2645,7 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
IS_MNT_SHARED
(
&
new_mnt
->
mnt_parent
->
mnt
)
||
IS_MNT_SHARED
(
&
root_mnt
->
mnt_parent
->
mnt
))
goto
out4
;
if
(
!
check_mnt
(
root
.
mnt
)
||
!
check_mnt
(
new
.
mnt
))
if
(
!
check_mnt
(
root
_mnt
)
||
!
check_mnt
(
new_
mnt
))
goto
out4
;
error
=
-
ENOENT
;
if
(
d_unlinked
(
new
.
dentry
))
...
...
@@ -2793,5 +2794,5 @@ EXPORT_SYMBOL(kern_unmount);
bool
our_mnt
(
struct
vfsmount
*
mnt
)
{
return
check_mnt
(
mnt
);
return
check_mnt
(
real_mount
(
mnt
)
);
}
fs/pnode.c
浏览文件 @
143c8c91
...
...
@@ -36,7 +36,7 @@ static struct mount *get_peer_under_root(struct mount *mnt,
do
{
/* Check the namespace first for optimization */
if
(
m
->
mnt
.
mnt
_ns
==
ns
&&
is_path_reachable
(
m
,
m
->
mnt
.
mnt_root
,
root
))
if
(
m
->
mnt_ns
==
ns
&&
is_path_reachable
(
m
,
m
->
mnt
.
mnt_root
,
root
))
return
m
;
m
=
next_peer
(
m
);
...
...
@@ -56,7 +56,7 @@ int get_dominating_id(struct mount *mnt, const struct path *root)
struct
mount
*
m
;
for
(
m
=
mnt
->
mnt_master
;
m
!=
NULL
;
m
=
m
->
mnt_master
)
{
struct
mount
*
d
=
get_peer_under_root
(
m
,
mnt
->
mnt
.
mnt
_ns
,
root
);
struct
mount
*
d
=
get_peer_under_root
(
m
,
mnt
->
mnt_ns
,
root
);
if
(
d
)
return
d
->
mnt
.
mnt_group_id
;
}
...
...
@@ -145,7 +145,7 @@ static struct mount *propagation_next(struct mount *m,
struct
mount
*
origin
)
{
/* are there any slaves of this mount? */
if
(
!
IS_MNT_NEW
(
&
m
->
mnt
)
&&
!
list_empty
(
&
m
->
mnt_slave_list
))
if
(
!
IS_MNT_NEW
(
m
)
&&
!
list_empty
(
&
m
->
mnt_slave_list
))
return
first_slave
(
m
);
while
(
1
)
{
...
...
@@ -189,7 +189,7 @@ static struct mount *get_source(struct mount *dest,
if
(
p_last_dest
)
{
do
{
p_last_dest
=
next_peer
(
p_last_dest
);
}
while
(
IS_MNT_NEW
(
&
p_last_dest
->
mn
t
));
}
while
(
IS_MNT_NEW
(
p_last_des
t
));
/* is that a peer of the earlier? */
if
(
dest
==
p_last_dest
)
{
*
type
=
CL_MAKE_SHARED
;
...
...
@@ -232,7 +232,7 @@ int propagate_mnt(struct mount *dest_mnt, struct dentry *dest_dentry,
int
type
;
struct
mount
*
source
;
if
(
IS_MNT_NEW
(
&
m
->
mnt
))
if
(
IS_MNT_NEW
(
m
))
continue
;
source
=
get_source
(
m
,
prev_dest_mnt
,
prev_src_mnt
,
&
type
);
...
...
include/linux/mount.h
浏览文件 @
143c8c91
...
...
@@ -58,7 +58,6 @@ struct vfsmount {
#endif
const
char
*
mnt_devname
;
/* Name of device e.g. /dev/dsk/hda1 */
struct
list_head
mnt_list
;
struct
mnt_namespace
*
mnt_ns
;
/* containing namespace */
int
mnt_id
;
/* mount identifier */
int
mnt_group_id
;
/* peer group identifier */
int
mnt_expiry_mark
;
/* true if marked for expiry */
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录