1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-02-25 21:57:45 +03:00

vgcreate: improve the use of label_scan

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.
This commit is contained in:
David Teigland 2017-10-26 14:32:30 -05:00
parent e3e5beec74
commit 5f138f3604

View File

@ -26,7 +26,6 @@ int vgcreate(struct cmd_context *cmd, int argc, char **argv)
const char *clustered_message = ""; const char *clustered_message = "";
char *vg_name; char *vg_name;
struct arg_value_group_list *current_group; struct arg_value_group_list *current_group;
uint32_t rc;
if (!argc) { if (!argc) {
log_error("Please provide volume group name and " 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; return_ECMD_FAILED;
cmd->lockd_gl_disable = 1; cmd->lockd_gl_disable = 1;
lvmcache_seed_infos_from_lvmetad(cmd);
/* /*
* Check if the VG name already exists. This should be done before * Check if the VG name already exists. This should be done before
* creating PVs on any of the devices. * 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) if (!lock_vol(cmd, vp_new.vg_name, LCK_VG_WRITE, NULL)) {
log_error("A volume group called %s already exists.", vp_new.vg_name); log_error("Can't get lock for %s.", vp_new.vg_name);
else return ECMD_FAILED;
log_error("Can't get lock for %s.", vp_new.vg_name); }
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; return ECMD_FAILED;
} }