diff options
author | David Teigland <teigland@redhat.com> | 2015-12-01 09:54:33 -0600 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2015-12-01 09:54:33 -0600 |
commit | 5bbbd37f414bdbf31776d09af1c937635205ab2d (patch) | |
tree | 90b940f736b4c5066264c8fe1cbaa45bced20657 | |
parent | f7571eb287ff3810d93485f6be7d5e1fad2bb250 (diff) | |
download | lvm2-5bbbd37f414bdbf31776d09af1c937635205ab2d.tar.gz |
lvrename: use process_each_vg
No functional change.
-rw-r--r-- | tools/lvrename.c | 93 |
1 files changed, 57 insertions, 36 deletions
diff --git a/tools/lvrename.c b/tools/lvrename.c index 7b0791a9d..18b02d265 100644 --- a/tools/lvrename.c +++ b/tools/lvrename.c @@ -15,20 +15,61 @@ #include "tools.h" +struct lvrename_params { + const char *lv_name_old; + const char *lv_name_new; +}; + +static int _lvrename_single(struct cmd_context *cmd, const char *vg_name, + struct volume_group *vg, struct processing_handle *handle) +{ + struct lvrename_params *lp = (struct lvrename_params *) handle->custom_handle; + struct lv_list *lvl; + int ret = ECMD_FAILED; + + if (!(lvl = find_lv_in_vg(vg, lp->lv_name_old))) { + log_error("Existing logical volume \"%s\" not found in " + "volume group \"%s\"", lp->lv_name_old, vg_name); + goto bad; + } + + if (lv_is_raid_image(lvl->lv) || lv_is_raid_metadata(lvl->lv)) { + log_error("Cannot rename a RAID %s directly", + lv_is_raid_image(lvl->lv) ? "image" : + "metadata area"); + goto bad; + } + + if (lv_is_raid_with_tracking(lvl->lv)) { + log_error("Cannot rename %s while it is tracking a split image", + lvl->lv->name); + goto bad; + } + + if (!lv_rename(cmd, lvl->lv, lp->lv_name_new)) + goto_bad; + + log_print_unless_silent("Renamed \"%s\" to \"%s\" in volume group \"%s\"", + lp->lv_name_old, lp->lv_name_new, vg_name); + + ret = ECMD_PROCESSED; +bad: + return ret; +} + /* * lvrename command implementation. * Check arguments and call lv_rename() to execute the request. */ int lvrename(struct cmd_context *cmd, int argc, char **argv) { + struct processing_handle *handle = NULL; + struct lvrename_params lp = { 0 }; size_t maxlen; char *lv_name_old, *lv_name_new; const char *vg_name, *vg_name_new, *vg_name_old; char *st; - struct volume_group *vg; - struct lv_list *lvl; - uint32_t lockd_state = 0; - int r = ECMD_FAILED; + int ret = ECMD_FAILED; if (argc == 3) { vg_name = skip_dev_dir(cmd, argv[0], NULL); @@ -99,43 +140,23 @@ int lvrename(struct cmd_context *cmd, int argc, char **argv) return EINVALID_CMD_LINE; } - if (!lockd_vg(cmd, vg_name, "ex", 0, &lockd_state)) - return_ECMD_FAILED; + if (!(lp.lv_name_old = dm_pool_strdup(cmd->mem, lv_name_old))) + return ECMD_FAILED; - log_verbose("Checking for existing volume group \"%s\"", vg_name); - vg = vg_read_for_update(cmd, vg_name, NULL, 0, lockd_state); - if (vg_read_error(vg)) { - release_vg(vg); - return_ECMD_FAILED; - } + if (!(lp.lv_name_new = dm_pool_strdup(cmd->mem, lv_name_new))) + return ECMD_FAILED; - if (!(lvl = find_lv_in_vg(vg, lv_name_old))) { - log_error("Existing logical volume \"%s\" not found in " - "volume group \"%s\"", lv_name_old, vg_name); - goto bad; + if (!(handle = init_processing_handle(cmd))) { + log_error("Failed to initialize processing handle."); + return ECMD_FAILED; } - if (lv_is_raid_image(lvl->lv) || lv_is_raid_metadata(lvl->lv)) { - log_error("Cannot rename a RAID %s directly", - lv_is_raid_image(lvl->lv) ? "image" : - "metadata area"); - goto bad; - } + handle->custom_handle = &lp; - if (lv_is_raid_with_tracking(lvl->lv)) { - log_error("Cannot rename %s while it is tracking a split image", - lvl->lv->name); - goto bad; - } + ret = process_each_vg(cmd, 0, NULL, vg_name, READ_FOR_UPDATE, handle, + _lvrename_single); - if (!lv_rename(cmd, lvl->lv, lv_name_new)) - goto_bad; + destroy_processing_handle(cmd, handle); + return ret; - log_print_unless_silent("Renamed \"%s\" to \"%s\" in volume group \"%s\"", - lv_name_old, lv_name_new, vg_name); - - r = ECMD_PROCESSED; -bad: - unlock_and_release_vg(cmd, vg, vg_name); - return r; } |