Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
gsplhtlxg
clone-Linux
提交
ca7068c4
C
clone-Linux
项目概览
gsplhtlxg
/
clone-Linux
通知
2
Star
0
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
clone-Linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ca7068c4
编写于
3月 17, 2012
作者:
A
Al Viro
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
anon_inodes: move allocation of anon_inode into ->mount()
Signed-off-by:
N
Al Viro
<
viro@zeniv.linux.org.uk
>
上级
2226a288
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
56 addition
and
53 deletion
+56
-53
fs/anon_inodes.c
fs/anon_inodes.c
+56
-53
未找到文件。
fs/anon_inodes.c
浏览文件 @
ca7068c4
...
...
@@ -39,19 +39,6 @@ static const struct dentry_operations anon_inodefs_dentry_operations = {
.
d_dname
=
anon_inodefs_dname
,
};
static
struct
dentry
*
anon_inodefs_mount
(
struct
file_system_type
*
fs_type
,
int
flags
,
const
char
*
dev_name
,
void
*
data
)
{
return
mount_pseudo
(
fs_type
,
"anon_inode:"
,
NULL
,
&
anon_inodefs_dentry_operations
,
ANON_INODE_FS_MAGIC
);
}
static
struct
file_system_type
anon_inode_fs_type
=
{
.
name
=
"anon_inodefs"
,
.
mount
=
anon_inodefs_mount
,
.
kill_sb
=
kill_anon_super
,
};
/*
* nop .set_page_dirty method so that people can use .page_mkwrite on
* anon inodes.
...
...
@@ -65,6 +52,62 @@ static const struct address_space_operations anon_aops = {
.
set_page_dirty
=
anon_set_page_dirty
,
};
/*
* A single inode exists for all anon_inode files. Contrary to pipes,
* anon_inode inodes have no associated per-instance data, so we need
* only allocate one of them.
*/
static
struct
inode
*
anon_inode_mkinode
(
struct
super_block
*
s
)
{
struct
inode
*
inode
=
new_inode_pseudo
(
s
);
if
(
!
inode
)
return
ERR_PTR
(
-
ENOMEM
);
inode
->
i_ino
=
get_next_ino
();
inode
->
i_fop
=
&
anon_inode_fops
;
inode
->
i_mapping
->
a_ops
=
&
anon_aops
;
/*
* Mark the inode dirty from the very beginning,
* that way it will never be moved to the dirty
* list because mark_inode_dirty() will think
* that it already _is_ on the dirty list.
*/
inode
->
i_state
=
I_DIRTY
;
inode
->
i_mode
=
S_IRUSR
|
S_IWUSR
;
inode
->
i_uid
=
current_fsuid
();
inode
->
i_gid
=
current_fsgid
();
inode
->
i_flags
|=
S_PRIVATE
;
inode
->
i_atime
=
inode
->
i_mtime
=
inode
->
i_ctime
=
CURRENT_TIME
;
return
inode
;
}
static
struct
dentry
*
anon_inodefs_mount
(
struct
file_system_type
*
fs_type
,
int
flags
,
const
char
*
dev_name
,
void
*
data
)
{
struct
dentry
*
root
;
root
=
mount_pseudo
(
fs_type
,
"anon_inode:"
,
NULL
,
&
anon_inodefs_dentry_operations
,
ANON_INODE_FS_MAGIC
);
if
(
!
IS_ERR
(
root
))
{
struct
super_block
*
s
=
root
->
d_sb
;
anon_inode_inode
=
anon_inode_mkinode
(
s
);
if
(
IS_ERR
(
anon_inode_inode
))
{
dput
(
root
);
deactivate_locked_super
(
s
);
root
=
ERR_CAST
(
anon_inode_inode
);
}
}
return
root
;
}
static
struct
file_system_type
anon_inode_fs_type
=
{
.
name
=
"anon_inodefs"
,
.
mount
=
anon_inodefs_mount
,
.
kill_sb
=
kill_anon_super
,
};
/**
* anon_inode_getfile - creates a new file instance by hooking it up to an
* anonymous inode, and a dentry that describe the "class"
...
...
@@ -180,38 +223,6 @@ int anon_inode_getfd(const char *name, const struct file_operations *fops,
}
EXPORT_SYMBOL_GPL
(
anon_inode_getfd
);
/*
* A single inode exists for all anon_inode files. Contrary to pipes,
* anon_inode inodes have no associated per-instance data, so we need
* only allocate one of them.
*/
static
struct
inode
*
anon_inode_mkinode
(
void
)
{
struct
inode
*
inode
=
new_inode_pseudo
(
anon_inode_mnt
->
mnt_sb
);
if
(
!
inode
)
return
ERR_PTR
(
-
ENOMEM
);
inode
->
i_ino
=
get_next_ino
();
inode
->
i_fop
=
&
anon_inode_fops
;
inode
->
i_mapping
->
a_ops
=
&
anon_aops
;
/*
* Mark the inode dirty from the very beginning,
* that way it will never be moved to the dirty
* list because mark_inode_dirty() will think
* that it already _is_ on the dirty list.
*/
inode
->
i_state
=
I_DIRTY
;
inode
->
i_mode
=
S_IRUSR
|
S_IWUSR
;
inode
->
i_uid
=
current_fsuid
();
inode
->
i_gid
=
current_fsgid
();
inode
->
i_flags
|=
S_PRIVATE
;
inode
->
i_atime
=
inode
->
i_mtime
=
inode
->
i_ctime
=
CURRENT_TIME
;
return
inode
;
}
static
int
__init
anon_inode_init
(
void
)
{
int
error
;
...
...
@@ -224,16 +235,8 @@ static int __init anon_inode_init(void)
error
=
PTR_ERR
(
anon_inode_mnt
);
goto
err_unregister_filesystem
;
}
anon_inode_inode
=
anon_inode_mkinode
();
if
(
IS_ERR
(
anon_inode_inode
))
{
error
=
PTR_ERR
(
anon_inode_inode
);
goto
err_mntput
;
}
return
0
;
err_mntput:
kern_unmount
(
anon_inode_mnt
);
err_unregister_filesystem:
unregister_filesystem
(
&
anon_inode_fs_type
);
err_exit:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录