|
@@ -1813,12 +1813,12 @@ static struct kmem_cache *migration_cache;
|
|
|
|
|
|
#define NOT_CORE_OPTION 1
|
|
|
|
|
|
-static int process_config_option(struct cache *cache, char **argv)
|
|
|
+static int process_config_option(struct cache *cache, const char *key, const char *value)
|
|
|
{
|
|
|
unsigned long tmp;
|
|
|
|
|
|
- if (!strcasecmp(argv[0], "migration_threshold")) {
|
|
|
- if (kstrtoul(argv[1], 10, &tmp))
|
|
|
+ if (!strcasecmp(key, "migration_threshold")) {
|
|
|
+ if (kstrtoul(value, 10, &tmp))
|
|
|
return -EINVAL;
|
|
|
|
|
|
cache->migration_threshold = tmp;
|
|
@@ -1828,7 +1828,20 @@ static int process_config_option(struct cache *cache, char **argv)
|
|
|
return NOT_CORE_OPTION;
|
|
|
}
|
|
|
|
|
|
-static int set_config_values(struct dm_cache_policy *p, int argc, const char **argv)
|
|
|
+static int set_config_value(struct cache *cache, const char *key, const char *value)
|
|
|
+{
|
|
|
+ int r = process_config_option(cache, key, value);
|
|
|
+
|
|
|
+ if (r == NOT_CORE_OPTION)
|
|
|
+ r = policy_set_config_value(cache->policy, key, value);
|
|
|
+
|
|
|
+ if (r)
|
|
|
+ DMWARN("bad config value for %s: %s", key, value);
|
|
|
+
|
|
|
+ return r;
|
|
|
+}
|
|
|
+
|
|
|
+static int set_config_values(struct cache *cache, int argc, const char **argv)
|
|
|
{
|
|
|
int r = 0;
|
|
|
|
|
@@ -1838,12 +1851,9 @@ static int set_config_values(struct dm_cache_policy *p, int argc, const char **a
|
|
|
}
|
|
|
|
|
|
while (argc) {
|
|
|
- r = policy_set_config_value(p, argv[0], argv[1]);
|
|
|
- if (r) {
|
|
|
- DMWARN("policy_set_config_value failed: key = '%s', value = '%s'",
|
|
|
- argv[0], argv[1]);
|
|
|
- return r;
|
|
|
- }
|
|
|
+ r = set_config_value(cache, argv[0], argv[1]);
|
|
|
+ if (r)
|
|
|
+ break;
|
|
|
|
|
|
argc -= 2;
|
|
|
argv += 2;
|
|
@@ -1855,8 +1865,6 @@ static int set_config_values(struct dm_cache_policy *p, int argc, const char **a
|
|
|
static int create_cache_policy(struct cache *cache, struct cache_args *ca,
|
|
|
char **error)
|
|
|
{
|
|
|
- int r;
|
|
|
-
|
|
|
cache->policy = dm_cache_policy_create(ca->policy_name,
|
|
|
cache->cache_size,
|
|
|
cache->origin_sectors,
|
|
@@ -1866,14 +1874,7 @@ static int create_cache_policy(struct cache *cache, struct cache_args *ca,
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
- r = set_config_values(cache->policy, ca->policy_argc, ca->policy_argv);
|
|
|
- if (r) {
|
|
|
- *error = "Error setting cache policy's config values";
|
|
|
- dm_cache_policy_destroy(cache->policy);
|
|
|
- cache->policy = NULL;
|
|
|
- }
|
|
|
-
|
|
|
- return r;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1967,7 +1968,15 @@ static int cache_create(struct cache_args *ca, struct cache **result)
|
|
|
r = create_cache_policy(cache, ca, error);
|
|
|
if (r)
|
|
|
goto bad;
|
|
|
+
|
|
|
cache->policy_nr_args = ca->policy_argc;
|
|
|
+ cache->migration_threshold = DEFAULT_MIGRATION_THRESHOLD;
|
|
|
+
|
|
|
+ r = set_config_values(cache, ca->policy_argc, ca->policy_argv);
|
|
|
+ if (r) {
|
|
|
+ *error = "Error setting cache policy's config values";
|
|
|
+ goto bad;
|
|
|
+ }
|
|
|
|
|
|
cmd = dm_cache_metadata_open(cache->metadata_dev->bdev,
|
|
|
ca->block_size, may_format,
|
|
@@ -1986,7 +1995,6 @@ static int cache_create(struct cache_args *ca, struct cache **result)
|
|
|
INIT_LIST_HEAD(&cache->quiesced_migrations);
|
|
|
INIT_LIST_HEAD(&cache->completed_migrations);
|
|
|
INIT_LIST_HEAD(&cache->need_commit_migrations);
|
|
|
- cache->migration_threshold = DEFAULT_MIGRATION_THRESHOLD;
|
|
|
atomic_set(&cache->nr_migrations, 0);
|
|
|
init_waitqueue_head(&cache->migration_wait);
|
|
|
|
|
@@ -2544,17 +2552,12 @@ err:
|
|
|
*/
|
|
|
static int cache_message(struct dm_target *ti, unsigned argc, char **argv)
|
|
|
{
|
|
|
- int r;
|
|
|
struct cache *cache = ti->private;
|
|
|
|
|
|
if (argc != 2)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- r = process_config_option(cache, argv);
|
|
|
- if (r == NOT_CORE_OPTION)
|
|
|
- return policy_set_config_value(cache->policy, argv[0], argv[1]);
|
|
|
-
|
|
|
- return r;
|
|
|
+ return set_config_value(cache, argv[0], argv[1]);
|
|
|
}
|
|
|
|
|
|
static int cache_iterate_devices(struct dm_target *ti,
|
|
@@ -2612,7 +2615,7 @@ static void cache_io_hints(struct dm_target *ti, struct queue_limits *limits)
|
|
|
|
|
|
static struct target_type cache_target = {
|
|
|
.name = "cache",
|
|
|
- .version = {1, 1, 0},
|
|
|
+ .version = {1, 1, 1},
|
|
|
.module = THIS_MODULE,
|
|
|
.ctr = cache_ctr,
|
|
|
.dtr = cache_dtr,
|