diff options
Diffstat (limited to 'tools/lvchange.c')
-rw-r--r-- | tools/lvchange.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/tools/lvchange.c b/tools/lvchange.c index 0189c365e..9f9238bee 100644 --- a/tools/lvchange.c +++ b/tools/lvchange.c @@ -215,6 +215,10 @@ static int _lvchange_activate(struct cmd_context *cmd, struct logical_volume *lv !lv_passes_auto_activation_filter(cmd, lv)) return 1; + if ((activate == CHANGE_AAY) && + ((lv->status & LV_NOAUTOACTIVATE) || (lv->vg->status & NOAUTOACTIVATE))) + return 1; + if (!lv_change_activate(cmd, lv, activate)) return_0; @@ -1009,6 +1013,28 @@ static int _lvchange_activation_skip(struct logical_volume *lv, uint32_t *mr) return 1; } +static int _lvchange_autoactivation(struct logical_volume *lv, uint32_t *mr) +{ + int aa_no_arg = !arg_int_value(lv->vg->cmd, autoactivation_ARG, 0); + int aa_no_meta = (lv->status & LV_NOAUTOACTIVATE); + + if ((aa_no_arg && aa_no_meta) || (!aa_no_arg && !aa_no_meta)) + return 1; + + if (aa_no_arg) + lv->status |= LV_NOAUTOACTIVATE; + else + lv->status &= ~LV_NOAUTOACTIVATE; + + log_verbose("Changing autoactivation flag to %s for LV %s.", + display_lvname(lv), aa_no_arg ? "no" : "yes"); + + /* Request caller to commit+backup metadata */ + *mr |= MR_COMMIT; + + return 1; +} + static int _lvchange_compression(struct logical_volume *lv, uint32_t *mr) { struct cmd_context *cmd = lv->vg->cmd; @@ -1112,6 +1138,7 @@ static int _option_allows_group_commit(int opt_enum) metadataprofile_ARG, detachprofile_ARG, setactivationskip_ARG, + autoactivation_ARG, -1 }; @@ -1250,6 +1277,11 @@ static int _lvchange_properties_single(struct cmd_context *cmd, doit += _lvchange_activation_skip(lv, &mr); break; + case autoactivation_ARG: + docmds++; + doit += _lvchange_autoactivation(lv, &mr); + break; + case compression_ARG: docmds++; doit += _lvchange_compression(lv, &mr); |