提交 195b0cb2 编写于 作者: G gaohuatao 提交者: lifeng68

devmapper: fix valgrind leek

Signed-off-by: Ngaohuatao <gaohuatao@huawei.com>
上级 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
/******************************************************************************
* 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
......@@ -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;
......
......@@ -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:
......
......@@ -18,7 +18,6 @@
#include <pthread.h>
#include "driver.h"
#include "metadata_store.h"
#include "device_setup.h"
#ifdef __cplusplus
extern "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"
......
......@@ -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
......@@ -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.
先完成此消息的编辑!
想要评论请 注册