Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Linux-御风守护者
linux
提交
7cf4dc3c
L
linux
项目概览
Linux-御风守护者
/
linux
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
7cf4dc3c
编写于
8月 15, 2012
作者:
A
Al Viro
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
move files_struct-related bits from kernel/exit.c to fs/file.c
Signed-off-by:
N
Al Viro
<
viro@zeniv.linux.org.uk
>
上级
dcfadfa4
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
99 addition
and
100 deletion
+99
-100
fs/file.c
fs/file.c
+99
-1
include/linux/fdtable.h
include/linux/fdtable.h
+0
-6
kernel/exit.c
kernel/exit.c
+0
-93
未找到文件。
fs/file.c
浏览文件 @
7cf4dc3c
...
...
@@ -84,7 +84,7 @@ static void free_fdtable_work(struct work_struct *work)
}
}
void
free_fdtable_rcu
(
struct
rcu_head
*
rcu
)
static
void
free_fdtable_rcu
(
struct
rcu_head
*
rcu
)
{
struct
fdtable
*
fdt
=
container_of
(
rcu
,
struct
fdtable
,
rcu
);
struct
fdtable_defer
*
fddef
;
...
...
@@ -116,6 +116,11 @@ void free_fdtable_rcu(struct rcu_head *rcu)
}
}
static
inline
void
free_fdtable
(
struct
fdtable
*
fdt
)
{
call_rcu
(
&
fdt
->
rcu
,
free_fdtable_rcu
);
}
/*
* Expand the fdset in the files_struct. Called with the files spinlock
* held for write.
...
...
@@ -388,6 +393,99 @@ struct files_struct *dup_fd(struct files_struct *oldf, int *errorp)
return
NULL
;
}
static
void
close_files
(
struct
files_struct
*
files
)
{
int
i
,
j
;
struct
fdtable
*
fdt
;
j
=
0
;
/*
* It is safe to dereference the fd table without RCU or
* ->file_lock because this is the last reference to the
* files structure. But use RCU to shut RCU-lockdep up.
*/
rcu_read_lock
();
fdt
=
files_fdtable
(
files
);
rcu_read_unlock
();
for
(;;)
{
unsigned
long
set
;
i
=
j
*
BITS_PER_LONG
;
if
(
i
>=
fdt
->
max_fds
)
break
;
set
=
fdt
->
open_fds
[
j
++
];
while
(
set
)
{
if
(
set
&
1
)
{
struct
file
*
file
=
xchg
(
&
fdt
->
fd
[
i
],
NULL
);
if
(
file
)
{
filp_close
(
file
,
files
);
cond_resched
();
}
}
i
++
;
set
>>=
1
;
}
}
}
struct
files_struct
*
get_files_struct
(
struct
task_struct
*
task
)
{
struct
files_struct
*
files
;
task_lock
(
task
);
files
=
task
->
files
;
if
(
files
)
atomic_inc
(
&
files
->
count
);
task_unlock
(
task
);
return
files
;
}
void
put_files_struct
(
struct
files_struct
*
files
)
{
struct
fdtable
*
fdt
;
if
(
atomic_dec_and_test
(
&
files
->
count
))
{
close_files
(
files
);
/*
* Free the fd and fdset arrays if we expanded them.
* If the fdtable was embedded, pass files for freeing
* at the end of the RCU grace period. Otherwise,
* you can free files immediately.
*/
rcu_read_lock
();
fdt
=
files_fdtable
(
files
);
if
(
fdt
!=
&
files
->
fdtab
)
kmem_cache_free
(
files_cachep
,
files
);
free_fdtable
(
fdt
);
rcu_read_unlock
();
}
}
void
reset_files_struct
(
struct
files_struct
*
files
)
{
struct
task_struct
*
tsk
=
current
;
struct
files_struct
*
old
;
old
=
tsk
->
files
;
task_lock
(
tsk
);
tsk
->
files
=
files
;
task_unlock
(
tsk
);
put_files_struct
(
old
);
}
void
exit_files
(
struct
task_struct
*
tsk
)
{
struct
files_struct
*
files
=
tsk
->
files
;
if
(
files
)
{
task_lock
(
tsk
);
tsk
->
files
=
NULL
;
task_unlock
(
tsk
);
put_files_struct
(
files
);
}
}
static
void
__devinit
fdtable_defer_list_init
(
int
cpu
)
{
struct
fdtable_defer
*
fddef
=
&
per_cpu
(
fdtable_defer_list
,
cpu
);
...
...
include/linux/fdtable.h
浏览文件 @
7cf4dc3c
...
...
@@ -94,14 +94,8 @@ struct vfsmount;
struct
dentry
;
extern
int
expand_files
(
struct
files_struct
*
,
int
nr
);
extern
void
free_fdtable_rcu
(
struct
rcu_head
*
rcu
);
extern
void
__init
files_defer_init
(
void
);
static
inline
void
free_fdtable
(
struct
fdtable
*
fdt
)
{
call_rcu
(
&
fdt
->
rcu
,
free_fdtable_rcu
);
}
static
inline
struct
file
*
fcheck_files
(
struct
files_struct
*
files
,
unsigned
int
fd
)
{
struct
file
*
file
=
NULL
;
...
...
kernel/exit.c
浏览文件 @
7cf4dc3c
...
...
@@ -466,99 +466,6 @@ void daemonize(const char *name, ...)
EXPORT_SYMBOL
(
daemonize
);
static
void
close_files
(
struct
files_struct
*
files
)
{
int
i
,
j
;
struct
fdtable
*
fdt
;
j
=
0
;
/*
* It is safe to dereference the fd table without RCU or
* ->file_lock because this is the last reference to the
* files structure. But use RCU to shut RCU-lockdep up.
*/
rcu_read_lock
();
fdt
=
files_fdtable
(
files
);
rcu_read_unlock
();
for
(;;)
{
unsigned
long
set
;
i
=
j
*
BITS_PER_LONG
;
if
(
i
>=
fdt
->
max_fds
)
break
;
set
=
fdt
->
open_fds
[
j
++
];
while
(
set
)
{
if
(
set
&
1
)
{
struct
file
*
file
=
xchg
(
&
fdt
->
fd
[
i
],
NULL
);
if
(
file
)
{
filp_close
(
file
,
files
);
cond_resched
();
}
}
i
++
;
set
>>=
1
;
}
}
}
struct
files_struct
*
get_files_struct
(
struct
task_struct
*
task
)
{
struct
files_struct
*
files
;
task_lock
(
task
);
files
=
task
->
files
;
if
(
files
)
atomic_inc
(
&
files
->
count
);
task_unlock
(
task
);
return
files
;
}
void
put_files_struct
(
struct
files_struct
*
files
)
{
struct
fdtable
*
fdt
;
if
(
atomic_dec_and_test
(
&
files
->
count
))
{
close_files
(
files
);
/*
* Free the fd and fdset arrays if we expanded them.
* If the fdtable was embedded, pass files for freeing
* at the end of the RCU grace period. Otherwise,
* you can free files immediately.
*/
rcu_read_lock
();
fdt
=
files_fdtable
(
files
);
if
(
fdt
!=
&
files
->
fdtab
)
kmem_cache_free
(
files_cachep
,
files
);
free_fdtable
(
fdt
);
rcu_read_unlock
();
}
}
void
reset_files_struct
(
struct
files_struct
*
files
)
{
struct
task_struct
*
tsk
=
current
;
struct
files_struct
*
old
;
old
=
tsk
->
files
;
task_lock
(
tsk
);
tsk
->
files
=
files
;
task_unlock
(
tsk
);
put_files_struct
(
old
);
}
void
exit_files
(
struct
task_struct
*
tsk
)
{
struct
files_struct
*
files
=
tsk
->
files
;
if
(
files
)
{
task_lock
(
tsk
);
tsk
->
files
=
NULL
;
task_unlock
(
tsk
);
put_files_struct
(
files
);
}
}
#ifdef CONFIG_MM_OWNER
/*
* A task is exiting. If it owned this mm, find a new owner for the mm.
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录