Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
iSulad
提交
457b7d16
I
iSulad
项目概览
openeuler
/
iSulad
通知
15
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
I
iSulad
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
457b7d16
编写于
3月 20, 2020
作者:
L
LiFeng
提交者:
lifeng68
7月 25, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
driver: export all interface functions
Signed-off-by:
N
LiFeng
<
lifeng68@huawei.com
>
上级
f8cec2b5
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
159 addition
and
189 deletion
+159
-189
src/cmd/isulad/main.c
src/cmd/isulad/main.c
+1
-6
src/image/oci/global_config.c
src/image/oci/global_config.c
+1
-5
src/image/oci/graphdriver/driver.c
src/image/oci/graphdriver/driver.c
+127
-170
src/image/oci/graphdriver/driver.h
src/image/oci/graphdriver/driver.h
+19
-7
src/image/oci/graphdriver/overlay2/driver_overlay2.c
src/image/oci/graphdriver/overlay2/driver_overlay2.c
+9
-1
src/image/oci/graphdriver/overlay2/driver_overlay2.h
src/image/oci/graphdriver/overlay2/driver_overlay2.h
+2
-0
未找到文件。
src/cmd/isulad/main.c
浏览文件 @
457b7d16
...
...
@@ -189,7 +189,7 @@ static void umount_daemon_mntpoint()
mntdir
=
NULL
;
}
graphdriver_
umount_mntpoint
();
graphdriver_
cleanup
();
}
#endif
...
...
@@ -1125,11 +1125,6 @@ static int isulad_server_init_common()
goto
out
;
}
#ifdef ENABLE_OCI_IMAGE
/* update status of graphdriver after image server running */
update_graphdriver_status
(
&
(
args
->
driver
));
#endif
if
(
containers_store_init
())
{
ERROR
(
"Failed to init containers store"
);
goto
out
;
...
...
src/image/oci/global_config.c
浏览文件 @
457b7d16
...
...
@@ -26,7 +26,6 @@ static int pack_global_graph_driver(const char * const *options, bool ignore_sto
{
int
ret
=
-
1
;
char
*
graph_driver
=
NULL
;
struct
graphdriver
*
driver
=
NULL
;
char
**
graph_opts
=
NULL
;
char
**
p
=
NULL
;
size_t
i
=
0
;
...
...
@@ -38,7 +37,7 @@ static int pack_global_graph_driver(const char * const *options, bool ignore_sto
COMMAND_ERROR
(
"Failed to get graph driver"
);
goto
out
;
}
driver
=
graphdriver_get
(
graph_driver
);
if
(
strcmp
(
graph_driver
,
"overlay2"
)
==
0
)
{
// Treating overlay2 as overlay cause image was downloaded always
// in '/var/lib/isulad/storage/overlay' directory.
...
...
@@ -52,9 +51,6 @@ static int pack_global_graph_driver(const char * const *options, bool ignore_sto
// since iSulad-img will set quota when pull image, which is differ from docker,
// and we may get some error if setted, ignore it if neccessary.
for
(
p
=
graph_opts
;
(
p
!=
NULL
)
&&
(
*
p
!=
NULL
);
p
++
)
{
if
(
ignore_storage_opt_size
&&
driver
!=
NULL
&&
driver
->
ops
->
is_quota_options
(
driver
,
*
p
))
{
continue
;
}
add_array_kv
(
params
,
PARAM_NUM
,
&
i
,
options
[
GB_OPTION_DRIVER_OPTIONS
],
*
p
);
}
...
...
src/image/oci/graphdriver/driver.c
浏览文件 @
457b7d16
...
...
@@ -28,12 +28,12 @@
#include "image.h"
#include "util_archive.h"
/* overlay/overlay2 */
#define DRIVER_OVERLAY_NAME "overlay"
static
struct
graphdriver
*
g_graphdriver
=
NULL
;
/* overlay2 */
#define DRIVER_OVERLAY2_NAME "overlay2"
static
const
struct
graphdriver_ops
g_overlay2_ops
=
{
.
init
=
overlay2_init
,
.
is_quota_options
=
overlay2_is_quota_options
,
.
create_rw
=
overlay2_create_rw
,
.
rm_layer
=
overlay2_rm_layer
,
.
mount_layer
=
overlay2_mount_layer
,
...
...
@@ -42,6 +42,7 @@ static const struct graphdriver_ops g_overlay2_ops = {
.
apply_diff
=
overlay2_apply_diff
,
.
get_layer_metadata
=
overlay2_get_layer_metadata
,
.
get_driver_status
=
overlay2_get_driver_status
,
.
clean_up
=
overlay2_clean_up
,
};
/* devicemapper */
...
...
@@ -49,7 +50,6 @@ static const struct graphdriver_ops g_overlay2_ops = {
static
const
struct
graphdriver_ops
g_devmapper_ops
=
{
.
init
=
devmapper_init
,
.
is_quota_options
=
devmapper_is_quota_options
,
};
static
struct
graphdriver
g_drivers
[]
=
{
...
...
@@ -64,9 +64,6 @@ struct graphdriver *graphdriver_init(const char *name, const char *isulad_root,
{
size_t
i
=
0
;
char
driver_home
[
PATH_MAX
]
=
{
0
};
//test
struct
driver_create_opts
test_create_opts
=
{
0
};
struct
driver_mount_opts
test_mount_opts
=
{
0
};
if
(
name
==
NULL
||
storage_opts
==
NULL
||
isulad_root
==
NULL
)
{
return
NULL
;
...
...
@@ -80,221 +77,172 @@ struct graphdriver *graphdriver_init(const char *name, const char *isulad_root,
for
(
i
=
0
;
i
<
g_numdrivers
;
i
++
)
{
if
(
strcmp
(
name
,
g_drivers
[
i
].
name
)
==
0
)
{
if
(
g_drivers
[
i
].
ops
->
init
(
&
g_drivers
[
i
],
driver_home
,
(
const
char
**
)
storage_opts
,
storage_opts_len
))
{
return
NULL
;
}
//just for test
if
(
g_drivers
[
i
].
ops
->
create_rw
(
"1"
,
""
,
&
g_drivers
[
i
],
&
test_create_opts
)
!=
0
)
{
return
NULL
;
}
if
(
g_drivers
[
i
].
ops
->
create_rw
(
"2"
,
"1"
,
&
g_drivers
[
i
],
&
test_create_opts
)
!=
0
)
{
return
NULL
;
}
if
(
g_drivers
[
i
].
ops
->
create_rw
(
"3"
,
"2"
,
&
g_drivers
[
i
],
&
test_create_opts
)
!=
0
)
{
return
NULL
;
if
(
g_drivers
[
i
].
ops
->
init
(
&
g_drivers
[
i
],
driver_home
,
(
const
char
**
)
storage_opts
,
storage_opts_len
)
!=
0
)
{
goto
out
;
}
g_graphdriver
=
&
g_drivers
[
i
];
break
;
}
}
if
(
g_drivers
[
i
].
ops
->
create_rw
(
"4"
,
"3"
,
&
g_drivers
[
i
],
&
test_create_opts
)
!=
0
)
{
return
NULL
;
}
char
*
test_merged
=
g_drivers
[
i
].
ops
->
mount_layer
(
"4"
,
&
g_drivers
[
i
],
&
test_mount_opts
);
if
(
test_merged
==
NULL
)
{
return
NULL
;
}
ERROR
(
"mount: %s"
,
test_merged
);
out:
return
g_graphdriver
;
}
if
(
test_archive
()
!=
0
)
{
ERROR
(
"Failed!!!"
);
}
struct
graphdriver
*
graphdriver_get
()
{
return
g_graphdriver
;
}
//if (g_drivers[i].ops->rm_layer("3", &g_drivers[i]) != 0) {
// return NULL;
// }
// end test
return
&
g_drivers
[
i
];
}
int
graphdriver_create_rw
(
const
char
*
id
,
const
char
*
parent
,
const
struct
driver_create_opts
*
create_opts
)
{
if
(
g_graphdriver
==
NULL
)
{
ERROR
(
"Driver not inited yet"
);
return
-
1
;
}
ERROR
(
"Invalid storage driver name: '%s'"
,
name
);
return
NULL
;
if
(
id
==
NULL
||
parent
==
NULL
||
create_opts
==
NULL
)
{
ERROR
(
"Invalid input arguments for driver create"
);
return
-
1
;
}
return
g_graphdriver
->
ops
->
create_rw
(
id
,
parent
,
g_graphdriver
,
create_opts
);;
}
struct
graphdriver
*
graphdriver_get
(
const
char
*
name
)
int
graphdriver_create_ro
(
const
char
*
id
,
const
char
*
parent
,
const
struct
driver_create_opts
*
create_opts
)
{
size_t
i
=
0
;
if
(
name
==
NULL
)
{
return
NULL
;
if
(
g_graphdriver
==
NULL
)
{
ERROR
(
"Driver not inited yet"
);
return
-
1
;
}
for
(
i
=
0
;
i
<
g_numdrivers
;
i
++
)
{
if
(
strcmp
(
name
,
g_drivers
[
i
].
name
)
==
0
)
{
return
&
g_drivers
[
i
];
}
if
(
id
==
NULL
||
parent
==
NULL
||
create_opts
==
NULL
)
{
ERROR
(
"Invalid input arguments for driver create"
);
return
-
1
;
}
isulad_set_error_message
(
"Invalid storage driver name: '%s'"
,
name
);
return
NULL
;
return
g_graphdriver
->
ops
->
create_rw
(
id
,
parent
,
g_graphdriver
,
create_opts
);;
}
struct
graphdriver_status
*
graphdriver_get_status
(
vo
id
)
int
graphdriver_rm_layer
(
const
char
*
id
)
{
struct
graphdriver_status
*
status
=
NULL
;
int
ret
=
-
1
;
im_storage_status_response
*
resp
=
NULL
;
ret
=
im_get_storage_status
(
IMAGE_TYPE_OCI
,
&
resp
);
if
(
ret
!=
0
)
{
return
NULL
;
if
(
g_graphdriver
==
NULL
)
{
ERROR
(
"Driver not inited yet"
);
return
-
1
;
}
status
=
util_common_calloc_s
(
sizeof
(
struct
graphdriver_status
));
if
(
status
==
NULL
)
{
ERROR
(
"Out of memory"
);
goto
free_out
;
if
(
id
==
NULL
)
{
ERROR
(
"Invalid input arguments for driver remove layer"
);
return
-
1
;
}
status
->
backing_fs
=
util_strdup_s
(
resp
->
backing_fs
);
status
->
status
=
util_strdup_s
(
resp
->
status
);
return
g_graphdriver
->
ops
->
rm_layer
(
id
,
g_graphdriver
);
}
ret
=
0
;
free_out:
free_im_storage_status_response
(
resp
);
if
(
ret
!=
0
)
{
free_graphdriver_status
(
status
);
char
*
graphdriver_mount_layer
(
const
char
*
id
,
const
struct
driver_mount_opts
*
mount_opts
)
{
if
(
g_graphdriver
==
NULL
)
{
ERROR
(
"Driver not inited yet"
);
return
NULL
;
}
return
status
;
if
(
id
==
NULL
||
mount_opts
==
NULL
)
{
ERROR
(
"Invalid input arguments for driver mount layer"
);
return
NULL
;
}
return
g_graphdriver
->
ops
->
mount_layer
(
id
,
g_graphdriver
,
mount_opts
);
}
container_inspect_graph_driver
*
graphdriver_get_metadata
(
char
*
id
)
int
graphdriver_umount_layer
(
const
char
*
id
)
{
container_inspect_graph_driver
*
inspect_driver
=
NULL
;
int
ret
=
-
1
;
im_storage_metadata_response
*
resp
=
NULL
;
int
i
=
0
;
ret
=
im_get_storage_metadata
(
IMAGE_TYPE_OCI
,
id
,
&
resp
);
if
(
ret
!=
0
)
{
goto
free_out
;
if
(
g_graphdriver
==
NULL
)
{
ERROR
(
"Driver not inited yet"
);
return
-
1
;
}
if
(
resp
->
name
==
NULL
||
resp
->
metadata
==
NULL
)
{
ERROR
(
"Failed to get metadata or name"
);
ret
=
-
1
;
goto
free_out
;
if
(
id
==
NULL
)
{
ERROR
(
"Invalid input arguments for driver umount layer"
);
return
-
1
;
}
inspect_driver
=
util_common_calloc_s
(
sizeof
(
container_inspect_graph_driver
));
if
(
inspect_driver
==
NULL
)
{
ERROR
(
"Out of memory"
);
ret
=
-
1
;
goto
free_out
;
}
inspect_driver
->
data
=
util_common_calloc_s
(
sizeof
(
container_inspect_graph_driver_data
));
if
(
inspect_driver
->
data
==
NULL
)
{
ERROR
(
"Out of memory"
);
ret
=
-
1
;
goto
free_out
;
}
return
g_graphdriver
->
ops
->
umount_layer
(
id
,
g_graphdriver
);
}
inspect_driver
->
name
=
util_strdup_s
(
resp
->
name
);
if
(
!
strcmp
(
resp
->
name
,
DRIVER_OVERLAY_NAME
)
||
!
strcmp
(
resp
->
name
,
DRIVER_OVERLAY2_NAME
))
{
for
(
i
=
0
;
i
<
resp
->
metadata
->
len
;
i
++
)
{
if
(
!
strcmp
(
resp
->
metadata
->
keys
[
i
],
"LowerDir"
))
{
inspect_driver
->
data
->
lower_dir
=
util_strdup_s
(
resp
->
metadata
->
values
[
i
]);
}
else
if
(
!
strcmp
(
resp
->
metadata
->
keys
[
i
],
"MergedDir"
))
{
inspect_driver
->
data
->
merged_dir
=
util_strdup_s
(
resp
->
metadata
->
values
[
i
]);
}
else
if
(
!
strcmp
(
resp
->
metadata
->
keys
[
i
],
"UpperDir"
))
{
inspect_driver
->
data
->
upper_dir
=
util_strdup_s
(
resp
->
metadata
->
values
[
i
]);
}
else
if
(
!
strcmp
(
resp
->
metadata
->
keys
[
i
],
"WorkDir"
))
{
inspect_driver
->
data
->
work_dir
=
util_strdup_s
(
resp
->
metadata
->
values
[
i
]);
}
}
}
else
if
(
!
strcmp
(
resp
->
name
,
DRIVER_DEVMAPPER_NAME
))
{
for
(
i
=
0
;
i
<
resp
->
metadata
->
len
;
i
++
)
{
if
(
!
strcmp
(
resp
->
metadata
->
keys
[
i
],
"DeviceId"
))
{
inspect_driver
->
data
->
device_id
=
util_strdup_s
(
resp
->
metadata
->
values
[
i
]);
}
else
if
(
!
strcmp
(
resp
->
metadata
->
keys
[
i
],
"DeviceName"
))
{
inspect_driver
->
data
->
device_name
=
util_strdup_s
(
resp
->
metadata
->
values
[
i
]);
}
else
if
(
!
strcmp
(
resp
->
metadata
->
keys
[
i
],
"DeviceSize"
))
{
inspect_driver
->
data
->
device_size
=
util_strdup_s
(
resp
->
metadata
->
values
[
i
]);
}
}
}
else
{
ERROR
(
"Unsupported driver %s"
,
resp
->
name
);
ret
=
-
1
;
goto
free_out
;
bool
graphdriver_layer_exists
(
const
char
*
id
)
{
if
(
g_graphdriver
==
NULL
)
{
ERROR
(
"Driver not inited yet"
);
return
-
1
;
}
ret
=
0
;
free_out:
free_im_storage_metadata_response
(
resp
);
if
(
ret
!=
0
)
{
free_container_inspect_graph_driver
(
inspect_driver
);
return
NULL
;
if
(
id
==
NULL
)
{
ERROR
(
"Invalid input arguments for driver exists layer"
);
return
-
1
;
}
return
inspect_driver
;
return
g_graphdriver
->
ops
->
exists
(
id
,
g_graphdriver
);
}
int
update_graphdriver_status
(
struct
graphdriver
**
driver
)
int
graphdriver_apply_diff
(
const
char
*
id
,
const
struct
io_read_wrapper
*
content
,
int64_t
*
layer_size
)
{
struct
graphdriver_status
*
status
=
NULL
;
int
ret
=
0
;
if
(
g_graphdriver
==
NULL
)
{
ERROR
(
"Driver not inited yet"
);
return
-
1
;
}
if
(
driver
==
NULL
)
{
if
(
id
==
NULL
||
content
==
NULL
||
layer_size
==
NULL
)
{
ERROR
(
"Invalid input arguments for driver umount layer"
);
return
-
1
;
}
status
=
graphdriver_get_status
();
if
(
status
==
NULL
)
{
ERROR
(
"Can not get driver status"
);
return
g_graphdriver
->
ops
->
apply_diff
(
id
,
g_graphdriver
,
content
,
layer_size
);
}
int
graphdriver_get_layer_metadata
(
const
char
*
id
,
json_map_string_string
*
map_info
)
{
if
(
g_graphdriver
==
NULL
)
{
ERROR
(
"Driver not inited yet"
);
return
-
1
;
}
if
(
*
driver
==
NULL
)
{
*
driver
=
util_common_calloc_s
(
sizeof
(
struct
graphdriver
));
if
(
*
driver
==
NULL
)
{
ERROR
(
"Out of memory"
);
ret
=
-
1
;
goto
out
;
}
if
(
id
==
NULL
||
map_info
==
NULL
)
{
ERROR
(
"Invalid input arguments for driver umount layer"
);
return
-
1
;
}
free
((
*
driver
)
->
backing_fs
);
(
*
driver
)
->
backing_fs
=
util_strdup_s
(
status
->
backing_fs
);
out:
free_graphdriver_status
(
status
);
return
ret
;
return
g_graphdriver
->
ops
->
get_layer_metadata
(
id
,
g_graphdriver
,
map_info
);
}
void
graphdriver_umount_mntpoint
(
void
)
struct
graphdriver_status
*
graphdriver_get_status
(
void
)
{
char
*
root
=
NULL
;
char
*
driver_name
=
NULL
;
char
mp
[
PATH_MAX
]
=
{
0
};
int
nret
=
0
;
root
=
conf_get_graph_rootpath
();
driver_name
=
conf_get_isulad_storage_driver
();
if
(
root
==
NULL
||
driver_name
==
NULL
)
{
WARN
(
"No root or driver name specified"
);
goto
cleanup
;
int
ret
=
-
1
;
struct
graphdriver_status
*
status
=
NULL
;
if
(
g_graphdriver
==
NULL
)
{
ERROR
(
"Driver not inited yet"
);
return
NULL
;
}
if
(
strcmp
(
driver_name
,
"overlay2"
)
==
0
)
{
driver_name
[
strlen
(
driver_name
)
-
1
]
=
'\0'
;
status
=
util_common_calloc_s
(
sizeof
(
struct
graphdriver_status
));
if
(
status
==
NULL
)
{
ERROR
(
"Out of memory"
);
goto
free_out
;
}
nret
=
snprintf
(
mp
,
sizeof
(
mp
),
"%s/%s"
,
root
,
driver_name
);
if
(
nret
<
0
||
(
size_t
)
nret
>=
sizeof
(
mp
))
{
WARN
(
"Failed to print string"
);
goto
cleanup
;
ret
=
g_graphdriver
->
ops
->
get_driver_status
(
g_graphdriver
,
status
);
if
(
ret
!=
0
)
{
ERROR
(
"Failed to get driver status"
);
goto
free_out
;
}
if
(
umount
(
mp
)
<
0
&&
errno
!=
EINVAL
)
{
WARN
(
"Can not umount: %s: %s"
,
mp
,
strerror
(
errno
));
free_out:
if
(
ret
!=
0
)
{
free_graphdriver_status
(
status
);
return
NULL
;
}
cleanup:
free
(
root
);
free
(
driver_name
);
return
status
;
}
void
free_graphdriver_status
(
struct
graphdriver_status
*
status
)
...
...
@@ -307,3 +255,12 @@ void free_graphdriver_status(struct graphdriver_status *status)
free
(
status
);
}
int
graphdriver_cleanup
(
void
)
{
if
(
g_graphdriver
==
NULL
)
{
ERROR
(
"Driver not inited yet"
);
return
-
1
;
}
return
g_graphdriver
->
ops
->
clean_up
(
g_graphdriver
);
}
src/image/oci/graphdriver/driver.h
浏览文件 @
457b7d16
...
...
@@ -48,8 +48,6 @@ struct graphdriver_status {
struct
graphdriver_ops
{
int
(
*
init
)(
struct
graphdriver
*
driver
,
const
char
*
drvier_home
,
const
char
**
options
,
size_t
len
);
bool
(
*
is_quota_options
)(
struct
graphdriver
*
driver
,
const
char
*
option
);
int
(
*
create_rw
)(
const
char
*
id
,
const
char
*
parent
,
const
struct
graphdriver
*
driver
,
const
struct
driver_create_opts
*
create_opts
);
...
...
@@ -67,6 +65,8 @@ struct graphdriver_ops {
int
(
*
get_layer_metadata
)(
const
char
*
id
,
const
struct
graphdriver
*
driver
,
json_map_string_string
*
map_info
);
int
(
*
get_driver_status
)(
const
struct
graphdriver
*
driver
,
struct
graphdriver_status
*
status
);
int
(
*
clean_up
)(
const
struct
graphdriver
*
driver
);
};
struct
graphdriver
{
...
...
@@ -84,18 +84,30 @@ struct graphdriver {
struct
graphdriver
*
graphdriver_init
(
const
char
*
name
,
const
char
*
isulad_root
,
char
**
storage_opts
,
size_t
storage_opts_len
);
struct
graphdriver
*
graphdriver_get
(
const
char
*
name
);
struct
graphdriver
*
graphdriver_get
(
void
);
struct
graphdriver_status
*
graphdriver_get_status
(
void
);
int
graphdriver_create_rw
(
const
char
*
id
,
const
char
*
parent
,
const
struct
driver_create_opts
*
create_opts
);
int
graphdriver_create_ro
(
const
char
*
id
,
const
char
*
parent
,
const
struct
driver_create_opts
*
create_opts
);
int
graphdriver_rm_layer
(
const
char
*
id
);
c
ontainer_inspect_graph_driver
*
graphdriver_get_metadata
(
char
*
id
);
c
har
*
graphdriver_mount_layer
(
const
char
*
id
,
const
struct
driver_mount_opts
*
mount_opts
);
int
update_graphdriver_status
(
struct
graphdriver
**
driver
);
int
graphdriver_umount_layer
(
const
char
*
id
);
void
graphdriver_umount_mntpoint
(
void
);
bool
graphdriver_layer_exists
(
const
char
*
id
);
int
graphdriver_apply_diff
(
const
char
*
id
,
const
struct
io_read_wrapper
*
content
,
int64_t
*
layer_size
);
int
graphdriver_get_layer_metadata
(
const
char
*
id
,
json_map_string_string
*
map_info
);
struct
graphdriver_status
*
graphdriver_get_status
(
void
);
void
free_graphdriver_status
(
struct
graphdriver_status
*
status
);
int
graphdriver_cleanup
(
void
);
#ifdef __cplusplus
}
#endif
...
...
src/image/oci/graphdriver/overlay2/driver_overlay2.c
浏览文件 @
457b7d16
...
...
@@ -1479,4 +1479,12 @@ int overlay2_get_driver_status(const struct graphdriver *driver, struct graphdri
out:
return
ret
;
}
\ No newline at end of file
}
int
overlay2_clean_up
(
const
struct
graphdriver
*
driver
)
{
if
(
driver
==
NULL
)
{
return
-
1
;
}
return
umount
(
driver
->
home
);
}
src/image/oci/graphdriver/overlay2/driver_overlay2.h
浏览文件 @
457b7d16
...
...
@@ -44,6 +44,8 @@ int overlay2_get_layer_metadata(const char *id, const struct graphdriver *driver
int
overlay2_get_driver_status
(
const
struct
graphdriver
*
driver
,
struct
graphdriver_status
*
status
);
int
overlay2_clean_up
(
const
struct
graphdriver
*
driver
);
#ifdef __cplusplus
}
#endif
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录