From 7fa91ec044b977785598ef57d8c53af59b2e3782 Mon Sep 17 00:00:00 2001 From: Dave Wysochanski Date: Fri, 10 Jul 2009 20:09:21 +0000 Subject: [PATCH] Move orphan lock obtain/release inside vg_extend(). With this change we now have vgcreate/vgextend liblvm functions. Note that this changes the lock order of the following functions as the orphan lock is now obtained first. With our policy of non-blocking second locks, this should not be a problem. Signed-off-by: Dave Wysochanski --- lib/metadata/metadata.c | 11 +++++++++-- tools/vgcreate.c | 8 -------- tools/vgextend.c | 7 ------- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index a471ed502..07ab067ae 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -437,6 +437,12 @@ int vg_extend(struct volume_group *vg, int pv_count, char **pv_names) { int i; struct physical_volume *pv; + struct cmd_context *cmd = vg->cmd; + + if (!lock_vol(cmd, VG_ORPHANS, LCK_VG_WRITE)) { + log_error("Can't get lock for orphan PVs"); + return 0; + } /* attach each pv */ for (i = 0; i < pv_count; i++) { @@ -445,18 +451,19 @@ int vg_extend(struct volume_group *vg, int pv_count, char **pv_names) "physical volume", pv_names[i]); goto bad; } - if (!add_pv_to_vg(vg, pv_names[i], pv)) goto bad; } /* FIXME Decide whether to initialise and add new mdahs to format instance */ + unlock_vg(cmd, VG_ORPHANS); return 1; - + bad: log_error("Unable to add physical volume '%s' to " "volume group '%s'.", pv_names[i], vg->name); + unlock_vg(cmd, VG_ORPHANS); return 0; } diff --git a/tools/vgcreate.c b/tools/vgcreate.c index 7cfd0f297..c41c50f60 100644 --- a/tools/vgcreate.c +++ b/tools/vgcreate.c @@ -46,12 +46,6 @@ int vgcreate(struct cmd_context *cmd, int argc, char **argv) if (validate_vg_create_params(cmd, &vp_new)) return EINVALID_CMD_LINE; - /* FIXME: orphan lock needs tied to vg handle or inside library call */ - if (!lock_vol(cmd, VG_ORPHANS, LCK_VG_WRITE)) { - log_error("Can't get lock for orphan PVs"); - return ECMD_FAILED; - } - /* Create the new VG */ vg = vg_create(cmd, vp_new.vg_name); if (vg_read_error(vg)) @@ -113,7 +107,6 @@ int vgcreate(struct cmd_context *cmd, int argc, char **argv) } unlock_vg(cmd, vp_new.vg_name); - unlock_vg(cmd, VG_ORPHANS); backup(vg); @@ -126,6 +119,5 @@ int vgcreate(struct cmd_context *cmd, int argc, char **argv) bad: vg_release(vg); unlock_vg(cmd, vp_new.vg_name); - unlock_vg(cmd, VG_ORPHANS); return ECMD_FAILED; } diff --git a/tools/vgextend.c b/tools/vgextend.c index a08d4dbdd..728d9f496 100644 --- a/tools/vgextend.c +++ b/tools/vgextend.c @@ -36,17 +36,11 @@ int vgextend(struct cmd_context *cmd, int argc, char **argv) argc--; argv++; - if (!lock_vol(cmd, VG_ORPHANS, LCK_VG_WRITE)) { - log_error("Can't get lock for orphan PVs"); - return ECMD_FAILED; - } - log_verbose("Checking for volume group \"%s\"", vg_name); vg = vg_read_for_update(cmd, vg_name, NULL, READ_REQUIRE_RESIZEABLE); if (vg_read_error(vg)) { vg_release(vg); - unlock_vg(cmd, VG_ORPHANS); return ECMD_FAILED; } /********** FIXME @@ -77,6 +71,5 @@ int vgextend(struct cmd_context *cmd, int argc, char **argv) error: unlock_and_release_vg(cmd, vg, vg_name); - unlock_vg(cmd, VG_ORPHANS); return r; } -- 2.43.5