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:
parent
e3e5beec74
commit
5f138f3604
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user