From: agk@sourceware.org <agk@sourceware.org>
To: lvm-devel@redhat.com
Subject: LVM2 ./WHATS_NEW daemons/clvmd/lvm-functions.c ...
Date: 27 Sep 2011 22:43:43 -0000 [thread overview]
Message-ID: <20110927224343.23639.qmail@sourceware.org> (raw)
CVSROOT: /cvs/lvm2
Module name: LVM2
Changes by: agk at sourceware.org 2011-09-27 22:43:42
Modified files:
. : WHATS_NEW
daemons/clvmd : lvm-functions.c
lib/activate : activate.c activate.h dev_manager.c
lib/locking : cluster_locking.c file_locking.c locking.c
locking.h no_locking.c
libdm : libdm-deptree.c
tools : pvmove.c
Log message:
Introduce revert_lv for better pvmove cleanup.
(One further fix needed to remove the stray pvmove LVs left behind.)
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/WHATS_NEW.diff?cvsroot=lvm2&r1=1.2142&r2=1.2143
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/clvmd/lvm-functions.c.diff?cvsroot=lvm2&r1=1.124&r2=1.125
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/activate/activate.c.diff?cvsroot=lvm2&r1=1.214&r2=1.215
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/activate/activate.h.diff?cvsroot=lvm2&r1=1.80&r2=1.81
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/activate/dev_manager.c.diff?cvsroot=lvm2&r1=1.232&r2=1.233
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/locking/cluster_locking.c.diff?cvsroot=lvm2&r1=1.58&r2=1.59
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/locking/file_locking.c.diff?cvsroot=lvm2&r1=1.60&r2=1.61
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/locking/locking.c.diff?cvsroot=lvm2&r1=1.99&r2=1.100
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/locking/locking.h.diff?cvsroot=lvm2&r1=1.68&r2=1.69
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/locking/no_locking.c.diff?cvsroot=lvm2&r1=1.29&r2=1.30
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/libdm/libdm-deptree.c.diff?cvsroot=lvm2&r1=1.112&r2=1.113
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/pvmove.c.diff?cvsroot=lvm2&r1=1.89&r2=1.90
--- LVM2/WHATS_NEW 2011/09/27 17:29:33 1.2142
+++ LVM2/WHATS_NEW 2011/09/27 22:43:40 1.2143
@@ -1,5 +1,6 @@
Version 2.02.89 -
==================================
+ Introduce revert_lv for better pvmove cleanup.
Replace incomplete pvmove activation failure recovery code with a message.
Abort if _finish_pvmove suspend_lvs fails instead of cleaning up incompletely.
Change suspend_lvs to call vg_revert internally.
--- LVM2/daemons/clvmd/lvm-functions.c 2011/09/24 20:50:36 1.124
+++ LVM2/daemons/clvmd/lvm-functions.c 2011/09/27 22:43:40 1.125
@@ -406,7 +406,7 @@
/* Resume the LV if it was active */
static int do_resume_lv(char *resource, unsigned char lock_flags)
{
- int oldmode, origin_only, exclusive;
+ int oldmode, origin_only, exclusive, revert;
/* Is it open ? */
oldmode = get_current_lock(resource);
@@ -416,8 +416,9 @@
}
origin_only = (lock_flags & LCK_ORIGIN_ONLY_MODE) ? 1 : 0;
exclusive = (oldmode == LCK_EXCL) ? 1 : 0;
+ revert = (lock_flags & LCK_REVERT_MODE) ? 1 : 0;
- if (!lv_resume_if_active(cmd, resource, origin_only, exclusive))
+ if (!lv_resume_if_active(cmd, resource, origin_only, exclusive, revert))
return EIO;
return 0;
--- LVM2/lib/activate/activate.c 2011/09/26 10:17:51 1.214
+++ LVM2/lib/activate/activate.c 2011/09/27 22:43:40 1.215
@@ -190,7 +190,7 @@
return 1;
}
int lv_resume_if_active(struct cmd_context *cmd, const char *lvid_s,
- unsigned origin_only, unsigned exclusive)
+ unsigned origin_only, unsigned exclusive, unsigned revert)
{
return 1;
}
@@ -1356,14 +1356,16 @@
laopts->origin_only = 0;
if (test_mode()) {
- _skip("Resuming %s%s.", lv->name, laopts->origin_only ? " without snapshots" : "");
+ _skip("Resuming %s%s%s.", lv->name, laopts->origin_only ? " without snapshots" : "",
+ laopts->revert ? " (reverting)" : "");
r = 1;
goto out;
}
- log_debug("Resuming LV %s/%s%s%s.", lv->vg->name, lv->name,
+ log_debug("Resuming LV %s/%s%s%s%s.", lv->vg->name, lv->name,
error_if_not_active ? "" : " if active",
- laopts->origin_only ? " without snapshots" : "");
+ laopts->origin_only ? " without snapshots" : "",
+ laopts->revert ? " (reverting)" : "");
if (!lv_info(cmd, lv, laopts->origin_only, &info, 0, 0))
goto_out;
@@ -1395,7 +1397,7 @@
/* Returns success if the device is not active */
int lv_resume_if_active(struct cmd_context *cmd, const char *lvid_s,
- unsigned origin_only, unsigned exclusive)
+ unsigned origin_only, unsigned exclusive, unsigned revert)
{
struct lv_activate_opts laopts = {
.origin_only = origin_only,
@@ -1404,7 +1406,8 @@
* non-clustered target should be used. This only happens
* if exclusive is set.
*/
- .exclusive = exclusive
+ .exclusive = exclusive,
+ .revert = revert
};
return _lv_resume(cmd, lvid_s, &laopts, 0);
--- LVM2/lib/activate/activate.h 2011/09/22 17:33:51 1.80
+++ LVM2/lib/activate/activate.h 2011/09/27 22:43:40 1.81
@@ -34,6 +34,7 @@
int exclusive;
int origin_only;
int no_merging;
+ unsigned revert;
};
/* target attribute flags */
@@ -63,7 +64,7 @@
int lv_suspend_if_active(struct cmd_context *cmd, const char *lvid_s, unsigned origin_only);
int lv_resume(struct cmd_context *cmd, const char *lvid_s, unsigned origin_only);
int lv_resume_if_active(struct cmd_context *cmd, const char *lvid_s,
- unsigned origin_only, unsigned exclusive);
+ unsigned origin_only, unsigned exclusive, unsigned revert);
int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive);
int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s,
int exclusive);
--- LVM2/lib/activate/dev_manager.c 2011/09/22 17:39:57 1.232
+++ LVM2/lib/activate/dev_manager.c 2011/09/27 22:43:41 1.233
@@ -1590,7 +1590,7 @@
layer ? UINT32_C(0) : (uint32_t) lv->major,
layer ? UINT32_C(0) : (uint32_t) lv->minor,
_read_only_lv(lv),
- (lv->vg->status & PRECOMMITTED) ? 1 : 0,
+ ((lv->vg->status & PRECOMMITTED) | laopts->revert) ? 1 : 0,
lvlayer,
_get_udev_flags(dm, lv, layer))))
return_0;
--- LVM2/lib/locking/cluster_locking.c 2011/08/30 14:55:17 1.58
+++ LVM2/lib/locking/cluster_locking.c 2011/09/27 22:43:41 1.59
@@ -327,6 +327,9 @@
if (flags & LCK_ORIGIN_ONLY)
args[1] |= LCK_ORIGIN_ONLY_MODE;
+ if (flags & LCK_REVERT)
+ args[1] |= LCK_REVERT_MODE;
+
if (mirror_in_sync())
args[1] |= LCK_MIRROR_NOSYNC_MODE;
--- LVM2/lib/locking/file_locking.c 2011/08/09 11:44:57 1.60
+++ LVM2/lib/locking/file_locking.c 2011/09/27 22:43:41 1.61
@@ -257,6 +257,7 @@
{
char lockfile[PATH_MAX];
unsigned origin_only = (flags & LCK_ORIGIN_ONLY) ? 1 : 0;
+ unsigned revert = (flags & LCK_REVERT) ? 1 : 0;
switch (flags & LCK_SCOPE_MASK) {
case LCK_VG:
@@ -292,8 +293,8 @@
case LCK_LV:
switch (flags & LCK_TYPE_MASK) {
case LCK_UNLOCK:
- log_very_verbose("Unlocking LV %s%s", resource, origin_only ? " without snapshots" : "");
- if (!lv_resume_if_active(cmd, resource, origin_only, 0))
+ log_very_verbose("Unlocking LV %s%s%s", resource, origin_only ? " without snapshots" : "", revert ? " (reverting)" : "");
+ if (!lv_resume_if_active(cmd, resource, origin_only, 0, revert))
return 0;
break;
case LCK_NULL:
--- LVM2/lib/locking/locking.c 2011/09/27 17:09:43 1.99
+++ LVM2/lib/locking/locking.c 2011/09/27 22:43:41 1.100
@@ -493,6 +493,20 @@
return r;
}
+/* Unlock and revert list of LVs */
+int revert_lvs(struct cmd_context *cmd, struct dm_list *lvs)
+{
+ struct lv_list *lvl;
+ int r = 1;
+
+ dm_list_iterate_items(lvl, lvs)
+ if (!revert_lv(cmd, lvl->lv)) {
+ r = 0;
+ stack;
+ }
+
+ return r;
+}
/*
* Lock a list of LVs.
* On failure to lock any LV, calls vg_revert() if vg_to_revert is set and
@@ -511,7 +525,7 @@
vg_revert(vg_to_revert);
dm_list_uniterate(lvh, lvs, &lvl->list) {
lvl = dm_list_item(lvh, struct lv_list);
- if (!resume_lv(cmd, lvl->lv))
+ if (!revert_lv(cmd, lvl->lv))
stack;
}
--- LVM2/lib/locking/locking.h 2011/09/27 17:09:43 1.68
+++ LVM2/lib/locking/locking.h 2011/09/27 22:43:41 1.69
@@ -97,6 +97,7 @@
#define LCK_CLUSTER_VG 0x00000080U /* VG is clustered */
#define LCK_CACHE 0x00000100U /* Operation on cache only using P_ lock */
#define LCK_ORIGIN_ONLY 0x00000200U /* Operation should bypass any snapshots */
+#define LCK_REVERT 0x00000400U /* Revert any incomplete change */
/*
* Additional lock bits for cluster communication via args[1]
@@ -107,6 +108,7 @@
#define LCK_CONVERT 0x08 /* Convert existing lock */
#define LCK_ORIGIN_ONLY_MODE 0x20 /* Same as above */
#define LCK_TEST_MODE 0x10 /* Test mode: No activation */
+#define LCK_REVERT_MODE 0x40 /* Remove inactive tables */
/*
* Special cases of VG locks.
@@ -164,6 +166,7 @@
#define resume_lv(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_RESUME)
#define resume_lv_origin(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_RESUME | LCK_ORIGIN_ONLY)
+#define revert_lv(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_RESUME | LCK_REVERT)
#define suspend_lv(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_SUSPEND | LCK_HOLD)
#define suspend_lv_origin(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_SUSPEND | LCK_HOLD | LCK_ORIGIN_ONLY)
#define deactivate_lv(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_DEACTIVATE)
@@ -191,6 +194,7 @@
int suspend_lvs(struct cmd_context *cmd, struct dm_list *lvs,
struct volume_group *vg_to_revert);
int resume_lvs(struct cmd_context *cmd, struct dm_list *lvs);
+int revert_lvs(struct cmd_context *cmd, struct dm_list *lvs);
int activate_lvs(struct cmd_context *cmd, struct dm_list *lvs, unsigned exclusive);
/* Interrupt handling */
--- LVM2/lib/locking/no_locking.c 2011/08/09 11:44:57 1.29
+++ LVM2/lib/locking/no_locking.c 2011/09/27 22:43:41 1.30
@@ -46,7 +46,7 @@
case LCK_NULL:
return lv_deactivate(cmd, resource);
case LCK_UNLOCK:
- return lv_resume_if_active(cmd, resource, (flags & LCK_ORIGIN_ONLY) ? 1: 0, 0);
+ return lv_resume_if_active(cmd, resource, (flags & LCK_ORIGIN_ONLY) ? 1: 0, 0, (flags & LCK_REVERT) ? 1 : 0);
case LCK_READ:
return lv_activate_with_filter(cmd, resource, 0);
case LCK_WRITE:
--- LVM2/libdm/libdm-deptree.c 2011/09/26 10:17:52 1.112
+++ LVM2/libdm/libdm-deptree.c 2011/09/27 22:43:41 1.113
@@ -610,6 +610,8 @@
if (!info->exists || !info->inactive_table)
return 1;
+// FIXME Get inactive deps. If any dev referenced has 1 opener and no live table, remove it after the clear.
+
log_verbose("Clearing inactive table %s (%" PRIu32 ":%" PRIu32 ")",
name, info->major, info->minor);
--- LVM2/tools/pvmove.c 2011/09/27 17:29:33 1.89
+++ LVM2/tools/pvmove.c 2011/09/27 22:43:42 1.90
@@ -370,13 +370,19 @@
if (!_suspend_lvs(cmd, first_time, lv_mirr, lvs_changed, vg)) {
log_error("ABORTING: Volume group metadata update failed.");
- goto out;
+ if (!first_time && !revert_lv(cmd, lv_mirr))
+ stack;
+ return 0;
}
/* Commit on-disk metadata */
if (!vg_commit(vg)) {
log_error("ABORTING: Volume group metadata update failed.");
- goto out;
+ if (!_resume_lvs(cmd, first_time, lv_mirr, lvs_changed))
+ stack;
+ if (!first_time && !revert_lv(cmd, lv_mirr))
+ stack;
+ return 0;
}
/* Activate the temporary mirror LV */
@@ -403,7 +409,9 @@
if (!_resume_lvs(cmd, first_time, lv_mirr, lvs_changed))
r = 0;
- backup(vg);
+ if (r)
+ backup(vg);
+
return r;
}
@@ -546,6 +554,8 @@
/* Suspend LVs changed (implicitly suspends lv_mirr) */
if (!suspend_lvs(cmd, lvs_changed, vg)) {
log_error("ABORTING: Locking LVs to remove temporary mirror failed");
+ if (!revert_lv(cmd, lv_mirr))
+ stack;
return 0;
}
@@ -553,9 +563,9 @@
if (!vg_commit(vg)) {
log_error("ABORTING: Failed to write new data locations "
"to disk.");
- if (!resume_lv(cmd, lv_mirr))
+ if (!revert_lv(cmd, lv_mirr))
stack;
- if (!resume_lvs(cmd, lvs_changed))
+ if (!revert_lvs(cmd, lvs_changed))
stack;
return 0;
}
next reply other threads:[~2011-09-27 22:43 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-27 22:43 agk [this message]
-- strict thread matches above, loose matches on Subject: below --
2012-01-20 0:27 LVM2 ./WHATS_NEW daemons/clvmd/lvm-functions.c jbrassow
2011-12-08 21:24 agk
2011-08-10 20:25 zkabelac
2011-02-18 14:16 zkabelac
2011-02-18 0:36 jbrassow
2011-02-04 20:30 jbrassow
2011-02-03 16:03 zkabelac
2011-02-03 1:58 zkabelac
2010-12-08 20:51 agk
2010-11-23 1:56 agk
2010-03-26 15:40 snitzer
2010-03-23 22:30 snitzer
2010-01-19 13:25 mbroz
2010-01-05 16:09 mbroz
2010-01-05 16:06 mbroz
2010-01-05 16:03 mbroz
2009-11-23 10:44 mbroz
2009-07-24 18:15 agk
2009-07-16 0:37 agk
2009-07-15 23:57 agk
2009-07-13 19:49 agk
2009-06-12 8:30 mbroz
2009-02-22 21:14 agk
2009-01-26 19:01 agk
2008-09-19 6:42 agk
2007-08-07 9:06 meyering
2007-01-25 14:37 agk
2007-01-23 15:58 agk
2007-01-19 22:21 agk
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=20110927224343.23639.qmail@sourceware.org \
--to=agk@sourceware.org \
--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.