From: Dave Wysochanski <dwysocha@redhat.com>
To: lvm-devel@redhat.com
Subject: [PATCH] Convert vgreduce to use vg_read_for_update.
Date: Sat, 24 Jan 2009 16:43:55 -0500 [thread overview]
Message-ID: <1232833435-2917-2-git-send-email-dwysocha@redhat.com> (raw)
In-Reply-To: <1232833435-2917-1-git-send-email-dwysocha@redhat.com>
From: Petr Rockai <prockai@redhat.com>
Fri Jan 9 15:38:20 CET 2009 Petr Rockai <me@mornfall.net>
* Convert vgreduce to use vg_read_for_update.
Remove incorrect unlock_vg() in vgreduce_single() error path.
If dev_get_size() fails we don't have the orphan lock yet so
don't try to unlock.
Signed-off-by: Dave Wysochanski <dwysocha@redhat.com>
---
tools/vgreduce.c | 57 +++++++++++++++++++----------------------------------
1 files changed, 21 insertions(+), 36 deletions(-)
diff --git a/tools/vgreduce.c b/tools/vgreduce.c
index 79bf3e0..09bbd09 100644
--- a/tools/vgreduce.c
+++ b/tools/vgreduce.c
@@ -382,7 +382,6 @@ static int _vgreduce_single(struct cmd_context *cmd, struct volume_group *vg,
{
struct pv_list *pvl;
struct volume_group *orphan_vg;
- int consistent = 1;
const char *name = pv_dev_name(pv);
if (pv_pe_alloc_count(pv)) {
@@ -396,17 +395,10 @@ 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)) {
- log_error("Can't get lock for orphan PVs");
- return ECMD_FAILED;
- }
-
pvl = find_pv_in_vg(vg, name);
- if (!archive(vg)) {
- unlock_vg(cmd, VG_ORPHANS);
+ if (!archive(vg))
return ECMD_FAILED;
- }
log_verbose("Removing \"%s\" from volume group \"%s\"", name, vg->name);
@@ -418,7 +410,6 @@ static int _vgreduce_single(struct cmd_context *cmd, struct volume_group *vg,
if (!dev_get_size(pv_dev(pv), &pv->size)) {
log_error("%s: Couldn't get size.", pv_dev_name(pv));
- unlock_vg(cmd, VG_ORPHANS);
return ECMD_FAILED;
}
@@ -426,12 +417,11 @@ static int _vgreduce_single(struct cmd_context *cmd, struct volume_group *vg,
vg->free_count -= pv_pe_count(pv) - pv_pe_alloc_count(pv);
vg->extent_count -= pv_pe_count(pv);
- if(!(orphan_vg = vg_read_internal(cmd, vg->fid->fmt->orphan_vg_name, NULL, &consistent)) ||
- !consistent) {
- log_error("Unable to read existing orphan PVs");
- unlock_vg(cmd, VG_ORPHANS);
+ orphan_vg = vg_read_for_update(cmd, vg->fid->fmt->orphan_vg_name,
+ NULL, NONBLOCKING_LOCK | ORPHAN_LOCK);
+
+ if (vg_read_error(orphan_vg))
return ECMD_FAILED;
- }
if (!vg_split_mdas(cmd, vg, orphan_vg) || !vg->pv_count) {
log_error("Cannot remove final metadata area on \"%s\" from \"%s\"",
@@ -468,7 +458,6 @@ int vgreduce(struct cmd_context *cmd, int argc, char **argv)
struct volume_group *vg;
char *vg_name;
int ret = 1;
- int consistent = 1;
int fixed = 1;
int repairing = arg_count(cmd, removemissing_ARG);
@@ -515,41 +504,37 @@ int vgreduce(struct cmd_context *cmd, int argc, char **argv)
}
log_verbose("Finding volume group \"%s\"", vg_name);
- if (!lock_vol(cmd, vg_name, LCK_VG_WRITE)) {
- log_error("Can't get lock for %s", vg_name);
- return ECMD_FAILED;
- }
- if ((!(vg = vg_read_internal(cmd, vg_name, NULL, &consistent)) || !consistent)
- && !repairing) {
- log_error("Volume group \"%s\" doesn't exist", vg_name);
- unlock_vg(cmd, vg_name);
+ vg = vg_read_for_update(cmd, vg_name, NULL, ALLOW_EXPORTED);
+ if (vg_read_error(vg) == FAILED_ALLOCATION ||
+ vg_read_error(vg) == FAILED_NOTFOUND)
return ECMD_FAILED;
- }
- if (vg && !vg_check_status(vg, CLUSTERED)) {
- unlock_vg(cmd, vg_name);
+ /* FIXME We want to allow read-only VGs to be changed here? */
+ if (vg_read_error(vg) && vg_read_error(vg) != FAILED_READ_ONLY
+ && !arg_count(cmd, removemissing_ARG))
return ECMD_FAILED;
- }
if (repairing) {
- if (vg && consistent && !vg_missing_pv_count(vg)) {
+ if (!vg_read_error(vg) && !vg_missing_pv_count(vg)) {
log_error("Volume group \"%s\" is already consistent",
vg_name);
unlock_vg(cmd, vg_name);
return ECMD_PROCESSED;
}
- consistent = !arg_count(cmd, force_ARG);
- if (!(vg = vg_read_internal(cmd, vg_name, NULL, &consistent))) {
- log_error("Volume group \"%s\" not found", vg_name);
- unlock_vg(cmd, vg_name);
- return ECMD_FAILED;
- }
- if (!vg_check_status(vg, CLUSTERED)) {
+ log_verbose("Trying to open VG %s for recovery...", vg_name);
+
+ vg = vg_read_for_update(cmd, vg_name, NULL,
+ ALLOW_INCONSISTENT | DISABLE_LOCK
+ | ALLOW_EXPORTED);
+
+ if (vg_read_error(vg) && vg_read_error(vg) != FAILED_READ_ONLY
+ && vg_read_error(vg) != FAILED_INCONSISTENT) {
unlock_vg(cmd, vg_name);
return ECMD_FAILED;
}
+
if (!archive(vg)) {
unlock_vg(cmd, vg_name);
return ECMD_FAILED;
--
1.5.5.1
next prev parent reply other threads:[~2009-01-24 21:43 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1232619010-4858-9-git-send-email-prockai>
2009-01-24 21:43 ` [PATCH updated] Convert vgreduce to use vg_read_for_update Dave Wysochanski
2009-01-24 21:43 ` Dave Wysochanski [this message]
2009-01-22 10:10 [PATCH 8/14] " Petr Rockai
2009-01-24 21:45 ` [PATCH updated] " Dave Wysochanski
2009-01-24 21:46 ` [PATCH] " Dave Wysochanski
2009-01-25 0:21 ` [PATCH update2] " Dave Wysochanski
2009-01-25 0:21 ` [PATCH] " Dave Wysochanski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1232833435-2917-2-git-send-email-dwysocha@redhat.com \
--to=dwysocha@redhat.com \
--cc=lvm-devel@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.