From 5a820745ce09adb0388a44e972ca909810fa03e8 Mon Sep 17 00:00:00 2001 From: Dave Wysochanski Date: Wed, 13 May 2009 13:02:52 +0000 Subject: [PATCH] Remove NON_BLOCKING lock flag from tools and set a policy to auto-set. As a simplification to the tools and further liblvm, this patch pushes the setting of NON_BLOCKING lock flag inside the lock_vol() call. The policy we set is if any existing VGs are currently locked, we set the NON_BLOCKING flag. Should be no functional change. --- WHATS_NEW | 1 + lib/locking/locking.c | 8 ++++++++ tools/vgcfgrestore.c | 4 ++-- tools/vgcreate.c | 4 ++-- tools/vgextend.c | 4 ++-- tools/vgmerge.c | 4 ++-- tools/vgreduce.c | 2 +- tools/vgremove.c | 4 ++-- tools/vgrename.c | 2 +- tools/vgsplit.c | 2 +- 10 files changed, 22 insertions(+), 13 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index 858c33fb8..4da35d451 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.46 - ================================ + Remove NON_BLOCKING lock flag from tools and set a policy to auto-set. Remove snapshot_count from VG and use function instead. Fix first_seg() call for empty segment list. Add make install_lvm2 as complement to device-mapper install. diff --git a/lib/locking/locking.c b/lib/locking/locking.c index ad93dddb8..37136ee55 100644 --- a/lib/locking/locking.c +++ b/lib/locking/locking.c @@ -376,6 +376,14 @@ int lock_vol(struct cmd_context *cmd, const char *vol, uint32_t flags) switch (flags & LCK_SCOPE_MASK) { case LCK_VG: + /* + * Automatically set LCK_NONBLOCK if one or more VGs locked. + * This will enforce correctness and prevent deadlocks rather + * than relying on the caller to set the flag properly. + */ + if (vgs_locked()) + flags |= LCK_NONBLOCK; + /* Lock VG to change on-disk metadata. */ /* If LVM1 driver knows about the VG, it can't be accessed. */ if (!check_lvm1_vg_inactive(cmd, vol)) diff --git a/tools/vgcfgrestore.c b/tools/vgcfgrestore.c index 3c66b62b3..6ec20d161 100644 --- a/tools/vgcfgrestore.c +++ b/tools/vgcfgrestore.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. - * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2009 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * @@ -48,7 +48,7 @@ int vgcfgrestore(struct cmd_context *cmd, int argc, char **argv) return ECMD_FAILED; } - if (!lock_vol(cmd, vg_name, LCK_VG_WRITE | LCK_NONBLOCK)) { + if (!lock_vol(cmd, vg_name, LCK_VG_WRITE)) { log_error("Unable to lock volume group %s", vg_name); unlock_vg(cmd, VG_ORPHANS); return ECMD_FAILED; diff --git a/tools/vgcreate.c b/tools/vgcreate.c index add394ae7..0b8b769d3 100644 --- a/tools/vgcreate.c +++ b/tools/vgcreate.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. - * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2009 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * @@ -51,7 +51,7 @@ int vgcreate(struct cmd_context *cmd, int argc, char **argv) return ECMD_FAILED; } - if (!lock_vol(cmd, vp_new.vg_name, LCK_VG_WRITE | LCK_NONBLOCK)) { + if (!lock_vol(cmd, vp_new.vg_name, LCK_VG_WRITE)) { log_error("Can't get lock for %s", vp_new.vg_name); unlock_vg(cmd, VG_ORPHANS); return ECMD_FAILED; diff --git a/tools/vgextend.c b/tools/vgextend.c index 5d99cce7e..280017ff3 100644 --- a/tools/vgextend.c +++ b/tools/vgextend.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. - * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2009 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * @@ -42,7 +42,7 @@ int vgextend(struct cmd_context *cmd, int argc, char **argv) } log_verbose("Checking for volume group \"%s\"", vg_name); - if (!(vg = vg_lock_and_read(cmd, vg_name, NULL, LCK_VG_WRITE | LCK_NONBLOCK, + if (!(vg = vg_lock_and_read(cmd, vg_name, NULL, LCK_VG_WRITE, CLUSTERED | EXPORTED_VG | LVM_WRITE | RESIZEABLE_VG, CORRECT_INCONSISTENT | FAIL_INCONSISTENT))) { diff --git a/tools/vgmerge.c b/tools/vgmerge.c index 82c34561d..8b85c7af3 100644 --- a/tools/vgmerge.c +++ b/tools/vgmerge.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. - * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2009 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * @@ -35,7 +35,7 @@ static int _vgmerge_single(struct cmd_context *cmd, const char *vg_name_to, log_verbose("Checking for volume group \"%s\"", vg_name_from); if (!(vg_from = vg_lock_and_read(cmd, vg_name_from, NULL, - LCK_VG_WRITE | LCK_NONBLOCK, + LCK_VG_WRITE, CLUSTERED | EXPORTED_VG | LVM_WRITE, CORRECT_INCONSISTENT | FAIL_INCONSISTENT))) { unlock_release_vg(cmd, vg_to, vg_name_to); diff --git a/tools/vgreduce.c b/tools/vgreduce.c index 8d407930a..cf55afeda 100644 --- a/tools/vgreduce.c +++ b/tools/vgreduce.c @@ -397,7 +397,7 @@ static int _vgreduce_single(struct cmd_context *cmd, struct volume_group *vg, return ECMD_FAILED; } - if (!lock_vol(cmd, VG_ORPHANS, LCK_VG_WRITE | LCK_NONBLOCK)) { + if (!lock_vol(cmd, VG_ORPHANS, LCK_VG_WRITE)) { log_error("Can't get lock for orphan PVs"); return ECMD_FAILED; } diff --git a/tools/vgremove.c b/tools/vgremove.c index 8c4357e15..38f9ee367 100644 --- a/tools/vgremove.c +++ b/tools/vgremove.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. - * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2009 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * @@ -41,7 +41,7 @@ int vgremove(struct cmd_context *cmd, int argc, char **argv) } ret = process_each_vg(cmd, argc, argv, - LCK_VG_WRITE | LCK_NONBLOCK, 1, + LCK_VG_WRITE, 1, NULL, &vgremove_single); unlock_vg(cmd, VG_ORPHANS); diff --git a/tools/vgrename.c b/tools/vgrename.c index 697d27bd6..205ba3e34 100644 --- a/tools/vgrename.c +++ b/tools/vgrename.c @@ -100,7 +100,7 @@ static int vg_rename_path(struct cmd_context *cmd, const char *old_vg_path, log_verbose("Checking for new volume group \"%s\"", vg_name_new); - if (!lock_vol(cmd, vg_name_new, LCK_VG_WRITE | LCK_NONBLOCK)) { + if (!lock_vol(cmd, vg_name_new, LCK_VG_WRITE)) { unlock_release_vg(cmd, vg, vg_name_old); log_error("Can't get lock for %s", vg_name_new); return 0; diff --git a/tools/vgsplit.c b/tools/vgsplit.c index c4b583afd..e4c7620ee 100644 --- a/tools/vgsplit.c +++ b/tools/vgsplit.c @@ -325,7 +325,7 @@ int vgsplit(struct cmd_context *cmd, int argc, char **argv) return ECMD_FAILED; log_verbose("Checking for new volume group \"%s\"", vg_name_to); - if (!lock_vol(cmd, vg_name_to, LCK_VG_WRITE | LCK_NONBLOCK)) { + if (!lock_vol(cmd, vg_name_to, LCK_VG_WRITE)) { log_error("Can't get lock for %s", vg_name_to); unlock_release_vg(cmd, vg_from, vg_name_from); return ECMD_FAILED;