summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Rockai <prockai@redhat.com>2014-11-19 18:39:58 +0100
committerPetr Rockai <prockai@redhat.com>2014-11-20 16:51:07 +0100
commitc164f59631ca08f56c5f1e2e6cf677f3a85145fb (patch)
tree8c1b24485041129d0c946d497d420aa83d0fc800
parentf67e1fadb0fcdc5887663f9b0c9c46fc5835d418 (diff)
downloadlvm2-c164f59631ca08f56c5f1e2e6cf677f3a85145fb.tar.gz
lvchange: Accept --cachepolicy.
-rw-r--r--tools/commands.h3
-rw-r--r--tools/lvchange.c32
2 files changed, 34 insertions, 1 deletions
diff --git a/tools/commands.h b/tools/commands.h
index d4473a4d0..e3bac1f1b 100644
--- a/tools/commands.h
+++ b/tools/commands.h
@@ -106,6 +106,7 @@ xx(lvchange,
"\t[--addtag Tag]\n"
"\t[--alloc AllocationPolicy]\n"
"\t[-C|--contiguous y|n]\n"
+ "\t[--cachepolicy policy=type] [--cachepolicy parameter=value]\n"
"\t[--commandprofile ProfileName]\n"
"\t[-d|--debug]\n"
"\t[--deltag Tag]\n"
@@ -143,7 +144,7 @@ xx(lvchange,
activationmode_ARG, addtag_ARG, alloc_ARG, autobackup_ARG, activate_ARG,
available_ARG,
- contiguous_ARG, deltag_ARG, discards_ARG, detachprofile_ARG, force_ARG,
+ cachepolicy_ARG, contiguous_ARG, deltag_ARG, discards_ARG, detachprofile_ARG, force_ARG,
ignorelockingfailure_ARG, ignoremonitoring_ARG, ignoreactivationskip_ARG,
ignoreskippedcluster_ARG, major_ARG, metadataprofile_ARG, minor_ARG,
monitor_ARG, minrecoveryrate_ARG, maxrecoveryrate_ARG, noudevsync_ARG,
diff --git a/tools/lvchange.c b/tools/lvchange.c
index e0bb4b1e1..144295b1d 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -605,6 +605,30 @@ static int lvchange_persistent(struct cmd_context *cmd,
return 1;
}
+static int lvchange_cachepolicy(struct cmd_context *cmd, struct logical_volume *lv)
+{
+ struct dm_config_tree *policy = NULL;
+ int r = 0;
+
+ if (!lv_is_cache(lv) && !lv_is_cache_pool(lv)) {
+ log_error("LV %s is not a cache LV.", lv->name);
+ log_error("Only cache or cache pool devices can have --cachepolicy set.");
+ goto_out;
+ }
+
+ if (!(policy = get_cachepolicy_params(cmd)))
+ goto_out;
+ if (!lv_cache_setpolicy(lv, policy))
+ goto_out;
+ if (!lv_update_and_reload(lv))
+ goto_out;
+ r = 1;
+out:
+ if (policy)
+ dm_config_destroy(policy);
+ return r;
+}
+
static int lvchange_tag(struct cmd_context *cmd, struct logical_volume *lv, int arg)
{
if (!change_tag(cmd, NULL, lv, NULL, arg))
@@ -990,6 +1014,13 @@ static int _lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
docmds++;
}
+ if (arg_count(cmd, cachepolicy_ARG)) {
+ if (!archive(lv->vg))
+ return_ECMD_FAILED;
+ doit += lvchange_cachepolicy(cmd, lv);
+ docmds++;
+ }
+
if (doit)
log_print_unless_silent("Logical volume \"%s\" changed.", lv->name);
@@ -1049,6 +1080,7 @@ int lvchange(struct cmd_context *cmd, int argc, char **argv)
arg_count(cmd, maxrecoveryrate_ARG) ||
arg_count(cmd, resync_ARG) ||
arg_count(cmd, syncaction_ARG) ||
+ arg_count(cmd, cachepolicy_ARG) ||
arg_count(cmd, writebehind_ARG) ||
arg_count(cmd, writemostly_ARG) ||
arg_count(cmd, zero_ARG);