Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Linux Kernel
提交
c2bab1e9
T
Third Party Linux Kernel
项目概览
OpenHarmony
/
Third Party Linux Kernel
8 个月 前同步成功
通知
1
Star
19
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party Linux Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
c2bab1e9
编写于
6月 10, 2021
作者:
O
openharmony_ci
提交者:
Gitee
6月 10, 2021
浏览文件
操作
浏览文件
下载
差异文件
!14 新增link/symlink/readlink接口的系统调用及内核实现
Merge pull request !14 from JING/link
上级
4f8d7c7b
7e7777a1
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
162 addition
and
1 deletion
+162
-1
fs/jffs2/dir.c
fs/jffs2/dir.c
+161
-0
fs/jffs2/jffs2_fs_i.h
fs/jffs2/jffs2_fs_i.h
+0
-1
fs/jffs2/os-linux.h
fs/jffs2/os-linux.h
+1
-0
未找到文件。
fs/jffs2/dir.c
浏览文件 @
c2bab1e9
...
...
@@ -104,6 +104,167 @@ int jffs2_link(struct jffs2_inode *old_d_inode, struct jffs2_inode *dir_i, const
return
ret
;
}
int
jffs2_symlink
(
struct
jffs2_inode
*
dir_i
,
struct
jffs2_inode
**
d_inode
,
const
unsigned
char
*
d_name
,
const
char
*
target
)
{
struct
jffs2_inode_info
*
f
,
*
dir_f
;
struct
jffs2_sb_info
*
c
;
struct
jffs2_inode
*
inode
;
struct
jffs2_raw_inode
*
ri
;
struct
jffs2_raw_dirent
*
rd
;
struct
jffs2_full_dnode
*
fn
;
struct
jffs2_full_dirent
*
fd
;
int
namelen
;
uint32_t
alloclen
;
int
ret
,
targetlen
=
strlen
(
target
);
/* FIXME: If you care. We'd need to use frags for the target
if it grows much more than this */
if
(
targetlen
>
254
)
return
-
ENAMETOOLONG
;
ri
=
jffs2_alloc_raw_inode
();
if
(
!
ri
)
return
-
ENOMEM
;
c
=
JFFS2_SB_INFO
(
dir_i
->
i_sb
);
/* Try to reserve enough space for both node and dirent.
* Just the node will do for now, though
*/
namelen
=
strlen
((
char
*
)
d_name
);
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
ri
)
+
targetlen
,
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_INODE_SIZE
);
if
(
ret
)
{
jffs2_free_raw_inode
(
ri
);
return
ret
;
}
inode
=
jffs2_new_inode
(
dir_i
,
S_IFLNK
|
S_IRWXUGO
,
ri
);
if
(
IS_ERR
(
inode
))
{
jffs2_free_raw_inode
(
ri
);
jffs2_complete_reservation
(
c
);
return
PTR_ERR
(
inode
);
}
f
=
JFFS2_INODE_INFO
(
inode
);
inode
->
i_size
=
targetlen
;
ri
->
isize
=
ri
->
dsize
=
ri
->
csize
=
cpu_to_je32
(
inode
->
i_size
);
ri
->
totlen
=
cpu_to_je32
(
sizeof
(
*
ri
)
+
inode
->
i_size
);
ri
->
hdr_crc
=
cpu_to_je32
(
crc32
(
0
,
ri
,
sizeof
(
struct
jffs2_unknown_node
)
-
4
));
ri
->
compr
=
JFFS2_COMPR_NONE
;
ri
->
data_crc
=
cpu_to_je32
(
crc32
(
0
,
target
,
targetlen
));
ri
->
node_crc
=
cpu_to_je32
(
crc32
(
0
,
ri
,
sizeof
(
*
ri
)
-
8
));
fn
=
jffs2_write_dnode
(
c
,
f
,
ri
,
(
const
unsigned
char
*
)
target
,
targetlen
,
ALLOC_NORMAL
);
jffs2_free_raw_inode
(
ri
);
if
(
IS_ERR
(
fn
))
{
/* Eeek. Wave bye bye */
mutex_unlock
(
&
f
->
sem
);
jffs2_complete_reservation
(
c
);
ret
=
PTR_ERR
(
fn
);
goto
fail
;
}
/* We use f->target field to store the target path. */
f
->
target
=
(
unsigned
char
*
)
malloc
(
targetlen
+
1
);
if
(
!
f
->
target
)
{
pr_warn
(
"Can't allocate %d bytes of memory
\n
"
,
targetlen
+
1
);
mutex_unlock
(
&
f
->
sem
);
jffs2_complete_reservation
(
c
);
ret
=
-
ENOMEM
;
goto
fail
;
}
ret
=
LOS_CopyToKernel
((
char
*
)
f
->
target
,
targetlen
+
1
,
target
,
targetlen
+
1
);
if
(
ret
!=
EOK
)
{
(
void
)
free
(
f
->
target
);
f
->
target
=
NULL
;
mutex_unlock
(
&
f
->
sem
);
jffs2_complete_reservation
(
c
);
goto
fail
;
}
jffs2_dbg
(
1
,
"%s(): symlink's target '%s' cached
\n
"
,
__func__
,
(
char
*
)
f
->
target
);
/* No data here. Only a metadata node, which will be
obsoleted by the first data write
*/
f
->
metadata
=
fn
;
mutex_unlock
(
&
f
->
sem
);
jffs2_complete_reservation
(
c
);
ret
=
jffs2_reserve_space
(
c
,
sizeof
(
*
rd
)
+
namelen
,
&
alloclen
,
ALLOC_NORMAL
,
JFFS2_SUMMARY_DIRENT_SIZE
(
namelen
));
if
(
ret
)
goto
fail
;
rd
=
jffs2_alloc_raw_dirent
();
if
(
!
rd
)
{
/* Argh. Now we treat it like a normal delete */
jffs2_complete_reservation
(
c
);
ret
=
-
ENOMEM
;
goto
fail
;
}
dir_f
=
JFFS2_INODE_INFO
(
dir_i
);
mutex_lock
(
&
dir_f
->
sem
);
rd
->
magic
=
cpu_to_je16
(
JFFS2_MAGIC_BITMASK
);
rd
->
nodetype
=
cpu_to_je16
(
JFFS2_NODETYPE_DIRENT
);
rd
->
totlen
=
cpu_to_je32
(
sizeof
(
*
rd
)
+
namelen
);
rd
->
hdr_crc
=
cpu_to_je32
(
crc32
(
0
,
rd
,
sizeof
(
struct
jffs2_unknown_node
)
-
4
));
rd
->
pino
=
cpu_to_je32
(
dir_i
->
i_ino
);
rd
->
version
=
cpu_to_je32
(
++
dir_f
->
highest_version
);
rd
->
ino
=
cpu_to_je32
(
inode
->
i_ino
);
rd
->
mctime
=
cpu_to_je32
(
Jffs2CurSec
());
rd
->
nsize
=
namelen
;
rd
->
type
=
DT_LNK
;
rd
->
node_crc
=
cpu_to_je32
(
crc32
(
0
,
rd
,
sizeof
(
*
rd
)
-
8
));
rd
->
name_crc
=
cpu_to_je32
(
crc32
(
0
,
(
const
char
*
)
d_name
,
namelen
));
fd
=
jffs2_write_dirent
(
c
,
dir_f
,
rd
,
(
const
unsigned
char
*
)
d_name
,
namelen
,
ALLOC_NORMAL
);
if
(
IS_ERR
(
fd
))
{
/* dirent failed to write. Delete the inode normally
as if it were the final unlink() */
jffs2_complete_reservation
(
c
);
jffs2_free_raw_dirent
(
rd
);
mutex_unlock
(
&
dir_f
->
sem
);
ret
=
PTR_ERR
(
fd
);
goto
fail
;
}
dir_i
->
i_mtime
=
dir_i
->
i_ctime
=
je32_to_cpu
(
rd
->
mctime
);
jffs2_free_raw_dirent
(
rd
);
/* Link the fd into the inode's list, obsoleting an old
one if necessary. */
jffs2_add_fd_to_list
(
c
,
fd
,
&
dir_f
->
dents
);
mutex_unlock
(
&
dir_f
->
sem
);
jffs2_complete_reservation
(
c
);
*
d_inode
=
inode
;
return
0
;
fail:
inode
->
i_nlink
=
0
;
jffs2_iput
(
inode
);
return
ret
;
}
int
jffs2_mkdir
(
struct
jffs2_inode
*
dir_i
,
const
unsigned
char
*
d_name
,
int
mode
,
struct
jffs2_inode
**
new_i
)
{
struct
jffs2_inode_info
*
f
,
*
dir_f
;
...
...
fs/jffs2/jffs2_fs_i.h
浏览文件 @
c2bab1e9
...
...
@@ -68,7 +68,6 @@ struct jffs2_inode {
time_t
i_atime
;
time_t
i_mtime
;
time_t
i_ctime
;
struct
Vnode
*
i_vnode
;
off_t
i_size
;
struct
super_block
*
i_sb
;
LOS_DL_LIST
i_hashlist
;
...
...
fs/jffs2/os-linux.h
浏览文件 @
c2bab1e9
...
...
@@ -150,6 +150,7 @@ struct jffs2_inode *jffs2_lookup(struct jffs2_inode *dir_i, const unsigned char
int
jffs2_create
(
struct
jffs2_inode
*
dir_i
,
const
unsigned
char
*
d_name
,
int
mode
,
struct
jffs2_inode
**
new_i
);
int
jffs2_mkdir
(
struct
jffs2_inode
*
dir_i
,
const
unsigned
char
*
d_name
,
int
mode
,
struct
jffs2_inode
**
new_i
);
int
jffs2_link
(
struct
jffs2_inode
*
old_d_inode
,
struct
jffs2_inode
*
dir_i
,
const
unsigned
char
*
d_name
);
int
jffs2_symlink
(
struct
jffs2_inode
*
dir_i
,
struct
jffs2_inode
**
d_inode
,
const
unsigned
char
*
d_name
,
const
char
*
target
);
int
jffs2_unlink
(
struct
jffs2_inode
*
dir_i
,
struct
jffs2_inode
*
d_inode
,
const
unsigned
char
*
d_name
);
int
jffs2_rmdir
(
struct
jffs2_inode
*
dir_i
,
struct
jffs2_inode
*
d_inode
,
const
unsigned
char
*
d_name
);
int
jffs2_rename
(
struct
jffs2_inode
*
old_dir_i
,
struct
jffs2_inode
*
d_inode
,
const
unsigned
char
*
old_d_name
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录