[lvm-devel] LVM2 ./WHATS_NEW lib/metadata/metadata-exporte ...
agk at sourceware.org
agk at sourceware.org
Wed Jan 16 18:15:27 UTC 2008
CVSROOT: /cvs/lvm2
Module name: LVM2
Changes by: agk at sourceware.org 2008-01-16 18:15:26
Modified files:
. : WHATS_NEW
lib/metadata : metadata-exported.h metadata.c
tools : lvmcmdline.c pvcreate.c pvdisplay.c toollib.c
Log message:
use scan_vgs_for_pvs to detect non-orphans without MDAs
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/WHATS_NEW.diff?cvsroot=lvm2&r1=1.762&r2=1.763
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata-exported.h.diff?cvsroot=lvm2&r1=1.33&r2=1.34
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.c.diff?cvsroot=lvm2&r1=1.148&r2=1.149
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/lvmcmdline.c.diff?cvsroot=lvm2&r1=1.58&r2=1.59
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/pvcreate.c.diff?cvsroot=lvm2&r1=1.59&r2=1.60
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/pvdisplay.c.diff?cvsroot=lvm2&r1=1.44&r2=1.45
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/toollib.c.diff?cvsroot=lvm2&r1=1.125&r2=1.126
--- LVM2/WHATS_NEW 2008/01/16 15:25:10 1.762
+++ LVM2/WHATS_NEW 2008/01/16 18:15:26 1.763
@@ -1,5 +1,6 @@
Version 2.02.30 -
===================================
+ Fix process_all_pvs to detect non-orphans with no MDAs correctly.
Don't use block_on_error with mirror targets version 1.12 and above.
Update vgsplit to include vgcreate-style options when new VG is destination.
Update vgsplit to accept existing VG as destination.
--- LVM2/lib/metadata/metadata-exported.h 2008/01/15 22:56:30 1.33
+++ LVM2/lib/metadata/metadata-exported.h 2008/01/16 18:15:26 1.34
@@ -310,6 +310,7 @@
/* Set full_scan to 1 to re-read every (filtered) device label */
struct list *get_vgs(struct cmd_context *cmd, int full_scan);
struct list *get_vgids(struct cmd_context *cmd, int full_scan);
+int scan_vgs_for_pvs(struct cmd_context *cmd);
int pv_write(struct cmd_context *cmd, struct physical_volume *pv,
struct list *mdas, int64_t label_sector);
--- LVM2/lib/metadata/metadata.c 2008/01/15 22:56:30 1.148
+++ LVM2/lib/metadata/metadata.c 2008/01/16 18:15:26 1.149
@@ -1015,7 +1015,16 @@
return NULL;
}
- /* FIXME Can fail when no PV mda */
+ if (is_orphan_vg(pv->vg_name)) {
+ /* If a PV has no MDAs - need to search all VGs for it */
+ if (!scan_vgs_for_pvs(cmd))
+ return_NULL;
+ if (!(pv = _pv_read(cmd, pv_name, NULL, NULL, 1))) {
+ log_error("Physical volume %s not found", pv_name);
+ return NULL;
+ }
+ }
+
if (is_orphan_vg(pv->vg_name)) {
log_error("Physical volume %s not in a volume group", pv_name);
return NULL;
@@ -1788,7 +1797,7 @@
return lvmcache_get_vgids(cmd, full_scan);
}
-struct list *get_pvs(struct cmd_context *cmd)
+static int _get_pvs(struct cmd_context *cmd, struct list **pvslist)
{
struct str_list *strl;
struct list *results;
@@ -1802,17 +1811,19 @@
lvmcache_label_scan(cmd, 0);
- if (!(results = dm_pool_alloc(cmd->mem, sizeof(*results)))) {
- log_error("PV list allocation failed");
- return NULL;
- }
+ if (pvslist) {
+ if (!(results = dm_pool_alloc(cmd->mem, sizeof(*results)))) {
+ log_error("PV list allocation failed");
+ return NULL;
+ }
- list_init(results);
+ list_init(results);
+ }
/* Get list of VGs */
if (!(vgids = get_vgids(cmd, 0))) {
log_error("get_pvs: get_vgs failed");
- return NULL;
+ return 0;
}
/* Read every VG to ensure cache consistency */
@@ -1839,16 +1850,36 @@
vgname);
/* Move PVs onto results list */
- list_iterate_safe(pvh, tmp, &vg->pvs) {
- list_add(results, pvh);
- }
+ if (pvslist)
+ list_iterate_safe(pvh, tmp, &vg->pvs)
+ list_add(results, pvh);
}
init_pvmove(old_pvmove);
init_partial(old_partial);
+ if (pvslist)
+ *pvslist = results;
+ else
+ dm_pool_free(cmd->mem, vgids);
+
+ return 1;
+}
+
+struct list *get_pvs(struct cmd_context *cmd)
+{
+ struct list *results;
+
+ if (!_get_pvs(cmd, &results))
+ return NULL;
+
return results;
}
+int scan_vgs_for_pvs(struct cmd_context *cmd)
+{
+ return _get_pvs(cmd, NULL);
+}
+
/* FIXME: liblvm todo - make into function that takes handle */
int pv_write(struct cmd_context *cmd __attribute((unused)),
struct physical_volume *pv,
--- LVM2/tools/lvmcmdline.c 2008/01/16 17:14:56 1.58
+++ LVM2/tools/lvmcmdline.c 2008/01/16 18:15:26 1.59
@@ -584,7 +584,6 @@
a->ui64_value = 0;
}
- memset(str, 0, sizeof(str));
/* fill in the short and long opts */
for (i = 0; i < cmd->command->num_args; i++)
_add_getopt_arg(cmd->command->valid_args[i], &ptr, &o);
--- LVM2/tools/pvcreate.c 2008/01/09 00:18:36 1.59
+++ LVM2/tools/pvcreate.c 2008/01/16 18:15:26 1.60
@@ -51,7 +51,8 @@
* system.
*/
if (pv && is_orphan(pv)) {
- (void) get_vgs(cmd, 1);
+ if (!scan_vgs_for_pvs(cmd))
+ return_0;
pv = pv_read(cmd, name, NULL, NULL, 0);
}
--- LVM2/tools/pvdisplay.c 2007/11/15 21:30:52 1.44
+++ LVM2/tools/pvdisplay.c 2008/01/16 18:15:26 1.45
@@ -26,7 +26,7 @@
const char *pv_name = pv_dev_name(pv);
const char *vg_name = NULL;
- if (!is_orphan(pv) && !vg) {
+ if (!is_orphan(pv) && !vg) {
vg_name = pv_vg_name(pv);
if (!(vg = vg_lock_and_read(cmd, vg_name, (char *)&pv->vgid,
LCK_VG_READ, CLUSTERED, 0))) {
--- LVM2/tools/toollib.c 2008/01/15 22:56:30 1.125
+++ LVM2/tools/toollib.c 2008/01/16 18:15:26 1.126
@@ -696,6 +696,7 @@
struct str_list *sll;
char *tagname;
int consistent = 1;
+ int scanned = 0;
list_init(&tags);
@@ -738,6 +739,30 @@
ret_max = ECMD_FAILED;
continue;
}
+
+ /*
+ * If a PV has no MDAs it may appear to be an
+ * orphan until the metadata is read off
+ * another PV in the same VG. Detecting this
+ * means checking every VG by scanning every
+ * PV on the system.
+ */
+ if (!scanned && is_orphan(pv)) {
+ if (!scan_vgs_for_pvs(cmd)) {
+ stack;
+ ret_max = ECMD_FAILED;
+ continue;
+ }
+ scanned = 1;
+ if (!(pv = pv_read(cmd, argv[opt],
+ NULL, NULL, 1))) {
+ log_error("Failed to read "
+ "physical volume "
+ "\"%s\"", argv[opt]);
+ ret_max = ECMD_FAILED;
+ continue;
+ }
+ }
}
ret = process_single(cmd, vg, pv, handle);
More information about the lvm-devel
mailing list