From 2ff055d6895c1860249d69d3116c66a47cbd8600 Mon Sep 17 00:00:00 2001 From: Jan Musial Date: Tue, 8 Feb 2022 11:14:04 +0100 Subject: [PATCH] Don't generate cache_id's on casadm side and use loaded cache params Signed-off-by: Jan Musial --- casadm/cas_lib.c | 27 +++----- modules/cas_cache/layer_cache_management.c | 73 +++++++++++++++++----- 2 files changed, 64 insertions(+), 36 deletions(-) diff --git a/casadm/cas_lib.c b/casadm/cas_lib.c index 3a4c89f..b5c64f5 100644 --- a/casadm/cas_lib.c +++ b/casadm/cas_lib.c @@ -967,9 +967,8 @@ int start_cache(uint16_t cache_id, unsigned int cache_init, { int fd = 0; struct kcas_start_cache cmd; - struct cache_device **caches; struct cache_device *cache; - int i, status, caches_count; + int i, status; double min_free_ram_gb; /* check if cache device given exists */ @@ -984,21 +983,6 @@ int start_cache(uint16_t cache_id, unsigned int cache_init, if (fd == -1) return FAILURE; - if (cache_id == 0) { - cache_id = 1; - caches = get_cache_devices(&caches_count, false); - if (caches != NULL) { - psort(caches, caches_count, sizeof(struct cache_device*), caches_compare); - for (i = 0; i < caches_count; ++i) { - if (caches[i]->id == cache_id) { - cache_id += 1; - } - } - - free_cache_devices_list(caches, caches_count); - } - } - memset(&cmd, 0, sizeof(cmd)); cmd.cache_id = cache_id; @@ -1014,9 +998,12 @@ int start_cache(uint16_t cache_id, unsigned int cache_init, cmd.line_size = line_size; cmd.force = (uint8_t)force; - if (run_ioctl_interruptible_retry(fd, KCAS_IOCTL_START_CACHE, &cmd, - "Starting cache", cache_id, OCF_CORE_ID_INVALID) < 0) { + status = run_ioctl_interruptible_retry(fd, KCAS_IOCTL_START_CACHE, &cmd, + "Starting cache", cache_id, OCF_CORE_ID_INVALID); + cache_id = cmd.cache_id; + if (status < 0) { close(fd); + if (cmd.ext_err_code == OCF_ERR_NO_FREE_RAM) { min_free_ram_gb = cmd.min_free_ram; min_free_ram_gb /= GiB; @@ -3014,7 +3001,7 @@ int standby_load(int cache_id, ocf_cache_line_size_t line_size, return start_cache(cache_id, CACHE_INIT_STANDBY_LOAD, cache_device, - ocf_cache_mode_default, + ocf_cache_mode_none, line_size, 0); } diff --git a/modules/cas_cache/layer_cache_management.c b/modules/cas_cache/layer_cache_management.c index 4907a49..a88117b 100644 --- a/modules/cas_cache/layer_cache_management.c +++ b/modules/cas_cache/layer_cache_management.c @@ -1839,7 +1839,6 @@ int cache_mngt_prepare_cache_device_cfg(struct ocf_mngt_cache_device_config *cfg &cfg->volume_type); } - int cache_mngt_prepare_cache_cfg(struct ocf_mngt_cache_config *cfg, struct ocf_mngt_cache_attach_config *attach_cfg, struct kcas_start_cache *cmd) @@ -2043,39 +2042,47 @@ static int _cache_mngt_cache_priv_init(ocf_cache_t cache) return 0; } -struct cache_mngt_check_metadata_context { +struct cache_mngt_probe_metadata_context { struct completion cmpl; char *cache_name; int *result; + + char *cache_name_meta; + ocf_cache_mode_t *cache_mode_meta; + ocf_cache_line_size_t *cache_line_size_meta; }; -static void cache_mngt_check_metadata_end(void *priv, int error, +static void cache_mngt_probe_metadata_end(void *priv, int error, struct ocf_metadata_probe_status *status) { - struct cache_mngt_check_metadata_context *context = priv; + struct cache_mngt_probe_metadata_context *context = priv; *context->result = error; if (error == -OCF_ERR_NO_METADATA) { printk(KERN_ERR "No cache metadata found!\n"); + goto err; } else if (error == -OCF_ERR_METADATA_VER) { printk(KERN_ERR "Cache metadata version mismatch\n"); + goto err; } else if (error) { printk(KERN_ERR "Failed to load cache metadata!\n"); - } else if (strncmp(status->cache_name, context->cache_name, - OCF_CACHE_NAME_SIZE)) { - *context->result = -OCF_ERR_CACHE_NAME_MISMATCH; - printk(KERN_ERR "Loaded cache name is invalid: %s!\n", - status->cache_name); + goto err; } + strlcpy(context->cache_name_meta, status->cache_name, + OCF_CACHE_NAME_SIZE); + *(context->cache_mode_meta) = status->cache_mode; + *(context->cache_line_size_meta) = status->cache_line_size; +err: complete(&context->cmpl); } -static int _cache_mngt_check_metadata(struct ocf_mngt_cache_config *cfg, - char *cache_path_name) +static int _cache_mngt_probe_metadata(char *cache_path_name, + char *cache_name_meta, ocf_cache_mode_t *cache_mode_meta, + ocf_cache_line_size_t *cache_line_size_meta) { - struct cache_mngt_check_metadata_context context; + struct cache_mngt_probe_metadata_context context; struct block_device *bdev; ocf_volume_t volume; char holder[] = "CAS CHECK METADATA\n"; @@ -2094,10 +2101,12 @@ static int _cache_mngt_check_metadata(struct ocf_mngt_cache_config *cfg, goto out_bdev; init_completion(&context.cmpl); - context.cache_name = cfg->name; context.result = &result; + context.cache_name_meta = cache_name_meta; + context.cache_mode_meta = cache_mode_meta; + context.cache_line_size_meta = cache_line_size_meta; - ocf_metadata_probe(cas_ctx, volume, cache_mngt_check_metadata_end, + ocf_metadata_probe(cas_ctx, volume, cache_mngt_probe_metadata_end, &context); wait_for_completion(&context.cmpl); @@ -2351,9 +2360,12 @@ int cache_mngt_init_instance(struct ocf_mngt_cache_config *cfg, struct kcas_start_cache *cmd) { struct _cache_mngt_attach_context *context; - ocf_cache_t cache; + ocf_cache_t cache, tmp_cache = NULL; + char cache_name_meta[OCF_CACHE_NAME_SIZE]; struct cache_priv *cache_priv; int result = 0, rollback_result = 0; + ocf_cache_mode_t cache_mode_meta; + ocf_cache_line_size_t cache_line_size_meta; if (!try_module_get(THIS_MODULE)) return -KCAS_ERR_SYSTEM; @@ -2367,11 +2379,40 @@ int cache_mngt_init_instance(struct ocf_mngt_cache_config *cfg, switch (cmd->init_cache) { case CACHE_INIT_LOAD: case CACHE_INIT_STANDBY_LOAD: - result = _cache_mngt_check_metadata(cfg, cmd->cache_path_name); + result = _cache_mngt_probe_metadata(cmd->cache_path_name, + cache_name_meta, &cache_mode_meta, + &cache_line_size_meta); if (result) { module_put(THIS_MODULE); return result; } + + /* Need to return name from metadata now for caller to properly + * communicate the error to user */ + if (cache_id_from_name(&cmd->cache_id, cache_name_meta)) { + printk(KERN_ERR "Improper cache name format on %s.\n", + cmd->cache_path_name); + + module_put(THIS_MODULE); + return -OCF_ERR_START_CACHE_FAIL; + } + + result = ocf_mngt_cache_get_by_name(cas_ctx, cache_name_meta, + OCF_CACHE_NAME_SIZE, &tmp_cache); + + if (result != -OCF_ERR_CACHE_NOT_EXIST) { + printk(KERN_ERR "Can't load %s. Cache using that name " + "already exists.\n", cache_name_meta); + + ocf_mngt_cache_put(tmp_cache); + module_put(THIS_MODULE); + return -OCF_ERR_CACHE_EXIST; + } + + result = 0; + strlcpy(cfg->name, cache_name_meta, OCF_CACHE_NAME_SIZE); + cfg->cache_mode = cache_mode_meta; + cfg->cache_line_size = cache_line_size_meta; default: break; }