Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
6070fe6f
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看板
提交
6070fe6f
编写于
10月 27, 2005
作者:
T
Trond Myklebust
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
RPC: Ensure that nobody can queue up new upcalls after rpc_close_pipes()
Signed-off-by:
N
Trond Myklebust
<
Trond.Myklebust@netapp.com
>
上级
bec273b4
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
15 addition
and
14 deletion
+15
-14
net/sunrpc/rpc_pipe.c
net/sunrpc/rpc_pipe.c
+15
-14
未找到文件。
net/sunrpc/rpc_pipe.c
浏览文件 @
6070fe6f
...
...
@@ -76,25 +76,35 @@ int
rpc_queue_upcall
(
struct
inode
*
inode
,
struct
rpc_pipe_msg
*
msg
)
{
struct
rpc_inode
*
rpci
=
RPC_I
(
inode
);
int
res
=
0
;
int
res
=
-
EPIPE
;
down
(
&
inode
->
i_sem
);
if
(
rpci
->
ops
==
NULL
)
goto
out
;
if
(
rpci
->
nreaders
)
{
list_add_tail
(
&
msg
->
list
,
&
rpci
->
pipe
);
rpci
->
pipelen
+=
msg
->
len
;
res
=
0
;
}
else
if
(
rpci
->
flags
&
RPC_PIPE_WAIT_FOR_OPEN
)
{
if
(
list_empty
(
&
rpci
->
pipe
))
schedule_delayed_work
(
&
rpci
->
queue_timeout
,
RPC_UPCALL_TIMEOUT
);
list_add_tail
(
&
msg
->
list
,
&
rpci
->
pipe
);
rpci
->
pipelen
+=
msg
->
len
;
}
else
res
=
-
EPIPE
;
res
=
0
;
}
out:
up
(
&
inode
->
i_sem
);
wake_up
(
&
rpci
->
waitq
);
return
res
;
}
static
inline
void
rpc_inode_setowner
(
struct
inode
*
inode
,
void
*
private
)
{
RPC_I
(
inode
)
->
private
=
private
;
}
static
void
rpc_close_pipes
(
struct
inode
*
inode
)
{
...
...
@@ -111,15 +121,10 @@ rpc_close_pipes(struct inode *inode)
rpci
->
ops
->
release_pipe
(
inode
);
rpci
->
ops
=
NULL
;
}
rpc_inode_setowner
(
inode
,
NULL
);
up
(
&
inode
->
i_sem
);
}
static
inline
void
rpc_inode_setowner
(
struct
inode
*
inode
,
void
*
private
)
{
RPC_I
(
inode
)
->
private
=
private
;
}
static
struct
inode
*
rpc_alloc_inode
(
struct
super_block
*
sb
)
{
...
...
@@ -501,7 +506,6 @@ rpc_depopulate(struct dentry *parent)
dentry
=
dvec
[
--
n
];
if
(
dentry
->
d_inode
)
{
rpc_close_pipes
(
dentry
->
d_inode
);
rpc_inode_setowner
(
dentry
->
d_inode
,
NULL
);
simple_unlink
(
dir
,
dentry
);
}
dput
(
dentry
);
...
...
@@ -576,10 +580,8 @@ __rpc_rmdir(struct inode *dir, struct dentry *dentry)
int
error
;
shrink_dcache_parent
(
dentry
);
if
(
dentry
->
d_inode
)
{
if
(
dentry
->
d_inode
)
rpc_close_pipes
(
dentry
->
d_inode
);
rpc_inode_setowner
(
dentry
->
d_inode
,
NULL
);
}
if
((
error
=
simple_rmdir
(
dir
,
dentry
))
!=
0
)
return
error
;
if
(
!
error
)
{
...
...
@@ -732,7 +734,6 @@ rpc_unlink(char *path)
d_drop
(
dentry
);
if
(
dentry
->
d_inode
)
{
rpc_close_pipes
(
dentry
->
d_inode
);
rpc_inode_setowner
(
dentry
->
d_inode
,
NULL
);
error
=
simple_unlink
(
dir
,
dentry
);
}
dput
(
dentry
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录