Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
iSulad
提交
195b0cb2
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,发现更多精彩内容 >>
提交
195b0cb2
编写于
6月 15, 2020
作者:
G
gaohuatao
提交者:
lifeng68
7月 25, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
devmapper: fix valgrind leek
Signed-off-by:
N
gaohuatao
<
gaohuatao@huawei.com
>
上级
543d1f57
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
249 addition
and
408 deletion
+249
-408
src/image/oci/storage/layer_store/graphdriver/devmapper/device_setup.c
.../storage/layer_store/graphdriver/devmapper/device_setup.c
+0
-199
src/image/oci/storage/layer_store/graphdriver/devmapper/device_setup.h
.../storage/layer_store/graphdriver/devmapper/device_setup.h
+0
-41
src/image/oci/storage/layer_store/graphdriver/devmapper/devices_constants.h
...age/layer_store/graphdriver/devmapper/devices_constants.h
+0
-1
src/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.c
...oci/storage/layer_store/graphdriver/devmapper/deviceset.c
+158
-100
src/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.h
...oci/storage/layer_store/graphdriver/devmapper/deviceset.h
+0
-1
src/image/oci/storage/layer_store/graphdriver/devmapper/driver_devmapper.c
...rage/layer_store/graphdriver/devmapper/driver_devmapper.c
+0
-1
src/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.c
...age/layer_store/graphdriver/devmapper/wrapper_devmapper.c
+91
-63
src/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.h
...age/layer_store/graphdriver/devmapper/wrapper_devmapper.h
+0
-2
未找到文件。
src/image/oci/storage/layer_store/graphdriver/devmapper/device_setup.c
已删除
100644 → 0
浏览文件 @
543d1f57
/******************************************************************************
* Copyright (c) Huawei Technologies Co., Ltd. 2020. All rights reserved.
* iSulad licensed under the Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v2 for more details.
* Author: gaohuatao
* Create: 2020-06-12
* Description: provide overlay2 function definition
******************************************************************************/
#include "device_setup.h"
#include "utils_file.h"
#include "isula_libutils/log.h"
#include "utils_string.h"
#include "utils.h"
#define LVM_DISK_SCAN "lvmdiskscan"
#define PVDISPLAY "pvdisplay"
int
validate_lvm_config
(
image_devmapper_direct_lvm_config
*
cfg
)
{
int
ret
=
-
1
;
if
(
cfg
==
NULL
)
{
ERROR
(
"direct lvm config is empty"
);
return
-
1
;
}
if
(
!
util_valid_str
(
cfg
->
device
))
{
ERROR
(
"must provide device path in `dm.directlvm_device` in order to configure direct-lvm"
);
return
ret
;
}
if
((
cfg
->
thinp_percent
>
0
&&
cfg
->
thinp_meta_percent
==
0
)
||
(
cfg
->
thinp_meta_percent
>
0
&&
cfg
->
thinp_percent
))
{
ERROR
(
"must set both `dm.thinp_percent` and `dm.thinp_metapercent` if either is specified"
);
return
ret
;
}
if
(
cfg
->
thinp_percent
+
cfg
->
thinp_meta_percent
>
100
)
{
ERROR
(
"combined `dm.thinp_percent` and `dm.thinp_metapercent` must not be greater than 100"
);
return
ret
;
}
return
0
;
}
int
check_dev_available
(
const
char
*
dev
)
{
// char *err = NULL;
// char *lvm_scan_fullpath = NULL;
// lvm_scan_fullpath = look_path("lvmdiskscan", &err);
// TODO: exec and get output and match dev
return
0
;
}
int
check_dev_invg
(
const
char
*
dev
)
{
// char *err = NULL;
// char *pvdisplay_fullpath = NULL;
// pvdisplay_fullpath = look_path("pvdisplay", &err);
return
0
;
}
int
check_dev_hasfs
(
const
char
*
dev
)
{
// char *err = NULL;
// char *blkid_fullpath = NULL;
// pvdisplay_fullpath = look_path("blkid", &err);
return
0
;
}
int
verify_block_device
(
const
char
*
dev
,
bool
force
)
{
int
ret
=
0
;
ret
=
check_dev_available
(
dev
);
if
(
ret
!=
0
)
{
//ERROR();
return
ret
;
}
ret
=
check_dev_invg
(
dev
);
if
(
ret
!=
0
)
{
//ERROR();
return
ret
;
}
if
(
force
)
{
return
ret
;
}
ret
=
check_dev_hasfs
(
dev
);
if
(
ret
!=
0
)
{
//ERROR();
return
ret
;
}
return
ret
;
}
image_devmapper_direct_lvm_config
*
read_lvm_config
(
const
char
*
root
)
{
parser_error
err
=
NULL
;
image_devmapper_direct_lvm_config
*
cfg
=
NULL
;
char
*
path
=
NULL
;
path
=
util_path_join
(
root
,
"setup-config.json"
);
if
(
!
util_file_exists
(
path
))
{
goto
out
;
}
cfg
=
image_devmapper_direct_lvm_config_parse_file
(
path
,
NULL
,
&
err
);
if
(
cfg
==
NULL
)
{
ERROR
(
"load setup-config.json failed %s"
,
err
!=
NULL
?
err
:
""
);
goto
out
;
}
out:
free
(
path
);
free
(
err
);
return
cfg
;
}
int
write_lvm_config
(
const
char
*
root
,
image_devmapper_direct_lvm_config
*
cfg
)
{
char
*
path
=
NULL
;
int
ret
=
0
;
path
=
util_path_join
(
root
,
"setup-config.json"
);
if
(
!
util_file_exists
(
path
))
{
goto
out
;
}
// TODO:write to file
out:
free
(
path
);
return
ret
;
}
int
setup_direct_lvm
(
image_devmapper_direct_lvm_config
*
cfg
)
{
// char *lvm_profile_dir = "/etc/lvm/profile";
// char *binaries[] = {"pvcreate", "vgcreate", "lvcreate", "lvconvert", "lvchange", "thin_check"};
//lookpath
// TODO: 执行上述命令
return
0
;
}
// ProbeFsType returns the filesystem name for the given device id.
// device: /dev/mapper/%s-hash
char
*
probe_fs_type
(
const
char
*
device
)
{
return
NULL
;
}
void
append_mount_options
(
char
**
dest
,
const
char
*
suffix
)
{
char
*
res_string
=
NULL
;
size_t
length
;
if
(
dest
==
NULL
)
{
// ERROR();
return
;
}
if
(
*
dest
==
NULL
)
{
*
dest
=
util_strdup_s
(
suffix
);
}
if
(
suffix
==
NULL
)
{
return
;
}
if
(
strlen
(
suffix
)
>
((
SIZE_MAX
-
strlen
(
*
dest
)
-
strlen
(
","
))
-
1
))
{
ERROR
(
"String is too long to be appended"
);
return
;
}
length
=
strlen
(
*
dest
)
+
strlen
(
","
)
+
strlen
(
suffix
)
+
1
;
res_string
=
util_common_calloc_s
(
length
);
if
(
res_string
==
NULL
)
{
ERROR
(
"Out of memory"
);
return
;
}
(
void
)
strcat
(
res_string
,
*
dest
);
(
void
)
strcat
(
res_string
,
","
);
(
void
)
strcat
(
res_string
,
suffix
);
free
(
*
dest
);
*
dest
=
res_string
;
}
\ No newline at end of file
src/image/oci/storage/layer_store/graphdriver/devmapper/device_setup.h
已删除
100644 → 0
浏览文件 @
543d1f57
/******************************************************************************
* Copyright (c) Huawei Technologies Co., Ltd. 2020. All rights reserved.
* iSulad licensed under the Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v2 for more details.
* Author: gaohuatao
* Create: 2020-06-12
* Description: provide overlay2 function definition
******************************************************************************/
#ifndef __DEVMAPPER_DEVICE_SETUP_H
#define __DEVMAPPER_DEVICE_SETUP_H
#include <stdint.h>
#include "isula_libutils/image_devmapper_direct_lvm_config.h"
#ifdef __cplusplus
extern
"C"
{
#endif
int
validate_lvm_config
(
image_devmapper_direct_lvm_config
*
cfg
);
int
check_dev_available
(
const
char
*
dev
);
int
check_dev_invg
(
const
char
*
dev
);
int
check_dev_hasfs
(
const
char
*
dev
);
int
verify_block_device
(
const
char
*
dev
,
bool
force
);
image_devmapper_direct_lvm_config
*
read_lvm_config
(
const
char
*
root
);
int
write_lvm_config
(
const
char
*
root
,
image_devmapper_direct_lvm_config
*
cfg
);
int
setup_direct_lvm
(
image_devmapper_direct_lvm_config
*
cfg
);
char
*
probe_fs_type
(
const
char
*
device
);
void
append_mount_options
(
char
**
dest
,
const
char
*
suffix
);
#ifdef __cplusplus
}
#endif
#endif
\ No newline at end of file
src/image/oci/storage/layer_store/graphdriver/devmapper/devices_constants.h
浏览文件 @
195b0cb2
...
...
@@ -78,7 +78,6 @@ struct device_set {
char
*
xfs_nospace_retries
;
// max retries when xfs receives ENOSPC
int64_t
udev_wait_timeout
;
image_devmapper_direct_lvm_config
*
lvm_setup_config
;
bool
driver_deferred_removal_support
;
bool
enable_deferred_removal
;
bool
enable_deferred_deletion
;
...
...
src/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.c
浏览文件 @
195b0cb2
...
...
@@ -165,6 +165,22 @@ static char *metadata_dir(struct device_set *devset)
return
dir
;
}
static
char
*
transaction_meta_file
(
struct
device_set
*
devset
)
{
char
*
dir
=
NULL
;
char
*
file
=
NULL
;
dir
=
metadata_dir
(
devset
);
if
(
dir
==
NULL
)
{
return
NULL
;
}
file
=
util_path_join
(
dir
,
TRANSACTION_METADATA
);
free
(
dir
);
return
file
;
}
static
char
*
deviceset_meta_file
(
struct
device_set
*
devset
)
{
char
*
dir
=
NULL
;
...
...
@@ -177,7 +193,7 @@ static char *deviceset_meta_file(struct device_set *devset)
file
=
util_path_join
(
dir
,
DEVICE_SET_METAFILE
);
UTIL_FREE_AND_SET_NULL
(
dir
);
free
(
dir
);
return
file
;
}
...
...
@@ -324,6 +340,7 @@ static int pool_status(struct device_set *devset, uint64_t *total_size_in_sector
ret
=
dev_get_status
(
&
start
,
&
length
,
&
target_type
,
&
params
,
name
);
if
(
ret
!=
0
)
{
ERROR
(
"devmapper: get dev status for pool name is %s"
,
name
);
goto
out
;
}
...
...
@@ -742,8 +759,108 @@ static void count_deleted_devices(struct device_set *devset)
}
}
static
int
remove_transaction_metadata
(
struct
device_set
*
devset
)
{
int
ret
=
0
;
char
*
fname
=
NULL
;
fname
=
transaction_meta_file
(
devset
);
if
(
fname
==
NULL
)
{
return
-
1
;
}
ret
=
util_path_remove
(
fname
);
if
(
ret
!=
0
)
{
ERROR
(
"devmapper: remove transaction metadata file %s failed"
,
fname
);
}
free
(
fname
);
return
ret
;
}
static
char
*
metadata_file
(
struct
device_set
*
devset
,
const
char
*
hash
)
{
char
*
file
=
NULL
;
char
*
full_path
=
NULL
;
char
*
dir
=
NULL
;
if
(
hash
==
NULL
)
{
ERROR
(
"devmapper: get metadata file param is null"
);
return
NULL
;
}
dir
=
metadata_dir
(
devset
);
if
(
dir
==
NULL
)
{
ERROR
(
"devmapper: get metadata dir of device %s failed"
,
hash
);
return
NULL
;
}
file
=
util_strdup_s
(
hash
);
if
(
file
==
NULL
)
{
goto
out
;
}
full_path
=
util_path_join
(
dir
,
file
);
out:
free
(
dir
);
free
(
file
);
return
full_path
;
}
static
int
remove_metadata
(
struct
device_set
*
devset
,
const
char
*
hash
)
{
int
ret
=
0
;
char
*
fname
=
NULL
;
fname
=
metadata_file
(
devset
,
hash
);
if
(
fname
==
NULL
)
{
return
-
1
;
}
ret
=
util_path_remove
(
fname
);
if
(
ret
!=
0
)
{
ERROR
(
"devmapper: remove metadata file %s failed"
,
hash
);
}
free
(
fname
);
return
ret
;
}
static
int
rollback_transaction
(
struct
device_set
*
devset
)
{
int
ret
=
0
;
char
*
pool_dev
=
NULL
;
pool_dev
=
get_pool_dev_name
(
devset
);
if
(
pool_dev
==
NULL
)
{
ERROR
(
"devmapper: get pool device name failed"
);
}
ret
=
dev_delete_device
(
pool_dev
,
devset
->
metadata_trans
->
device_id
);
if
(
ret
!=
0
)
{
ERROR
(
"devmapper: unable to delete device:%s"
,
pool_dev
);
}
ret
=
remove_metadata
(
devset
,
devset
->
metadata_trans
->
device_hash
);
if
(
ret
!=
0
)
{
ERROR
(
"devmapper: unable to remove metadata"
);
}
else
{
mark_device_id_free
(
devset
,
devset
->
metadata_trans
->
device_id
);
}
ret
=
metadata_store_remove
(
devset
->
metadata_trans
->
device_hash
,
devset
->
meta_store
);
if
(
ret
!=
0
)
{
ERROR
(
"devmapper: remove unused device from store failed"
);
}
ret
=
remove_transaction_metadata
(
devset
);
if
(
ret
!=
0
)
{
ERROR
(
"devmapper: unable to remove transaction meta file"
);
}
free
(
pool_dev
);
return
0
;
}
...
...
@@ -770,8 +887,6 @@ static int process_pending_transaction(struct device_set *devset)
return
0
;
}
// TODO: Pool transaction ID is not same as open transaction. There is
// a transaction which was not completed.
ret
=
rollback_transaction
(
devset
);
if
(
ret
!=
0
)
{
ERROR
(
"devmapper: Rolling back open transaction failed"
);
...
...
@@ -971,35 +1086,6 @@ out:
return
ret
;
}
static
char
*
metadata_file
(
struct
device_set
*
devset
,
const
char
*
hash
)
{
char
*
file
=
NULL
;
char
*
full_path
=
NULL
;
char
*
dir
=
NULL
;
if
(
hash
==
NULL
)
{
ERROR
(
"devmapper: get metadata file param is null"
);
return
NULL
;
}
dir
=
metadata_dir
(
devset
);
if
(
dir
==
NULL
)
{
ERROR
(
"devmapper: get metadata dir of device %s failed"
,
hash
);
return
NULL
;
}
file
=
util_strdup_s
(
hash
);
if
(
file
==
NULL
)
{
goto
out
;
}
full_path
=
util_path_join
(
dir
,
file
);
out:
free
(
dir
);
free
(
file
);
return
full_path
;
}
static
int
save_metadata
(
struct
device_set
*
devset
,
image_devmapper_device_info
*
info
)
{
...
...
@@ -1194,25 +1280,6 @@ static int close_transaction(struct device_set *devset)
return
ret
;
}
static
int
remove_metadata
(
struct
device_set
*
devset
,
const
char
*
hash
)
{
int
ret
=
0
;
char
*
fname
=
NULL
;
fname
=
metadata_file
(
devset
,
hash
);
if
(
fname
==
NULL
)
{
// ERROR();
return
-
1
;
}
ret
=
util_path_remove
(
fname
);
if
(
ret
!=
0
)
{
ERROR
(
"devmapper: remove metadata file %s failed"
,
hash
);
}
return
ret
;
}
static
int
unregister_device
(
struct
device_set
*
devset
,
const
char
*
hash
)
{
int
ret
=
0
;
...
...
@@ -1301,7 +1368,6 @@ static image_devmapper_device_info *create_register_device(struct device_set *de
do
{
ret
=
dev_create_device
(
pool_dev
,
device_id
);
if
(
ret
!=
0
)
{
// TODO: 如果错误类型为device id exists
// Device ID already exists. This should not
// happen. Now we have a mechanism to find
// a free device ID. So something is not right.
...
...
@@ -1381,7 +1447,6 @@ static int create_register_snap_device(struct device_set *devset, image_devmappe
do
{
ret
=
dev_create_snap_device_raw
(
pool_dev
,
device_id
,
base_info
->
device_id
);
if
(
ret
!=
0
)
{
// TODO: 如果错误类型为device id exists
// Device ID already exists. This should not
// happen. Now we have a mechanism to find
// a free device ID. So something is not right.
...
...
@@ -1861,7 +1926,8 @@ static int verify_base_device_uuidfs(struct device_set *devset, image_devmapper_
}
if
(
devset
->
base_device_filesystem
==
NULL
)
{
fs_type
=
probe_fs_type
(
dev_fname
);
// Now only support ext4, xfs and btrfs not support
fs_type
=
util_strdup_s
(
"ext4"
);
if
(
fs_type
==
NULL
)
{
goto
free_out
;
}
...
...
@@ -1912,6 +1978,42 @@ static int setup_verify_baseimages_uuidfs(struct device_set *devset, image_devma
return
ret
;
}
void
static
append_mount_options
(
char
**
dest
,
const
char
*
suffix
)
{
char
*
res_string
=
NULL
;
size_t
length
;
if
(
dest
==
NULL
)
{
return
;
}
if
(
*
dest
==
NULL
)
{
*
dest
=
util_strdup_s
(
suffix
);
}
if
(
suffix
==
NULL
)
{
return
;
}
if
(
strlen
(
suffix
)
>
((
SIZE_MAX
-
strlen
(
*
dest
)
-
strlen
(
","
))
-
1
))
{
ERROR
(
"String is too long to be appended"
);
return
;
}
length
=
strlen
(
*
dest
)
+
strlen
(
","
)
+
strlen
(
suffix
)
+
1
;
res_string
=
util_common_calloc_s
(
length
);
if
(
res_string
==
NULL
)
{
ERROR
(
"Out of memory"
);
return
;
}
(
void
)
strcat
(
res_string
,
*
dest
);
(
void
)
strcat
(
res_string
,
","
);
(
void
)
strcat
(
res_string
,
suffix
);
free
(
*
dest
);
*
dest
=
res_string
;
}
// 对未挂载的文件系统扩容或者在线扩容,需要内核支持此功能
static
int
grow_fs
(
struct
device_set
*
devset
,
image_devmapper_device_info
*
info
)
{
...
...
@@ -2072,47 +2174,6 @@ out:
return
0
;
}
// Issue discard only if device open count is zero.
static
void
issue_discard
(
struct
device_set
*
devset
,
image_devmapper_device_info
*
info
)
{
int
ret
=
0
;
struct
dm_info
dinfo
;
char
*
dm_name
=
NULL
;
char
*
dev_fname
=
NULL
;
ret
=
activate_device_if_needed
(
devset
,
info
,
true
);
if
(
ret
!=
0
)
{
ERROR
(
"devmapper: activate device %s failed"
,
info
->
hash
);
goto
free_out
;
}
dm_name
=
get_dm_name
(
devset
,
info
->
hash
);
if
(
dm_name
==
NULL
)
{
goto
free_out
;
}
ret
=
dev_get_info
(
&
dinfo
,
dm_name
);
if
(
ret
!=
0
)
{
goto
free_out
;
}
if
(
dinfo
.
open_count
!=
0
)
{
DEBUG
(
"devmapper: Device: %s is in use. OpenCount=%d. Not issuing discards."
,
info
->
hash
,
dinfo
.
open_count
);
goto
free_out
;
}
dev_fname
=
get_dev_name
(
dm_name
);
if
(
dev_fname
==
NULL
)
{
goto
free_out
;
}
ret
=
dev_block_device_discard
(
dev_fname
);
free_out:
UTIL_FREE_AND_SET_NULL
(
dm_name
);
UTIL_FREE_AND_SET_NULL
(
dev_fname
);
}
static
int
do_delete_device
(
struct
device_set
*
devset
,
const
char
*
hash
,
bool
sync_delete
)
{
int
ret
=
0
;
...
...
@@ -2124,9 +2185,6 @@ static int do_delete_device(struct device_set *devset, const char *hash, bool sy
ERROR
(
"devmapper: lookup device failed"
);
return
-
1
;
}
if
(
devset
->
do_blk_discard
)
{
issue_discard
(
devset
,
device_info
->
info
);
}
deferred_remove
=
devset
->
deferred_remove
;
if
(
!
devset
->
deferred_delete
)
{
...
...
@@ -2299,7 +2357,6 @@ static int do_devmapper_init(struct device_set *devset)
goto
out
;
}
pool_exist
=
thin_pool_exists
(
devset
,
pool_name
);
if
(
!
pool_exist
||
!
util_valid_str
(
devset
->
thin_pool_device
))
{
ERROR
(
"devmapper: thin pool is not exist or caller did not pass us a pool, please create it firstly"
);
goto
out
;
...
...
@@ -2418,6 +2475,7 @@ static int devmapper_init_cap_by_version(struct device_set *devset)
}
out:
free
(
version
);
return
ret
;
}
...
...
@@ -3079,7 +3137,7 @@ static int umount_dev_file_recursive(struct device_set *devset)
}
devmapper_device_info_ref_dec
(
device_info
);
}
ret
=
0
;
out:
...
...
src/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.h
浏览文件 @
195b0cb2
...
...
@@ -18,7 +18,6 @@
#include <pthread.h>
#include "driver.h"
#include "metadata_store.h"
#include "device_setup.h"
#ifdef __cplusplus
extern
"C"
{
...
...
src/image/oci/storage/layer_store/graphdriver/devmapper/driver_devmapper.c
浏览文件 @
195b0cb2
...
...
@@ -29,7 +29,6 @@
#include "utils.h"
#include "wrapper_devmapper.h"
#include "devices_constants.h"
#include "device_setup.h"
#include "deviceset.h"
#include "isula_libutils/json_common.h"
#include "util_archive.h"
...
...
src/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.c
浏览文件 @
195b0cb2
...
...
@@ -133,11 +133,16 @@ struct dm_task *task_create_named(int type, const char *dm_name)
int
ret
;
struct
dm_task
*
dmt
=
NULL
;
if
(
dm_name
==
NULL
)
{
ERROR
(
"devicemapper: invalid input"
);
return
NULL
;
}
// struct dm_task *dm_task_create(int type);
dmt
=
dm_task_create
(
type
);
if
(
dmt
==
NULL
)
{
ERROR
(
"devicemapper: Can't create task of type %d"
,
type
);
return
dmt
;
return
NULL
;
}
ret
=
dm_task_set_name
(
dmt
,
dm_name
);
...
...
@@ -149,8 +154,7 @@ struct dm_task *task_create_named(int type, const char *dm_name)
return
dmt
;
cleanup:
free
(
dmt
);
dmt
=
NULL
;
dm_task_destroy
(
dmt
);
return
NULL
;
}
...
...
@@ -161,6 +165,15 @@ int dev_get_table(uint64_t *start, uint64_t *length, char **target_type, char **
int
ret
=
0
;
struct
dm_task
*
dmt
=
NULL
;
struct
dm_info
info
;
uint64_t
dm_length
=
0
;
uint64_t
dm_start
=
0
;
char
*
dm_target_type
=
NULL
;
char
*
dm_params
=
NULL
;
if
(
start
==
NULL
||
length
==
NULL
||
target_type
==
NULL
||
params
==
NULL
||
name
==
NULL
)
{
ERROR
(
"devicemapper: invalid input params to get table"
);
return
-
1
;
}
dmt
=
task_create_named
(
DM_DEVICE_TABLE
,
name
);
if
(
dmt
==
NULL
)
{
...
...
@@ -188,11 +201,15 @@ int dev_get_table(uint64_t *start, uint64_t *length, char **target_type, char **
goto
cleanup
;
}
(
void
)
dm_get_next_target
(
dmt
,
NULL
,
start
,
length
,
target_type
,
params
);
(
void
)
dm_get_next_target
(
dmt
,
NULL
,
&
dm_start
,
&
dm_length
,
&
dm_target_type
,
&
dm_params
);
*
start
=
dm_start
;
*
length
=
dm_length
;
*
target_type
=
util_strdup_s
(
dm_target_type
);
*
params
=
util_strdup_s
(
dm_params
);
ret
=
0
;
cleanup:
free
(
dmt
);
dm_task_destroy
(
dmt
);
return
ret
;
}
...
...
@@ -203,32 +220,32 @@ char *dev_get_driver_version()
char
*
version
=
NULL
;
size_t
size
=
128
;
version
=
util_common_calloc_s
(
size
);
if
(
version
==
NULL
)
{
ERROR
(
"devmapper: out of memory"
);
dmt
=
task_create
(
DM_DEVICE_VERSION
);
if
(
dmt
==
NULL
)
{
goto
cleanup
;
}
dmt
=
task_create
(
DM_DEVICE_VERSION
);
if
(
dmt
==
NULL
)
{
version
=
util_common_calloc_s
(
size
);
if
(
version
==
NULL
)
{
ERROR
(
"devmapper: out of memory"
);
goto
cleanup
;
}
ret
=
dm_task_run
(
dmt
);
if
(
ret
!=
1
)
{
UTIL_FREE_AND_SET_NULL
(
version
);
ERROR
(
"devicemapper: task run failed"
);
goto
cleanup
;
}
ret
=
dm_task_get_driver_version
(
dmt
,
version
,
size
);
if
(
ret
==
0
)
{
free
(
version
);
version
=
NULL
;
UTIL_FREE_AND_SET_NULL
(
version
);
goto
cleanup
;
}
cleanup:
free
(
dmt
);
dm_task_destroy
(
dmt
);
return
version
;
}
...
...
@@ -239,6 +256,15 @@ int dev_get_status(uint64_t *start, uint64_t *length, char **target_type, char *
int
ret
=
0
;
struct
dm_task
*
dmt
=
NULL
;
struct
dm_info
info
;
uint64_t
dm_length
=
0
;
uint64_t
dm_start
=
0
;
char
*
dm_target_type
=
NULL
;
char
*
dm_params
=
NULL
;
if
(
start
==
NULL
||
length
==
NULL
||
target_type
==
NULL
||
params
==
NULL
||
name
==
NULL
)
{
ERROR
(
"devicemapper: invalid input params to get table"
);
return
-
1
;
}
dmt
=
task_create_named
(
DM_DEVICE_STATUS
,
name
);
if
(
dmt
==
NULL
)
{
...
...
@@ -265,11 +291,15 @@ int dev_get_status(uint64_t *start, uint64_t *length, char **target_type, char *
goto
cleanup
;
}
(
void
)
dm_get_next_target
(
dmt
,
NULL
,
start
,
length
,
target_type
,
params
);
(
void
)
dm_get_next_target
(
dmt
,
NULL
,
&
dm_start
,
&
dm_length
,
&
dm_target_type
,
&
dm_params
);
*
start
=
dm_start
;
*
length
=
dm_length
;
*
target_type
=
util_strdup_s
(
dm_target_type
);
*
params
=
util_strdup_s
(
dm_params
);
ret
=
0
;
cleanup:
free
(
dmt
);
dm_task_destroy
(
dmt
);
return
ret
;
}
...
...
@@ -298,7 +328,7 @@ struct dm_deps *dev_get_deps(const char *name)
}
cleanup:
free
(
dmt
);
dm_task_destroy
(
dmt
);
return
deps
;
}
...
...
@@ -330,7 +360,7 @@ int dev_get_info(struct dm_info *info, const char *name)
ret
=
0
;
cleanup:
free
(
dmt
);
dm_task_destroy
(
dmt
);
return
ret
;
}
...
...
@@ -338,7 +368,7 @@ cleanup:
int
set_cookie
(
struct
dm_task
*
dmt
,
uint32_t
*
cookie
,
uint16_t
flags
)
{
// int dm_task_set_cookie(struct dm_task *dmt, uint32_t *cookie, uint16_t flags);
int
ret
;
int
ret
=
0
;
if
(
cookie
==
NULL
)
{
ERROR
(
"cookie ptr can't be nil"
);
...
...
@@ -357,7 +387,7 @@ int set_cookie(struct dm_task *dmt, uint32_t *cookie, uint16_t flags)
static
void
*
udev_wait_process
(
void
*
data
)
{
udev_wait_pth_t
*
uwait
=
(
udev_wait_pth_t
*
)
data
;
int
ret
;
int
ret
=
0
;
ret
=
dm_udev_wait
(
uwait
->
cookie
);
if
(
ret
!=
1
)
{
...
...
@@ -443,7 +473,7 @@ int dev_remove_device(const char *pool_fname)
{
int
ret
=
0
;
struct
dm_task
*
dmt
=
NULL
;
uint32_t
cookie
;
uint32_t
cookie
=
0
;
dmt
=
task_create_named
(
DM_DEVICE_REMOVE
,
pool_fname
);
if
(
dmt
==
NULL
)
{
...
...
@@ -452,7 +482,6 @@ int dev_remove_device(const char *pool_fname)
ret
=
set_cookie
(
dmt
,
&
cookie
,
0
);
if
(
ret
!=
0
)
{
ret
=
-
1
;
goto
out
;
}
...
...
@@ -462,12 +491,13 @@ int dev_remove_device(const char *pool_fname)
goto
out
;
}
// TODO: udev_wait(cookie)
// 单开一个线程wait device删除成功
ret
=
0
;
out:
free
(
dmt
);
if
(
ret
!=
ERR_NIL_COOKIE
&&
ret
!=
ERR_TASK_SET_COOKIE
)
{
dev_udev_wait
(
cookie
);
}
dm_task_destroy
(
dmt
);
return
ret
;
}
...
...
@@ -475,7 +505,7 @@ int dev_remove_device_deferred(const char *pool_fname)
{
int
ret
=
0
;
struct
dm_task
*
dmt
=
NULL
;
uint32_t
cookie
;
uint32_t
cookie
=
0
;
uint16_t
flags
=
DM_UDEV_DISABLE_LIBRARY_FALLBACK
;
dmt
=
task_create_named
(
DM_DEVICE_REMOVE
,
pool_fname
);
...
...
@@ -485,19 +515,15 @@ int dev_remove_device_deferred(const char *pool_fname)
ret
=
dm_task_deferred_remove
(
dmt
);
if
(
ret
!=
1
)
{
// ERROR()
;
return
ERR_TASK_DEFERRED_REMOVE
;
ret
=
ERR_TASK_DEFERRED_REMOVE
;
goto
out
;
}
ret
=
set_cookie
(
dmt
,
&
cookie
,
flags
);
if
(
ret
!=
0
)
{
ret
=
-
1
;
goto
out
;
}
// TODO: udev_wait(cookie)
// 单开一个线程wait device删除成功
dm_saw_enxio
=
false
;
ret
=
dm_task_run
(
dmt
);
if
(
ret
!=
1
)
{
...
...
@@ -506,11 +532,15 @@ int dev_remove_device_deferred(const char *pool_fname)
ret
=
ERR_ENXIO
;
}
ERROR
(
"devicemapper: Error running RemoveDeviceDeferred %d"
,
ret
);
goto
out
;
}
ret
=
0
;
out:
free
(
dmt
);
if
(
ret
!=
ERR_NIL_COOKIE
&&
ret
!=
ERR_TASK_SET_COOKIE
)
{
dev_udev_wait
(
cookie
);
}
dm_task_destroy
(
dmt
);
return
ret
;
}
...
...
@@ -585,12 +615,10 @@ int dev_get_device_list(char ***list, size_t *length)
ERROR
(
"devicemapper: get device list failed"
);
goto
cleanup
;
}
free
(
dmt
);
return
0
;
ret
=
0
;
cleanup:
free
(
dmt
);
dm_task_destroy
(
dmt
);
return
ret
;
}
...
...
@@ -663,7 +691,7 @@ int dev_create_device(const char *pool_fname, int device_id)
ret
=
0
;
cleanup:
free
(
dmt
);
dm_task_destroy
(
dmt
);
return
ret
;
}
...
...
@@ -692,9 +720,9 @@ int dev_delete_device(const char *pool_fname, int device_id)
goto
cleanup
;
}
if
(
snprintf
(
message
,
sizeof
(
message
),
"delete %d"
,
device_id
)
<
0
)
{
ret
=
snprintf
(
message
,
sizeof
(
message
),
"delete %d"
,
device_id
);
if
(
ret
<
0
||
(
size_t
)
ret
>=
sizeof
(
message
))
{
ret
=
-
1
;
// ERROR()
goto
cleanup
;
}
...
...
@@ -714,7 +742,7 @@ int dev_delete_device(const char *pool_fname, int device_id)
ret
=
0
;
cleanup:
free
(
dmt
);
dm_task_destroy
(
dmt
);
return
ret
;
}
...
...
@@ -745,7 +773,7 @@ int dev_get_info_with_deferred(const char *dm_name, struct dm_info *dmi)
ret
=
0
;
cleanup:
free
(
dmt
);
dm_task_destroy
(
dmt
);
return
ret
;
}
...
...
@@ -772,7 +800,7 @@ int dev_suspend_device(const char *dm_name)
ret
=
0
;
out:
free
(
dmt
);
dm_task_destroy
(
dmt
);
return
ret
;
}
...
...
@@ -781,15 +809,14 @@ out:
int
dev_resume_device
(
const
char
*
dm_name
)
{
int
ret
=
0
;
uint32_t
cookie
;
uint32_t
cookie
=
0
;
uint16_t
flags
=
0
;
struct
dm_task
*
dmt
=
NULL
;
dmt
=
task_create_named
(
DM_DEVICE_SUSPEND
,
dm_name
);
if
(
dmt
==
NULL
)
{
ret
=
-
1
;
ERROR
(
"devicemapper:create named task failed"
);
goto
out
;
return
-
1
;
}
ret
=
set_cookie
(
dmt
,
&
cookie
,
flags
);
...
...
@@ -802,12 +829,16 @@ int dev_resume_device(const char *dm_name)
if
(
ret
!=
1
)
{
ret
=
-
1
;
ERROR
(
"devicemapper: Error running deviceResume %d"
,
ret
);
goto
out
;
}
dev_udev_wait
(
cookie
)
;
ret
=
0
;
out:
free
(
dmt
);
if
(
ret
!=
ERR_NIL_COOKIE
&&
ret
!=
ERR_TASK_SET_COOKIE
)
{
dev_udev_wait
(
cookie
);
}
dm_task_destroy
(
dmt
);
return
ret
;
}
...
...
@@ -824,7 +855,7 @@ int dev_active_device(const char *pool_name, const char *name, int device_id, ui
dmt
=
task_create_named
(
DM_DEVICE_CREATE
,
name
);
if
(
dmt
==
NULL
)
{
ERROR
(
"devicemapper:create named task failed"
);
goto
out
;
return
-
1
;
}
ret
=
snprintf
(
params
,
sizeof
(
params
),
"%s %d"
,
pool_name
,
device_id
);
...
...
@@ -853,13 +884,19 @@ int dev_active_device(const char *pool_name, const char *name, int device_id, ui
ret
=
dm_task_run
(
dmt
);
if
(
ret
!=
1
)
{
ret
=
-
1
;
ERROR
(
"devicemapper: error running deviceCreate (ActivateDevice) %d"
,
ret
);
goto
udev_wait
;
}
dev_udev_wait
(
cookie
);
ret
=
0
;
udev_wait:
if
(
ret
!=
ERR_NIL_COOKIE
&&
ret
!=
ERR_TASK_SET_COOKIE
)
{
dev_udev_wait
(
cookie
);
}
out:
free
(
dmt
);
dm_task_destroy
(
dmt
);
return
ret
;
}
...
...
@@ -905,7 +942,7 @@ int dev_cancel_deferred_remove(const char *dm_name)
ret
=
0
;
cleanup:
free
(
dmt
);
dm_task_destroy
(
dmt
);
return
ret
;
}
...
...
@@ -972,15 +1009,6 @@ void log_with_errno_init()
dm_log_with_errno_init
(
log_cb
);
}
// BlockDeviceDiscard runs discard for the given path.
// This is used as a workaround for the kernel not discarding block so
// on the thin pool when we remove a thinp device, so we do it
// manually
int
dev_block_device_discard
(
const
char
*
path
)
{
return
0
;
}
// CreateSnapDeviceRaw creates a snapshot device. Caller needs to suspend and resume the origin device if it is active.
int
dev_create_snap_device_raw
(
const
char
*
pool_name
,
int
device_id
,
int
base_device_id
)
{
...
...
@@ -1030,7 +1058,7 @@ int dev_create_snap_device_raw(const char *pool_name, int device_id, int base_de
ret
=
0
;
cleanup:
free
(
dmt
);
dm_task_destroy
(
dmt
);
return
ret
;
}
...
...
@@ -1082,6 +1110,6 @@ int dev_set_transaction_id(const char *pool_name, uint64_t old_id, uint64_t new_
ret
=
0
;
cleanup:
free
(
dmt
);
dm_task_destroy
(
dmt
);
return
ret
;
}
\ No newline at end of file
src/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.h
浏览文件 @
195b0cb2
...
...
@@ -126,8 +126,6 @@ int dev_active_device(const char *pool_name, const char *name, int device_id, ui
void
dev_udev_wait
(
uint32_t
cookie
);
int
dev_block_device_discard
(
const
char
*
path
);
int
dev_cancel_deferred_remove
(
const
char
*
dm_name
);
int
dev_create_snap_device_raw
(
const
char
*
pool_name
,
int
device_id
,
int
base_device_id
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录