Don't generate cache_id's on casadm side and use loaded cache params

Signed-off-by: Jan Musial <jan.musial@intel.com>
This commit is contained in:
Jan Musial 2022-02-08 11:14:04 +01:00
parent 199993d9a4
commit 2ff055d689
2 changed files with 64 additions and 36 deletions

View File

@ -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);
}

View File

@ -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;
}