Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
3cc19c0c
Q
qemu
项目概览
openeuler
/
qemu
通知
10
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Q
qemu
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
3cc19c0c
编写于
5月 07, 2011
作者:
A
Aneesh Kumar K.V
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
hw/9pfs: Update v9fs_walk to use coroutines
Signed-off-by:
N
Aneesh Kumar K.V
<
aneesh.kumar@linux.vnet.ibm.com
>
上级
d8e0c29e
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
68 addition
and
151 deletion
+68
-151
hw/9pfs/virtio-9p.c
hw/9pfs/virtio-9p.c
+68
-138
hw/9pfs/virtio-9p.h
hw/9pfs/virtio-9p.h
+0
-13
未找到文件。
hw/9pfs/virtio-9p.c
浏览文件 @
3cc19c0c
...
...
@@ -1327,171 +1327,101 @@ out:
complete_pdu
(
s
,
pdu
,
err
);
}
static
void
v9fs_walk_complete
(
V9fsState
*
s
,
V9fsWalkState
*
vs
,
int
err
)
{
complete_pdu
(
s
,
vs
->
pdu
,
err
);
if
(
vs
->
nwnames
&&
vs
->
nwnames
<=
P9_MAXWELEM
)
{
for
(
vs
->
name_idx
=
0
;
vs
->
name_idx
<
vs
->
nwnames
;
vs
->
name_idx
++
)
{
v9fs_string_free
(
&
vs
->
wnames
[
vs
->
name_idx
]);
}
g_free
(
vs
->
wnames
);
g_free
(
vs
->
qids
);
}
}
static
void
v9fs_walk_marshal
(
V9fsWalkState
*
vs
)
static
int
v9fs_walk_marshal
(
V9fsPDU
*
pdu
,
uint16_t
nwnames
,
V9fsQID
*
qids
)
{
int
i
;
vs
->
offset
=
7
;
vs
->
offset
+=
pdu_marshal
(
vs
->
pdu
,
vs
->
offset
,
"w"
,
vs
->
nwnames
);
for
(
i
=
0
;
i
<
vs
->
nwnames
;
i
++
)
{
vs
->
offset
+=
pdu_marshal
(
vs
->
pdu
,
vs
->
offset
,
"Q"
,
&
vs
->
qids
[
i
]);
}
}
static
void
v9fs_walk_post_newfid_lstat
(
V9fsState
*
s
,
V9fsWalkState
*
vs
,
int
err
)
{
if
(
err
==
-
1
)
{
free_fid
(
s
,
vs
->
newfidp
->
fid
);
v9fs_string_free
(
&
vs
->
path
);
err
=
-
ENOENT
;
goto
out
;
}
stat_to_qid
(
&
vs
->
stbuf
,
&
vs
->
qids
[
vs
->
name_idx
]);
vs
->
name_idx
++
;
if
(
vs
->
name_idx
<
vs
->
nwnames
)
{
v9fs_string_sprintf
(
&
vs
->
path
,
"%s/%s"
,
vs
->
newfidp
->
path
.
data
,
vs
->
wnames
[
vs
->
name_idx
].
data
);
v9fs_string_copy
(
&
vs
->
newfidp
->
path
,
&
vs
->
path
);
err
=
v9fs_do_lstat
(
s
,
&
vs
->
newfidp
->
path
,
&
vs
->
stbuf
);
v9fs_walk_post_newfid_lstat
(
s
,
vs
,
err
);
return
;
}
v9fs_string_free
(
&
vs
->
path
);
v9fs_walk_marshal
(
vs
);
err
=
vs
->
offset
;
out:
v9fs_walk_complete
(
s
,
vs
,
err
);
}
static
void
v9fs_walk_post_oldfid_lstat
(
V9fsState
*
s
,
V9fsWalkState
*
vs
,
int
err
)
{
if
(
err
==
-
1
)
{
v9fs_string_free
(
&
vs
->
path
);
err
=
-
ENOENT
;
goto
out
;
}
stat_to_qid
(
&
vs
->
stbuf
,
&
vs
->
qids
[
vs
->
name_idx
]);
vs
->
name_idx
++
;
if
(
vs
->
name_idx
<
vs
->
nwnames
)
{
v9fs_string_sprintf
(
&
vs
->
path
,
"%s/%s"
,
vs
->
fidp
->
path
.
data
,
vs
->
wnames
[
vs
->
name_idx
].
data
);
v9fs_string_copy
(
&
vs
->
fidp
->
path
,
&
vs
->
path
);
err
=
v9fs_do_lstat
(
s
,
&
vs
->
fidp
->
path
,
&
vs
->
stbuf
);
v9fs_walk_post_oldfid_lstat
(
s
,
vs
,
err
);
return
;
size_t
offset
=
7
;
offset
+=
pdu_marshal
(
pdu
,
offset
,
"w"
,
nwnames
);
for
(
i
=
0
;
i
<
nwnames
;
i
++
)
{
offset
+=
pdu_marshal
(
pdu
,
offset
,
"Q"
,
&
qids
[
i
]);
}
v9fs_string_free
(
&
vs
->
path
);
v9fs_walk_marshal
(
vs
);
err
=
vs
->
offset
;
out:
v9fs_walk_complete
(
s
,
vs
,
err
);
return
offset
;
}
static
void
v9fs_walk
(
void
*
opaque
)
{
int
name_idx
;
V9fsQID
*
qids
=
NULL
;
int
i
,
err
=
0
;
V9fsString
path
;
uint16_t
nwnames
;
struct
stat
stbuf
;
size_t
offset
=
7
;
int32_t
fid
,
newfid
;
V9fsString
*
wnames
=
NULL
;
V9fsFidState
*
fidp
;
V9fsFidState
*
newfidp
;
V9fsPDU
*
pdu
=
opaque
;
V9fsState
*
s
=
pdu
->
s
;
int32_t
fid
,
newfid
;
V9fsWalkState
*
vs
;
int
err
=
0
;
int
i
;
vs
=
g_malloc
(
sizeof
(
*
vs
));
vs
->
pdu
=
pdu
;
vs
->
wnames
=
NULL
;
vs
->
qids
=
NULL
;
vs
->
offset
=
7
;
vs
->
offset
+=
pdu_unmarshal
(
vs
->
pdu
,
vs
->
offset
,
"ddw"
,
&
fid
,
&
newfid
,
&
vs
->
nwnames
);
if
(
vs
->
nwnames
&&
vs
->
nwnames
<=
P9_MAXWELEM
)
{
vs
->
wnames
=
g_malloc0
(
sizeof
(
vs
->
wnames
[
0
])
*
vs
->
nwnames
);
offset
+=
pdu_unmarshal
(
pdu
,
offset
,
"ddw"
,
&
fid
,
&
newfid
,
&
nwnames
);
vs
->
qids
=
g_malloc0
(
sizeof
(
vs
->
qids
[
0
])
*
vs
->
nwnames
);
for
(
i
=
0
;
i
<
vs
->
nwnames
;
i
++
)
{
vs
->
offset
+=
pdu_unmarshal
(
vs
->
pdu
,
vs
->
offset
,
"s"
,
&
vs
->
wnames
[
i
]);
if
(
nwnames
&&
nwnames
<=
P9_MAXWELEM
)
{
wnames
=
g_malloc0
(
sizeof
(
wnames
[
0
])
*
nwnames
);
qids
=
g_malloc0
(
sizeof
(
qids
[
0
])
*
nwnames
);
for
(
i
=
0
;
i
<
nwnames
;
i
++
)
{
offset
+=
pdu_unmarshal
(
pdu
,
offset
,
"s"
,
&
wnames
[
i
]);
}
}
else
if
(
vs
->
nwnames
>
P9_MAXWELEM
)
{
}
else
if
(
nwnames
>
P9_MAXWELEM
)
{
err
=
-
EINVAL
;
goto
out
;
}
vs
->
fidp
=
lookup_fid
(
s
,
fid
);
if
(
vs
->
fidp
==
NULL
)
{
fidp
=
lookup_fid
(
s
,
fid
);
if
(
fidp
==
NULL
)
{
err
=
-
ENOENT
;
goto
out
;
}
/* FIXME: is this really valid? */
if
(
fid
==
newfid
)
{
BUG_ON
(
vs
->
fidp
->
fid_type
!=
P9_FID_NONE
);
v9fs_string_init
(
&
vs
->
path
);
vs
->
name_idx
=
0
;
if
(
vs
->
name_idx
<
vs
->
nwnames
)
{
v9fs_string_sprintf
(
&
vs
->
path
,
"%s/%s"
,
vs
->
fidp
->
path
.
data
,
vs
->
wnames
[
vs
->
name_idx
].
data
);
v9fs_string_copy
(
&
vs
->
fidp
->
path
,
&
vs
->
path
);
err
=
v9fs_do_lstat
(
s
,
&
vs
->
fidp
->
path
,
&
vs
->
stbuf
)
;
v9fs_walk_post_oldfid_lstat
(
s
,
vs
,
err
);
return
;
BUG_ON
(
fidp
->
fid_type
!=
P9_FID_NONE
);
v9fs_string_init
(
&
path
);
for
(
name_idx
=
0
;
name_idx
<
nwnames
;
name_idx
++
)
{
v9fs_string_sprintf
(
&
path
,
"%s/%s"
,
fidp
->
path
.
data
,
wnames
[
name_idx
].
data
);
v9fs_string_copy
(
&
fidp
->
path
,
&
path
);
err
=
v9fs_co_lstat
(
s
,
&
fidp
->
path
,
&
stbuf
);
if
(
err
<
0
)
{
v9fs_string_free
(
&
path
);
goto
out
;
}
stat_to_qid
(
&
stbuf
,
&
qids
[
name_idx
])
;
}
v9fs_string_free
(
&
path
);
}
else
{
vs
->
newfidp
=
alloc_fid
(
s
,
newfid
);
if
(
vs
->
newfidp
==
NULL
)
{
newfidp
=
alloc_fid
(
s
,
newfid
);
if
(
newfidp
==
NULL
)
{
err
=
-
EINVAL
;
goto
out
;
}
v
s
->
newfidp
->
uid
=
vs
->
fidp
->
uid
;
v9fs_string_
init
(
&
vs
->
path
);
vs
->
name_idx
=
0
;
v9fs_string_copy
(
&
vs
->
newfidp
->
path
,
&
vs
->
fidp
->
path
);
if
(
vs
->
name_idx
<
vs
->
nwnames
)
{
v9fs_string_sprintf
(
&
vs
->
path
,
"%s/%s"
,
vs
->
newfidp
->
path
.
data
,
vs
->
wnames
[
vs
->
name_idx
].
data
);
v9fs_string_copy
(
&
vs
->
newfidp
->
path
,
&
vs
->
path
);
err
=
v9fs_do_lstat
(
s
,
&
vs
->
newfidp
->
path
,
&
vs
->
stbuf
)
;
v9fs_walk_post_newfid_lstat
(
s
,
vs
,
err
);
return
;
newfidp
->
uid
=
fidp
->
uid
;
v
9fs_string_init
(
&
path
)
;
v9fs_string_
copy
(
&
newfidp
->
path
,
&
fidp
->
path
);
for
(
name_idx
=
0
;
name_idx
<
nwnames
;
name_idx
++
)
{
v9fs_string_sprintf
(
&
path
,
"%s/%s"
,
newfidp
->
path
.
data
,
wnames
[
name_idx
].
data
);
v9fs_string_copy
(
&
newfidp
->
path
,
&
path
);
err
=
v9fs_co_lstat
(
s
,
&
newfidp
->
path
,
&
stbuf
);
if
(
err
<
0
)
{
free_fid
(
s
,
newfidp
->
fid
);
v9fs_string_free
(
&
path
);
goto
out
;
}
stat_to_qid
(
&
stbuf
,
&
qids
[
name_idx
])
;
}
v9fs_string_free
(
&
path
);
}
v9fs_walk_marshal
(
vs
);
err
=
vs
->
offset
;
err
=
v9fs_walk_marshal
(
pdu
,
nwnames
,
qids
);
out:
v9fs_walk_complete
(
s
,
vs
,
err
);
complete_pdu
(
s
,
pdu
,
err
);
if
(
nwnames
&&
nwnames
<=
P9_MAXWELEM
)
{
for
(
name_idx
=
0
;
name_idx
<
nwnames
;
name_idx
++
)
{
v9fs_string_free
(
&
wnames
[
name_idx
]);
}
g_free
(
wnames
);
g_free
(
qids
);
}
}
static
int32_t
get_iounit
(
V9fsState
*
s
,
V9fsString
*
name
)
...
...
hw/9pfs/virtio-9p.h
浏览文件 @
3cc19c0c
...
...
@@ -267,19 +267,6 @@ typedef struct V9fsStatDotl {
uint64_t
st_data_version
;
}
V9fsStatDotl
;
typedef
struct
V9fsWalkState
{
V9fsPDU
*
pdu
;
size_t
offset
;
uint16_t
nwnames
;
int
name_idx
;
V9fsQID
*
qids
;
V9fsFidState
*
fidp
;
V9fsFidState
*
newfidp
;
V9fsString
path
;
V9fsString
*
wnames
;
struct
stat
stbuf
;
}
V9fsWalkState
;
typedef
struct
V9fsOpenState
{
V9fsPDU
*
pdu
;
size_t
offset
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录