From ba3707d9539f9cc2e72c5368388ae795776379af Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Tue, 8 Jun 2021 19:02:07 +0200 Subject: [PATCH 4/8] archiving: take archive automatically Instead of calling explicit archive with command processing logic, move this step towards 1st. vg_write() call, which will automatically store archive of committed metadata. This slightly changes some error path where the error in archiving was detected earlier in the command, while now some on going command 'actions' might have been, but will be simply scratched in case of error (since even new metadata would not have been even written). So general effect should be only some command message ordering. Signed-off-by: Heming Zhao --- lib/metadata/lv_manip.c | 15 --------------- lib/metadata/metadata.c | 6 +++--- lib/metadata/pv_manip.c | 3 --- lib/metadata/vg.c | 3 --- tools/lvconvert.c | 30 ------------------------------ tools/pvchange.c | 2 -- tools/pvmove.c | 3 --- tools/vgchange.c | 8 -------- tools/vgcreate.c | 3 --- tools/vgexport.c | 4 ---- tools/vgextend.c | 6 ------ tools/vgimport.c | 3 --- tools/vgimportclone.c | 3 --- tools/vgreduce.c | 3 --- tools/vgrename.c | 3 --- 15 files changed, 3 insertions(+), 92 deletions(-) diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c index 37dd3611dde7..899297f28498 100644 --- a/lib/metadata/lv_manip.c +++ b/lib/metadata/lv_manip.c @@ -4834,9 +4834,6 @@ int lv_rename_update(struct cmd_context *cmd, struct logical_volume *lv, } } - if (update_mda && !archive(vg)) - return_0; - if (old_lv_is_historical) { /* * Historical LVs have neither sub LVs nor any @@ -6146,9 +6143,6 @@ int lv_resize(struct logical_volume *lv, if (!lockd_lv_resize(cmd, lock_lv, "ex", 0, lp)) return_0; - if (!archive(vg)) - return_0; - /* Remove any striped raid reshape space for LV resizing */ if (aux_lv && first_seg(aux_lv)->reshape_len) if (!lv_raid_free_reshape_space(aux_lv)) @@ -6719,9 +6713,6 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv, return 0; } - if (!archive(vg)) - return_0; - if (!lv_detach_writecache_cachevol(lv, 1)) { log_error("Failed to detach writecache from %s", display_lvname(lv)); return 0; @@ -6742,9 +6733,6 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv, /* FIXME Review and fix the snapshot error paths! */ return_0; - if (!archive(vg)) - return_0; - /* Special case removing a striped raid LV with allocated reshape space */ if (seg && seg->reshape_len) { if (!(seg->segtype = get_segtype_from_string(cmd, SEG_TYPE_NAME_STRIPED))) @@ -8458,9 +8446,6 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg, return NULL; } - if (!archive(vg)) - return_NULL; - if (pool_lv && segtype_is_thin_volume(create_segtype)) { /* Ensure all stacked messages are submitted */ if ((pool_is_active(pool_lv) || is_change_activating(lp->activate)) && diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index 0b284435b41b..6852d2a2a7fe 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -614,9 +614,6 @@ int vg_remove_check(struct volume_group *vg) return 0; } - if (!archive(vg)) - return 0; - return 1; } @@ -2978,6 +2975,9 @@ int vg_write(struct volume_group *vg) if (vg->cmd->wipe_outdated_pvs) _wipe_outdated_pvs(vg->cmd, vg); + if (!vg_is_archived(vg) && vg->vg_committed && !archive(vg->vg_committed)) + return_0; + if (critical_section()) log_error(INTERNAL_ERROR "Writing metadata in critical section."); diff --git a/lib/metadata/pv_manip.c b/lib/metadata/pv_manip.c index 5fd80a2ceca3..fd97bbbc2462 100644 --- a/lib/metadata/pv_manip.c +++ b/lib/metadata/pv_manip.c @@ -623,9 +623,6 @@ int pv_resize_single(struct cmd_context *cmd, const char *vg_name = pv->vg_name; int vg_needs_pv_write = 0; - if (!archive(vg)) - goto out; - if (!(pv->fmt->features & FMT_RESIZE_PV)) { log_error("Physical volume %s format does not support resizing.", pv_name); diff --git a/lib/metadata/vg.c b/lib/metadata/vg.c index 3f9ec8d350fb..428e5dca79c6 100644 --- a/lib/metadata/vg.c +++ b/lib/metadata/vg.c @@ -694,9 +694,6 @@ int vgreduce_single(struct cmd_context *cmd, struct volume_group *vg, pvl = find_pv_in_vg(vg, name); - if (!archive(vg)) - goto_bad; - log_verbose("Removing \"%s\" from volume group \"%s\"", name, vg->name); if (pvl) diff --git a/tools/lvconvert.c b/tools/lvconvert.c index 71f7a7627fa1..c40031fe47a8 100644 --- a/tools/lvconvert.c +++ b/tools/lvconvert.c @@ -1861,9 +1861,6 @@ static int _lvconvert_splitsnapshot(struct cmd_context *cmd, struct logical_volu } } - if (!archive(vg)) - return_0; - log_verbose("Splitting snapshot %s from its origin.", display_lvname(cow)); if (!vg_remove_snapshot(cow)) @@ -2796,9 +2793,6 @@ static int _lvconvert_to_thin_with_external(struct cmd_context *cmd, if (!(lvc.segtype = get_segtype_from_string(cmd, SEG_TYPE_NAME_THIN))) return_0; - if (!archive(vg)) - return_0; - /* * New thin LV needs to be created (all messages sent to pool) In this * case thin volume is created READ-ONLY and also warn about not @@ -2979,9 +2973,6 @@ static int _lvconvert_swap_pool_metadata(struct cmd_context *cmd, return 0; } - if (!archive(vg)) - return_0; - /* Swap names between old and new metadata LV */ if (!detach_pool_metadata_lv(seg, &prev_metadata_lv)) @@ -3286,9 +3277,6 @@ static int _lvconvert_to_pool(struct cmd_context *cmd, meta_readahead = arg_uint_value(cmd, readahead_ARG, cmd->default_settings.read_ahead); meta_alloc = (alloc_policy_t) arg_uint_value(cmd, alloc_ARG, ALLOC_INHERIT); - if (!archive(vg)) - goto_bad; - if (!(metadata_lv = alloc_pool_metadata(lv, meta_name, meta_readahead, @@ -3305,9 +3293,6 @@ static int _lvconvert_to_pool(struct cmd_context *cmd, goto bad; } - if (!archive(vg)) - goto_bad; - if (zero_metadata) { metadata_lv->status |= LV_ACTIVATION_SKIP; if (!activate_lv(cmd, metadata_lv)) { @@ -3556,9 +3541,6 @@ static int _cache_vol_attach(struct cmd_context *cmd, if (!get_cache_params(cmd, &chunk_size, &cache_metadata_format, &cache_mode, &policy_name, &policy_settings)) goto_out; - if (!archive(vg)) - goto_out; - /* * lv/cache_lv keeps the same lockd lock it had before, the lock for * lv_fast is kept but is not used while it's attached, and @@ -5525,9 +5507,6 @@ static int _lvconvert_to_vdopool_single(struct cmd_context *cmd, } } - if (!archive(vg)) - goto_out; - if (!convert_vdo_pool_lv(lv, &vdo_params, &lvc.virtual_extents, zero_vdopool)) goto_out; @@ -6198,9 +6177,6 @@ int lvconvert_writecache_attach_single(struct cmd_context *cmd, if (fast_name && !lockd_lv(cmd, lv_fast, "ex", 0)) goto_bad; - if (!archive(vg)) - goto_bad; - /* * lv keeps the same lockd lock it had before, the lock for * lv_fast is kept but is not used while it's attached, and @@ -6339,9 +6315,6 @@ static int _lvconvert_integrity_remove(struct cmd_context *cmd, struct logical_v if (!lockd_lv(cmd, lv, "ex", 0)) return_0; - if (!archive(vg)) - return_0; - if (lv_is_raid(lv)) ret = lv_remove_integrity_from_raid(lv); if (!ret) @@ -6371,9 +6344,6 @@ static int _lvconvert_integrity_add(struct cmd_context *cmd, struct logical_volu } else use_pvh = &vg->pvs; - if (!archive(vg)) - return_0; - if (lv_is_partial(lv)) { log_error("Cannot add integrity while LV is missing PVs."); return 0; diff --git a/tools/pvchange.c b/tools/pvchange.c index 04cbb428dde1..8b4a0643d3cd 100644 --- a/tools/pvchange.c +++ b/tools/pvchange.c @@ -65,8 +65,6 @@ static int _pvchange_single(struct cmd_context *cmd, struct volume_group *vg, "logical volumes", pv_name); goto bad; } - if (!archive(vg)) - goto_bad; } else { if (tagargs) { log_error("Can't change tag on Physical Volume %s not " diff --git a/tools/pvmove.c b/tools/pvmove.c index bb372f7dcaeb..ed92f3ce4a6d 100644 --- a/tools/pvmove.c +++ b/tools/pvmove.c @@ -709,9 +709,6 @@ static int _pvmove_setup_single(struct cmd_context *cmd, vg, pv, pp->alloc))) goto_out; - if (!archive(vg)) - goto_out; - if (!(lv_mirr = _set_up_pvmove_lv(cmd, vg, source_pvl, lv_name, allocatable_pvs, pp->alloc, &lvs_changed, &exclusive))) diff --git a/tools/vgchange.c b/tools/vgchange.c index 032f3efcfd04..625b68d46b56 100644 --- a/tools/vgchange.c +++ b/tools/vgchange.c @@ -675,8 +675,6 @@ static int _vgchange_single(struct cmd_context *cmd, const char *vg_name, for (i = 0; i < DM_ARRAY_SIZE(_vgchange_args); ++i) { if (arg_is_set(cmd, _vgchange_args[i].arg)) { - if (!archive(vg)) - return_ECMD_FAILED; if (!_vgchange_args[i].fn(cmd, vg)) return_ECMD_FAILED; } @@ -1002,9 +1000,6 @@ static int _vgchange_locktype_single(struct cmd_context *cmd, const char *vg_nam struct volume_group *vg, struct processing_handle *handle) { - if (!archive(vg)) - return_ECMD_FAILED; - if (!_vgchange_locktype(cmd, vg)) return_ECMD_FAILED; @@ -1201,9 +1196,6 @@ static int _vgchange_systemid_single(struct cmd_context *cmd, const char *vg_nam struct volume_group *vg, struct processing_handle *handle) { - if (!archive(vg)) - return_ECMD_FAILED; - if (!_vgchange_system_id(cmd, vg)) return_ECMD_FAILED; diff --git a/tools/vgcreate.c b/tools/vgcreate.c index f9c40e86d646..d6d6bb61ddc3 100644 --- a/tools/vgcreate.c +++ b/tools/vgcreate.c @@ -148,9 +148,6 @@ int vgcreate(struct cmd_context *cmd, int argc, char **argv) } } - if (!archive(vg)) - goto_bad; - /* Store VG on disk(s) */ if (!vg_write(vg) || !vg_commit(vg)) goto_bad; diff --git a/tools/vgexport.c b/tools/vgexport.c index 86dad3abb432..15cc3dd75d56 100644 --- a/tools/vgexport.c +++ b/tools/vgexport.c @@ -45,10 +45,6 @@ static int vgexport_single(struct cmd_context *cmd __attribute__((unused)), } } - - if (!archive(vg)) - goto_bad; - vg->status |= EXPORTED_VG; vg->system_id = NULL; diff --git a/tools/vgextend.c b/tools/vgextend.c index 04d37f886d4d..b0f49569f492 100644 --- a/tools/vgextend.c +++ b/tools/vgextend.c @@ -60,9 +60,6 @@ static int _vgextend_restoremissing(struct cmd_context *cmd __attribute__((unuse int fixed = 0; unsigned i; - if (!archive(vg)) - return_0; - for (i = 0; i < pp->pv_count; i++) if (_restore_pv(vg, pp->pv_names[i])) fixed++; @@ -99,9 +96,6 @@ static int _vgextend_single(struct cmd_context *cmd, const char *vg_name, return ECMD_FAILED; } - if (!archive(vg)) - return_ECMD_FAILED; - if (!vg_extend_each_pv(vg, pp)) goto_out; diff --git a/tools/vgimport.c b/tools/vgimport.c index 0d8b0f215704..4b25b468f017 100644 --- a/tools/vgimport.c +++ b/tools/vgimport.c @@ -33,9 +33,6 @@ static int _vgimport_single(struct cmd_context *cmd, goto bad; } - if (!archive(vg)) - goto_bad; - vg->status &= ~EXPORTED_VG; if (!vg_is_shared(vg)) diff --git a/tools/vgimportclone.c b/tools/vgimportclone.c index 1e6bb2d69d83..a4778277108e 100644 --- a/tools/vgimportclone.c +++ b/tools/vgimportclone.c @@ -110,9 +110,6 @@ static int _update_vg(struct cmd_context *cmd, struct volume_group *vg, * Write changes. */ - if (!archive(vg)) - goto_bad; - if (vp->import_vg) vg->status &= ~EXPORTED_VG; diff --git a/tools/vgreduce.c b/tools/vgreduce.c index 4a4202e8683f..c759c664301c 100644 --- a/tools/vgreduce.c +++ b/tools/vgreduce.c @@ -157,9 +157,6 @@ static int _vgreduce_repair_single(struct cmd_context *cmd, const char *vg_name, return ECMD_PROCESSED; } - if (!archive(vg)) - return_ECMD_FAILED; - if (vp->force) { if (!_make_vg_consistent(cmd, vg)) return_ECMD_FAILED; diff --git a/tools/vgrename.c b/tools/vgrename.c index f442f731fd4a..71b4e16774af 100644 --- a/tools/vgrename.c +++ b/tools/vgrename.c @@ -103,9 +103,6 @@ static int _vgrename_single(struct cmd_context *cmd, const char *vg_name, dev_dir = cmd->dev_dir; - if (!archive(vg)) - goto error; - if (!lockd_rename_vg_before(cmd, vg)) { stack; goto error; -- 1.8.3.1