Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
e80c14e1
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看板
提交
e80c14e1
编写于
1月 13, 2010
作者:
L
Linus Torvalds
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'fasync-helper'
* fasync-helper: fasync: split 'fasync_helper()' into separate add/remove functions
上级
7284ce6c
53281b6d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
66 addition
and
36 deletion
+66
-36
fs/fcntl.c
fs/fcntl.c
+66
-36
未找到文件。
fs/fcntl.c
浏览文件 @
e80c14e1
...
...
@@ -618,60 +618,90 @@ static DEFINE_RWLOCK(fasync_lock);
static
struct
kmem_cache
*
fasync_cache
__read_mostly
;
/*
* fasync_helper() is used by almost all character device drivers
* to set up the fasync queue. It returns negative on error, 0 if it did
* no changes and positive if it added/deleted the entry.
* Remove a fasync entry. If successfully removed, return
* positive and clear the FASYNC flag. If no entry exists,
* do nothing and return 0.
*
* NOTE! It is very important that the FASYNC flag always
* match the state "is the filp on a fasync list".
*
* We always take the 'filp->f_lock', in since fasync_lock
* needs to be irq-safe.
*/
int
fasync_helper
(
int
fd
,
struct
file
*
filp
,
int
on
,
struct
fasync_struct
**
fapp
)
static
int
fasync_remove_entry
(
struct
file
*
filp
,
struct
fasync_struct
**
fapp
)
{
struct
fasync_struct
*
fa
,
**
fp
;
struct
fasync_struct
*
new
=
NULL
;
int
result
=
0
;
if
(
on
)
{
new
=
kmem_cache_alloc
(
fasync_cache
,
GFP_KERNEL
);
if
(
!
new
)
return
-
ENOMEM
;
spin_lock
(
&
filp
->
f_lock
);
write_lock_irq
(
&
fasync_lock
);
for
(
fp
=
fapp
;
(
fa
=
*
fp
)
!=
NULL
;
fp
=
&
fa
->
fa_next
)
{
if
(
fa
->
fa_file
!=
filp
)
continue
;
*
fp
=
fa
->
fa_next
;
kmem_cache_free
(
fasync_cache
,
fa
);
filp
->
f_flags
&=
~
FASYNC
;
result
=
1
;
break
;
}
write_unlock_irq
(
&
fasync_lock
);
spin_unlock
(
&
filp
->
f_lock
);
return
result
;
}
/*
* Add a fasync entry. Return negative on error, positive if
* added, and zero if did nothing but change an existing one.
*
* NOTE! It is very important that the FASYNC flag always
* match the state "is the filp on a fasync list".
*/
static
int
fasync_add_entry
(
int
fd
,
struct
file
*
filp
,
struct
fasync_struct
**
fapp
)
{
struct
fasync_struct
*
new
,
*
fa
,
**
fp
;
int
result
=
0
;
new
=
kmem_cache_alloc
(
fasync_cache
,
GFP_KERNEL
);
if
(
!
new
)
return
-
ENOMEM
;
/*
* We need to take f_lock first since it's not an IRQ-safe
* lock.
*/
spin_lock
(
&
filp
->
f_lock
);
write_lock_irq
(
&
fasync_lock
);
for
(
fp
=
fapp
;
(
fa
=
*
fp
)
!=
NULL
;
fp
=
&
fa
->
fa_next
)
{
if
(
fa
->
fa_file
==
filp
)
{
if
(
on
)
{
fa
->
fa_fd
=
fd
;
kmem_cache_free
(
fasync_cache
,
new
);
}
else
{
*
fp
=
fa
->
fa_next
;
kmem_cache_free
(
fasync_cache
,
fa
);
result
=
1
;
}
goto
out
;
}
if
(
fa
->
fa_file
!=
filp
)
continue
;
fa
->
fa_fd
=
fd
;
kmem_cache_free
(
fasync_cache
,
new
);
goto
out
;
}
if
(
on
)
{
new
->
magic
=
FASYNC_MAGIC
;
new
->
fa_file
=
filp
;
new
->
fa_fd
=
fd
;
new
->
fa_next
=
*
fapp
;
*
fapp
=
new
;
result
=
1
;
}
new
->
magic
=
FASYNC_MAGIC
;
new
->
fa_file
=
filp
;
new
->
fa_fd
=
fd
;
new
->
fa_next
=
*
fapp
;
*
fapp
=
new
;
result
=
1
;
filp
->
f_flags
|=
FASYNC
;
out:
if
(
on
)
filp
->
f_flags
|=
FASYNC
;
else
filp
->
f_flags
&=
~
FASYNC
;
write_unlock_irq
(
&
fasync_lock
);
spin_unlock
(
&
filp
->
f_lock
);
return
result
;
}
/*
* fasync_helper() is used by almost all character device drivers
* to set up the fasync queue, and for regular files by the file
* lease code. It returns negative on error, 0 if it did no changes
* and positive if it added/deleted the entry.
*/
int
fasync_helper
(
int
fd
,
struct
file
*
filp
,
int
on
,
struct
fasync_struct
**
fapp
)
{
if
(
!
on
)
return
fasync_remove_entry
(
filp
,
fapp
);
return
fasync_add_entry
(
fd
,
filp
,
fapp
);
}
EXPORT_SYMBOL
(
fasync_helper
);
void
__kill_fasync
(
struct
fasync_struct
*
fa
,
int
sig
,
int
band
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录