diff options
author | David Teigland <teigland@redhat.com> | 2017-10-26 14:32:30 -0500 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2017-10-27 14:59:30 -0500 |
commit | 495d7c893c0e3f0caed68534ee6d4078bc8e25d8 (patch) | |
tree | fcbd44944f5237ae01cc095366a5f51579b20254 | |
parent | 827b45c84492a67ae87e7e00082e3e2043c77be6 (diff) | |
download | lvm2-dev-dct-new-scan-17.tar.gz |
vgcreate: improve the use of label_scandev-dct-new-scan-17
The old code was doing unnecessary label scans when
checking to see if the new VG name exists. A single
label_scan is sufficient if it is done after the
new VG lock is held.
-rw-r--r-- | tools/vgcreate.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/tools/vgcreate.c b/tools/vgcreate.c index af0c36364..87a296f56 100644 --- a/tools/vgcreate.c +++ b/tools/vgcreate.c @@ -26,7 +26,6 @@ int vgcreate(struct cmd_context *cmd, int argc, char **argv) const char *clustered_message = ""; char *vg_name; struct arg_value_group_list *current_group; - uint32_t rc; if (!argc) { log_error("Please provide volume group name and " @@ -66,17 +65,30 @@ int vgcreate(struct cmd_context *cmd, int argc, char **argv) return_ECMD_FAILED; cmd->lockd_gl_disable = 1; - lvmcache_seed_infos_from_lvmetad(cmd); - /* * Check if the VG name already exists. This should be done before * creating PVs on any of the devices. + * + * When searching if a VG name exists, acquire the VG lock, + * then do the initial label scan which reads all devices and + * populates lvmcache with any VG name it finds. If the VG name + * we want to use exists, then the label scan will find it, + * and the fmt_from_vgname call (used to check if the name exists) + * will return non-NULL. */ - if ((rc = vg_lock_newname(cmd, vp_new.vg_name)) != SUCCESS) { - if (rc == FAILED_EXIST) - log_error("A volume group called %s already exists.", vp_new.vg_name); - else - log_error("Can't get lock for %s.", vp_new.vg_name); + + if (!lock_vol(cmd, vp_new.vg_name, LCK_VG_WRITE, NULL)) { + log_error("Can't get lock for %s.", vp_new.vg_name); + return ECMD_FAILED; + } + + lvmcache_force_next_label_scan(); + lvmcache_label_scan(cmd); /* Does nothing when using lvmetad. */ + lvmcache_seed_infos_from_lvmetad(cmd); /* Does nothing unless using lvmetad. */ + + if (lvmcache_fmt_from_vgname(cmd, vp_new.vg_name, NULL, 0)) { + unlock_vg(cmd, NULL, vp_new.vg_name); + log_error("A volume group called %s already exists.", vp_new.vg_name); return ECMD_FAILED; } |