Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
a8db149f
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
161
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看板
提交
a8db149f
编写于
5月 02, 2015
作者:
A
Al Viro
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
jffs2: switch to simple_follow_link()
Signed-off-by:
N
Al Viro
<
viro@zeniv.linux.org.uk
>
上级
75e7566b
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
3 addition
and
44 deletion
+3
-44
fs/jffs2/dir.c
fs/jffs2/dir.c
+1
-0
fs/jffs2/fs.c
fs/jffs2/fs.c
+1
-0
fs/jffs2/symlink.c
fs/jffs2/symlink.c
+1
-44
未找到文件。
fs/jffs2/dir.c
浏览文件 @
a8db149f
...
...
@@ -354,6 +354,7 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char
ret
=
-
ENOMEM
;
goto
fail
;
}
inode
->
i_link
=
f
->
target
;
jffs2_dbg
(
1
,
"%s(): symlink's target '%s' cached
\n
"
,
__func__
,
(
char
*
)
f
->
target
);
...
...
fs/jffs2/fs.c
浏览文件 @
a8db149f
...
...
@@ -294,6 +294,7 @@ struct inode *jffs2_iget(struct super_block *sb, unsigned long ino)
case
S_IFLNK
:
inode
->
i_op
=
&
jffs2_symlink_inode_operations
;
inode
->
i_link
=
f
->
target
;
break
;
case
S_IFDIR
:
...
...
fs/jffs2/symlink.c
浏览文件 @
a8db149f
...
...
@@ -9,58 +9,15 @@
*
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/namei.h>
#include "nodelist.h"
static
void
*
jffs2_follow_link
(
struct
dentry
*
dentry
,
struct
nameidata
*
nd
);
const
struct
inode_operations
jffs2_symlink_inode_operations
=
{
.
readlink
=
generic_readlink
,
.
follow_link
=
jffs2
_follow_link
,
.
follow_link
=
simple
_follow_link
,
.
setattr
=
jffs2_setattr
,
.
setxattr
=
jffs2_setxattr
,
.
getxattr
=
jffs2_getxattr
,
.
listxattr
=
jffs2_listxattr
,
.
removexattr
=
jffs2_removexattr
};
static
void
*
jffs2_follow_link
(
struct
dentry
*
dentry
,
struct
nameidata
*
nd
)
{
struct
jffs2_inode_info
*
f
=
JFFS2_INODE_INFO
(
d_inode
(
dentry
));
char
*
p
=
(
char
*
)
f
->
target
;
/*
* We don't acquire the f->sem mutex here since the only data we
* use is f->target.
*
* 1. If we are here the inode has already built and f->target has
* to point to the target path.
* 2. Nobody uses f->target (if the inode is symlink's inode). The
* exception is inode freeing function which frees f->target. But
* it can't be called while we are here and before VFS has
* stopped using our f->target string which we provide by means of
* nd_set_link() call.
*/
if
(
!
p
)
{
pr_err
(
"%s(): can't find symlink target
\n
"
,
__func__
);
p
=
ERR_PTR
(
-
EIO
);
}
jffs2_dbg
(
1
,
"%s(): target path is '%s'
\n
"
,
__func__
,
(
char
*
)
f
->
target
);
nd_set_link
(
nd
,
p
);
/*
* We will unlock the f->sem mutex but VFS will use the f->target string. This is safe
* since the only way that may cause f->target to be changed is iput() operation.
* But VFS will not use f->target after iput() has been called.
*/
return
NULL
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录