diff --git a/src/image/oci/storage/layer_store/graphdriver/devmapper/device_setup.c b/src/image/oci/storage/layer_store/graphdriver/devmapper/device_setup.c deleted file mode 100644 index b3dcbe445da6ce973cebc4055c0788e89b7ca978..0000000000000000000000000000000000000000 --- a/src/image/oci/storage/layer_store/graphdriver/devmapper/device_setup.c +++ /dev/null @@ -1,199 +0,0 @@ -/****************************************************************************** - * 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 diff --git a/src/image/oci/storage/layer_store/graphdriver/devmapper/device_setup.h b/src/image/oci/storage/layer_store/graphdriver/devmapper/device_setup.h deleted file mode 100644 index a80f3c18f520be263be26e32f1c6b0f5ca4a2f6e..0000000000000000000000000000000000000000 --- a/src/image/oci/storage/layer_store/graphdriver/devmapper/device_setup.h +++ /dev/null @@ -1,41 +0,0 @@ - -/****************************************************************************** - * 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 -#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 diff --git a/src/image/oci/storage/layer_store/graphdriver/devmapper/devices_constants.h b/src/image/oci/storage/layer_store/graphdriver/devmapper/devices_constants.h index 057bad1d1f0e77185a6da7e1415f2d7444f6daa7..6b519f9dd6f2d64235051ba5ccc4464d79c68bc8 100644 --- a/src/image/oci/storage/layer_store/graphdriver/devmapper/devices_constants.h +++ b/src/image/oci/storage/layer_store/graphdriver/devmapper/devices_constants.h @@ -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; diff --git a/src/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.c b/src/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.c index 24e4f50092af9d6d61d8c0b04742383448a36f75..45bff221f9a771026b9712e8675ab6d5feba723d 100644 --- a/src/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.c +++ b/src/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.c @@ -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, ¶ms, 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: diff --git a/src/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.h b/src/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.h index 24ea67d7c9d6f0cf04c125b8e9ce65c892d3ebfc..bd2208be0a1cc8c09c32708f0f58f87b67adf1f4 100644 --- a/src/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.h +++ b/src/image/oci/storage/layer_store/graphdriver/devmapper/deviceset.h @@ -18,7 +18,6 @@ #include #include "driver.h" #include "metadata_store.h" -#include "device_setup.h" #ifdef __cplusplus extern "C" { diff --git a/src/image/oci/storage/layer_store/graphdriver/devmapper/driver_devmapper.c b/src/image/oci/storage/layer_store/graphdriver/devmapper/driver_devmapper.c index 1d882ed3d494b18acb3ec4bc8a37f9940ca39636..1575bb041f873ffb97079f35e91ccac0fbfc3a03 100644 --- a/src/image/oci/storage/layer_store/graphdriver/devmapper/driver_devmapper.c +++ b/src/image/oci/storage/layer_store/graphdriver/devmapper/driver_devmapper.c @@ -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" diff --git a/src/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.c b/src/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.c index f2c167c9abd8fd75b41cc8013471edd370baaca6..11fb3b3cdad63f46993c7c57b240bb14a3b1e65e 100644 --- a/src/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.c +++ b/src/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.c @@ -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 diff --git a/src/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.h b/src/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.h index fd5e36d572b654d4510e5c57e1292f4182900e4d..ce1c7798baa3e0dbd04a525641fed479f3e3bd07 100644 --- a/src/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.h +++ b/src/image/oci/storage/layer_store/graphdriver/devmapper/wrapper_devmapper.h @@ -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);