Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
iSulad
提交
7acea640
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,发现更多精彩内容 >>
提交
7acea640
编写于
6月 19, 2020
作者:
G
gaohuatao
提交者:
lifeng68
7月 25, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
devmapper: add remove device strerror
Signed-off-by:
N
gaohuatao
<
gaohuatao@huawei.com
>
上级
642cd5e5
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
148 addition
and
38 deletion
+148
-38
src/image/oci/storage/layer_store/graphdriver/devmapper/devices_constants.h
...age/layer_store/graphdriver/devmapper/devices_constants.h
+0
-2
src/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.c
...oci/storage/layer_store/graphdriver/devmapper/deviceset.c
+97
-30
src/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.h
...oci/storage/layer_store/graphdriver/devmapper/deviceset.h
+5
-0
src/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.c
...age/layer_store/graphdriver/devmapper/wrapper_devmapper.c
+43
-6
src/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.h
...age/layer_store/graphdriver/devmapper/wrapper_devmapper.h
+3
-0
未找到文件。
src/image/oci/storage/layer_store/graphdriver/devmapper/devices_constants.h
浏览文件 @
7acea640
...
...
@@ -51,8 +51,6 @@ struct device_set {
pthread_rwlock_t
devmapper_driver_rwlock
;
//protect all fields of DeviceSet
// options
int64_t
data_loop_back_size
;
int64_t
meta_data_loop_back_size
;
uint64_t
base_fs_size
;
char
*
filesystem
;
char
*
mount_options
;
...
...
src/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.c
浏览文件 @
7acea640
...
...
@@ -282,10 +282,41 @@ out:
return
dev_name
;
}
static
int
remove_device
(
const
char
*
name
)
{
int
i
=
0
;
int
max_retry
=
200
;
int
ret
=
0
;
if
(
name
==
NULL
)
{
ERROR
(
"Invalid input"
);
return
-
1
;
}
for
(;
i
<
max_retry
;
i
++
)
{
ret
=
dev_remove_device
(
name
);
if
(
ret
==
0
)
{
DEBUG
(
"devmapper: remove device:%s success"
,
name
);
goto
out
;
}
if
(
ret
!=
ERR_BUSY
)
{
ERROR
(
"devmapper: remove device err,cause is not busy,stop retry"
);
goto
out
;
}
INFO
(
"devmapper: device is busy so we cannot remove, after 0.1s to retry"
);
sleep
(
0
.
1
);
}
out:
return
ret
;
}
static
int
deactivate_device_mode
(
struct
device_set
*
devset
,
image_devmapper_device_info
*
dev_info
,
bool
deferred_remove
)
{
int
ret
=
0
;
int
nret
=
0
;
char
*
dm_name
=
NULL
;
struct
dm_info
dinfo
;
...
...
@@ -296,8 +327,9 @@ static int deactivate_device_mode(struct device_set *devset, image_devmapper_dev
dm_name
=
get_dm_name
(
devset
,
dev_info
->
hash
);
if
(
dm_name
==
NULL
)
{
ret
=
-
1
;
ERROR
(
"devmapper: get dm device name failed"
);
return
-
1
;
goto
free_out
;
}
if
(
dev_get_info
(
&
dinfo
,
dm_name
)
!=
0
)
{
...
...
@@ -307,12 +339,32 @@ static int deactivate_device_mode(struct device_set *devset, image_devmapper_dev
}
if
(
dinfo
.
exists
==
0
)
{
ret
=
0
;
DEBUG
(
"devmapper: device has exited, no need to remove again"
)
;
goto
free_out
;
}
if
(
deferred_remove
)
{
ret
=
dev_remove_device
(
dm_name
);
nret
=
dev_remove_device_deferred
(
dm_name
);
if
(
nret
!=
0
)
{
if
(
nret
==
ERR_ENXIO
)
{
WARN
(
"devmapper: device %s has gone"
,
dm_name
);
goto
free_out
;
}
ret
=
-
1
;
ERROR
(
"devmapper: remove device:%s failed, err:%s"
,
dm_name
,
dev_strerror
(
nret
));
goto
free_out
;
}
}
else
{
nret
=
remove_device
(
dm_name
);
if
(
nret
!=
0
)
{
if
(
nret
==
ERR_ENXIO
)
{
WARN
(
"devmapper: device %s has gone"
,
dm_name
);
goto
free_out
;
}
ret
=
-
1
;
ERROR
(
"devmapper: remove device:%s without deferred failed, err:%s"
,
dm_name
,
dev_strerror
(
nret
));
goto
free_out
;
}
}
free_out:
...
...
@@ -579,7 +631,7 @@ static uint64_t get_base_device_size(struct device_set *devset)
uint64_t
res
=
0
;
devmapper_device_info_t
*
device_info
=
NULL
;
device_info
=
lookup_device
(
devset
,
""
);
device_info
=
lookup_device
(
devset
,
"
base
"
);
if
(
device_info
==
NULL
)
{
return
0
;
}
...
...
@@ -907,7 +959,7 @@ static void cleanup_deleted_devices(struct device_set *devset)
for
(;
i
<
ids_len
;
i
++
)
{
if
(
delete_device
(
idsarray
[
i
],
false
,
devset
)
!=
0
)
{
WARN
(
"devmapper:Deletion of device
%s
failed"
,
idsarray
[
i
]);
WARN
(
"devmapper:Deletion of device
:
\"
%s
\"
failed"
,
idsarray
[
i
]);
}
}
...
...
@@ -2188,9 +2240,13 @@ out:
static
int
do_delete_device
(
struct
device_set
*
devset
,
const
char
*
hash
,
bool
sync_delete
)
{
int
ret
=
0
;
bool
deferred_remove
;
bool
deferred_remove
=
false
;
devmapper_device_info_t
*
device_info
=
NULL
;
if
(
devset
==
NULL
||
hash
==
NULL
)
{
return
-
1
;
}
device_info
=
lookup_device
(
devset
,
hash
);
if
(
device_info
==
NULL
)
{
ERROR
(
"devmapper: lookup device failed"
);
...
...
@@ -2243,6 +2299,8 @@ static int setup_base_image(struct device_set *devset)
goto
out
;
}
DEBUG
(
"devmapper: removing uninitialized base image"
);
if
(
do_delete_device
(
devset
,
"base"
,
true
)
!=
0
)
{
ret
=
-
1
;
ERROR
(
"devmapper: remove uninitialized base image failed"
);
...
...
@@ -2326,8 +2384,9 @@ static int do_check_all_devices(struct device_set *devset)
}
// remove broken device
if
(
length
==
0
)
{
if
(
dev_remove_device
(
devices_list
[
i
])
!=
0
)
{
WARN
(
"devmapper: remove broken device %s failed"
,
devices_list
[
i
]);
nret
=
dev_remove_device
(
devices_list
[
i
]);
if
(
nret
!=
0
)
{
WARN
(
"devmapper: remove broken device %s failed, err:%s"
,
devices_list
[
i
],
dev_strerror
(
nret
));
}
DEBUG
(
"devmapper: remove broken device: %s"
,
devices_list
[
i
]);
}
...
...
@@ -2338,8 +2397,9 @@ static int do_check_all_devices(struct device_set *devset)
continue
;
}
if
(
stat
(
device_path
,
&
st
))
{
if
(
dev_remove_device
(
devices_list
[
i
])
!=
0
)
{
WARN
(
"devmapper: remove incompelete device %s"
,
devices_list
[
i
]);
nret
=
dev_remove_device
(
devices_list
[
i
]);
if
(
nret
!=
0
)
{
WARN
(
"devmapper: remove incompelete device %s, err:%s"
,
devices_list
[
i
],
dev_strerror
(
nret
));
}
DEBUG
(
"devmapper: remove incompelete device: %s"
,
devices_list
[
i
]);
}
...
...
@@ -2680,6 +2740,11 @@ int add_device(const char *hash, const char *base_hash, struct device_set *devse
devmapper_device_info_t
*
device_info
=
NULL
;
uint64_t
size
=
0
;
if
(
devset
==
NULL
||
hash
==
NULL
||
base_hash
==
NULL
)
{
ERROR
(
"devmapper: invalid input params to add device"
);
return
-
1
;
}
if
(
pthread_rwlock_wrlock
(
&
(
devset
->
devmapper_driver_rwlock
))
!=
0
)
{
ERROR
(
"lock devmapper conf failed"
);
return
-
1
;
...
...
@@ -2776,7 +2841,7 @@ int mount_device(const char *hash, const char *path, const struct driver_mount_o
char
*
options
=
NULL
;
if
(
hash
==
NULL
||
path
==
NULL
||
mount_opts
==
NULL
)
{
ERROR
(
"devmapper:
failed
to mount device"
);
ERROR
(
"devmapper:
invalid input params
to mount device"
);
return
-
1
;
}
...
...
@@ -2785,9 +2850,9 @@ int mount_device(const char *hash, const char *path, const struct driver_mount_o
return
-
1
;
}
device_info
=
lookup_device
(
devset
,
hash
);
device_info
=
lookup_device
(
devset
,
strcmp
(
hash
,
""
)
==
0
?
"base"
:
hash
);
if
(
device_info
==
NULL
)
{
ERROR
(
"devmapper: lookup device
%s failed"
,
hash
);
ERROR
(
"devmapper: lookup device
:
\"
%s
\"
failed"
,
strcmp
(
hash
,
""
)
==
0
?
"base"
:
hash
);
ret
=
-
1
;
goto
free_out
;
}
...
...
@@ -2806,7 +2871,7 @@ int mount_device(const char *hash, const char *path, const struct driver_mount_o
if
(
activate_device_if_needed
(
devset
,
device_info
->
info
,
false
)
!=
0
)
{
ret
=
-
1
;
ERROR
(
"devmapper: Error activating devmapper device for
%s"
,
hash
);
ERROR
(
"devmapper: Error activating devmapper device for
\"
%s
\"
"
,
strcmp
(
hash
,
""
)
==
0
?
"base"
:
hash
);
goto
free_out
;
}
...
...
@@ -2835,7 +2900,7 @@ int unmount_device(const char *hash, const char *mount_path, struct device_set *
devmapper_device_info_t
*
device_info
=
NULL
;
if
(
hash
==
NULL
||
mount_path
==
NULL
)
{
ERROR
(
"devmapper:
failed
to unmount device"
);
ERROR
(
"devmapper:
invalid input params
to unmount device"
);
return
-
1
;
}
...
...
@@ -2844,9 +2909,9 @@ int unmount_device(const char *hash, const char *mount_path, struct device_set *
return
-
1
;
}
device_info
=
lookup_device
(
devset
,
hash
);
device_info
=
lookup_device
(
devset
,
strcmp
(
hash
,
""
)
==
0
?
"base"
:
hash
);
if
(
device_info
==
NULL
)
{
ERROR
(
"devmapper: lookup device
%s failed"
,
hash
);
ERROR
(
"devmapper: lookup device
:
\"
%s
\"
failed"
,
strcmp
(
hash
,
""
)
==
0
?
"base"
:
hash
);
ret
=
-
1
;
goto
free_out
;
}
...
...
@@ -2884,8 +2949,8 @@ bool has_device(const char *hash, struct device_set *devset)
bool
res
=
false
;
devmapper_device_info_t
*
device_info
=
NULL
;
if
(
hash
==
NULL
)
{
ERROR
(
"devmapper:
failed
to judge device metadata exists"
);
if
(
hash
==
NULL
||
devset
==
NULL
)
{
ERROR
(
"devmapper:
invalid input params
to judge device metadata exists"
);
return
false
;
}
...
...
@@ -2894,9 +2959,9 @@ bool has_device(const char *hash, struct device_set *devset)
return
-
1
;
}
device_info
=
lookup_device
(
devset
,
hash
);
device_info
=
lookup_device
(
devset
,
strcmp
(
hash
,
""
)
==
0
?
"base"
:
hash
);
if
(
device_info
==
NULL
)
{
ERROR
(
"devmapper: lookup device
%s failed"
,
hash
);
ERROR
(
"devmapper: lookup device
:
\"
%s
\"
failed"
,
strcmp
(
hash
,
""
)
==
0
?
"base"
:
hash
);
goto
free_out
;
}
...
...
@@ -2917,7 +2982,8 @@ int delete_device(const char *hash, bool sync_delete, struct device_set *devset)
int
ret
=
0
;
devmapper_device_info_t
*
device_info
=
NULL
;
if
(
hash
==
NULL
)
{
if
(
devset
==
NULL
||
hash
==
NULL
)
{
ERROR
(
"Invalid input params"
);
return
-
1
;
}
...
...
@@ -2926,16 +2992,16 @@ int delete_device(const char *hash, bool sync_delete, struct device_set *devset)
return
-
1
;
}
device_info
=
lookup_device
(
devset
,
hash
);
device_info
=
lookup_device
(
devset
,
strcmp
(
hash
,
""
)
==
0
?
"base"
:
hash
);
if
(
device_info
==
NULL
)
{
ret
=
-
1
;
ERROR
(
"devmapper: lookup device
%s failed"
,
hash
);
ERROR
(
"devmapper: lookup device
\"
%s
\"
failed"
,
strcmp
(
hash
,
""
)
==
0
?
"base"
:
hash
);
goto
free_out
;
}
if
(
do_delete_device
(
devset
,
hash
,
sync_delete
)
!=
0
)
{
if
(
do_delete_device
(
devset
,
strcmp
(
hash
,
""
)
==
0
?
"base"
:
hash
,
sync_delete
)
!=
0
)
{
ret
=
-
1
;
ERROR
(
"devmapper: do delete device:
%s failed"
,
hash
);
ERROR
(
"devmapper: do delete device:
\"
%s
\"
failed"
,
strcmp
(
hash
,
""
)
==
0
?
"base"
:
hash
);
goto
free_out
;
}
...
...
@@ -2957,6 +3023,7 @@ int export_device_metadata(struct device_metadata *dev_metadata, const char *has
devmapper_device_info_t
*
device_info
=
NULL
;
if
(
hash
==
NULL
||
dev_metadata
==
NULL
)
{
ERROR
(
"Invalid input params"
);
return
-
1
;
}
...
...
@@ -2965,17 +3032,17 @@ int export_device_metadata(struct device_metadata *dev_metadata, const char *has
return
-
1
;
}
dm_name
=
get_dm_name
(
devset
,
hash
);
dm_name
=
get_dm_name
(
devset
,
strcmp
(
hash
,
""
)
==
0
?
"base"
:
hash
);
if
(
dm_name
==
NULL
)
{
ret
=
-
1
;
ERROR
(
"devmapper: failed to get d
m %s name"
,
hash
);
ERROR
(
"devmapper: failed to get d
evice:
\"
%s
\"
dm name"
,
strcmp
(
hash
,
""
)
==
0
?
"base"
:
hash
);
goto
free_out
;
}
device_info
=
lookup_device
(
devset
,
hash
);
device_info
=
lookup_device
(
devset
,
strcmp
(
hash
,
""
)
==
0
?
"base"
:
hash
);
if
(
device_info
==
NULL
)
{
ret
=
-
1
;
ERROR
(
"devmapper: lookup device
%s failed"
,
hash
);
ERROR
(
"devmapper: lookup device
:
\"
%s
\"
failed"
,
strcmp
(
hash
,
""
)
==
0
?
"base"
:
hash
);
goto
free_out
;
}
...
...
src/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.h
浏览文件 @
7acea640
...
...
@@ -60,15 +60,20 @@ int device_set_init(struct graphdriver *driver, const char *drvier_home, const c
int
add_device
(
const
char
*
hash
,
const
char
*
base_hash
,
struct
device_set
*
devset
,
const
json_map_string_string
*
storage_opts
);
int
mount_device
(
const
char
*
hash
,
const
char
*
path
,
const
struct
driver_mount_opts
*
mount_opts
,
struct
device_set
*
devset
);
int
unmount_device
(
const
char
*
hash
,
const
char
*
mount_path
,
struct
device_set
*
devset
);
bool
has_device
(
const
char
*
hash
,
struct
device_set
*
devset
);
int
delete_device
(
const
char
*
hash
,
bool
sync_delete
,
struct
device_set
*
devset
);
int
export_device_metadata
(
struct
device_metadata
*
dev_metadata
,
const
char
*
hash
,
struct
device_set
*
devset
);
struct
status
*
device_set_status
(
struct
device_set
*
devset
);
void
free_devmapper_status
(
struct
status
*
st
);
int
device_set_shutdown
(
struct
device_set
*
devset
,
const
char
*
home
);
...
...
src/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.c
浏览文件 @
7acea640
...
...
@@ -27,6 +27,43 @@ static bool dm_saw_enxio = false; // no such device or address
// static bool dm_saw_eno_data = false; // no data available
static
int64_t
dm_udev_wait_timeout
=
0
;
char
*
dev_strerror
(
int
errnum
)
{
char
*
errmsg
=
NULL
;
switch
(
errnum
)
{
case
ERR_TASK_RUN
:
errmsg
=
"Task run error"
;
break
;
case
ERR_TASK_SET_COOKIE
:
errmsg
=
"Task set cookie error"
;
break
;
case
ERR_TASK_SET_ADD_NODE
:
errmsg
=
"Task add dm node failed"
;
break
;
case
ERR_BUSY
:
errmsg
=
"Device busy"
;
break
;
case
ERR_DEVICE_ID_EXISTS
:
errmsg
=
"Device exists already"
;
break
;
case
ERR_ENXIO
:
errmsg
=
"No such device of address"
;
break
;
case
ERR_TASK_ADD_TARGET
:
errmsg
=
"Task add target device error"
;
break
;
case
ERR_TASK_DEFERRED_REMOVE
:
errmsg
=
"dm_task_deferred_remove failed"
;
break
;
default:
errmsg
=
"Unknown error"
;
break
;
}
return
errmsg
;
}
struct
dm_task
*
task_create
(
int
type
)
{
struct
dm_task
*
dmt
=
NULL
;
...
...
@@ -489,18 +526,18 @@ free_out:
free
(
uwait
);
}
int
dev_remove_device
(
const
char
*
pool_f
name
)
int
dev_remove_device
(
const
char
*
name
)
{
int
ret
=
0
;
struct
dm_task
*
dmt
=
NULL
;
uint32_t
cookie
=
0
;
if
(
pool_f
name
==
NULL
)
{
if
(
name
==
NULL
)
{
ret
=
-
1
;
goto
out
;
}
dmt
=
task_create_named
(
DM_DEVICE_REMOVE
,
pool_f
name
);
dmt
=
task_create_named
(
DM_DEVICE_REMOVE
,
name
);
if
(
dmt
==
NULL
)
{
ERROR
(
"devicemapper: create task with name:DM_DEVICE_REMOVE failed"
);
ret
=
-
1
;
...
...
@@ -539,19 +576,19 @@ out:
return
ret
;
}
int
dev_remove_device_deferred
(
const
char
*
pool_f
name
)
int
dev_remove_device_deferred
(
const
char
*
name
)
{
int
ret
=
0
;
struct
dm_task
*
dmt
=
NULL
;
uint32_t
cookie
=
0
;
uint16_t
flags
=
DM_UDEV_DISABLE_LIBRARY_FALLBACK
;
if
(
pool_f
name
==
NULL
)
{
if
(
name
==
NULL
)
{
ret
=
-
1
;
goto
out
;
}
dmt
=
task_create_named
(
DM_DEVICE_REMOVE
,
pool_f
name
);
dmt
=
task_create_named
(
DM_DEVICE_REMOVE
,
name
);
if
(
dmt
==
NULL
)
{
ret
=
-
1
;
goto
out
;
...
...
src/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.h
浏览文件 @
7acea640
...
...
@@ -73,6 +73,7 @@ typedef struct {
int
state
;
// 0: ok 1:err_udev_wait 2: err_udev_wait_timeout
}
udev_wait_pth_t
;
char
*
dev_strerror
(
int
errnum
);
struct
dm_task
*
task_create
(
int
type
);
...
...
@@ -104,6 +105,8 @@ int dev_get_info(struct dm_info *info, const char *name);
int
dev_remove_device
(
const
char
*
name
);
int
dev_remove_device_deferred
(
const
char
*
name
);
int
dev_get_device_list
(
char
***
list
,
size_t
*
length
);
bool
udev_sync_supported
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录