r479 - in lvm2/upstream/current: . daemons/clvmd dmeventd/mirror doc include lib lib/activate lib/cache lib/commands lib/config lib/datastruct lib/device lib/display lib/filters lib/format1 lib/format_text lib/label lib/locking lib/log lib/metadata lib/misc lib/regex lib/report man po scripts tools

Bastian Blank waldi at alioth.debian.org
Fri Jun 22 11:19:15 UTC 2007


Author: waldi
Date: Fri Jun 22 11:19:15 2007
New Revision: 479

Log:
Load into /lvm2/upstream/current.


Added:
   lvm2/upstream/current/daemons/clvmd/clvmd-openais.c
   lvm2/upstream/current/man/pvck.8
   lvm2/upstream/current/tools/pvck.c
Removed:
   lvm2/upstream/current/daemons/clvmd/system-lv.c
   lvm2/upstream/current/daemons/clvmd/system-lv.h
   lvm2/upstream/current/lib/regex/
Modified:
   lvm2/upstream/current/VERSION
   lvm2/upstream/current/WHATS_NEW
   lvm2/upstream/current/daemons/clvmd/Makefile.in
   lvm2/upstream/current/daemons/clvmd/clvmd-cman.c
   lvm2/upstream/current/daemons/clvmd/clvmd-command.c
   lvm2/upstream/current/daemons/clvmd/clvmd-comms.h
   lvm2/upstream/current/daemons/clvmd/clvmd-gulm.c
   lvm2/upstream/current/daemons/clvmd/clvmd.c
   lvm2/upstream/current/daemons/clvmd/clvmd.h
   lvm2/upstream/current/daemons/clvmd/lvm-functions.c
   lvm2/upstream/current/daemons/clvmd/tcp-comms.c
   lvm2/upstream/current/daemons/clvmd/tcp-comms.h
   lvm2/upstream/current/dmeventd/mirror/dmeventd_mirror.c
   lvm2/upstream/current/doc/example.conf
   lvm2/upstream/current/include/.symlinks
   lvm2/upstream/current/lib/Makefile.in
   lvm2/upstream/current/lib/activate/activate.c
   lvm2/upstream/current/lib/activate/dev_manager.c
   lvm2/upstream/current/lib/activate/fs.c
   lvm2/upstream/current/lib/activate/fs.h
   lvm2/upstream/current/lib/cache/lvmcache.c
   lvm2/upstream/current/lib/commands/toolcontext.c
   lvm2/upstream/current/lib/config/config.c
   lvm2/upstream/current/lib/config/config.h
   lvm2/upstream/current/lib/datastruct/lvm-types.h
   lvm2/upstream/current/lib/device/dev-cache.c
   lvm2/upstream/current/lib/device/dev-cache.h
   lvm2/upstream/current/lib/device/dev-io.c
   lvm2/upstream/current/lib/device/device.h
   lvm2/upstream/current/lib/display/display.c
   lvm2/upstream/current/lib/display/display.h
   lvm2/upstream/current/lib/filters/filter-persistent.c
   lvm2/upstream/current/lib/filters/filter-regex.c
   lvm2/upstream/current/lib/filters/filter-sysfs.c
   lvm2/upstream/current/lib/format1/disk-rep.c
   lvm2/upstream/current/lib/format1/format1.c
   lvm2/upstream/current/lib/format1/import-extents.c
   lvm2/upstream/current/lib/format_text/archive.c
   lvm2/upstream/current/lib/format_text/archiver.c
   lvm2/upstream/current/lib/format_text/archiver.h
   lvm2/upstream/current/lib/format_text/export.c
   lvm2/upstream/current/lib/format_text/format-text.c
   lvm2/upstream/current/lib/format_text/format-text.h
   lvm2/upstream/current/lib/format_text/import_vsn1.c
   lvm2/upstream/current/lib/label/label.c
   lvm2/upstream/current/lib/label/label.h
   lvm2/upstream/current/lib/locking/locking.c
   lvm2/upstream/current/lib/locking/locking.h
   lvm2/upstream/current/lib/log/log.h
   lvm2/upstream/current/lib/metadata/metadata.c
   lvm2/upstream/current/lib/metadata/metadata.h
   lvm2/upstream/current/lib/metadata/mirror.c
   lvm2/upstream/current/lib/misc/lib.h
   lvm2/upstream/current/lib/misc/lvm-file.c
   lvm2/upstream/current/lib/misc/lvm-string.c
   lvm2/upstream/current/lib/misc/lvm-string.h
   lvm2/upstream/current/lib/report/report.c
   lvm2/upstream/current/make.tmpl.in
   lvm2/upstream/current/man/Makefile.in
   lvm2/upstream/current/man/lvm.8
   lvm2/upstream/current/man/lvm.conf.5
   lvm2/upstream/current/man/lvs.8
   lvm2/upstream/current/man/vgcfgrestore.8
   lvm2/upstream/current/man/vgrename.8
   lvm2/upstream/current/man/vgs.8
   lvm2/upstream/current/po/lvm2.po
   lvm2/upstream/current/scripts/lvm_dump.sh
   lvm2/upstream/current/tools/Makefile.in
   lvm2/upstream/current/tools/commands.h
   lvm2/upstream/current/tools/lvchange.c
   lvm2/upstream/current/tools/lvconvert.c
   lvm2/upstream/current/tools/lvcreate.c
   lvm2/upstream/current/tools/lvmcmdline.c
   lvm2/upstream/current/tools/lvmdiskscan.c
   lvm2/upstream/current/tools/lvrename.c
   lvm2/upstream/current/tools/lvresize.c
   lvm2/upstream/current/tools/pvchange.c
   lvm2/upstream/current/tools/pvcreate.c
   lvm2/upstream/current/tools/pvdisplay.c
   lvm2/upstream/current/tools/pvmove.c
   lvm2/upstream/current/tools/pvremove.c
   lvm2/upstream/current/tools/pvresize.c
   lvm2/upstream/current/tools/pvscan.c
   lvm2/upstream/current/tools/reporter.c
   lvm2/upstream/current/tools/toollib.c
   lvm2/upstream/current/tools/toollib.h
   lvm2/upstream/current/tools/vgcfgrestore.c
   lvm2/upstream/current/tools/vgconvert.c
   lvm2/upstream/current/tools/vgextend.c
   lvm2/upstream/current/tools/vgmerge.c
   lvm2/upstream/current/tools/vgreduce.c
   lvm2/upstream/current/tools/vgremove.c
   lvm2/upstream/current/tools/vgrename.c
   lvm2/upstream/current/tools/vgsplit.c

Modified: lvm2/upstream/current/VERSION
==============================================================================
--- lvm2/upstream/current/VERSION	(original)
+++ lvm2/upstream/current/VERSION	Fri Jun 22 11:19:15 2007
@@ -1 +1 @@
-2.02.24 (2007-03-19)
+2.02.26 (2007-06-15)

Modified: lvm2/upstream/current/WHATS_NEW
==============================================================================
--- lvm2/upstream/current/WHATS_NEW	(original)
+++ lvm2/upstream/current/WHATS_NEW	Fri Jun 22 11:19:15 2007
@@ -1,3 +1,54 @@
+Version 2.02.26 - 15th June 2007
+================================
+  Update vgcfgrestore man page.
+  Allow keyboard interrupt during user prompts when appropriate.
+  Remove unused clvmd system-lv code.
+  Replace many physical_volume struct dereferences with new get_pv_* functions.
+  Suppress a benign compile-time warning.
+  Convert find_pv_in_vg_by_uuid and pv_create to use PV handles.
+  Add wrappers to some functions in preparation for external LVM library.
+  Add -f to vgcfgrestore to list metadata backup files.
+  Add vg_check_status to consolidate vg status checks and error messages.
+  Add pvdisplay --maps implementation.
+  Remove unsupported LVM1 options from vgcfgrestore man page.
+  Update vgcfgrestore man page to show mandatory VG name.
+  Update vgrename man page to include UUID and be consistent with lvrename.
+  Add (experimental) OpenAIS support to clvmd.
+  Fix deactivation code to follow dependencies and remove symlinks.
+  Fix and clarify vgsplit error messages.
+  Fix a segfault in device_is_usable() if a device has no table.
+  Add some more debug messages to clvmd startup.
+  Misc clvmd cleanups.
+
+Version 2.02.25 - 27th April 2007
+=================================
+  Fix get_config_uint64() to read a 64-bit value not a 32-bit one.
+  Add -Wformat-security and change one fprintf() to fputs().
+  Move regex functions into libdevmapper.
+  Change some #include lines to search only standard system directories.
+  Add devices/preferred_names config regex list for displayed device names.
+  Free a temporary dir string in fcntl_lock_file() after use.
+  Fix a dm_pool_destroy() in matcher_create().
+  Introduce goto_bad macro.
+  Fix warnings on x86_64 involving ptrdiff_t in log_error messages.
+  Update pvck to include text metadata area and record detection.
+  Add support functions for token counting in config file extracts.
+  Update pvck to read labels on disk, with --labelsector parameter.
+  Add count_chars and count_chars_len functions.
+  Add /sys/block listings to lvm_dump.sh.
+  Make lvm_dump.sh list /dev recursively.
+  Fix thread race in clvmd.
+  Add scan_sector param to label_read and _find_labeller.
+  Make clvmd cope with quorum devices.
+  Add extra internal error checking to clvmd.
+  Add dev_read_circular.
+  Add pvck command stub.
+  Update lists of attribute characters in man pages.
+  Change cling alloc policy attribute character from 'C' to l'.
+  Fix creation and conversion of mirrors with tags.
+  Fix vgsplit for lvm1 format (set and validate VG name in PVs metadata).
+  Split metadata areas in vgsplit properly.
+
 Version 2.02.24 - 19th March 2007
 =================================
   Fix processing of exit status in init scripts

Modified: lvm2/upstream/current/daemons/clvmd/Makefile.in
==============================================================================
--- lvm2/upstream/current/daemons/clvmd/Makefile.in	(original)
+++ lvm2/upstream/current/daemons/clvmd/Makefile.in	Fri Jun 22 11:19:15 2007
@@ -19,8 +19,7 @@
 	clvmd-command.c  \
 	clvmd.c          \
 	lvm-functions.c  \
-	refresh_clvmd.c \
-	system-lv.c
+	refresh_clvmd.c
 
 ifeq ("@CLVMD@", "gulm")
 	GULM = yes
@@ -30,9 +29,16 @@
 	CMAN = yes
 endif
 
+ifeq ("@CLVMD@", "openais")
+	OPENAIS = yes
+	GULM = no
+	CMAN = no
+endif
+
 ifeq ("@CLVMD@", "all")
 	GULM = yes
 	CMAN = yes
+	OPENAIS = no
 endif
 
 ifeq ("@DEBUG@", "yes")
@@ -51,6 +57,12 @@
 	DEFS += -DUSE_CMAN
 endif
 
+ifeq ("$(OPENAIS)", "yes")
+	SOURCES += clvmd-openais.c
+	LMLIBS += -lSaLck -lSaClm -lcpg
+	DEFS += -DUSE_OPENAIS
+endif
+
 TARGETS = \
 	clvmd
 

Modified: lvm2/upstream/current/daemons/clvmd/clvmd-cman.c
==============================================================================
--- lvm2/upstream/current/daemons/clvmd/clvmd-cman.c	(original)
+++ lvm2/upstream/current/daemons/clvmd/clvmd-cman.c	Fri Jun 22 11:19:15 2007
@@ -36,10 +36,10 @@
 #include <fcntl.h>
 #include <getopt.h>
 #include <errno.h>
+#include <libdlm.h>
 
 #include "clvmd-comms.h"
 #include "clvm.h"
-#include "libdlm.h"
 #include "log.h"
 #include "clvmd.h"
 #include "lvm-functions.h"
@@ -58,7 +58,7 @@
 
 static void count_clvmds_running(void);
 static void get_members(void);
-static int nodeid_from_csid(char *csid);
+static int nodeid_from_csid(const char *csid);
 static int name_from_nodeid(int nodeid, char *name);
 static void event_callback(cman_handle_t handle, void *private, int reason, int arg);
 static void data_callback(cman_handle_t handle, void *private,
@@ -78,6 +78,7 @@
 		syslog(LOG_ERR, "Can't open cluster manager socket: %m");
 		return -1;
 	}
+	DEBUGLOG("Connected to CMAN\n");
 
 	if (cman_start_recv_data(c_handle, data_callback, CLUSTER_PORT_CLVMD)) {
 		syslog(LOG_ERR, "Can't bind cluster socket: %m");
@@ -93,6 +94,8 @@
 	get_members();
 	count_clvmds_running();
 
+	DEBUGLOG("CMAN initialisation complete\n");
+
 	/* Create a lockspace for LV & VG locks to live in */
 	lockspace = dlm_create_lockspace(LOCKSPACE_NAME, 0600);
 	if (!lockspace) {
@@ -100,7 +103,7 @@
 		return -1;
 	}
 	dlm_ls_pthread_init(lockspace);
-
+	DEBUGLOG("DLM initialisation complete\n");
 	return 0;
 }
 
@@ -121,14 +124,15 @@
 
 	/* return number of ACTIVE nodes */
 	for (i=0; i<num_nodes; i++) {
-		if (nodes[i].cn_member)
+		if (nodes[i].cn_member && nodes[i].cn_nodeid)
 			nnodes++;
 	}
 	return nnodes;
 }
 
 /* send_message with the fd check removed */
-static int _cluster_send_message(void *buf, int msglen, char *csid, const char *errtext)
+static int _cluster_send_message(const void *buf, int msglen, const char *csid,
+				 const char *errtext)
 {
 	int nodeid = 0;
 
@@ -137,7 +141,7 @@
 
 	if (cman_send_data(c_handle, buf, msglen, 0, CLUSTER_PORT_CLVMD, nodeid) <= 0)
 	{
-		log_error(errtext);
+		log_error("%s", errtext);
 	}
 	return msglen;
 }
@@ -152,14 +156,15 @@
 
 /* Call a callback routine for each node is that known (down means not running a clvmd) */
 static int _cluster_do_node_callback(struct local_client *client,
-				     void (*callback) (struct local_client *, char *,
+				     void (*callback) (struct local_client *,
+						       const char *,
 						       int))
 {
 	int i;
 	int somedown = 0;
 
 	for (i = 0; i < _get_num_nodes(); i++) {
-		if (nodes[i].cn_member) {
+		if (nodes[i].cn_member && nodes[i].cn_nodeid) {
 			callback(client, (char *)&nodes[i].cn_nodeid, node_updown[nodes[i].cn_nodeid]);
 			if (!node_updown[nodes[i].cn_nodeid])
 				somedown = -1;
@@ -168,8 +173,7 @@
 	return somedown;
 }
 
-/* Process OOB message from the cluster socket,
-   this currently just means that a node has stopped listening on our port */
+/* Process OOB messages from the cluster socket */
 static void event_callback(cman_handle_t handle, void *private, int reason, int arg)
 {
 	char namebuf[MAX_CLUSTER_MEMBER_NAME_LEN];
@@ -206,7 +210,8 @@
 }
 
 static struct local_client *cman_client;
-static int _cluster_fd_callback(struct local_client *fd, char *buf, int len, char *csid,
+static int _cluster_fd_callback(struct local_client *fd, char *buf, int len,
+				const char *csid,
 				struct local_client **new_client)
 {
 
@@ -229,7 +234,7 @@
 	process_message(cman_client, buf, len, (char *)&nodeid);
 }
 
-static void _add_up_node(char *csid)
+static void _add_up_node(const char *csid)
 {
 	/* It's up ! */
 	int nodeid = nodeid_from_csid(csid);
@@ -321,17 +326,16 @@
 	}
 
 	if (node_updown == NULL) {
-		node_updown =
-			(int *) malloc(sizeof(int) *
-				       max(num_nodes, max_updown_nodes));
-		memset(node_updown, 0,
-		       sizeof(int) * max(num_nodes, max_updown_nodes));
+		size_t buf_len = sizeof(int) * max(num_nodes, max_updown_nodes);
+		node_updown = malloc(buf_len);
+		if (node_updown)
+			memset(node_updown, 0, buf_len);
 	}
 }
 
 
 /* Convert a node name to a CSID */
-static int _csid_from_name(char *csid, char *name)
+static int _csid_from_name(char *csid, const char *name)
 {
 	int i;
 
@@ -345,7 +349,7 @@
 }
 
 /* Convert a CSID to a node name */
-static int _name_from_csid(char *csid, char *name)
+static int _name_from_csid(const char *csid, char *name)
 {
 	int i;
 
@@ -377,7 +381,7 @@
 }
 
 /* Convert a CSID to a node ID */
-static int nodeid_from_csid(char *csid)
+static int nodeid_from_csid(const char *csid)
 {
         int nodeid;
 

Modified: lvm2/upstream/current/daemons/clvmd/clvmd-command.c
==============================================================================
--- lvm2/upstream/current/daemons/clvmd/clvmd-command.c	(original)
+++ lvm2/upstream/current/daemons/clvmd/clvmd-command.c	Fri Jun 22 11:19:15 2007
@@ -64,8 +64,9 @@
 #include <stddef.h>
 #include <unistd.h>
 #include <errno.h>
+#include <libdevmapper.h>
+#include <libdlm.h>
 
-#include "libdevmapper.h"
 #include "list.h"
 #include "locking.h"
 #include "log.h"
@@ -73,7 +74,6 @@
 #include "clvmd-comms.h"
 #include "clvm.h"
 #include "clvmd.h"
-#include "libdlm.h"
 
 extern struct cluster_ops *clops;
 
@@ -95,13 +95,22 @@
 		/* Just a test message */
 	case CLVMD_CMD_TEST:
 		if (arglen > buflen) {
+			char *new_buf;
 			buflen = arglen + 200;
-			*buf = realloc(*buf, buflen);
+			new_buf = realloc(*buf, buflen);
+			if (new_buf == NULL) {
+				status = errno;
+				free (*buf);
+			}
+			*buf = new_buf;
+		}
+		if (*buf) {
+			uname(&nodeinfo);
+			*retlen = 1 + snprintf(*buf, buflen,
+					       "TEST from %s: %s v%s",
+					       nodeinfo.nodename, args,
+					       nodeinfo.release);
 		}
-		uname(&nodeinfo);
-		*retlen = 1 + snprintf(*buf, buflen, "TEST from %s: %s v%s",
-				       nodeinfo.nodename, args,
-				       nodeinfo.release);
 		break;
 
 	case CLVMD_CMD_LOCK_VG:
@@ -118,7 +127,7 @@
 		/* Replace EIO with something less scary */
 		if (status == EIO) {
 			*retlen =
-			    1 + snprintf(*buf, buflen,
+			    1 + snprintf(*buf, buflen, "%s",
 					 get_last_lvm_error());
 			return EIO;
 		}
@@ -131,7 +140,7 @@
 	case CLVMD_CMD_GET_CLUSTERNAME:
 		status = clops->get_cluster_name(*buf, buflen);
 		if (!status)
-			*retlen = strlen(*buf);
+			*retlen = strlen(*buf)+1;
 		break;
 
 	default:
@@ -141,7 +150,7 @@
 
 	/* Check the status of the command and return the error text */
 	if (status) {
-		*retlen = 1 + snprintf(*buf, buflen, strerror(status));
+		*retlen = 1 + snprintf(*buf, buflen, "%s", strerror(status));
 	}
 
 	return status;

Modified: lvm2/upstream/current/daemons/clvmd/clvmd-comms.h
==============================================================================
--- lvm2/upstream/current/daemons/clvmd/clvmd-comms.h	(original)
+++ lvm2/upstream/current/daemons/clvmd/clvmd-comms.h	Fri Jun 22 11:19:15 2007
@@ -25,27 +25,31 @@
 struct cluster_ops {
 	void (*cluster_init_completed) (void);
 
-	int (*cluster_send_message) (void *buf, int msglen, char *csid,
-				const char *errtext);
-	int (*name_from_csid) (char *csid, char *name);
-	int (*csid_from_name) (char *csid, char *name);
+	int (*cluster_send_message) (const void *buf, int msglen,
+				     const char *csid,
+				     const char *errtext);
+	int (*name_from_csid) (const char *csid, char *name);
+	int (*csid_from_name) (char *csid, const char *name);
 	int (*get_num_nodes) (void);
 	int (*cluster_fd_callback) (struct local_client *fd, char *buf, int len,
-			       char *csid, struct local_client **new_client);
+				    const char *csid,
+				    struct local_client **new_client);
 	int (*get_main_cluster_fd) (void);	/* gets accept FD or cman cluster socket */
 	int (*cluster_do_node_callback) (struct local_client *client,
-				    void (*callback) (struct local_client *,
-						      char *csid, int node_up));
+					 void (*callback) (struct local_client *,
+							   const char *csid,
+							   int node_up));
 	int (*is_quorate) (void);
 
 	void (*get_our_csid) (char *csid);
-	void (*add_up_node) (char *csid);
+	void (*add_up_node) (const char *csid);
 	void (*reread_config) (void);
 	void (*cluster_closedown) (void);
 
 	int (*get_cluster_name)(char *buf, int buflen);
 
-	int (*sync_lock) (const char *resource, int mode, int flags, int *lockid);
+	int (*sync_lock) (const char *resource, int mode,
+			  int flags, int *lockid);
 	int (*sync_unlock) (const char *resource, int lockid);
 
 };
@@ -71,6 +75,23 @@
 struct cluster_ops *init_cman_cluster(void);
 #endif
 
+#ifdef USE_OPENAIS
+#  include <openais/saAis.h>
+#  include <openais/totem/totem.h>
+#  define OPENAIS_CSID_LEN (sizeof(int))
+#  define OPENAIS_MAX_CLUSTER_MESSAGE         MESSAGE_SIZE_MAX
+#  define OPENAIS_MAX_CLUSTER_MEMBER_NAME_LEN SA_MAX_NAME_LENGTH
+#  ifndef MAX_CLUSTER_MEMBER_NAME_LEN
+#    define MAX_CLUSTER_MEMBER_NAME_LEN       SA_MAX_NAME_LENGTH
+#  endif
+#  ifndef CMAN_MAX_CLUSTER_MESSAGE
+#    define CMAN_MAX_CLUSTER_MESSAGE          MESSAGE_SIZE_MAX
+#  endif
+#  ifndef MAX_CSID_LEN
+#    define MAX_CSID_LEN sizeof(int)
+#  endif
+struct cluster_ops *init_openais_cluster(void);
+#endif
 
 
 #endif

Modified: lvm2/upstream/current/daemons/clvmd/clvmd-gulm.c
==============================================================================
--- lvm2/upstream/current/daemons/clvmd/clvmd-gulm.c	(original)
+++ lvm2/upstream/current/daemons/clvmd/clvmd-gulm.c	Fri Jun 22 11:19:15 2007
@@ -40,9 +40,10 @@
 #include <utmpx.h>
 #include <syslog.h>
 #include <assert.h>
+#include <libdevmapper.h>
+#include <ccs.h>
+#include <libgulm.h>
 
-#include "libdevmapper.h"
-#include "ccs.h"
 #include "list.h"
 #include "locking.h"
 #include "log.h"
@@ -51,7 +52,6 @@
 #include "lvm-functions.h"
 #include "clvmd.h"
 #include "clvmd-gulm.h"
-#include "libgulm.h"
 
 /* Hash list of nodes in the cluster */
 static struct dm_hash_table *node_hash;

Added: lvm2/upstream/current/daemons/clvmd/clvmd-openais.c
==============================================================================
--- (empty file)
+++ lvm2/upstream/current/daemons/clvmd/clvmd-openais.c	Fri Jun 22 11:19:15 2007
@@ -0,0 +1,756 @@
+/******************************************************************************
+*******************************************************************************
+**
+**  Copyright (C) 2007 Red Hat, Inc. All rights reserved.
+**
+*******************************************************************************
+******************************************************************************/
+
+/* This provides the interface between clvmd and OpenAIS as the cluster
+ * and lock manager.
+ *
+ */
+
+#include <pthread.h>
+#include <sys/types.h>
+#include <sys/utsname.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/file.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <errno.h>
+#include <utmpx.h>
+#include <syslog.h>
+#include <assert.h>
+#include <libdevmapper.h>
+
+#include <openais/saAis.h>
+#include <openais/saLck.h>
+#include <openais/saClm.h>
+#include <openais/cpg.h>
+
+#include "list.h"
+#include "locking.h"
+#include "log.h"
+#include "clvm.h"
+#include "clvmd-comms.h"
+#include "lvm-functions.h"
+#include "clvmd.h"
+
+/* Timeout value for several openais calls */
+#define TIMEOUT 10
+
+static void lck_lock_callback(SaInvocationT invocation,
+			      SaLckLockStatusT lockStatus,
+			      SaAisErrorT error);
+static void lck_unlock_callback(SaInvocationT invocation,
+				SaAisErrorT error);
+static void cpg_deliver_callback (cpg_handle_t handle,
+				  struct cpg_name *groupName,
+				  uint32_t nodeid,
+				  uint32_t pid,
+				  void *msg,
+				  int msg_len);
+static void cpg_confchg_callback(cpg_handle_t handle,
+				 struct cpg_name *groupName,
+				 struct cpg_address *member_list, int member_list_entries,
+				 struct cpg_address *left_list, int left_list_entries,
+				 struct cpg_address *joined_list, int joined_list_entries);
+static void _cluster_closedown(void);
+
+/* Hash list of nodes in the cluster */
+static struct dm_hash_table *node_hash;
+
+/* For associating lock IDs & resource handles */
+static struct dm_hash_table *lock_hash;
+
+/* Number of active nodes */
+static int num_nodes;
+static unsigned int our_nodeid;
+
+static struct local_client *cluster_client;
+
+/* OpenAIS handles */
+static cpg_handle_t cpg_handle;
+static SaLckHandleT lck_handle;
+
+static struct cpg_name cpg_group_name;
+
+/* Openais callback structs */
+cpg_callbacks_t cpg_callbacks = {
+	.cpg_deliver_fn =            cpg_deliver_callback,
+	.cpg_confchg_fn =            cpg_confchg_callback,
+};
+
+SaLckCallbacksT lck_callbacks = {
+        .saLckLockGrantCallback      = lck_lock_callback,
+        .saLckResourceUnlockCallback = lck_unlock_callback
+};
+
+/* We only call Clm to get our node id */
+SaClmCallbacksT clm_callbacks;
+
+struct node_info
+{
+	enum {NODE_UNKNOWN, NODE_DOWN, NODE_UP, NODE_CLVMD} state;
+	int nodeid;
+};
+
+struct lock_info
+{
+	SaLckResourceHandleT res_handle;
+	SaLckLockIdT         lock_id;
+	SaNameT              lock_name;
+};
+
+struct lock_wait
+{
+	pthread_cond_t cond;
+	pthread_mutex_t mutex;
+	int status;
+};
+
+/* Set errno to something approximating the right value and return 0 or -1 */
+static int ais_to_errno(SaAisErrorT err)
+{
+	switch(err)
+	{
+	case SA_AIS_OK:
+		return 0;
+        case SA_AIS_ERR_LIBRARY:
+		errno = EINVAL;
+		break;
+        case SA_AIS_ERR_VERSION:
+		errno = EINVAL;
+		break;
+        case SA_AIS_ERR_INIT:
+		errno = EINVAL;
+		break;
+        case SA_AIS_ERR_TIMEOUT:
+		errno = ETIME;
+		break;
+        case SA_AIS_ERR_TRY_AGAIN:
+		errno = EAGAIN;
+		break;
+        case SA_AIS_ERR_INVALID_PARAM:
+		errno = EINVAL;
+		break;
+        case SA_AIS_ERR_NO_MEMORY:
+		errno = ENOMEM;
+		break;
+        case SA_AIS_ERR_BAD_HANDLE:
+		errno = EINVAL;
+		break;
+        case SA_AIS_ERR_BUSY:
+		errno = EBUSY;
+		break;
+        case SA_AIS_ERR_ACCESS:
+		errno = EPERM;
+		break;
+        case SA_AIS_ERR_NOT_EXIST:
+		errno = ENOENT;
+		break;
+        case SA_AIS_ERR_NAME_TOO_LONG:
+		errno = ENAMETOOLONG;
+		break;
+        case SA_AIS_ERR_EXIST:
+		errno = EEXIST;
+		break;
+        case SA_AIS_ERR_NO_SPACE:
+		errno = ENOSPC;
+		break;
+        case SA_AIS_ERR_INTERRUPT:
+		errno = EINTR;
+		break;
+	case SA_AIS_ERR_NAME_NOT_FOUND:
+		errno = ENOENT;
+		break;
+        case SA_AIS_ERR_NO_RESOURCES:
+		errno = ENOMEM;
+		break;
+        case SA_AIS_ERR_NOT_SUPPORTED:
+		errno = EOPNOTSUPP;
+		break;
+        case SA_AIS_ERR_BAD_OPERATION:
+		errno = EINVAL;
+		break;
+        case SA_AIS_ERR_FAILED_OPERATION:
+		errno = EIO;
+		break;
+        case SA_AIS_ERR_MESSAGE_ERROR:
+		errno = EIO;
+		break;
+        case SA_AIS_ERR_QUEUE_FULL:
+		errno = EXFULL;
+		break;
+        case SA_AIS_ERR_QUEUE_NOT_AVAILABLE:
+		errno = EINVAL;
+		break;
+        case SA_AIS_ERR_BAD_FLAGS:
+		errno = EINVAL;
+		break;
+        case SA_AIS_ERR_TOO_BIG:
+		errno = E2BIG;
+		break;
+        case SA_AIS_ERR_NO_SECTIONS:
+		errno = ENOMEM;
+		break;
+	default:
+		errno = EINVAL;
+		break;
+	}
+	return -1;
+}
+
+static char *print_csid(const char *csid)
+{
+	static char buf[128];
+	int id;
+
+	memcpy(&id, csid, sizeof(int));
+	sprintf(buf, "%d", id);
+	return buf;
+}
+
+static int add_internal_client(int fd, fd_callback_t callback)
+{
+	struct local_client *client;
+
+	DEBUGLOG("Add_internal_client, fd = %d\n", fd);
+
+	client = malloc(sizeof(struct local_client));
+	if (!client)
+	{
+		DEBUGLOG("malloc failed\n");
+		return -1;
+	}
+
+	memset(client, 0, sizeof(struct local_client));
+	client->fd = fd;
+	client->type = CLUSTER_INTERNAL;
+	client->callback = callback;
+	add_client(client);
+
+	/* Set Close-on-exec */
+	fcntl(fd, F_SETFD, 1);
+
+	return 0;
+}
+
+static void cpg_deliver_callback (cpg_handle_t handle,
+				  struct cpg_name *groupName,
+				  uint32_t nodeid,
+				  uint32_t pid,
+				  void *msg,
+				  int msg_len)
+{
+	int target_nodeid;
+
+	memcpy(&target_nodeid, msg, OPENAIS_CSID_LEN);
+
+	DEBUGLOG("Got message from nodeid %d for %d. len %d\n",
+		 nodeid, target_nodeid, msg_len-4);
+
+	if (target_nodeid == our_nodeid)
+		process_message(cluster_client, (char *)msg+OPENAIS_CSID_LEN,
+				msg_len-OPENAIS_CSID_LEN, (char*)&nodeid);
+}
+
+static void cpg_confchg_callback(cpg_handle_t handle,
+				 struct cpg_name *groupName,
+				 struct cpg_address *member_list, int member_list_entries,
+				 struct cpg_address *left_list, int left_list_entries,
+				 struct cpg_address *joined_list, int joined_list_entries)
+{
+	int i;
+	struct node_info *ninfo;
+
+	DEBUGLOG("confchg callback. %d joined, %d left, %d members\n",
+		 joined_list_entries, left_list_entries, member_list_entries);
+
+	for (i=0; i<joined_list_entries; i++) {
+		ninfo = dm_hash_lookup_binary(node_hash,
+					      (char *)&joined_list[i].nodeid,
+					      OPENAIS_CSID_LEN);
+		if (!ninfo) {
+			ninfo = malloc(sizeof(struct node_info));
+			if (!ninfo) {
+				break;
+			}
+			else {
+				ninfo->nodeid = joined_list[i].nodeid;
+				dm_hash_insert_binary(node_hash,
+						      (char *)&ninfo->nodeid,
+						      OPENAIS_CSID_LEN, ninfo);
+			}
+		}
+		ninfo->state = NODE_CLVMD;
+	}
+
+	for (i=0; i<left_list_entries; i++) {
+		ninfo = dm_hash_lookup_binary(node_hash,
+					      (char *)&left_list[i].nodeid,
+					      OPENAIS_CSID_LEN);
+		if (ninfo)
+			ninfo->state = NODE_DOWN;
+	}
+
+	num_nodes = joined_list_entries;
+}
+
+static void lck_lock_callback(SaInvocationT invocation,
+			      SaLckLockStatusT lockStatus,
+			      SaAisErrorT error)
+{
+	struct lock_wait *lwait = (struct lock_wait *)(long)invocation;
+
+	DEBUGLOG("lck_lock_callback, error = %d\n", error);
+
+	lwait->status = error;
+	pthread_mutex_lock(&lwait->mutex);
+	pthread_cond_signal(&lwait->cond);
+	pthread_mutex_unlock(&lwait->mutex);
+}
+
+static void lck_unlock_callback(SaInvocationT invocation,
+				SaAisErrorT error)
+{
+	struct lock_wait *lwait = (struct lock_wait *)(long)invocation;
+
+	DEBUGLOG("lck_unlock_callback\n");
+
+	lwait->status = SA_AIS_OK;
+	pthread_mutex_lock(&lwait->mutex);
+	pthread_cond_signal(&lwait->cond);
+	pthread_mutex_unlock(&lwait->mutex);
+}
+
+static int lck_dispatch(struct local_client *client, char *buf, int len,
+			const char *csid, struct local_client **new_client)
+{
+	*new_client = NULL;
+	saLckDispatch(lck_handle, SA_DISPATCH_ONE);
+	return 1;
+}
+
+static int _init_cluster(void)
+{
+	SaAisErrorT err;
+	SaVersionT  ver = { 'B', 1, 1 };
+	SaClmHandleT clm_handle;
+	int select_fd;
+	SaClmClusterNodeT cluster_node;
+
+	node_hash = dm_hash_create(100);
+	lock_hash = dm_hash_create(10);
+
+	err = cpg_initialize(&cpg_handle,
+			     &cpg_callbacks);
+	if (err != SA_AIS_OK) {
+		syslog(LOG_ERR, "Cannot initialise OpenAIS CPG service: %d",
+		       err);
+		DEBUGLOG("Cannot initialise OpenAIS CPG service: %d", err);
+		return ais_to_errno(err);
+	}
+
+	err = saLckInitialize(&lck_handle,
+			      &lck_callbacks,
+			      &ver);
+	if (err != SA_AIS_OK) {
+		cpg_initialize(&cpg_handle, &cpg_callbacks);
+		syslog(LOG_ERR, "Cannot initialise OpenAIS lock service: %d",
+		       err);
+		DEBUGLOG("Cannot initialise OpenAIS lock service: %d\n\n", err);
+		return ais_to_errno(err);
+	}
+
+	/* Connect to the clvmd group */
+	strcpy((char *)cpg_group_name.value, "clvmd");
+	cpg_group_name.length = strlen((char *)cpg_group_name.value);
+	err = cpg_join(cpg_handle, &cpg_group_name);
+	if (err != SA_AIS_OK) {
+		cpg_finalize(cpg_handle);
+		saLckFinalize(lck_handle);
+		syslog(LOG_ERR, "Cannot join clvmd process group");
+		DEBUGLOG("Cannot join clvmd process group\n");
+		return ais_to_errno(err);
+	}
+
+	/* A brief foray into Clm to get our node id */
+	err = saClmInitialize(&clm_handle, &clm_callbacks, &ver);
+	if (err != SA_AIS_OK) {
+		syslog(LOG_ERR, "Could not initialize OpenAIS membership service %d\n", err);
+		DEBUGLOG("Could not initialize OpenAIS Membership service %d\n", err);
+		return ais_to_errno(err);
+	}
+
+	err = saClmClusterNodeGet(clm_handle,
+				  SA_CLM_LOCAL_NODE_ID,
+				  TIMEOUT,
+				  &cluster_node);
+	if (err != SA_AIS_OK) {
+		cpg_finalize(cpg_handle);
+		saLckFinalize(lck_handle);
+		saClmFinalize(clm_handle);
+		syslog(LOG_ERR, "Cannot get local node id\n");
+		return ais_to_errno(err);
+	}
+	saClmFinalize(clm_handle);
+	our_nodeid = cluster_node.nodeId;
+	DEBUGLOG("Our local node id is %d\n", our_nodeid);
+
+	saLckSelectionObjectGet(lck_handle, (SaSelectionObjectT *)&select_fd);
+	add_internal_client(select_fd, lck_dispatch);
+
+	DEBUGLOG("Connected to OpenAIS\n");
+
+	return 0;
+}
+
+static void _cluster_closedown(void)
+{
+	DEBUGLOG("cluster_closedown\n");
+	unlock_all();
+
+	saLckFinalize(lck_handle);
+	cpg_inalize(cpg_handle);
+}
+
+static void _get_our_csid(char *csid)
+{
+	memcpy(csid, &our_nodeid, sizeof(int));
+}
+
+/* OpenAIS doesn't really have nmode names so we
+   just use the node ID in hex instead */
+static int _csid_from_name(char *csid, const char *name)
+{
+	int nodeid;
+	struct node_info *ninfo;
+
+	if (sscanf(name, "%x", &nodeid) == 1) {
+		ninfo = dm_hash_lookup_binary(node_hash, csid, OPENAIS_CSID_LEN);
+		if (ninfo)
+			return nodeid;
+	}
+	return -1;
+}
+
+static int _name_from_csid(const char *csid, char *name)
+{
+	struct node_info *ninfo;
+
+	ninfo = dm_hash_lookup_binary(node_hash, csid, OPENAIS_CSID_LEN);
+	if (!ninfo)
+	{
+		sprintf(name, "UNKNOWN %s", print_csid(csid));
+		return -1;
+	}
+
+	sprintf(name, "%x", ninfo->nodeid);
+	return 0;
+}
+
+static int _get_num_nodes()
+{
+	DEBUGLOG("num_nodes = %d\n", num_nodes);
+	return num_nodes;
+}
+
+/* Node is now known to be running a clvmd */
+static void _add_up_node(const char *csid)
+{
+	struct node_info *ninfo;
+
+	ninfo = dm_hash_lookup_binary(node_hash, csid, OPENAIS_CSID_LEN);
+	if (!ninfo) {
+		DEBUGLOG("openais_add_up_node no node_hash entry for csid %s\n",
+			 print_csid(csid));
+		return;
+	}
+
+	DEBUGLOG("openais_add_up_node %d\n", ninfo->nodeid);
+
+	ninfo->state = NODE_CLVMD;
+
+	return;
+}
+
+/* Call a callback for each node, so the caller knows whether it's up or down */
+static int _cluster_do_node_callback(struct local_client *master_client,
+				     void (*callback)(struct local_client *,
+						      const char *csid, int node_up))
+{
+	struct dm_hash_node *hn;
+	struct node_info *ninfo;
+
+	dm_hash_iterate(hn, node_hash)
+	{
+		char csid[OPENAIS_CSID_LEN];
+
+		ninfo = dm_hash_get_data(node_hash, hn);
+		memcpy(csid, dm_hash_get_key(node_hash, hn), OPENAIS_CSID_LEN);
+
+		DEBUGLOG("down_callback. node %d, state = %d\n", ninfo->nodeid,
+			 ninfo->state);
+
+		if (ninfo->state != NODE_DOWN)
+			callback(master_client, csid, ninfo->state == NODE_CLVMD);
+	}
+	return 0;
+}
+
+/* Real locking */
+static int _lock_resource(char *resource, int mode, int flags, int *lockid)
+{
+	struct lock_wait lwait;
+	struct lock_info *linfo;
+	SaLckResourceHandleT res_handle;
+	SaAisErrorT err;
+	SaLckLockIdT lock_id;
+
+	pthread_cond_init(&lwait.cond, NULL);
+	pthread_mutex_init(&lwait.mutex, NULL);
+	pthread_mutex_lock(&lwait.mutex);
+
+	/* This needs to be converted from DLM/LVM2 value for OpenAIS LCK */
+	if (flags & LCK_NONBLOCK) flags = SA_LCK_LOCK_NO_QUEUE;
+
+	linfo = malloc(sizeof(struct lock_info));
+	if (!linfo)
+		return -1;
+
+	DEBUGLOG("lock_resource '%s', flags=%d, mode=%d\n", resource, flags, mode);
+
+	linfo->lock_name.length = strlen(resource)+1;
+	strcpy((char *)linfo->lock_name.value, resource);
+
+	err = saLckResourceOpen(lck_handle, &linfo->lock_name,
+				SA_LCK_RESOURCE_CREATE, TIMEOUT, &res_handle);
+	if (err != SA_AIS_OK)
+	{
+		DEBUGLOG("ResourceOpen returned %d\n", err);
+		free(linfo);
+		return ais_to_errno(err);
+	}
+
+	err = saLckResourceLockAsync(res_handle,
+				     (SaInvocationT)(long)&lwait,
+				     &lock_id,
+				     mode,
+				     flags,
+				     0);
+	if (err != SA_AIS_OK)
+	{
+		free(linfo);
+		saLckResourceClose(res_handle);
+		return ais_to_errno(err);
+	}
+
+	/* Wait for it to complete */
+	pthread_cond_wait(&lwait.cond, &lwait.mutex);
+	pthread_mutex_unlock(&lwait.mutex);
+
+	DEBUGLOG("lock_resource returning %d, lock_id=%llx\n", lwait.status,
+		 lock_id);
+
+	linfo->lock_id = lock_id;
+	linfo->res_handle = res_handle;
+
+	dm_hash_insert(lock_hash, resource, linfo);
+
+	return ais_to_errno(lwait.status);
+}
+
+
+static int _unlock_resource(char *resource, int lockid)
+{
+	struct lock_wait lwait;
+	SaAisErrorT err;
+	struct lock_info *linfo;
+
+	pthread_cond_init(&lwait.cond, NULL);
+	pthread_mutex_init(&lwait.mutex, NULL);
+	pthread_mutex_lock(&lwait.mutex);
+
+	DEBUGLOG("unlock_resource %s\n", resource);
+	linfo = dm_hash_lookup(lock_hash, resource);
+	if (!linfo)
+		return 0;
+
+	DEBUGLOG("unlock_resource: lockid: %llx\n", linfo->lock_id);
+	err = saLckResourceUnlockAsync((SaInvocationT)(long)&lwait, linfo->lock_id);
+	if (err != SA_AIS_OK)
+	{
+		DEBUGLOG("Unlock returned %d\n", err);
+		return ais_to_errno(err);
+	}
+
+	/* Wait for it to complete */
+	pthread_cond_wait(&lwait.cond, &lwait.mutex);
+	pthread_mutex_unlock(&lwait.mutex);
+
+	/* Release the resource */
+	dm_hash_remove(lock_hash, resource);
+	saLckResourceClose(linfo->res_handle);
+	free(linfo);
+
+	return ais_to_errno(lwait.status);
+}
+
+static int _sync_lock(const char *resource, int mode, int flags, int *lockid)
+{
+	int status;
+	char lock1[strlen(resource)+3];
+	char lock2[strlen(resource)+3];
+
+	snprintf(lock1, sizeof(lock1), "%s-1", resource);
+	snprintf(lock2, sizeof(lock2), "%s-2", resource);
+
+	switch (mode)
+	{
+	case LCK_EXCL:
+		status = _lock_resource(lock1, SA_LCK_EX_LOCK_MODE, flags, lockid);
+		if (status)
+			goto out;
+
+		/* If we can't get this lock too then bail out */
+		status = _lock_resource(lock2, SA_LCK_EX_LOCK_MODE, LCK_NONBLOCK,
+					lockid);
+		if (status == SA_LCK_LOCK_NOT_QUEUED)
+		{
+			_unlock_resource(lock1, *lockid);
+			status = -1;
+			errno = EAGAIN;
+		}
+		break;
+
+	case LCK_PREAD:
+	case LCK_READ:
+		status = _lock_resource(lock1, SA_LCK_PR_LOCK_MODE, flags, lockid);
+		if (status)
+			goto out;
+		_unlock_resource(lock2, *lockid);
+		break;
+
+	case LCK_WRITE:
+		status = _lock_resource(lock2, SA_LCK_EX_LOCK_MODE, flags, lockid);
+		if (status)
+			goto out;
+		_unlock_resource(lock1, *lockid);
+		break;
+
+	default:
+		status = -1;
+		errno = EINVAL;
+		break;
+	}
+out:
+	*lockid = mode;
+	return status;
+}
+
+static int _sync_unlock(const char *resource, int lockid)
+{
+	int status = 0;
+	char lock1[strlen(resource)+3];
+	char lock2[strlen(resource)+3];
+
+	snprintf(lock1, sizeof(lock1), "%s-1", resource);
+	snprintf(lock2, sizeof(lock2), "%s-2", resource);
+
+	_unlock_resource(lock1, lockid);
+	_unlock_resource(lock2, lockid);
+
+	return status;
+}
+
+/* We are always quorate ! */
+static int _is_quorate()
+{
+	return 1;
+}
+
+static int _get_main_cluster_fd(void)
+{
+	int select_fd;
+
+	cpg_fd_get(cpg_handle, &select_fd);
+	return select_fd;
+}
+
+static int _cluster_fd_callback(struct local_client *fd, char *buf, int len,
+				const char *csid,
+				struct local_client **new_client)
+{
+	cluster_client = fd;
+	*new_client = NULL;
+	cpg_dispatch(cpg_handle, SA_DISPATCH_ONE);
+	return 1;
+}
+
+static int _cluster_send_message(const void *buf, int msglen, const char *csid,
+				 const char *errtext)
+{
+	struct iovec iov[2];
+	SaAisErrorT err;
+	int target_node;
+
+	if (csid)
+		memcpy(&target_node, csid, OPENAIS_CSID_LEN);
+	else
+		target_node = 0;
+
+	iov[0].iov_base = &target_node;
+	iov[0].iov_len = sizeof(int);
+	iov[1].iov_base = (char *)buf;
+	iov[1].iov_len = msglen;
+
+	err = cpg_mcast_joined(cpg_handle, CPG_TYPE_AGREED, iov, 2);
+	return ais_to_errno(err);
+}
+
+/* We don't have a cluster name to report here */
+static int _get_cluster_name(char *buf, int buflen)
+{
+	strncpy(buf, "OpenAIS", buflen);
+	return 0;
+}
+
+static struct cluster_ops _cluster_openais_ops = {
+	.cluster_init_completed   = NULL,
+	.cluster_send_message     = _cluster_send_message,
+	.name_from_csid           = _name_from_csid,
+	.csid_from_name           = _csid_from_name,
+	.get_num_nodes            = _get_num_nodes,
+	.cluster_fd_callback      = _cluster_fd_callback,
+	.get_main_cluster_fd      = _get_main_cluster_fd,
+	.cluster_do_node_callback = _cluster_do_node_callback,
+	.is_quorate               = _is_quorate,
+	.get_our_csid             = _get_our_csid,
+	.add_up_node              = _add_up_node,
+	.reread_config            = NULL,
+	.cluster_closedown        = _cluster_closedown,
+	.get_cluster_name         = _get_cluster_name,
+	.sync_lock                = _sync_lock,
+	.sync_unlock              = _sync_unlock,
+};
+
+struct cluster_ops *init_openais_cluster(void)
+{
+	if (!_init_cluster())
+		return &_cluster_openais_ops;
+	else
+		return NULL;
+}

Modified: lvm2/upstream/current/daemons/clvmd/clvmd.c
==============================================================================
--- lvm2/upstream/current/daemons/clvmd/clvmd.c	(original)
+++ lvm2/upstream/current/daemons/clvmd/clvmd.c	Fri Jun 22 11:19:15 2007
@@ -37,6 +37,7 @@
 #include <getopt.h>
 #include <syslog.h>
 #include <errno.h>
+#include <libdlm.h>
 
 #include "clvmd-comms.h"
 #include "lvm-functions.h"
@@ -44,8 +45,6 @@
 #include "version.h"
 #include "clvmd.h"
 #include "refresh_clvmd.h"
-#include "libdlm.h"
-#include "system-lv.h"
 #include "list.h"
 #include "log.h"
 
@@ -56,9 +55,7 @@
 #define FALSE 0
 #endif
 
-/* The maximum size of a message that will fit into a packet. Anything bigger
-   than this is sent via the system LV */
-#define MAX_INLINE_MESSAGE (max_cluster_message-sizeof(struct clvm_header))
+#define MAX_RETRIES 4
 
 #define ISLOCAL_CSID(c) (memcmp(c, our_csid, max_csid_len) == 0)
 
@@ -113,31 +110,32 @@
 static void free_reply(struct local_client *client);
 static void send_version_message(void);
 static void *pre_and_post_thread(void *arg);
-static int send_message(void *buf, int msglen, char *csid, int fd,
+static int send_message(void *buf, int msglen, const char *csid, int fd,
 			const char *errtext);
 static int read_from_local_sock(struct local_client *thisfd);
 static int process_local_command(struct clvm_header *msg, int msglen,
 				 struct local_client *client,
 				 unsigned short xid);
 static void process_remote_command(struct clvm_header *msg, int msglen, int fd,
-				   char *csid);
-static int process_reply(struct clvm_header *msg, int msglen, char *csid);
+				   const char *csid);
+static int process_reply(const struct clvm_header *msg, int msglen,
+			 const char *csid);
 static int open_local_sock(void);
 static struct local_client *find_client(int clientid);
 static void main_loop(int local_sock, int cmd_timeout);
 static void be_daemon(int start_timeout);
 static int check_all_clvmds_running(struct local_client *client);
 static int local_rendezvous_callback(struct local_client *thisfd, char *buf,
-				     int len, char *csid,
+				     int len, const char *csid,
 				     struct local_client **new_client);
 static void *lvm_thread_fn(void *);
 static int add_to_lvmqueue(struct local_client *client, struct clvm_header *msg,
-			   int msglen, char *csid);
+			   int msglen, const char *csid);
 static int distribute_command(struct local_client *thisfd);
 static void hton_clvm(struct clvm_header *hdr);
 static void ntoh_clvm(struct clvm_header *hdr);
 static void add_reply_to_list(struct local_client *client, int status,
-			      char *csid, const char *buf, int len);
+			      const char *csid, const char *buf, int len);
 
 static void usage(char *prog, FILE *file)
 {
@@ -293,6 +291,15 @@
 			syslog(LOG_NOTICE, "Cluster LVM daemon started - connected to GULM");
 		}
 #endif
+#ifdef USE_OPENAIS
+	if (!clops)
+		if ((clops = init_openais_cluster())) {
+			max_csid_len = OPENAIS_CSID_LEN;
+			max_cluster_message = OPENAIS_MAX_CLUSTER_MESSAGE;
+			max_cluster_member_name_len = OPENAIS_MAX_CLUSTER_MEMBER_NAME_LEN;
+			syslog(LOG_NOTICE, "Cluster LVM daemon started - connected to OpenAIS");
+		}
+#endif
 
 	if (!clops) {
 		DEBUGLOG("Can't initialise cluster interface\n");
@@ -325,7 +332,7 @@
 	/* This needs to be started after cluster initialisation
 	   as it may need to take out locks */
 	DEBUGLOG("starting LVM thread\n");
-	pthread_create(&lvm_thread, NULL, lvm_thread_fn, 
+	pthread_create(&lvm_thread, NULL, lvm_thread_fn,
 			(void *)(long)using_gulm);
 
 	/* Tell the rest of the cluster our version number */
@@ -357,7 +364,8 @@
 
 /* Data on a connected socket */
 static int local_sock_callback(struct local_client *thisfd, char *buf, int len,
-			       char *csid, struct local_client **new_client)
+			       const char *csid,
+			       struct local_client **new_client)
 {
 	*new_client = NULL;
 	return read_from_local_sock(thisfd);
@@ -365,7 +373,7 @@
 
 /* Data on a connected socket */
 static int local_rendezvous_callback(struct local_client *thisfd, char *buf,
-				     int len, char *csid,
+				     int len, const char *csid,
 				     struct local_client **new_client)
 {
 	/* Someone connected to our local socket, accept it. */
@@ -375,6 +383,9 @@
 	socklen_t sl = sizeof(socka);
 	int client_fd = accept(thisfd->fd, (struct sockaddr *) &socka, &sl);
 
+	if (client_fd == -1 && errno == EINTR)
+		return 1;
+
 	if (client_fd >= 0) {
 		newfd = malloc(sizeof(struct local_client));
 		if (!newfd) {
@@ -403,7 +414,7 @@
 }
 
 static int local_pipe_callback(struct local_client *thisfd, char *buf,
-			       int maxlen, char *csid,
+			       int maxlen, const char *csid,
 			       struct local_client **new_client)
 {
 	int len;
@@ -412,6 +423,8 @@
 	int status = -1;	/* in error by default */
 
 	len = read(thisfd->fd, buffer, sizeof(int));
+	if (len == -1 && errno == EINTR)
+		return 1;
 
 	if (len == sizeof(int)) {
 		memcpy(&status, buffer, sizeof(int));
@@ -477,7 +490,7 @@
    add one with "ETIMEDOUT".
    NOTE: This won't race with real replies because they happen in the same thread.
 */
-static void timedout_callback(struct local_client *client, char *csid,
+static void timedout_callback(struct local_client *client, const char *csid,
 			      int node_up)
 {
 	if (node_up) {
@@ -786,6 +799,8 @@
 	char buffer[PIPE_BUF];
 
 	len = read(thisfd->fd, buffer, sizeof(buffer));
+	if (len == -1 && errno == EINTR)
+		return 1;
 
 	DEBUGLOG("Read on local socket %d, len = %d\n", thisfd->fd, len);
 
@@ -901,8 +916,12 @@
 		    len - strlen(inheader->node) - sizeof(struct clvm_header);
 		missing_len = inheader->arglen - argslen;
 
+		if (missing_len < 0)
+			missing_len = 0;
+
 		/* Save the message */
 		thisfd->bits.localsock.cmd = malloc(len + missing_len);
+
 		if (!thisfd->bits.localsock.cmd) {
 			struct clvm_header reply;
 			reply.cmd = CLVMD_CMD_REPLY;
@@ -927,9 +946,8 @@
 				DEBUGLOG
 				    ("got %d bytes, need another %d (total %d)\n",
 				     argslen, missing_len, inheader->arglen);
-				len =
-				    read(thisfd->fd, argptr + argslen,
-					 missing_len);
+				len = read(thisfd->fd, argptr + argslen,
+					   missing_len);
 				if (len >= 0) {
 					missing_len -= len;
 					argslen += len;
@@ -1039,31 +1057,6 @@
 	return 0;
 }
 
-
-/*
- * Send a long message using the System LV
- */
-static int send_long_message(struct local_client *thisfd, struct clvm_header *inheader, int len)
-{
-    struct clvm_header new_header;
-    int status;
-
-    DEBUGLOG("Long message: being sent via system LV:\n");
-
-    /* Use System LV */
-    status = system_lv_write_data((char *)inheader, len);
-    if (status < 0)
-	    return errno;
-
-    /* Send message indicating System-LV is being used */
-    memcpy(&new_header, inheader, sizeof(new_header));
-    new_header.flags |= CLVMD_FLAG_SYSTEMLV;
-    new_header.xid = thisfd->xid;
-
-    return send_message(&new_header, sizeof(new_header), NULL, -1,
-		 "Error forwarding long message to cluster");
-}
-
 /* Called when the pre-command has completed successfully - we
    now execute the real command on all the requested nodes */
 static int distribute_command(struct local_client *thisfd)
@@ -1090,13 +1083,9 @@
 			add_to_lvmqueue(thisfd, inheader, len, NULL);
 
 			DEBUGLOG("Sending message to all cluster nodes\n");
-			if (len > MAX_INLINE_MESSAGE) {
-			        send_long_message(thisfd, inheader, len );
-			} else {
-				inheader->xid = thisfd->xid;
-				send_message(inheader, len, NULL, -1,
-					     "Error forwarding message to cluster");
-			}
+			inheader->xid = thisfd->xid;
+			send_message(inheader, len, NULL, -1,
+				     "Error forwarding message to cluster");
 		} else {
                         /* Do it on a single node */
 			char csid[MAX_CSID_LEN];
@@ -1117,14 +1106,10 @@
 				} else {
 					DEBUGLOG("Sending message to single node: %s\n",
 						 inheader->node);
-					if (len > MAX_INLINE_MESSAGE) {
-					        send_long_message(thisfd, inheader, len );
-					} else {
-						inheader->xid = thisfd->xid;
-						send_message(inheader, len,
-							     csid, -1,
-							     "Error forwarding message to cluster node");
-					}
+					inheader->xid = thisfd->xid;
+					send_message(inheader, len,
+						     csid, -1,
+						     "Error forwarding message to cluster node");
 				}
 			}
 		}
@@ -1140,7 +1125,7 @@
 
 /* Process a command from a remote node and return the result */
 static void process_remote_command(struct clvm_header *msg, int msglen, int fd,
-			    	   char *csid)
+			    	   const char *csid)
 {
 	char *replyargs;
 	char nodename[max_cluster_member_name_len];
@@ -1155,55 +1140,6 @@
 	DEBUGLOG("process_remote_command %d for clientid 0x%x XID %d on node %s\n",
 		 msg->cmd, msg->clientid, msg->xid, nodename);
 
-	/* Is the data to be found in the system LV ? */
-	if (msg->flags & CLVMD_FLAG_SYSTEMLV) {
-		struct clvm_header *newmsg;
-
-		DEBUGLOG("Reading message from system LV\n");
-		newmsg =
-		    (struct clvm_header *) malloc(msg->arglen +
-						  sizeof(struct clvm_header));
-		if (newmsg) {
-			ssize_t len;
-			if (system_lv_read_data(nodename, (char *) newmsg,
-			     			&len) == 0) {
-				msg = newmsg;
-				msg_malloced = 1;
-				msglen = len;
-			} else {
-				struct clvm_header head;
-				DEBUGLOG("System LV read failed\n");
-
-				/* Return a failure response */
-				head.cmd = CLVMD_CMD_REPLY;
-				head.status = EFBIG;
-				head.flags = 0;
-				head.clientid = msg->clientid;
-				head.arglen = 0;
-				head.node[0] = '\0';
-				send_message(&head, sizeof(struct clvm_header),
-					     csid, fd,
-					     "Error sending ENOMEM command reply");
-				return;
-			}
-		} else {
-			struct clvm_header head;
-			DEBUGLOG
-			    ("Error attempting to malloc %d bytes for system LV read\n",
-			     msg->arglen);
-			/* Return a failure response */
-			head.cmd = CLVMD_CMD_REPLY;
-			head.status = ENOMEM;
-			head.flags = 0;
-			head.clientid = msg->clientid;
-			head.arglen = 0;
-			head.node[0] = '\0';
-			send_message(&head, sizeof(struct clvm_header), csid,
-				     fd, "Error sending ENOMEM command reply");
-			return;
-		}
-	}
-
 	/* Check for GOAWAY and sulk */
 	if (msg->cmd == CLVMD_CMD_GOAWAY) {
 
@@ -1215,7 +1151,7 @@
 	/* Version check is internal - don't bother exposing it in
 	   clvmd-command.c */
 	if (msg->cmd == CLVMD_CMD_VERSION) {
-		int version_nums[3]; 
+		int version_nums[3];
 		char node[256];
 
 		memcpy(version_nums, msg->args, sizeof(version_nums));
@@ -1278,40 +1214,16 @@
 				replyargs, replylen);
 
 			agghead->xid = msg->xid;
-
-			/* Use the system LV ? */
-			if (replylen > MAX_INLINE_MESSAGE) {
-				agghead->cmd = CLVMD_CMD_REPLY;
-				agghead->status = status;
-				agghead->flags = CLVMD_FLAG_SYSTEMLV;
-				agghead->clientid = msg->clientid;
-				agghead->arglen = replylen;
-				agghead->node[0] = '\0';
-
-				/* If System LV operation failed then report it as EFBIG but only do it
-				   if the data buffer has something in it. */
-				if (system_lv_write_data(aggreply,
-							 replylen + sizeof(struct clvm_header)) < 0
-				    && replylen > 0)
-					agghead->status = EFBIG;
-
-				send_message(agghead,
-					     sizeof(struct clvm_header), csid,
-					     fd,
-					     "Error sending long command reply");
-
-			} else {
-				agghead->cmd = CLVMD_CMD_REPLY;
-				agghead->status = status;
-				agghead->flags = 0;
-				agghead->clientid = msg->clientid;
-				agghead->arglen = replylen;
-				agghead->node[0] = '\0';
-				send_message(aggreply,
-					     sizeof(struct clvm_header) +
-					     replylen, csid, fd,
-					     "Error sending command reply");
-			}
+			agghead->cmd = CLVMD_CMD_REPLY;
+			agghead->status = status;
+			agghead->flags = 0;
+			agghead->clientid = msg->clientid;
+			agghead->arglen = replylen;
+			agghead->node[0] = '\0';
+			send_message(aggreply,
+				     sizeof(struct clvm_header) +
+				     replylen, csid, fd,
+				     "Error sending command reply");
 		} else {
 			struct clvm_header head;
 
@@ -1340,7 +1252,7 @@
    If we have got a full set then send them to the waiting client down the local
    socket */
 static void add_reply_to_list(struct local_client *client, int status,
-			      char *csid, const char *buf, int len)
+			      const char *csid, const char *buf, int len)
 {
 	struct node_reply *reply;
 
@@ -1395,6 +1307,7 @@
 {
 	struct local_client *client = (struct local_client *) arg;
 	int status;
+	int write_status;
 	sigset_t ss;
 	int pipe_fd = client->bits.localsock.pipe;
 
@@ -1424,8 +1337,19 @@
 			client->bits.localsock.all_success = 0;
 
 		DEBUGLOG("Writing status %d down pipe %d\n", status, pipe_fd);
+
 		/* Tell the parent process we have finished this bit */
-		write(pipe_fd, &status, sizeof(int));
+		do {
+			write_status = write(pipe_fd, &status, sizeof(int));
+			if (write_status == sizeof(int))
+				break;
+			if (write_status < 0 &&
+			    (errno == EINTR || errno == EAGAIN))
+				continue;
+			log_error("Error sending to pipe: %m\n");
+			break;
+		} while(1);
+
 		if (status)
 			continue; /* Wait for another PRE command */
 
@@ -1446,7 +1370,16 @@
 		status = 0;
 		do_post_command(client);
 
-		write(pipe_fd, &status, sizeof(int));
+		do {
+			write_status = write(pipe_fd, &status, sizeof(int));
+			if (write_status == sizeof(int))
+				break;
+			if (write_status < 0 &&
+			    (errno == EINTR || errno == EAGAIN))
+				continue;
+			log_error("Error sending to pipe: %m\n");
+			break;
+		} while(1);
 
 		DEBUGLOG("Waiting for next pre command\n");
 
@@ -1496,7 +1429,7 @@
 	return status;
 }
 
-static int process_reply(struct clvm_header *msg, int msglen, char *csid)
+static int process_reply(const struct clvm_header *msg, int msglen, const char *csid)
 {
 	struct local_client *client = NULL;
 
@@ -1646,10 +1579,15 @@
 }
 
 /* Send a message to either a local client or another server */
-static int send_message(void *buf, int msglen, char *csid, int fd,
+static int send_message(void *buf, int msglen, const char *csid, int fd,
 			const char *errtext)
 {
 	int len;
+	int saved_errno = 0;
+	struct timespec delay;
+	struct timespec remtime;
+
+	int retry_cnt = 0;
 
 	/* Send remote messages down the cluster socket */
 	if (csid == NULL || !ISLOCAL_CSID(csid)) {
@@ -1660,14 +1598,38 @@
 
 		/* Make sure it all goes */
 		do {
+			if (retry_cnt > MAX_RETRIES)
+			{
+				errno = saved_errno;
+				log_error("%s", errtext);
+				errno = saved_errno;
+				break;
+			}
+
 			len = write(fd, buf + ptr, msglen - ptr);
 
 			if (len <= 0) {
-				log_error(errtext);
+				if (errno == EINTR)
+					continue;
+				if (errno == EAGAIN ||
+				    errno == EIO ||
+				    errno == ENOSPC) {
+					saved_errno = errno;
+					retry_cnt++;
+
+					delay.tv_sec = 0;
+					delay.tv_nsec = 100000;
+					remtime.tv_sec = 0;
+					remtime.tv_nsec = 0;
+					(void) nanosleep (&delay, &remtime);
+
+					continue;
+				}
+				log_error("%s", errtext);
 				break;
 			}
 			ptr += len;
-		} while (len < msglen);
+		} while (ptr < msglen);
 	}
 	return len;
 }
@@ -1749,7 +1711,7 @@
 
 /* Pass down some work to the LVM thread */
 static int add_to_lvmqueue(struct local_client *client, struct clvm_header *msg,
-			   int msglen, char *csid)
+			   int msglen, const char *csid)
 {
 	struct lvm_thread_cmd *cmd;
 
@@ -1827,7 +1789,8 @@
 	return local_socket;
 }
 
-void process_message(struct local_client *client, char *buf, int len, char *csid)
+void process_message(struct local_client *client, const char *buf, int len,
+		     const char *csid)
 {
 	struct clvm_header *inheader;
 
@@ -1840,7 +1803,7 @@
 }
 
 
-static void check_all_callback(struct local_client *client, char *csid,
+static void check_all_callback(struct local_client *client, const char *csid,
 			       int node_up)
 {
 	if (!node_up)

Modified: lvm2/upstream/current/daemons/clvmd/clvmd.h
==============================================================================
--- lvm2/upstream/current/daemons/clvmd/clvmd.h	(original)
+++ lvm2/upstream/current/daemons/clvmd/clvmd.h	Fri Jun 22 11:19:15 2007
@@ -76,7 +76,8 @@
 };
 
 typedef int (*fd_callback_t) (struct local_client * fd, char *buf, int len,
-			      char *csid, struct local_client ** new_client);
+			      const char *csid,
+			      struct local_client ** new_client);
 
 /* One of these for each fd we are listening on */
 struct local_client {
@@ -112,7 +113,8 @@
 extern int add_client(struct local_client *new_client);
 
 extern void clvmd_cluster_init_completed(void);
-extern void process_message(struct local_client *client, char *buf, int len, char *csid);
+extern void process_message(struct local_client *client, const char *buf,
+			    int len, const char *csid);
 extern void debuglog(const char *fmt, ... );
 
 int sync_lock(const char *resource, int mode, int flags, int *lockid);

Modified: lvm2/upstream/current/daemons/clvmd/lvm-functions.c
==============================================================================
--- lvm2/upstream/current/daemons/clvmd/lvm-functions.c	(original)
+++ lvm2/upstream/current/daemons/clvmd/lvm-functions.c	Fri Jun 22 11:19:15 2007
@@ -30,11 +30,11 @@
 #include <errno.h>
 #include <syslog.h>
 #include <assert.h>
+#include <libdevmapper.h>
+#include <libdlm.h>
 
-#include "libdevmapper.h"
 #include "list.h"
 #include "lvm-types.h"
-#include "libdlm.h"
 #include "clvm.h"
 #include "clvmd-comms.h"
 #include "clvmd.h"
@@ -50,6 +50,7 @@
 static struct cmd_context *cmd = NULL;
 static struct dm_hash_table *lv_hash = NULL;
 static pthread_mutex_t lv_hash_lock;
+static pthread_mutex_t lvm_lock;
 static char last_error[1024];
 
 struct lv_info {
@@ -311,10 +312,12 @@
 	DEBUGLOG("do_lock_lv: resource '%s', cmd = 0x%x, flags = %x\n",
 		 resource, command, lock_flags);
 
+	pthread_mutex_lock(&lvm_lock);
 	if (!cmd->config_valid || config_files_changed(cmd)) {
 		/* Reinitialise various settings inc. logging, filters */
 		if (!refresh_toolcontext(cmd)) {
 			log_error("Updated config file invalid. Aborting.");
+			pthread_mutex_unlock(&lvm_lock);
 			return EINVAL;
 		}
 	}
@@ -367,6 +370,7 @@
 
 	/* clean the pool for another command */
 	dm_pool_empty(cmd->mem);
+	pthread_mutex_unlock(&lvm_lock);
 
 	DEBUGLOG("Command return is %d\n", status);
 	return status;
@@ -393,6 +397,8 @@
 int post_lock_lv(unsigned char command, unsigned char lock_flags,
 		 char *resource)
 {
+	int status;
+
 	/* Opposite of above, done on resume after a metadata update */
 	if (command == LCK_LV_RESUME) {
 		int oldmode;
@@ -406,7 +412,10 @@
 		if (oldmode == LKM_PWMODE) {
 			struct lvinfo lvi;
 
-			if (!lv_info_by_lvid(cmd, resource, &lvi, 0))
+			pthread_mutex_lock(&lvm_lock);
+			status = lv_info_by_lvid(cmd, resource, &lvi, 0);
+			pthread_mutex_unlock(&lvm_lock);
+			if (!status)
 				return EIO;
 
 			if (lvi.exists) {
@@ -533,7 +542,7 @@
 			const char *message)
 {
 	/*
-	 * Ignore non-error messages, but store the latest one for returning 
+	 * Ignore non-error messages, but store the latest one for returning
 	 * to the user.
 	 */
 	if (level != _LOG_ERR && level != _LOG_FATAL)
@@ -572,6 +581,7 @@
 	/* Create hash table for keeping LV locks & status */
 	lv_hash = dm_hash_create(100);
 	pthread_mutex_init(&lv_hash_lock, NULL);
+	pthread_mutex_init(&lvm_lock, NULL);
 }
 
 /* Called to initialise the LVM context of the daemon */

Modified: lvm2/upstream/current/daemons/clvmd/tcp-comms.c
==============================================================================
--- lvm2/upstream/current/daemons/clvmd/tcp-comms.c	(original)
+++ lvm2/upstream/current/daemons/clvmd/tcp-comms.c	Fri Jun 22 11:19:15 2007
@@ -34,8 +34,8 @@
 #include <syslog.h>
 #include <netdb.h>
 #include <assert.h>
+#include <libdevmapper.h>
 
-#include "libdevmapper.h"
 #include "clvm.h"
 #include "clvmd-comms.h"
 #include "clvmd.h"
@@ -92,41 +92,37 @@
     return 0;
 }
 
-void tcp_remove_client(char *csid)
- {
+void tcp_remove_client(const char *c_csid)
+{
     struct local_client *client;
+    char csid[GULM_MAX_CSID_LEN];
+    unsigned int i;
+    memcpy(csid, c_csid, sizeof csid);
     DEBUGLOG("tcp_remove_client\n");
 
     /* Don't actually close the socket here - that's the
        job of clvmd.c whch will do the job when it notices the
        other end has gone. We just need to remove the client(s) from
        the hash table so we don't try to use it for sending any more */
-    client = dm_hash_lookup_binary(sock_hash, csid, GULM_MAX_CSID_LEN);
-    if (client)
+    for (i = 0; i < 2; i++)
     {
-	dm_hash_remove_binary(sock_hash, csid, GULM_MAX_CSID_LEN);
-	client->removeme = 1;
-	close(client->fd);
-    }
-
-    /* Look for a mangled one too */
-    csid[0] ^= 0x80;
-
-    client = dm_hash_lookup_binary(sock_hash, csid, GULM_MAX_CSID_LEN);
-    if (client)
-    {
-	dm_hash_remove_binary(sock_hash, csid, GULM_MAX_CSID_LEN);
-	client->removeme = 1;
-	close(client->fd);
+	client = dm_hash_lookup_binary(sock_hash, csid, GULM_MAX_CSID_LEN);
+	if (client)
+	{
+	    dm_hash_remove_binary(sock_hash, csid, GULM_MAX_CSID_LEN);
+	    client->removeme = 1;
+	    close(client->fd);
+	}
+	/* Look for a mangled one too, on the 2nd iteration. */
+	csid[0] ^= 0x80;
     }
-
-    /* Put it back as we found it */
-    csid[0] ^= 0x80;
 }
 
-int alloc_client(int fd, char *csid, struct local_client **new_client)
+int alloc_client(int fd, const char *c_csid, struct local_client **new_client)
 {
     struct local_client *client;
+    char csid[GULM_MAX_CSID_LEN];
+    memcpy(csid, c_csid, sizeof csid);
 
     DEBUGLOG("alloc_client %d csid = %s\n", fd, print_csid(csid));
 
@@ -315,7 +311,7 @@
     return status;
 }
 
-int gulm_connect_csid(char *csid, struct local_client **newclient)
+int gulm_connect_csid(const char *csid, struct local_client **newclient)
 {
     int fd;
     struct sockaddr_in6 addr;
@@ -366,7 +362,7 @@
 }
 
 /* Send a message to a known CSID */
-static int tcp_send_message(void *buf, int msglen, unsigned char *csid, const char *errtext)
+static int tcp_send_message(void *buf, int msglen, const char *csid, const char *errtext)
 {
     int status;
     struct local_client *client;
@@ -465,7 +461,7 @@
 }
 
 /* Get someone else's IP address from DNS */
-int get_ip_address(char *node, char *addr)
+int get_ip_address(const char *node, char *addr)
 {
     struct hostent *he;
 
@@ -493,7 +489,7 @@
     return 0;
 }
 
-char *print_csid(char *csid)
+char *print_csid(const char *csid)
 {
     static char buf[128];
     int *icsid = (int *)csid;

Modified: lvm2/upstream/current/daemons/clvmd/tcp-comms.h
==============================================================================
--- lvm2/upstream/current/daemons/clvmd/tcp-comms.h	(original)
+++ lvm2/upstream/current/daemons/clvmd/tcp-comms.h	Fri Jun 22 11:19:15 2007
@@ -5,9 +5,9 @@
 #define GULM_MAX_CLUSTER_MEMBER_NAME_LEN 128
 
 extern int init_comms(unsigned short);
-extern char *print_csid(char *);
+extern char *print_csid(const char *);
 int get_main_gulm_cluster_fd(void);
 int cluster_fd_gulm_callback(struct local_client *fd, char *buf, int len, char *csid, struct local_client **new_client);
 int gulm_cluster_send_message(void *buf, int msglen, char *csid, const char *errtext);
 void get_our_gulm_csid(char *csid);
-int gulm_connect_csid(char *csid, struct local_client **newclient);
+int gulm_connect_csid(const char *csid, struct local_client **newclient);

Modified: lvm2/upstream/current/dmeventd/mirror/dmeventd_mirror.c
==============================================================================
--- lvm2/upstream/current/dmeventd/mirror/dmeventd_mirror.c	(original)
+++ lvm2/upstream/current/dmeventd/mirror/dmeventd_mirror.c	Fri Jun 22 11:19:15 2007
@@ -12,10 +12,10 @@
  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#include "libdevmapper.h"
-#include "libdevmapper-event.h"
 #include "lvm2cmd.h"
 
+#include <libdevmapper.h>
+#include <libdevmapper-event.h>
 #include <errno.h>
 #include <signal.h>
 #include <string.h>

Modified: lvm2/upstream/current/doc/example.conf
==============================================================================
--- lvm2/upstream/current/doc/example.conf	(original)
+++ lvm2/upstream/current/doc/example.conf	Fri Jun 22 11:19:15 2007
@@ -19,6 +19,14 @@
     # to use with LVM2.
     scan = [ "/dev" ]
 
+    # If several entries in the scanned directories correspond to the
+    # same block device and the tools need to display a name for device,
+    # all the pathnames are matched against each item in the following
+    # list of regular expressions in turn and the first match is used.
+    preferred_names = [ ]
+
+    # preferred_names = [ "^/dev/mpath/", "^/dev/[hs]d" ]
+
     # A filter that tells LVM2 to only use a restricted set of devices.
     # The filter consists of an array of regular expressions.  These
     # expressions can be delimited by a character of your choice, and

Modified: lvm2/upstream/current/include/.symlinks
==============================================================================
--- lvm2/upstream/current/include/.symlinks	(original)
+++ lvm2/upstream/current/include/.symlinks	Fri Jun 22 11:19:15 2007
@@ -43,7 +43,6 @@
 ../lib/misc/lvm-string.h
 ../lib/misc/lvm-wrappers.h
 ../lib/misc/sharedlib.h
-../lib/regex/matcher.h
 ../lib/report/report.h
 ../lib/uuid/uuid.h
 ../po/pogen.h

Modified: lvm2/upstream/current/lib/Makefile.in
==============================================================================
--- lvm2/upstream/current/lib/Makefile.in	(original)
+++ lvm2/upstream/current/lib/Makefile.in	Fri Jun 22 11:19:15 2007
@@ -81,9 +81,6 @@
 	misc/lvm-wrappers.c \
 	misc/timestamp.c \
 	mm/memlock.c \
-	regex/matcher.c \
-	regex/parse_rx.c \
-	regex/ttree.c \
 	report/report.c \
 	striped/striped.c \
 	uuid/uuid.c \

Modified: lvm2/upstream/current/lib/activate/activate.c
==============================================================================
--- lvm2/upstream/current/lib/activate/activate.c	(original)
+++ lvm2/upstream/current/lib/activate/activate.c	Fri Jun 22 11:19:15 2007
@@ -168,7 +168,7 @@
 {
 	return 0;
 }
-int lvs_in_vg_activated_by_uuid_only(struct volume_group *vg);
+int lvs_in_vg_activated_by_uuid_only(struct volume_group *vg)
 {
 	return 0;
 }

Modified: lvm2/upstream/current/lib/activate/dev_manager.c
==============================================================================
--- lvm2/upstream/current/lib/activate/dev_manager.c	(original)
+++ lvm2/upstream/current/lib/activate/dev_manager.c	Fri Jun 22 11:19:15 2007
@@ -187,7 +187,7 @@
                 next = dm_get_next_target(dmt, next, &start, &length,
                                           &target_type, &params);
                 /* Skip if target type doesn't match */
-                if (!strcmp(target_type, "mirror"))
+                if (target_type && !strcmp(target_type, "mirror"))
 			goto out;
         } while (next);
 
@@ -435,10 +435,8 @@
 		return NULL;
 	}
 
-	if (!(dm = dm_pool_alloc(mem, sizeof(*dm)))) {
-		stack;
-		goto bad;
-	}
+	if (!(dm = dm_pool_alloc(mem, sizeof(*dm))))
+		goto_bad;
 
 	dm->cmd = cmd;
 	dm->mem = mem;
@@ -450,10 +448,8 @@
 	}
 	dm->stripe_filler = stripe_filler;
 
-	if (!(dm->vg_name = dm_pool_strdup(dm->mem, vg_name))) {
-		stack;
-		goto bad;
-	}
+	if (!(dm->vg_name = dm_pool_strdup(dm->mem, vg_name)))
+		goto_bad;
 
 	dm->target_state = NULL;
 
@@ -941,6 +937,10 @@
 	return 1;
 }
 
+/* FIXME: symlinks should be created/destroyed at the same time
+ * as the kernel devices but we can't do that from within libdevmapper
+ * at present so we must walk the tree twice instead. */
+
 /*
  * Create LV symlinks for children of supplied root node.
  */
@@ -973,6 +973,32 @@
 	return r;
 }
 
+/*
+ * Remove LV symlinks for children of supplied root node.
+ */
+static int _remove_lv_symlinks(struct dev_manager *dm, struct dm_tree_node *root)
+{
+	void *handle = NULL;
+	struct dm_tree_node *child;
+	char *vgname, *lvname, *layer;
+	int r = 1;
+
+	while ((child = dm_tree_next_child(&handle, root, 0))) {
+        	if (!dm_split_lvm_name(dm->mem, dm_tree_node_get_name(child), &vgname, &lvname, &layer)) {
+			r = 0;
+			continue;
+		}
+
+		/* only top level layer has symlinks */
+		if (*layer)
+			continue;
+
+		fs_del_lv_byname(dm->cmd->dev_dir, vgname, lvname);
+	}
+
+	return r;
+}
+
 static int _clean_tree(struct dev_manager *dm, struct dm_tree_node *root)
 {
 	void *handle = NULL;
@@ -1032,6 +1058,8 @@
  		/* Deactivate LV and all devices it references that nothing else has open. */
 		if (!dm_tree_deactivate_children(root, dlid, ID_LEN + sizeof(UUID_PREFIX) - 1))
 			goto_out;
+		if (!_remove_lv_symlinks(dm, root))
+			log_error("Failed to remove all device symlinks associated with %s.", lv->name);
 		break;
 	case SUSPEND:
 		dm_tree_skip_lockfs(root);

Modified: lvm2/upstream/current/lib/activate/fs.c
==============================================================================
--- lvm2/upstream/current/lib/activate/fs.c	(original)
+++ lvm2/upstream/current/lib/activate/fs.c	Fri Jun 22 11:19:15 2007
@@ -338,6 +338,11 @@
 		      "", "");
 }
 
+int fs_del_lv_byname(const char *dev_dir, const char *vg_name, const char *lv_name)
+{
+	return _fs_op(FS_DEL, dev_dir, vg_name, lv_name, "", "");
+}
+
 int fs_rename_lv(struct logical_volume *lv,
 		 const char *dev, const char *old_name)
 {

Modified: lvm2/upstream/current/lib/activate/fs.h
==============================================================================
--- lvm2/upstream/current/lib/activate/fs.h	(original)
+++ lvm2/upstream/current/lib/activate/fs.h	Fri Jun 22 11:19:15 2007
@@ -25,6 +25,7 @@
  */
 int fs_add_lv(const struct logical_volume *lv, const char *dev);
 int fs_del_lv(const struct logical_volume *lv);
+int fs_del_lv_byname(const char *dev_dir, const char *vg_name, const char *lv_name);
 int fs_rename_lv(struct logical_volume *lv,
 		 const char *dev, const char *old_name);
 void fs_unlock(void);

Modified: lvm2/upstream/current/lib/cache/lvmcache.c
==============================================================================
--- lvm2/upstream/current/lib/cache/lvmcache.c	(original)
+++ lvm2/upstream/current/lib/cache/lvmcache.c	Fri Jun 22 11:19:15 2007
@@ -135,7 +135,7 @@
 
 	list_iterate_safe(devh, tmp, &devs) {
 		devl = list_item(devh, struct device_list);
-		label_read(devl->dev, &label);
+		label_read(devl->dev, &label, UINT64_C(0));
 		list_del(&devl->list);
 		dm_free(devl);
 	}
@@ -205,7 +205,7 @@
 	struct label *label;
 
 	if (info->status & CACHE_INVALID)
-		label_read(info->dev, &label);
+		label_read(info->dev, &label, UINT64_C(0));
 }
 
 static int _scan_invalid(void)
@@ -247,7 +247,7 @@
 	}
 
 	while ((dev = dev_iter_get(iter)))
-		label_read(dev, &label);
+		label_read(dev, &label, UINT64_C(0));
 
 	dev_iter_destroy(iter);
 
@@ -346,7 +346,7 @@
 
 	/* Already cached ? */
 	if ((info = info_from_pvid((char *) pvid))) {
-		if (label_read(info->dev, &label)) {
+		if (label_read(info->dev, &label, UINT64_C(0))) {
 			info = (struct lvmcache_info *) label->info;
 			if (id_equal(pvid, (struct id *) &info->dev->pvid))
 				return info->dev;
@@ -357,7 +357,7 @@
 
 	/* Try again */
 	if ((info = info_from_pvid((char *) pvid))) {
-		if (label_read(info->dev, &label)) {
+		if (label_read(info->dev, &label, UINT64_C(0))) {
 			info = (struct lvmcache_info *) label->info;
 			if (id_equal(pvid, (struct id *) &info->dev->pvid))
 				return info->dev;
@@ -371,7 +371,7 @@
 
 	/* Try again */
 	if ((info = info_from_pvid((char *) pvid))) {
-		if (label_read(info->dev, &label)) {
+		if (label_read(info->dev, &label, UINT64_C(0))) {
 			info = (struct lvmcache_info *) label->info;
 			if (id_equal(pvid, (struct id *) &info->dev->pvid))
 				return info->dev;

Modified: lvm2/upstream/current/lib/commands/toolcontext.c
==============================================================================
--- lvm2/upstream/current/lib/commands/toolcontext.c	(original)
+++ lvm2/upstream/current/lib/commands/toolcontext.c	Fri Jun 22 11:19:15 2007
@@ -465,10 +465,8 @@
 	const struct config_node *cn;
 	struct config_value *cv;
 
-	if (!dev_cache_init()) {
-		stack;
-		return 0;
-	}
+	if (!dev_cache_init(cmd))
+		return_0;
 
 	if (!(cn = find_config_tree_node(cmd, "devices/scan"))) {
 		if (!dev_cache_add_dir("/dev")) {

Modified: lvm2/upstream/current/lib/config/config.c
==============================================================================
--- lvm2/upstream/current/lib/config/config.c	(original)
+++ lvm2/upstream/current/lib/config/config.c	Fri Jun 22 11:19:15 2007
@@ -19,6 +19,7 @@
 #include "device.h"
 #include "str_list.h"
 #include "toolcontext.h"
+#include "lvm-string.h"
 
 #include <sys/stat.h>
 #include <sys/mman.h>
@@ -26,6 +27,9 @@
 #include <fcntl.h>
 #include <ctype.h>
 
+#define SECTION_B_CHAR '{'
+#define SECTION_E_CHAR '}'
+
 enum {
 	TOK_INT,
 	TOK_FLOAT,
@@ -79,7 +83,8 @@
 
 #define match(t) do {\
    if (!_match_aux(p, (t))) {\
-	log_error("Parse error at byte %d (line %d): unexpected token", p->tb - p->fb + 1, p->line); \
+	log_error("Parse error at byte %" PRIptrdiff_t " (line %d): unexpected token", \
+		  p->tb - p->fb + 1, p->line); \
       return 0;\
    } \
 } while(0);
@@ -183,7 +188,7 @@
 	int r = 0;
 	int use_mmap = 1;
 	off_t mmap_offset = 0;
-	char *buf;
+	char *buf = NULL;
 
 	if (!(p = dm_pool_alloc(c->mem, sizeof(*p)))) {
 		stack;
@@ -210,18 +215,10 @@
 			stack;
 			return 0;
 		}
-		if (!dev_read(dev, (uint64_t) offset, size, buf)) {
-			log_error("Read from %s failed", dev_name(dev));
+		if (!dev_read_circular(dev, (uint64_t) offset, size,
+				       (uint64_t) offset2, size2, buf)) {
 			goto out;
 		}
-		if (size2) {
-			if (!dev_read(dev, (uint64_t) offset2, size2,
-				      buf + size)) {
-				log_error("Circular read from %s failed",
-					  dev_name(dev));
-				goto out;
-			}
-		}
 		p->fb = buf;
 	}
 
@@ -360,7 +357,7 @@
 		break;
 
 	case CFG_INT:
-		fprintf(fp, "%d", v->v.i);
+		fprintf(fp, "%" PRId64, v->v.i);
 		break;
 
 	case CFG_EMPTY_ARRAY:
@@ -482,7 +479,7 @@
 
 static struct config_node *_section(struct parser *p)
 {
-	/* IDENTIFIER '{' VALUE* '}' */
+	/* IDENTIFIER SECTION_B_CHAR VALUE* SECTION_E_CHAR */
 	struct config_node *root, *n, *l = NULL;
 	if (!(root = _create_node(p))) {
 		stack;
@@ -571,7 +568,7 @@
 	switch (p->t) {
 	case TOK_INT:
 		v->type = CFG_INT;
-		v->v.i = strtol(p->tb, NULL, 0);	/* FIXME: check error */
+		v->v.i = strtoll(p->tb, NULL, 0);	/* FIXME: check error */
 		match(TOK_INT);
 		break;
 
@@ -594,7 +591,8 @@
 		break;
 
 	default:
-		log_error("Parse error at byte %d (line %d): expected a value", p->tb - p->fb + 1, p->line);
+		log_error("Parse error at byte %" PRIptrdiff_t " (line %d): expected a value",
+			  p->tb - p->fb + 1, p->line);
 		return 0;
 	}
 	return v;
@@ -631,12 +629,12 @@
 	p->t = TOK_INT;		/* fudge so the fall through for
 				   floats works */
 	switch (*p->te) {
-	case '{':
+	case SECTION_B_CHAR:
 		p->t = TOK_SECTION_B;
 		p->te++;
 		break;
 
-	case '}':
+	case SECTION_E_CHAR:
 		p->t = TOK_SECTION_E;
 		p->te++;
 		break;
@@ -716,8 +714,9 @@
 	default:
 		p->t = TOK_IDENTIFIER;
 		while ((p->te != p->fe) && (*p->te) && !isspace(*p->te) &&
-		       (*p->te != '#') && (*p->te != '=') && (*p->te != '{') &&
-		       (*p->te != '}'))
+		       (*p->te != '#') && (*p->te != '=') &&
+		       (*p->te != SECTION_B_CHAR) &&
+		       (*p->te != SECTION_E_CHAR))
 			p->te++;
 		break;
 	}
@@ -872,25 +871,26 @@
 	return _find_config_str(cn, NULL, path, fail);
 }
 
-static int _find_config_int(const struct config_node *cn1,
-			    const struct config_node *cn2,
-			    const char *path, int fail)
+static int64_t _find_config_int64(const struct config_node *cn1,
+				  const struct config_node *cn2,
+				  const char *path, int64_t fail)
 {
 	const struct config_node *n = _find_first_config_node(cn1, cn2, path);
 
 	if (n && n->v && n->v->type == CFG_INT) {
-		log_very_verbose("Setting %s to %d", path, n->v->v.i);
+		log_very_verbose("Setting %s to %" PRId64, path, n->v->v.i);
 		return n->v->v.i;
 	}
 
-	log_very_verbose("%s not found in config: defaulting to %d",
+	log_very_verbose("%s not found in config: defaulting to %" PRId64,
 			 path, fail);
 	return fail;
 }
 
 int find_config_int(const struct config_node *cn, const char *path, int fail)
 {
-	return _find_config_int(cn, NULL, path, fail);
+	/* FIXME Add log_error message on overflow */
+	return (int) _find_config_int64(cn, NULL, path, (int64_t) fail);
 }
 
 static float _find_config_float(const struct config_node *cn1,
@@ -932,7 +932,8 @@
 int find_config_tree_int(struct cmd_context *cmd, const char *path,
                          int fail)
 {
-	return _find_config_int(cmd->cft_override ? cmd->cft_override->root : NULL, cmd->cft->root, path, fail);
+	/* FIXME Add log_error message on overflow */
+	return (int) _find_config_int64(cmd->cft_override ? cmd->cft_override->root : NULL, cmd->cft->root, path, (int64_t) fail);
 }
 
 float find_config_tree_float(struct cmd_context *cmd, const char *path,
@@ -1024,7 +1025,6 @@
 	if (!n || !n->v || n->v->type != CFG_INT)
 		return 0;
 
-	/* FIXME Support 64-bit value! */
 	*result = (uint64_t) n->v->v.i;
 	return 1;
 }
@@ -1154,3 +1154,61 @@
 
 	return 1;
 }
+
+/*
+ * Convert a token type to the char it represents.
+ */
+static char _token_type_to_char(int type)
+{
+	switch (type) {
+		case TOK_SECTION_B:
+			return SECTION_B_CHAR;
+		case TOK_SECTION_E:
+			return SECTION_E_CHAR;
+		default:
+			return 0;
+	}
+}
+
+/*
+ * Returns:
+ *  # of 'type' tokens in 'str'.
+ */
+static unsigned _count_tokens (const char *str, unsigned len, int type)
+{
+	char c;
+
+	c = _token_type_to_char(type);
+
+	return(count_chars_len(str, len, c));
+}
+
+/*
+ * Heuristic function to make a quick guess as to whether a text
+ * region probably contains a valid config "section".  (Useful for
+ * scanning areas of the disk for old metadata.)
+ * Config sections contain various tokens, may contain other sections
+ * and strings, and are delimited by begin (type 'TOK_SECTION_B') and
+ * end (type 'TOK_SECTION_E') tokens.  As a quick heuristic, we just
+ * count the number of begin and end tokens, and see if they are
+ * non-zero and the counts match.
+ * Full validation of the section should be done with another function
+ * (for example, read_config_fd).
+ *
+ * Returns:
+ *  0 - probably is not a valid config section
+ *  1 - probably _is_ a valid config section
+ */
+unsigned maybe_config_section(const char *str, unsigned len)
+{
+	int begin_count;
+	int end_count;
+
+	begin_count = _count_tokens(str, len, TOK_SECTION_B);
+	end_count = _count_tokens(str, len, TOK_SECTION_E);
+
+	if (begin_count && end_count && (begin_count - end_count == 0))
+		return 1;
+	else
+		return 0;
+}

Modified: lvm2/upstream/current/lib/config/config.h
==============================================================================
--- lvm2/upstream/current/lib/config/config.h	(original)
+++ lvm2/upstream/current/lib/config/config.h	Fri Jun 22 11:19:15 2007
@@ -31,7 +31,7 @@
 struct config_value {
 	int type;
 	union {
-		int i;
+		int64_t i;
 		float r;
 		char *str;
 	} v;
@@ -108,4 +108,6 @@
 int get_config_str(const struct config_node *cn, const char *path,
 		   char **result);
 
+unsigned maybe_config_section(const char *str, unsigned len);
+
 #endif

Modified: lvm2/upstream/current/lib/datastruct/lvm-types.h
==============================================================================
--- lvm2/upstream/current/lib/datastruct/lvm-types.h	(original)
+++ lvm2/upstream/current/lib/datastruct/lvm-types.h	Fri Jun 22 11:19:15 2007
@@ -23,6 +23,7 @@
 
 /* Define some portable printing types */
 #define PRIsize_t "zu"
+#define PRIptrdiff_t "td"
 
 struct str_list {
 	struct list list;

Modified: lvm2/upstream/current/lib/device/dev-cache.c
==============================================================================
--- lvm2/upstream/current/lib/device/dev-cache.c	(original)
+++ lvm2/upstream/current/lib/device/dev-cache.c	Fri Jun 22 11:19:15 2007
@@ -19,6 +19,7 @@
 #include "btree.h"
 #include "filter.h"
 #include "filter-persistent.h"
+#include "toolcontext.h"
 
 #include <unistd.h>
 #include <sys/param.h>
@@ -38,6 +39,7 @@
 	struct dm_pool *mem;
 	struct dm_hash_table *names;
 	struct btree *devices;
+	struct dm_regex *preferred_names_matcher;
 
 	int has_scanned;
 	struct list dirs;
@@ -129,15 +131,52 @@
 	return dev;
 }
 
+void dev_set_preferred_name(struct str_list *sl, struct device *dev)
+{
+	/*
+	 * Don't interfere with ordering specified in config file.
+	 */
+	if (_cache.preferred_names_matcher)
+		return;
+
+	log_debug("%s: New preferred name", sl->str);
+	list_del(&sl->list);
+	list_add_h(&dev->aliases, &sl->list);
+}
+
 /* Return 1 if we prefer path1 else return 0 */
 static int _compare_paths(const char *path0, const char *path1)
 {
 	int slash0 = 0, slash1 = 0;
+	int m0, m1;
 	const char *p;
 	char p0[PATH_MAX], p1[PATH_MAX];
 	char *s0, *s1;
 	struct stat stat0, stat1;
 
+	/*
+	 * FIXME Better to compare patterns one-at-a-time against all names.
+	 */
+	if (_cache.preferred_names_matcher) {
+		m0 = dm_regex_match(_cache.preferred_names_matcher, path0);
+		m1 = dm_regex_match(_cache.preferred_names_matcher, path1);
+
+		if (m0 != m1) {
+			if (m0 < 0)
+				return 1;
+			if (m1 < 0)
+				return 0;
+			if (m0 < m1)
+				return 1;
+			if (m1 < m0)
+				return 0;
+		}
+	}
+
+	/*
+	 * Built-in rules.
+	 */
+
 	/* Return the path with fewer slashes */
 	for (p = path0; p++; p = (const char *) strchr(p, '/'))
 		slash0++;
@@ -441,7 +480,65 @@
 		_full_scan(1);
 }
 
-int dev_cache_init(void)
+static int _init_preferred_names(struct cmd_context *cmd)
+{
+	const struct config_node *cn;
+	struct config_value *v;
+	struct dm_pool *scratch = NULL;
+	char **regex;
+	unsigned count = 0;
+	int i, r = 0;
+
+	_cache.preferred_names_matcher = NULL;
+
+	if (!(cn = find_config_tree_node(cmd, "devices/preferred_names")) ||
+	    cn->v->type == CFG_EMPTY_ARRAY) {
+		log_very_verbose("devices/preferred_names not found in config file: "
+				 "using built-in preferences");
+		return 1;
+	}
+
+	for (v = cn->v; v; v = v->next) {
+		if (v->type != CFG_STRING) {
+			log_error("preferred_names patterns must be enclosed in quotes");
+			return 0;
+		}       
+
+		count++;
+	}
+
+	if (!(scratch = dm_pool_create("preferred device name matcher", 1024)))
+		return_0;
+
+	if (!(regex = dm_pool_alloc(scratch, sizeof(*regex) * count))) {
+		log_error("Failed to allocate preferred device name "
+			  "pattern list.");
+		goto out;
+	}
+
+	for (v = cn->v, i = count - 1; v; v = v->next, i--) {
+		if (!(regex[i] = dm_pool_strdup(scratch, v->v.str))) {
+			log_error("Failed to allocate a preferred device name "
+				  "pattern.");
+			goto out;
+		}
+	}
+
+	if (!(_cache.preferred_names_matcher =
+		dm_regex_create(_cache.mem,(const char **) regex, count))) {
+		log_error("Preferred device name pattern matcher creation failed.");
+		goto out;
+	}
+
+	r = 1;
+
+out:
+	dm_pool_destroy(scratch);
+
+	return r;
+}
+
+int dev_cache_init(struct cmd_context *cmd)
 {
 	_cache.names = NULL;
 	_cache.has_scanned = 0;
@@ -466,6 +563,9 @@
 	list_init(&_cache.dirs);
 	list_init(&_cache.files);
 
+	if (!_init_preferred_names(cmd))
+		goto_bad;
+
 	return 1;
 
       bad:
@@ -489,6 +589,9 @@
 	if (_cache.names)
 		_check_for_open_devices();
 
+	if (_cache.preferred_names_matcher)
+		_cache.preferred_names_matcher = NULL;
+
 	if (_cache.mem) {
 		dm_pool_destroy(_cache.mem);
 		_cache.mem = NULL;

Modified: lvm2/upstream/current/lib/device/dev-cache.h
==============================================================================
--- lvm2/upstream/current/lib/device/dev-cache.h	(original)
+++ lvm2/upstream/current/lib/device/dev-cache.h	Fri Jun 22 11:19:15 2007
@@ -30,7 +30,8 @@
 /*
  * The global device cache.
  */
-int dev_cache_init(void);
+struct cmd_context;
+int dev_cache_init(struct cmd_context *cmd);
 void dev_cache_exit(void);
 
 /* Trigger(1) or avoid(0) a scan */
@@ -41,6 +42,8 @@
 int dev_cache_add_loopfile(const char *path);
 struct device *dev_cache_get(const char *name, struct dev_filter *f);
 
+void dev_set_preferred_name(struct str_list *sl, struct device *dev);
+
 /*
  * Object for iterating through the cache.
  */

Modified: lvm2/upstream/current/lib/device/dev-io.c
==============================================================================
--- lvm2/upstream/current/lib/device/dev-io.c	(original)
+++ lvm2/upstream/current/lib/device/dev-io.c	Fri Jun 22 11:19:15 2007
@@ -564,6 +564,35 @@
 	return _aligned_io(&where, buffer, 0);
 }
 
+/*
+ * Read from 'dev' into 'buf', possibly in 2 distinct regions, denoted
+ * by (offset,len) and (offset2,len2).  Thus, the total size of
+ * 'buf' should be len+len2.
+ */
+int dev_read_circular(struct device *dev, uint64_t offset, size_t len,
+		      uint64_t offset2, size_t len2, void *buf)
+{
+	if (!dev_read(dev, offset, len, buf)) {
+		log_error("Read from %s failed", dev_name(dev));
+		return 0;
+	}
+
+	/*
+	 * The second region is optional, and allows for
+	 * a circular buffer on the device.
+	 */
+	if (!len2)
+		return 1;
+
+	if (!dev_read(dev, offset2, len2, buf + len)) {
+		log_error("Circular read from %s failed",
+			  dev_name(dev));
+		return 0;
+	}
+
+	return 1;
+}
+
 /* FIXME If O_DIRECT can't extend file, dev_extend first; dev_truncate after.
  *       But fails if concurrent processes writing
  */

Modified: lvm2/upstream/current/lib/device/device.h
==============================================================================
--- lvm2/upstream/current/lib/device/device.h	(original)
+++ lvm2/upstream/current/lib/device/device.h	Fri Jun 22 11:19:15 2007
@@ -78,6 +78,8 @@
 const char *dev_name(const struct device *dev);
 
 int dev_read(struct device *dev, uint64_t offset, size_t len, void *buffer);
+int dev_read_circular(struct device *dev, uint64_t offset, size_t len,
+		      uint64_t offset2, size_t len2, void *buf);
 int dev_write(struct device *dev, uint64_t offset, size_t len, void *buffer);
 int dev_append(struct device *dev, size_t len, void *buffer);
 int dev_set(struct device *dev, uint64_t offset, size_t len, int value);

Modified: lvm2/upstream/current/lib/display/display.c
==============================================================================
--- lvm2/upstream/current/lib/display/display.c	(original)
+++ lvm2/upstream/current/lib/display/display.c	Fri Jun 22 11:19:15 2007
@@ -258,6 +258,33 @@
 	return;
 }
 
+void pvdisplay_segments(struct physical_volume *pv)
+{
+	struct pv_segment *pvseg;
+
+	if (pv->pe_size)
+		log_print("--- Physical Segments ---");
+
+	list_iterate_items(pvseg, &pv->segments) {
+		log_print("Physical extent %u to %u:",
+			  pvseg->pe, pvseg->pe + pvseg->len - 1);
+
+		if (pvseg->lvseg) {
+			log_print("  Logical volume\t%s%s/%s",
+				  pvseg->lvseg->lv->vg->cmd->dev_dir,
+				  pvseg->lvseg->lv->vg->name,
+				  pvseg->lvseg->lv->name);
+			log_print("  Logical extents\t%d to %d",
+				  pvseg->lvseg->le, pvseg->lvseg->le +
+				  pvseg->lvseg->len - 1);
+		} else
+			log_print("  FREE");
+	}
+
+	log_print(" ");
+	return;
+}
+
 /* FIXME Include label fields */
 void pvdisplay_full(struct cmd_context *cmd, struct physical_volume *pv,
 		    void *handle __attribute((unused)))

Modified: lvm2/upstream/current/lib/display/display.h
==============================================================================
--- lvm2/upstream/current/lib/display/display.h	(original)
+++ lvm2/upstream/current/lib/display/display.h	Fri Jun 22 11:19:15 2007
@@ -31,6 +31,7 @@
 void display_stripe(const struct lv_segment *seg, uint32_t s, const char *pre);
 
 void pvdisplay_colons(struct physical_volume *pv);
+void pvdisplay_segments(struct physical_volume *pv);
 void pvdisplay_full(struct cmd_context *cmd, struct physical_volume *pv,
 		    void *handle);
 int pvdisplay_short(struct cmd_context *cmd, struct volume_group *vg,

Modified: lvm2/upstream/current/lib/filters/filter-persistent.c
==============================================================================
--- lvm2/upstream/current/lib/filters/filter-persistent.c	(original)
+++ lvm2/upstream/current/lib/filters/filter-persistent.c	Fri Jun 22 11:19:15 2007
@@ -301,10 +301,9 @@
 	}
 	memset(pf, 0, sizeof(*pf));
 
-	if (!(pf->file = dm_malloc(strlen(file) + 1))) {
-		stack;
-		goto bad;
-	}
+	if (!(pf->file = dm_malloc(strlen(file) + 1)))
+		goto_bad;
+
 	strcpy(pf->file, file);
 	pf->real = real;
 
@@ -313,10 +312,8 @@
 		goto bad;
 	}
 
-	if (!(f = dm_malloc(sizeof(*f)))) {
-		stack;
-		goto bad;
-	}
+	if (!(f = dm_malloc(sizeof(*f))))
+		goto_bad;
 
 	f->passes_filter = _lookup_p;
 	f->destroy = _persistent_destroy;

Modified: lvm2/upstream/current/lib/filters/filter-regex.c
==============================================================================
--- lvm2/upstream/current/lib/filters/filter-regex.c	(original)
+++ lvm2/upstream/current/lib/filters/filter-regex.c	Fri Jun 22 11:19:15 2007
@@ -15,13 +15,12 @@
 
 #include "lib.h"
 #include "filter-regex.h"
-#include "matcher.h"
 #include "device.h"
 
 struct rfilter {
 	struct dm_pool *mem;
 	dm_bitset_t accept;
-	struct matcher *engine;
+	struct dm_regex *engine;
 };
 
 static int _extract_pattern(struct dm_pool *mem, const char *pat,
@@ -98,18 +97,15 @@
 	unsigned count = 0;
 	int i, r = 0;
 
-	if (!(scratch = dm_pool_create("filter matcher", 1024))) {
-		stack;
-		return 0;
-	}
+	if (!(scratch = dm_pool_create("filter dm_regex", 1024)))
+		return_0;
 
 	/*
 	 * count how many patterns we have.
 	 */
 	for (v = val; v; v = v->next) {
-
 		if (v->type != CFG_STRING) {
-			log_info("filter patterns must be enclosed in quotes");
+			log_error("filter patterns must be enclosed in quotes");
 			goto out;
 		}
 
@@ -119,10 +115,8 @@
 	/*
 	 * allocate space for them
 	 */
-	if (!(regex = dm_pool_alloc(scratch, sizeof(*regex) * count))) {
-		stack;
-		goto out;
-	}
+	if (!(regex = dm_pool_alloc(scratch, sizeof(*regex) * count)))
+		goto_out;
 
 	/*
 	 * create the accept/reject bitset
@@ -136,15 +130,15 @@
 	 */
 	for (v = val, i = count - 1; v; v = v->next, i--)
 		if (!_extract_pattern(scratch, v->v.str, regex, rf->accept, i)) {
-			log_info("invalid filter pattern");
+			log_error("invalid filter pattern");
 			goto out;
 		}
 
 	/*
 	 * build the matcher.
 	 */
-	if (!(rf->engine = matcher_create(rf->mem, (const char **) regex,
-					  count)))
+	if (!(rf->engine = dm_regex_create(rf->mem, (const char **) regex,
+					   count)))
 		stack;
 	r = 1;
 
@@ -160,17 +154,12 @@
 	struct str_list *sl;
 
 	list_iterate_items(sl, &dev->aliases) {
-		m = matcher_run(rf->engine, sl->str);
+		m = dm_regex_match(rf->engine, sl->str);
 
 		if (m >= 0) {
 			if (dm_bit(rf->accept, m)) {
-
-				if (!first) {
-					log_debug("%s: New preferred name",
-						  sl->str);
-					list_del(&sl->list);
-					list_add_h(&dev->aliases, &sl->list);
-				}
+				if (!first)
+					dev_set_preferred_name(sl, dev);
 
 				return 1;
 			}
@@ -208,22 +197,16 @@
 		return NULL;
 	}
 
-	if (!(rf = dm_pool_alloc(mem, sizeof(*rf)))) {
-		stack;
-		goto bad;
-	}
+	if (!(rf = dm_pool_alloc(mem, sizeof(*rf))))
+		goto_bad;
 
 	rf->mem = mem;
 
-	if (!_build_matcher(rf, patterns)) {
-		stack;
-		goto bad;
-	}
+	if (!_build_matcher(rf, patterns))
+		goto_bad;
 
-	if (!(f = dm_pool_zalloc(mem, sizeof(*f)))) {
-		stack;
-		goto bad;
-	}
+	if (!(f = dm_pool_zalloc(mem, sizeof(*f))))
+		goto_bad;
 
 	f->passes_filter = _accept_p;
 	f->destroy = _regex_destroy;

Modified: lvm2/upstream/current/lib/filters/filter-sysfs.c
==============================================================================
--- lvm2/upstream/current/lib/filters/filter-sysfs.c	(original)
+++ lvm2/upstream/current/lib/filters/filter-sysfs.c	Fri Jun 22 11:19:15 2007
@@ -284,10 +284,8 @@
 		goto bad;
 	}
 
-	if (!(f = dm_pool_zalloc(mem, sizeof(*f)))) {
-		stack;
-		goto bad;
-	}
+	if (!(f = dm_pool_zalloc(mem, sizeof(*f))))
+		goto_bad;
 
 	f->passes_filter = _accept_p;
 	f->destroy = _destroy;

Modified: lvm2/upstream/current/lib/format1/disk-rep.c
==============================================================================
--- lvm2/upstream/current/lib/format1/disk-rep.c	(original)
+++ lvm2/upstream/current/lib/format1/disk-rep.c	Fri Jun 22 11:19:15 2007
@@ -357,10 +357,8 @@
 	list_init(&dl->uuids);
 	list_init(&dl->lvds);
 
-	if (!_read_pvd(dev, &dl->pvd)) {
-		stack;
-		goto bad;
-	}
+	if (!_read_pvd(dev, &dl->pvd))
+		goto_bad;
 
 	/*
 	 * is it an orphan ?

Modified: lvm2/upstream/current/lib/format1/format1.c
==============================================================================
--- lvm2/upstream/current/lib/format1/format1.c	(original)
+++ lvm2/upstream/current/lib/format1/format1.c	Fri Jun 22 11:19:15 2007
@@ -131,10 +131,10 @@
 	int partial;
 
 	if (!vg)
-		goto bad;
+		goto_bad;
 
 	if (list_empty(pvs))
-		goto bad;
+		goto_bad;
 
 	memset(vg, 0, sizeof(*vg));
 
@@ -146,24 +146,24 @@
 	list_init(&vg->tags);
 
 	if (!_check_vgs(pvs, &partial))
-		goto bad;
+		goto_bad;
 
 	dl = list_item(pvs->n, struct disk_list);
 
 	if (!import_vg(mem, vg, dl, partial))
-		goto bad;
+		goto_bad;
 
 	if (!import_pvs(fid->fmt, mem, vg, pvs, &vg->pvs, &vg->pv_count))
-		goto bad;
+		goto_bad;
 
 	if (!import_lvs(mem, vg, pvs))
-		goto bad;
+		goto_bad;
 
 	if (!import_extents(fid->fmt->cmd, vg, pvs))
-		goto bad;
+		goto_bad;
 
 	if (!import_snapshots(mem, vg, pvs))
-		goto bad;
+		goto_bad;
 
 	return vg;
 
@@ -191,15 +191,11 @@
 	vg_name = strip_dir(vg_name, fid->fmt->cmd->dev_dir);
 
 	if (!read_pvs_in_vg
-	    (fid->fmt, vg_name, fid->fmt->cmd->filter, mem, &pvs)) {
-		stack;
-		goto bad;
-	}
+	    (fid->fmt, vg_name, fid->fmt->cmd->filter, mem, &pvs))
+		goto_bad;
 
-	if (!(vg = _build_vg(fid, &pvs))) {
-		stack;
-		goto bad;
-	}
+	if (!(vg = _build_vg(fid, &pvs)))
+		goto_bad;
 
       bad:
 	dm_pool_destroy(mem);
@@ -415,17 +411,14 @@
 		return 0;
 	}
 
-	if (!(dl = dm_pool_alloc(mem, sizeof(*dl)))) {
-		stack;
-		goto bad;
-	}
+	if (!(dl = dm_pool_alloc(mem, sizeof(*dl))))
+		goto_bad;
+
 	dl->mem = mem;
 	dl->dev = pv->dev;
 
-	if (!export_pv(fmt->cmd, mem, NULL, &dl->pvd, pv)) {
-		stack;
-		goto bad;
-	}
+	if (!export_pv(fmt->cmd, mem, NULL, &dl->pvd, pv))
+		goto_bad;
 
 	/* must be set to be able to zero gap after PV structure in
 	   dev_write in order to make other disk tools happy */
@@ -434,10 +427,8 @@
 	dl->pvd.pe_on_disk.base = LVM1_PE_ALIGN << SECTOR_SHIFT;
 
 	list_add(&pvs, &dl->list);
-	if (!write_disks(fmt, &pvs)) {
-		stack;
-		goto bad;
-	}
+	if (!write_disks(fmt, &pvs))
+		goto_bad;
 
 	dm_pool_destroy(mem);
 	return 1;

Modified: lvm2/upstream/current/lib/format1/import-extents.c
==============================================================================
--- lvm2/upstream/current/lib/format1/import-extents.c	(original)
+++ lvm2/upstream/current/lib/format1/import-extents.c	Fri Jun 22 11:19:15 2007
@@ -59,22 +59,16 @@
 		if (ll->lv->status & SNAPSHOT)
 			continue;
 
-		if (!(lvm = dm_pool_alloc(mem, sizeof(*lvm)))) {
-			stack;
-			goto bad;
-		}
+		if (!(lvm = dm_pool_alloc(mem, sizeof(*lvm))))
+			goto_bad;
 
 		lvm->lv = ll->lv;
 		if (!(lvm->map = dm_pool_zalloc(mem, sizeof(*lvm->map)
-					     * ll->lv->le_count))) {
-			stack;
-			goto bad;
-		}
+					     * ll->lv->le_count)))
+			goto_bad;
 
-		if (!dm_hash_insert(maps, ll->lv->name, lvm)) {
-			stack;
-			goto bad;
-		}
+		if (!dm_hash_insert(maps, ll->lv->name, lvm))
+			goto_bad;
 	}
 
 	return maps;

Modified: lvm2/upstream/current/lib/format_text/archive.c
==============================================================================
--- lvm2/upstream/current/lib/format_text/archive.c	(original)
+++ lvm2/upstream/current/lib/format_text/archive.c	Fri Jun 22 11:19:15 2007
@@ -362,6 +362,22 @@
 	return 1;
 }
 
+int archive_list_file(struct cmd_context *cmd, const char *file)
+{
+	struct archive_file af;
+
+	af.path = (char *)file;
+
+	if (!path_exists(af.path)) {
+		log_err("Archive file %s not found.", af.path);
+		return 0;
+	}
+
+	_display_archive(cmd, &af);
+
+	return 1;
+}
+
 int backup_list(struct cmd_context *cmd, const char *dir, const char *vgname)
 {
 	struct archive_file af;

Modified: lvm2/upstream/current/lib/format_text/archiver.c
==============================================================================
--- lvm2/upstream/current/lib/format_text/archiver.c	(original)
+++ lvm2/upstream/current/lib/format_text/archiver.c	Fri Jun 22 11:19:15 2007
@@ -148,6 +148,17 @@
 	return r1 && r2;
 }
 
+int archive_display_file(struct cmd_context *cmd, const char *file)
+{
+	int r;
+
+	init_partial(1);
+	r = archive_list_file(cmd, file);
+	init_partial(0);
+
+	return r;
+}
+
 int backup_init(struct cmd_context *cmd, const char *dir)
 {
 	if (!(cmd->backup_params = dm_pool_zalloc(cmd->libmem,

Modified: lvm2/upstream/current/lib/format_text/archiver.h
==============================================================================
--- lvm2/upstream/current/lib/format_text/archiver.h	(original)
+++ lvm2/upstream/current/lib/format_text/archiver.h	Fri Jun 22 11:19:15 2007
@@ -38,6 +38,7 @@
 void archive_enable(struct cmd_context *cmd, int flag);
 int archive(struct volume_group *vg);
 int archive_display(struct cmd_context *cmd, const char *vg_name);
+int archive_display_file(struct cmd_context *cmd, const char *file);
 
 int backup_init(struct cmd_context *cmd, const char *dir);
 void backup_exit(struct cmd_context *cmd);

Modified: lvm2/upstream/current/lib/format_text/export.c
==============================================================================
--- lvm2/upstream/current/lib/format_text/export.c	(original)
+++ lvm2/upstream/current/lib/format_text/export.c	Fri Jun 22 11:19:15 2007
@@ -160,7 +160,7 @@
 	for (i = 0; i < f->indent; i++)
 		white_space[i] = '\t';
 	white_space[i] = '\0';
-	fprintf(f->data.fp, white_space);
+	fputs(white_space, f->data.fp);
 	i = vfprintf(f->data.fp, fmt, ap);
 
 	if (comment) {
@@ -176,7 +176,7 @@
 
 		while (++i < COMMENT_TAB);
 
-		fprintf(f->data.fp, comment);
+		fputs(comment, f->data.fp);
 	}
 	fputc('\n', f->data.fp);
 

Modified: lvm2/upstream/current/lib/format_text/format-text.c
==============================================================================
--- lvm2/upstream/current/lib/format_text/format-text.c	(original)
+++ lvm2/upstream/current/lib/format_text/format-text.c	Fri Jun 22 11:19:15 2007
@@ -39,6 +39,9 @@
 #define FMT_TEXT_NAME "lvm2"
 #define FMT_TEXT_ALIAS "text"
 
+static struct mda_header *_raw_read_mda_header(const struct format_type *fmt,
+					       struct device_area *dev_area);
+
 static struct format_instance *_text_create_text_instance(const struct format_type
 						     *fmt, const char *vgname,
 						     const char *vgid,
@@ -80,6 +83,164 @@
 	return 1;
 }
 
+/*
+ * Check if metadata area belongs to vg
+ */
+static int _mda_in_vg_raw(struct format_instance *fid __attribute((unused)),
+			     struct volume_group *vg, struct metadata_area *mda)
+{
+	struct mda_context *mdac = (struct mda_context *) mda->metadata_locn;
+	struct pv_list *pvl;
+
+	list_iterate_items(pvl, &vg->pvs)
+		if (pvl->pv->dev == mdac->area.dev)
+			return 1;
+
+	return 0;
+}
+
+/*
+ * For circular region between region_start and region_start + region_size,
+ * back up one SECTOR_SIZE from 'region_ptr' and return the value.
+ * This allows reverse traversal through text metadata area to find old
+ * metadata.
+ *
+ * Parameters:
+ *   region_start: start of the region (bytes)
+ *   region_size: size of the region (bytes)
+ *   region_ptr: pointer within the region (bytes)
+ *   NOTE: region_start <= region_ptr <= region_start + region_size
+ */
+static uint64_t _get_prev_sector_circular(uint64_t region_start,
+					  uint64_t region_size,
+					  uint64_t region_ptr)
+{
+	if (region_ptr >= region_start + SECTOR_SIZE)
+		return region_ptr - SECTOR_SIZE;
+	else
+		return (region_start + region_size - SECTOR_SIZE);
+}
+
+/*
+ * Analyze a metadata area for old metadata records in the circular buffer.
+ * This function just looks through and makes a first pass at the data in
+ * the sectors for particular things.
+ * FIXME: do something with each metadata area (try to extract vg, write
+ * raw data to file, etc)
+ */
+static int _pv_analyze_mda_raw (const struct format_type * fmt,
+				struct metadata_area *mda)
+{
+	struct mda_header *mdah;
+	struct raw_locn *rlocn;
+	uint64_t area_start;
+	uint64_t area_size;
+	uint64_t prev_sector;
+	uint64_t latest_mrec_offset;
+	int i;
+	uint64_t offset;
+	uint64_t offset2;
+	uint64_t size;
+	uint64_t size2;
+	char *buf=NULL;
+	struct device_area *area;
+	struct mda_context *mdac;
+	int r=0;
+
+	mdac = (struct mda_context *) mda->metadata_locn;
+
+	log_print("Found text metadata area, offset=%"PRIu64", size=%"PRIu64,
+		  mdac->area.start,
+		  mdac->area.size);
+	area = &mdac->area;
+
+	if (!dev_open(area->dev))
+		return_0;
+
+	if (!(mdah = _raw_read_mda_header(fmt, area)))
+		goto_out;
+
+	rlocn = mdah->raw_locns;
+
+	/*
+	 * The device area includes the metadata header as well as the
+	 * records, so remove the metadata header from the start and size
+	 */
+	area_start = area->start + MDA_HEADER_SIZE;
+	area_size = area->size - MDA_HEADER_SIZE;
+	latest_mrec_offset = rlocn->offset + area->start;
+
+	/*
+	 * Start searching at rlocn (point of live metadata) and go
+	 * backwards.
+	 */
+	prev_sector = _get_prev_sector_circular(area_start, area_size,
+					       latest_mrec_offset);
+	offset = prev_sector;
+	size = SECTOR_SIZE;
+	offset2 = size2 = 0;
+	i = 0;
+	while (prev_sector != latest_mrec_offset) {
+		prev_sector = _get_prev_sector_circular(area_start, area_size,
+							prev_sector);
+		/*
+		 * FIXME: for some reason, the whole metadata region from
+		 * area->start to area->start+area->size is not used.
+		 * Only ~32KB seems to contain valid metadata records
+		 * (LVM2 format - format_text).  As a result, I end up with
+		 * "maybe_config_section" returning true when there's no valid
+		 * metadata in a sector (sectors with all nulls).
+		 */
+		if (!(buf = dm_pool_alloc(fmt->cmd->mem, size + size2)))
+			goto_out;
+
+		if (!dev_read_circular(area->dev, offset, size,
+				       offset2, size2, buf))
+			goto_out;
+
+		/*
+		 * FIXME: We could add more sophisticated metadata detection
+		 */
+		if (maybe_config_section(buf, size+size2)) {
+			/* FIXME: Validate region, pull out timestamp?, etc */
+			/* FIXME: Do something with this region */
+			log_verbose ("Found LVM2 metadata record at "
+				     "offset=%"PRIu64", size=%"PRIu64", "
+				     "offset2=%"PRIu64" size2=%"PRIu64,
+				     offset, size, offset2, size2);
+			offset = prev_sector;
+			size = SECTOR_SIZE;
+			offset2 = size2 = 0;
+		} else {
+			/*
+			 * Not a complete metadata record, assume we have
+			 * metadata and just increase the size and offset.
+			 * Start the second region if the previous sector is
+			 * wrapping around towards the end of the disk.
+			 */
+			if (prev_sector > offset) {
+				offset2 = prev_sector;
+				size2 += SECTOR_SIZE;
+			} else {
+				offset = prev_sector;
+				size += SECTOR_SIZE;
+			}
+		}
+		dm_pool_free(fmt->cmd->mem, buf);
+		buf = NULL;
+	}
+
+	r = 1;
+ out:
+	if (buf)
+		dm_pool_free(fmt->cmd->mem, buf);
+	if (!dev_close(area->dev))
+		stack;
+	return r;
+}
+
+
+
 static int _text_lv_setup(struct format_instance *fid __attribute((unused)),
 			  struct logical_volume *lv)
 {
@@ -1271,7 +1432,7 @@
 	}
 
 	/* FIXME Optimise out repeated reading when cache lock held */
-	if (!(label_read(dev, &label))) {
+	if (!(label_read(dev, &label, UINT64_C(0)))) {
 		stack;
 		return 0;
 	}
@@ -1395,7 +1556,9 @@
 	.vg_remove = _vg_remove_raw,
 	.vg_precommit = _vg_precommit_raw,
 	.vg_commit = _vg_commit_raw,
-	.vg_revert = _vg_revert_raw
+	.vg_revert = _vg_revert_raw,
+	.mda_in_vg = _mda_in_vg_raw,
+	.pv_analyze_mda = _pv_analyze_mda_raw,
 };
 
 /* pvmetadatasize in sectors */

Modified: lvm2/upstream/current/lib/format_text/format-text.h
==============================================================================
--- lvm2/upstream/current/lib/format_text/format-text.h	(original)
+++ lvm2/upstream/current/lib/format_text/format-text.h	Fri Jun 22 11:19:15 2007
@@ -33,6 +33,7 @@
  * Displays a list of vg backups in a particular archive directory.
  */
 int archive_list(struct cmd_context *cmd, const char *dir, const char *vgname);
+int archive_list_file(struct cmd_context *cmd, const char *file);
 int backup_list(struct cmd_context *cmd, const char *dir, const char *vgname);
 
 /*

Modified: lvm2/upstream/current/lib/format_text/import_vsn1.c
==============================================================================
--- lvm2/upstream/current/lib/format_text/import_vsn1.c	(original)
+++ lvm2/upstream/current/lib/format_text/import_vsn1.c	Fri Jun 22 11:19:15 2007
@@ -660,15 +660,11 @@
 	/* eg Set to instance of fmt1 here if reading a format1 backup? */
 	vg->fid = fid;
 
-	if (!(vg->name = dm_pool_strdup(mem, vgn->key))) {
-		stack;
-		goto bad;
-	}
+	if (!(vg->name = dm_pool_strdup(mem, vgn->key)))
+		goto_bad;
 
-	if (!(vg->system_id = dm_pool_zalloc(mem, NAME_LEN))) {
-		stack;
-		goto bad;
-	}
+	if (!(vg->system_id = dm_pool_zalloc(mem, NAME_LEN)))
+		goto_bad;
 
 	vgn = vgn->child;
 

Modified: lvm2/upstream/current/lib/label/label.c
==============================================================================
--- lvm2/upstream/current/lib/label/label.c	(original)
+++ lvm2/upstream/current/lib/label/label.c	Fri Jun 22 11:19:15 2007
@@ -107,7 +107,8 @@
 }
 
 static struct labeller *_find_labeller(struct device *dev, char *buf,
-				       uint64_t *label_sector)
+				       uint64_t *label_sector,
+				       uint64_t scan_sector)
 {
 	struct labeller_i *li;
 	struct labeller *r = NULL;
@@ -117,12 +118,13 @@
 	int found = 0;
 	char readbuf[LABEL_SCAN_SIZE] __attribute((aligned(8)));
 
-	if (!dev_read(dev, UINT64_C(0), LABEL_SCAN_SIZE, readbuf)) {
+	if (!dev_read(dev, scan_sector << SECTOR_SHIFT,
+		      LABEL_SCAN_SIZE, readbuf)) {
 		log_debug("%s: Failed to read label area", dev_name(dev));
 		goto out;
 	}
 
-	/* Scan first few sectors for a valid label */
+	/* Scan a few sectors for a valid label */
 	for (sector = 0; sector < LABEL_SCAN_SECTORS;
 	     sector += LABEL_SIZE >> SECTOR_SHIFT) {
 		lh = (struct label_header *) (readbuf +
@@ -132,13 +134,14 @@
 			if (found) {
 				log_error("Ignoring additional label on %s at "
 					  "sector %" PRIu64, dev_name(dev),
-					  sector);
+					  sector + scan_sector);
 			}
-			if (xlate64(lh->sector_xl) != sector) {
+			if (xlate64(lh->sector_xl) != sector + scan_sector) {
 				log_info("%s: Label for sector %" PRIu64
 					 " found at sector %" PRIu64
 					 " - ignoring", dev_name(dev),
-					 xlate64(lh->sector_xl), sector);
+					 xlate64(lh->sector_xl),
+					 sector + scan_sector);
 				continue;
 			}
 			if (calc_crc(INITIAL_CRC, &lh->offset_xl, LABEL_SIZE -
@@ -153,19 +156,21 @@
 		}
 
 		list_iterate_items(li, &_labellers) {
-			if (li->l->ops->can_handle(li->l, (char *) lh, sector)) {
+			if (li->l->ops->can_handle(li->l, (char *) lh,
+						   sector + scan_sector)) {
 				log_very_verbose("%s: %s label detected",
 						 dev_name(dev), li->name);
 				if (found) {
 					log_error("Ignoring additional label "
 						  "on %s at sector %" PRIu64,
-						  dev_name(dev), sector);
+						  dev_name(dev),
+						  sector + scan_sector);
 					continue;
 				}
 				r = li->l;
 				memcpy(buf, lh, LABEL_SIZE);
 				if (label_sector)
-					*label_sector = sector;
+					*label_sector = sector + scan_sector;
 				found = 1;
 				break;
 			}
@@ -256,7 +261,8 @@
 }
 
 /* FIXME Avoid repeated re-reading if cache lock held */
-int label_read(struct device *dev, struct label **result)
+int label_read(struct device *dev, struct label **result,
+		uint64_t scan_sector)
 {
 	char buf[LABEL_SIZE] __attribute((aligned(8)));
 	struct labeller *l;
@@ -274,7 +280,7 @@
 		return r;
 	}
 
-	if (!(l = _find_labeller(dev, buf, &sector)))
+	if (!(l = _find_labeller(dev, buf, &sector, scan_sector)))
 		goto_out;
 
 	if ((r = (l->ops->read)(l, dev, buf, result)) && result && *result)
@@ -354,7 +360,7 @@
 		return_0;
 	}
 
-	if (!(l = _find_labeller(dev, buf, &sector)))
+	if (!(l = _find_labeller(dev, buf, &sector, UINT64_C(0))))
 		goto_out;
 
 	r = l->ops->verify ? l->ops->verify(l, buf, sector) : 1;

Modified: lvm2/upstream/current/lib/label/label.h
==============================================================================
--- lvm2/upstream/current/lib/label/label.h	(original)
+++ lvm2/upstream/current/lib/label/label.h	Fri Jun 22 11:19:15 2007
@@ -96,7 +96,8 @@
 struct labeller *label_get_handler(const char *name);
 
 int label_remove(struct device *dev);
-int label_read(struct device *dev, struct label **result);
+int label_read(struct device *dev, struct label **result,
+		uint64_t scan_sector);
 int label_write(struct device *dev, struct label *label);
 int label_verify(struct device *dev);
 struct label *label_create(struct labeller *labeller);

Modified: lvm2/upstream/current/lib/locking/locking.c
==============================================================================
--- lvm2/upstream/current/lib/locking/locking.c	(original)
+++ lvm2/upstream/current/lib/locking/locking.c	Fri Jun 22 11:19:15 2007
@@ -34,6 +34,90 @@
 static int _vg_write_lock_held = 0;	/* VG write lock held? */
 static int _signals_blocked = 0;
 
+static volatile sig_atomic_t _sigint_caught = 0;
+static volatile sig_atomic_t _handler_installed;
+static struct sigaction _oldhandler;
+static int _oldmasked;
+
+static void _catch_sigint(int unused __attribute__((unused)))
+{
+	_sigint_caught = 1;
+}
+
+int sigint_caught(void) {
+	return _sigint_caught;
+}
+
+void sigint_clear(void)
+{
+	_sigint_caught = 0;
+}
+
+/*
+ * Temporarily allow keyboard interrupts to be intercepted and noted;
+ * saves interrupt handler state for sigint_restore().  Users should
+ * use the sigint_caught() predicate to check whether interrupt was
+ * requested and act appropriately.  Interrupt flags are never
+ * cleared automatically by this code, but the tools clear the flag
+ * before running each command in lvm_run_command().  All other places
+ * where the flag needs to be cleared need to call sigint_clear().
+ */
+
+void sigint_allow(void)
+{
+	struct sigaction handler;
+	sigset_t sigs;
+
+	/*
+	 * Do not overwrite the backed-up handler data -
+	 * just increase nesting count.
+	 */
+	if (_handler_installed) {
+		_handler_installed++;
+		return;
+	}
+
+	/* Grab old sigaction for SIGINT: shall not fail. */
+	sigaction(SIGINT, NULL, &handler);
+	handler.sa_flags &= ~SA_RESTART; /* Clear restart flag */
+	handler.sa_handler = _catch_sigint;
+
+	_handler_installed = 1;
+
+	/* Override the signal handler: shall not fail. */
+	sigaction(SIGINT, &handler, &_oldhandler);
+
+	/* Unmask SIGINT.  Remember to mask it again on restore. */
+	sigprocmask(0, NULL, &sigs);
+	if ((_oldmasked = sigismember(&sigs, SIGINT))) {
+		sigdelset(&sigs, SIGINT);
+		sigprocmask(SIG_SETMASK, &sigs, NULL);
+	}
+}
+
+void sigint_restore(void)
+{
+	if (!_handler_installed)
+		return;
+
+	if (_handler_installed > 1) {
+		_handler_installed--;
+		return;
+	}
+
+	/* Nesting count went down to 0. */
+	_handler_installed = 0;
+
+	if (_oldmasked) {
+		sigset_t sigs;
+		sigprocmask(0, NULL, &sigs);
+		sigaddset(&sigs, SIGINT);
+		sigprocmask(SIG_SETMASK, &sigs, NULL);
+	}
+
+	sigaction(SIGINT, &_oldhandler, NULL);
+}
+
 static void _block_signals(int flags __attribute((unused)))
 {
 	sigset_t set;

Modified: lvm2/upstream/current/lib/locking/locking.h
==============================================================================
--- lvm2/upstream/current/lib/locking/locking.h	(original)
+++ lvm2/upstream/current/lib/locking/locking.h	Fri Jun 22 11:19:15 2007
@@ -115,4 +115,10 @@
 int resume_lvs(struct cmd_context *cmd, struct list *lvs);
 int activate_lvs_excl(struct cmd_context *cmd, struct list *lvs);
 
+/* Interrupt handling */
+void sigint_clear(void);
+void sigint_allow(void);
+void sigint_restore(void);
+int sigint_caught(void);
+
 #endif

Modified: lvm2/upstream/current/lib/log/log.h
==============================================================================
--- lvm2/upstream/current/lib/log/log.h	(original)
+++ lvm2/upstream/current/lib/log/log.h	Fri Jun 22 11:19:15 2007
@@ -138,5 +138,6 @@
 #define return_0	do { stack; return 0; } while (0)
 #define return_NULL	do { stack; return NULL; } while (0)
 #define goto_out	do { stack; goto out; } while (0)
+#define goto_bad	do { stack; goto bad; } while (0)
 
 #endif

Modified: lvm2/upstream/current/lib/metadata/metadata.c
==============================================================================
--- lvm2/upstream/current/lib/metadata/metadata.c	(original)
+++ lvm2/upstream/current/lib/metadata/metadata.c	Fri Jun 22 11:19:15 2007
@@ -24,9 +24,43 @@
 #include "pv_alloc.h"
 #include "activate.h"
 #include "display.h"
+#include "locking.h"
 
 #include <sys/param.h>
 
+/*
+ * FIXME: Check for valid handle before dereferencing field or log error?
+ */
+#define pv_field(handle, field)				\
+	(((struct physical_volume *)(handle))->field)
+
+static struct physical_volume *_pv_read(struct cmd_context *cmd, 
+					const char *pv_name,
+					struct list *mdas, 
+					uint64_t *label_sector,
+					int warnings);
+
+static struct physical_volume *_pv_create(const struct format_type *fmt,
+				  struct device *dev,
+				  struct id *id, uint64_t size,
+				  uint64_t pe_start,
+				  uint32_t existing_extent_count,
+				  uint32_t existing_extent_size,
+				  int pvmetadatacopies,
+				  uint64_t pvmetadatasize, struct list *mdas);
+
+static int _pv_write(struct cmd_context *cmd __attribute((unused)), 
+		     struct physical_volume *pv,
+	     	     struct list *mdas, int64_t label_sector);
+
+static struct physical_volume *_find_pv_by_name(struct cmd_context *cmd,
+			 			const char *pv_name);
+
+static struct pv_list *_find_pv_in_vg(struct volume_group *vg, const char *pv_name);
+
+static struct physical_volume *_find_pv_in_vg_by_uuid(struct volume_group *vg,
+						      struct id *id);
+
 unsigned long pe_align(void)
 {
 	return MAX(65536UL, lvm_getpagesize()) >> SECTOR_SHIFT;
@@ -49,7 +83,7 @@
 	}
 
 	list_init(&mdas);
-	if (!(pv = pv_read(fid->fmt->cmd, pv_name, &mdas, NULL, 1))) {
+	if (!(pv = _pv_read(fid->fmt->cmd, pv_name, &mdas, NULL, 1))) {
 		log_error("%s not identified as an existing physical volume",
 			  pv_name);
 		return 0;
@@ -102,7 +136,7 @@
 		return 0;
 	}
 
-	if (find_pv_in_vg(vg, pv_name)) {
+	if (_find_pv_in_vg(vg, pv_name)) {
 		log_error("Physical volume '%s' listed more than once.",
 			  pv_name);
 		return 0;
@@ -280,10 +314,9 @@
 	vg->seqno = 0;
 
 	vg->status = (RESIZEABLE_VG | LVM_READ | LVM_WRITE);
-	if (!(vg->system_id = dm_pool_alloc(mem, NAME_LEN))) {
-		stack;
-		goto bad;
-	}
+	if (!(vg->system_id = dm_pool_alloc(mem, NAME_LEN)))
+		goto_bad;
+
 	*vg->system_id = '\0';
 
 	vg->extent_size = extent_size;
@@ -320,7 +353,7 @@
 
 	/* attach the pv's */
 	if (!vg_extend(vg->fid, vg, pv_count, pv_names))
-		goto bad;
+		goto_bad;
 
 	return vg;
 
@@ -505,8 +538,72 @@
 	return 1;
 }
 
+int vg_split_mdas(struct cmd_context *cmd, struct volume_group *vg_from,
+		  struct volume_group *vg_to)
+{
+	struct metadata_area *mda, *mda2;
+	struct list *mdas_from, *mdas_to;
+	int common_mda = 0;
+
+	mdas_from = &vg_from->fid->metadata_areas;
+	mdas_to = &vg_to->fid->metadata_areas;
+
+	list_iterate_items_safe(mda, mda2, mdas_from) {
+		if (!mda->ops->mda_in_vg) {
+			common_mda = 1;
+			continue;
+		}
+
+		if (!mda->ops->mda_in_vg(vg_from->fid, vg_from, mda)) {
+			list_del(&mda->list);
+			list_add(mdas_to, &mda->list);
+		}
+	}
+
+	if (list_empty(mdas_from) || list_empty(mdas_to))
+		return common_mda;
+
+	return 1;
+}
+
+/**
+ * pv_create - initialize a physical volume for use with a volume group
+ * @fmt: format type
+ * @dev: PV device to initialize
+ * @id: PV UUID to use for initialization
+ * @size: size of the PV in sectors
+ * @pe_start: physical extent start
+ * @existing_extent_count
+ * @existing_extent_size
+ * @pvmetadatacopies
+ * @pvmetadatasize
+ * @mdas
+ *
+ * Returns:
+ *   PV handle - physical volume initialized successfully
+ *   NULL - invalid parameter or problem initializing the physical volume
+ *
+ * Note:
+ *   FIXME - liblvm todo - tidy up arguments for external use (fmt, mdas, etc)
+ */
+pv_t *pv_create(const struct format_type *fmt,
+		struct device *dev,
+		struct id *id, uint64_t size,
+		uint64_t pe_start,
+		uint32_t existing_extent_count,
+		uint32_t existing_extent_size,
+		int pvmetadatacopies,
+		uint64_t pvmetadatasize, struct list *mdas)
+{
+	return _pv_create(fmt, dev, id, size, pe_start, 
+			  existing_extent_count,
+			  existing_extent_size,
+			  pvmetadatacopies,
+			  pvmetadatasize, mdas);
+}
+
 /* Sizes in sectors */
-struct physical_volume *pv_create(const struct format_type *fmt,
+static struct physical_volume *_pv_create(const struct format_type *fmt,
 				  struct device *dev,
 				  struct id *id, uint64_t size,
 				  uint64_t pe_start,
@@ -533,10 +630,8 @@
 
 	pv->dev = dev;
 
-	if (!(pv->vg_name = dm_pool_zalloc(mem, NAME_LEN))) {
-		stack;
-		goto bad;
-	}
+	if (!(pv->vg_name = dm_pool_zalloc(mem, NAME_LEN)))
+		goto_bad;
 
 	pv->status = ALLOCATABLE_PV;
 
@@ -584,8 +679,14 @@
 	return NULL;
 }
 
+/* FIXME: liblvm todo - make into function that returns handle */
 struct pv_list *find_pv_in_vg(struct volume_group *vg, const char *pv_name)
 {
+	return _find_pv_in_vg(vg, pv_name);
+}
+
+static struct pv_list *_find_pv_in_vg(struct volume_group *vg, const char *pv_name)
+{
 	struct pv_list *pvl;
 
 	list_iterate_items(pvl, &vg->pvs)
@@ -606,8 +707,26 @@
 	return 0;
 }
 
-struct physical_volume *find_pv_in_vg_by_uuid(struct volume_group *vg,
-					      struct id *id)
+/**
+ * find_pv_in_vg_by_uuid - Find PV in VG by PV UUID
+ * @vg: volume group to search
+ * @id: UUID of the PV to match
+ *
+ * Returns:
+ *   PV handle - if UUID of PV found in VG
+ *   NULL - invalid parameter or UUID of PV not found in VG
+ *
+ * Note
+ *   FIXME - liblvm todo - make into function that takes VG handle
+ */
+pv_t *find_pv_in_vg_by_uuid(struct volume_group *vg, struct id *id)
+{
+	return _find_pv_in_vg_by_uuid(vg, id);
+}
+
+
+static struct physical_volume *_find_pv_in_vg_by_uuid(struct volume_group *vg,
+						      struct id *id)
 {
 	struct pv_list *pvl;
 
@@ -665,12 +784,20 @@
 	return NULL;
 }
 
+/* FIXME: liblvm todo - make into function that returns handle */
 struct physical_volume *find_pv_by_name(struct cmd_context *cmd,
 					const char *pv_name)
 {
+	return _find_pv_by_name(cmd, pv_name);
+}
+
+
+static struct physical_volume *_find_pv_by_name(struct cmd_context *cmd,
+			 			const char *pv_name)
+{
 	struct physical_volume *pv;
 
-	if (!(pv = pv_read(cmd, pv_name, NULL, NULL, 1))) {
+	if (!(pv = _pv_read(cmd, pv_name, NULL, NULL, 1))) {
 		log_error("Physical volume %s not found", pv_name);
 		return NULL;
 	}
@@ -759,6 +886,12 @@
 				r = 0;
 			}
 		}
+
+		if (strcmp(pvl->pv->vg_name, vg->name)) {
+			log_error("Internal error: VG name for PV %s is corrupted",
+				  dev_name(pvl->pv->dev));
+			r = 0;
+		}
 	}
 
 	if (!check_pv_segments(vg)) {
@@ -948,7 +1081,7 @@
 	}
 
 	list_iterate_items(info, &vginfo->infos) {
-		if (!(pv = pv_read(cmd, dev_name(info->dev), NULL, NULL, 1))) {
+		if (!(pv = _pv_read(cmd, dev_name(info->dev), NULL, NULL, 1))) {
 			continue;
 		}
 		if (!(pvl = dm_pool_zalloc(cmd->mem, sizeof(*pvl)))) {
@@ -1354,11 +1487,35 @@
 	return lvl->lv;
 }
 
-/* FIXME Use label functions instead of PV functions */
+/**
+ * pv_read - read and return a handle to a physical volume
+ * @cmd: LVM command initiating the pv_read
+ * @pv_name: full device name of the PV, including the path
+ * @mdas: list of metadata areas of the PV
+ * @label_sector: sector number where the PV label is stored on @pv_name
+ * @warnings:
+ *
+ * Returns:
+ *   PV handle - valid pv_name and successful read of the PV, or
+ *   NULL - invalid parameter or error in reading the PV
+ *
+ * Note:
+ *   FIXME - liblvm todo - make into function that returns handle
+ */
 struct physical_volume *pv_read(struct cmd_context *cmd, const char *pv_name,
 				struct list *mdas, uint64_t *label_sector,
 				int warnings)
 {
+	return _pv_read(cmd, pv_name, mdas, label_sector, warnings);
+}
+
+/* FIXME Use label functions instead of PV functions */
+static struct physical_volume *_pv_read(struct cmd_context *cmd, 
+					const char *pv_name,
+					struct list *mdas, 
+					uint64_t *label_sector,
+					int warnings)
+{
 	struct physical_volume *pv;
 	struct label *label;
 	struct lvmcache_info *info;
@@ -1369,7 +1526,7 @@
 		return NULL;
 	}
 
-	if (!(label_read(dev, &label))) {
+	if (!(label_read(dev, &label, UINT64_C(0)))) {
 		if (warnings)
 			log_error("No physical volume label read from %s",
 				  pv_name);
@@ -1478,9 +1635,18 @@
 	return results;
 }
 
-int pv_write(struct cmd_context *cmd __attribute((unused)), struct physical_volume *pv,
+/* FIXME: liblvm todo - make into function that takes handle */
+int pv_write(struct cmd_context *cmd __attribute((unused)),
+	     struct physical_volume *pv,
 	     struct list *mdas, int64_t label_sector)
 {
+	return _pv_write(cmd, pv, mdas, label_sector);
+}
+
+static int _pv_write(struct cmd_context *cmd __attribute((unused)), 
+		     struct physical_volume *pv,
+	     	     struct list *mdas, int64_t label_sector)
+{
 	if (!pv->fmt->ops->pv_write) {
 		log_error("Format does not support writing physical volumes");
 		return 0;
@@ -1512,7 +1678,7 @@
 		return 0;
 	}
 
-	if (!pv_write(cmd, pv, NULL, INT64_C(-1))) {
+	if (!_pv_write(cmd, pv, NULL, INT64_C(-1))) {
 		log_error("Failed to clear metadata from physical "
 			  "volume \"%s\" after removal from \"%s\"",
 			  dev_name(pv->dev), old_vg_name);
@@ -1521,3 +1687,154 @@
 
 	return 1;
 }
+
+/**
+ * is_orphan - Determine whether a pv is an orphan based on its vg_name
+ * @pv: handle to the physical volume
+ */
+int is_orphan(pv_t *pv)
+{
+	return (pv_field(pv, vg_name)[0] ? 0 : 1);
+}
+
+
+/*
+ * Returns:
+ *  0 - fail
+ *  1 - success
+ */
+int pv_analyze(struct cmd_context *cmd, const char *pv_name,
+	       int64_t label_sector)
+{
+	struct label *label;
+	struct device *dev;
+	struct metadata_area *mda;
+	struct lvmcache_info *info;
+
+	dev = dev_cache_get(pv_name, cmd->filter);
+	if (!dev) {
+		log_error("Device %s not found (or ignored by filtering).",
+			  pv_name);
+		return 0;
+	}
+
+	/*
+	 * First, scan for LVM labels.
+	 */
+	if (!label_read(dev, &label, label_sector)) {
+		log_error("Could not find LVM label on %s",
+			  pv_name);
+		return 0;
+	}
+
+	log_print("Found label on %s, sector %"PRIu64", type=%s",
+		  pv_name, label->sector, label->type);
+
+	/*
+	 * Next, loop through metadata areas
+	 */
+	info = label->info;
+	list_iterate_items(mda, &info->mdas)
+		mda->ops->pv_analyze_mda(info->fmt, mda);
+
+	return 1;
+}
+
+
+
+/**
+ * vg_check_status - check volume group status flags and log error
+ * @vg - volume group to check status flags
+ * @status_flags - specific status flags to check (e.g. EXPORTED_VG)
+ *
+ * Returns:
+ * 0 - fail
+ * 1 - success
+ */
+int vg_check_status(struct volume_group *vg, uint32_t status_flags)
+{
+	if ((status_flags & CLUSTERED) &&
+	    (vg->status & CLUSTERED) && !locking_is_clustered() &&
+	    !lockingfailed()) {
+		log_error("Skipping clustered volume group %s", vg->name);
+		return 0;
+	}
+
+	if ((status_flags & EXPORTED_VG) &&
+	    (vg->status & EXPORTED_VG)) {
+		log_error("Volume group %s is exported", vg->name);
+		return 0;
+	}
+
+	if ((status_flags & LVM_WRITE) &&
+	    !(vg->status & LVM_WRITE)) {
+		log_error("Volume group %s is read-only", vg->name);
+		return 0;
+	}
+	if ((status_flags & RESIZEABLE_VG) &&
+	    !(vg->status & RESIZEABLE_VG)) {
+		log_error("Volume group %s is not resizeable.", vg->name);
+		return 0;
+	}
+
+	return 1;
+}
+
+
+/*
+ * Gets/Sets for external LVM library
+ */
+struct id get_pv_id(pv_t *pv)
+{
+	return pv_field(pv, id);
+}
+
+const struct format_type *get_pv_format_type(pv_t *pv)
+{
+	return pv_field(pv, fmt);
+}
+
+struct id get_pv_vgid(pv_t *pv)
+{
+	return pv_field(pv, vgid);
+}
+
+struct device *get_pv_dev(pv_t *pv)
+{
+	return pv_field(pv, dev);
+}
+
+const char *get_pv_vg_name(pv_t *pv)
+{
+	return pv_field(pv, vg_name);
+}
+
+uint64_t get_pv_size(pv_t *pv)
+{
+	return pv_field(pv, size);
+}
+
+uint32_t get_pv_status(pv_t *pv)
+{
+	return pv_field(pv, status);
+}
+
+uint32_t get_pv_pe_size(pv_t *pv)
+{
+	return pv_field(pv, pe_size);
+}
+
+uint64_t get_pv_pe_start(pv_t *pv)
+{
+	return pv_field(pv, pe_start);
+}
+
+uint32_t get_pv_pe_count(pv_t *pv)
+{
+	return pv_field(pv, pe_count);
+}
+
+uint32_t get_pv_pe_alloc_count(pv_t *pv)
+{
+	return pv_field(pv, pe_alloc_count);
+}

Modified: lvm2/upstream/current/lib/metadata/metadata.h
==============================================================================
--- lvm2/upstream/current/lib/metadata/metadata.h	(original)
+++ lvm2/upstream/current/lib/metadata/metadata.h	Fri Jun 22 11:19:15 2007
@@ -142,6 +142,7 @@
 	struct list tags;
 };
 
+typedef struct physical_volume pv_t;
 struct metadata_area;
 struct format_instance;
 
@@ -178,6 +179,17 @@
 			  struct volume_group * vg, struct metadata_area * mda);
 	int (*vg_remove) (struct format_instance * fi, struct volume_group * vg,
 			  struct metadata_area * mda);
+	/*
+	 * Check if metadata area belongs to vg
+	 */
+	int (*mda_in_vg) (struct format_instance * fi,
+			    struct volume_group * vg, struct metadata_area *mda);
+	/*
+	 * Analyze a metadata area on a PV.
+	 */
+	int (*pv_analyze_mda) (const struct format_type * fmt,
+			       struct metadata_area *mda);
+
 };
 
 struct metadata_area {
@@ -424,20 +436,23 @@
 int pv_write(struct cmd_context *cmd, struct physical_volume *pv,
 	     struct list *mdas, int64_t label_sector);
 int pv_write_orphan(struct cmd_context *cmd, struct physical_volume *pv);
+int is_orphan(pv_t *pv);
 
 /* pe_start and pe_end relate to any existing data so that new metadata
  * areas can avoid overlap */
-struct physical_volume *pv_create(const struct format_type *fmt,
-				  struct device *dev,
-				  struct id *id,
-				  uint64_t size,
-				  uint64_t pe_start,
-				  uint32_t existing_extent_count,
-				  uint32_t existing_extent_size,
-				  int pvmetadatacopies,
-				  uint64_t pvmetadatasize, struct list *mdas);
+pv_t *pv_create(const struct format_type *fmt,
+		      struct device *dev,
+		      struct id *id,
+		      uint64_t size,
+		      uint64_t pe_start,
+		      uint32_t existing_extent_count,
+		      uint32_t existing_extent_size,
+		      int pvmetadatacopies,
+		      uint64_t pvmetadatasize, struct list *mdas);
 int pv_resize(struct physical_volume *pv, struct volume_group *vg,
               uint32_t new_pe_count);
+int pv_analyze(struct cmd_context *cmd, const char *pv_name,
+	       int64_t label_sector);
 
 struct volume_group *vg_create(struct cmd_context *cmd, const char *name,
 			       uint32_t extent_size, uint32_t max_pv,
@@ -450,6 +465,8 @@
 	      int pv_count, char **pv_names);
 int vg_change_pesize(struct cmd_context *cmd, struct volume_group *vg,
 		     uint32_t new_extent_size);
+int vg_split_mdas(struct cmd_context *cmd, struct volume_group *vg_from,
+		  struct volume_group *vg_to);
 
 /* Manipulate LVs */
 struct logical_volume *lv_create_empty(struct format_instance *fi,
@@ -485,8 +502,7 @@
 
 /* Find a PV within a given VG */
 struct pv_list *find_pv_in_vg(struct volume_group *vg, const char *pv_name);
-struct physical_volume *find_pv_in_vg_by_uuid(struct volume_group *vg,
-					      struct id *id);
+pv_t *find_pv_in_vg_by_uuid(struct volume_group *vg, struct id *id);
 int get_pv_from_vg_by_id(const struct format_type *fmt, const char *vg_name,
 			 const char *vgid, const char *pvid,
 			 struct physical_volume *pv);
@@ -563,6 +579,8 @@
 
 int vg_remove_snapshot(struct logical_volume *cow);
 
+int vg_check_status(struct volume_group *vg, uint32_t status_flags);
+
 /*
  * Mirroring functions
  */
@@ -618,4 +636,19 @@
 char *generate_lv_name(struct volume_group *vg, const char *format,
 		       char *buffer, size_t len);
 
+/*
+ * Gets/Sets for external LVM library
+ */
+struct id get_pv_id(pv_t *pv);
+const struct format_type *get_pv_format_type(pv_t *pv);
+struct id get_pv_vgid(pv_t *pv);
+struct device *get_pv_dev(pv_t *pv);
+const char *get_pv_vg_name(pv_t *pv);
+uint64_t get_pv_size(pv_t *pv);
+uint32_t get_pv_status(pv_t *pv);
+uint32_t get_pv_pe_size(pv_t *pv);
+uint64_t get_pv_pe_start(pv_t *pv);
+uint32_t get_pv_pe_count(pv_t *pv);
+uint32_t get_pv_pe_alloc_count(pv_t *pv);
+
 #endif

Modified: lvm2/upstream/current/lib/metadata/mirror.c
==============================================================================
--- lvm2/upstream/current/lib/metadata/mirror.c	(original)
+++ lvm2/upstream/current/lib/metadata/mirror.c	Fri Jun 22 11:19:15 2007
@@ -21,6 +21,7 @@
 #include "activate.h"
 #include "lv_alloc.h"
 #include "lvm-string.h"
+#include "str_list.h"
 #include "locking.h"	/* FIXME Should not be used in this file */
 
 #include "defaults.h" /* FIXME: should this be defaults.h? */
@@ -77,6 +78,42 @@
 	lv_from->size = 0;
 }
 
+
+/*
+ * Delete independent/orphan LV, it must acquire lock.
+ */
+static int _delete_lv(struct lv_segment *mirrored_seg, struct logical_volume *lv)
+{
+	struct cmd_context *cmd = mirrored_seg->lv->vg->cmd;
+	struct str_list *sl;
+
+	/* Inherit tags - maybe needed for activation */
+	if (!str_list_match_list(&mirrored_seg->lv->tags, &lv->tags)) {
+		list_iterate_items(sl, &mirrored_seg->lv->tags)
+			if (!str_list_add(cmd->mem, &lv->tags, sl->str)) {
+				log_error("Aborting. Unable to tag.");
+				return 0;
+			}
+
+		if (!vg_write(mirrored_seg->lv->vg) ||
+		    !vg_commit(mirrored_seg->lv->vg)) {
+			log_error("Intermediate VG commit for orphan volume failed.");
+			return 0;
+		}
+	}
+
+	if (!activate_lv(cmd, lv))
+		return_0;
+
+	if (!deactivate_lv(cmd, lv))
+		return_0;
+
+	if (!lv_remove(lv))
+		return_0;
+
+	return 1;
+}
+
 /*
  * Reduce mirrored_seg to num_mirrors images.
  */
@@ -205,57 +242,15 @@
 	}
 
 	/* Delete the 'orphan' LVs */
-	for (m = num_mirrors; m < old_area_count; m++) {
-		/* LV is now independent of the mirror so must acquire lock. */
-		if (!activate_lv(mirrored_seg->lv->vg->cmd, seg_lv(mirrored_seg, m))) {
-			stack;
-			return 0;
-		}
-
-		if (!deactivate_lv(mirrored_seg->lv->vg->cmd, seg_lv(mirrored_seg, m))) {
-			stack;
-			return 0;
-		}
-
-		if (!lv_remove(seg_lv(mirrored_seg, m))) {
-			stack;
-			return 0;
-		}
-	}
-
-	if (lv1) {
-		if (!activate_lv(mirrored_seg->lv->vg->cmd, lv1)) {
-			stack;
-			return 0;
-		}
-
-		if (!deactivate_lv(mirrored_seg->lv->vg->cmd, lv1)) {
-			stack;
+	for (m = num_mirrors; m < old_area_count; m++)
+		if (!_delete_lv(mirrored_seg, seg_lv(mirrored_seg, m)))
 			return 0;
-		}
-
-		if (!lv_remove(lv1)) {
-			stack;
-			return 0;
-		}
-	}
 
-	if (log_lv) {
-		if (!activate_lv(mirrored_seg->lv->vg->cmd, log_lv)) {
-			stack;
-			return 0;
-		}
-
-		if (!deactivate_lv(mirrored_seg->lv->vg->cmd, log_lv)) {
-			stack;
-			return 0;
-		}
+	if (lv1 && !_delete_lv(mirrored_seg, lv1))
+		return 0;
 
-		if (!lv_remove(log_lv)) {
-			stack;
-			return 0;
-		}
-	}
+	if (log_lv && !_delete_lv(mirrored_seg, log_lv))
+		return 0;
 
 	return 1;
 }

Modified: lvm2/upstream/current/lib/misc/lib.h
==============================================================================
--- lvm2/upstream/current/lib/misc/lib.h	(original)
+++ lvm2/upstream/current/lib/misc/lib.h	Fri Jun 22 11:19:15 2007
@@ -19,7 +19,7 @@
 #ifndef _LVM_LIB_H
 #define _LVM_LIB_H
 
-#include <configure.h>
+#include "configure.h"
 
 #define _REENTRANT
 #define _GNU_SOURCE

Modified: lvm2/upstream/current/lib/misc/lvm-file.c
==============================================================================
--- lvm2/upstream/current/lib/misc/lvm-file.c	(original)
+++ lvm2/upstream/current/lib/misc/lvm-file.c	Fri Jun 22 11:19:15 2007
@@ -273,8 +273,12 @@
 	if ((c = strrchr(dir, '/')))
 		*c = '\0';
 
-	if (!create_dir(dir))
+	if (!create_dir(dir)) {
+		dm_free(dir);
 		return -1;
+	}
+
+	dm_free(dir);
 
 	log_very_verbose("Locking %s (%s, %hd)", file,
 			 (lock_type == F_WRLCK) ? "F_WRLCK" : "F_RDLCK",

Modified: lvm2/upstream/current/lib/misc/lvm-string.c
==============================================================================
--- lvm2/upstream/current/lib/misc/lvm-string.c	(original)
+++ lvm2/upstream/current/lib/misc/lvm-string.c	Fri Jun 22 11:19:15 2007
@@ -36,18 +36,38 @@
 }
 
 /*
- * Device layer names are all of the form <vg>-<lv>-<layer>, any
- * other hyphens that appear in these names are quoted with yet
- * another hyphen.  The top layer of any device has no layer
- * name.  eg, vg0-lvol0.
+ * Count occurences of 'c' in 'str' until we reach a null char.
+ *
+ * Returns:
+ *  len - incremented for each char we encounter, whether 'c' or not.
+ *  count - number of occurences of 'c'
  */
-static void _count_hyphens(const char *str, size_t *len, int *hyphens)
+void count_chars(const char *str, size_t *len, int *count,
+		 const char c)
 {
 	const char *ptr;
 
 	for (ptr = str; *ptr; ptr++, (*len)++)
-		if (*ptr == '-')
-			(*hyphens)++;
+		if (*ptr == c)
+			(*count)++;
+}
+
+/*
+ * Count occurences of 'c' in 'str' of length 'size'.
+ *
+ * Returns:
+ *   # of occurences of 'c'
+ */
+unsigned count_chars_len(const char *str, size_t size, const char c)
+{
+	int i;
+	unsigned count=0;
+
+	for (i=0; i < size; i++)
+		if (str[i] == c)
+			count++;
+	return count;
+
 }
 
 /*
@@ -73,11 +93,11 @@
 	int hyphens = 1;
 	char *r, *out;
 
-	_count_hyphens(vgname, &len, &hyphens);
-	_count_hyphens(lvname, &len, &hyphens);
+	count_chars(vgname, &len, &hyphens, '-');
+	count_chars(lvname, &len, &hyphens, '-');
 
 	if (layer && *layer) {
-		_count_hyphens(layer, &len, &hyphens);
+		count_chars(layer, &len, &hyphens, '-');
 		hyphens++;
 	}
 
@@ -105,6 +125,12 @@
 	return r;
 }
 
+/*
+ * Device layer names are all of the form <vg>-<lv>-<layer>, any
+ * other hyphens that appear in these names are quoted with yet
+ * another hyphen.  The top layer of any device has no layer
+ * name.  eg, vg0-lvol0.
+ */
 int validate_name(const char *n)
 {
 	register char c;

Modified: lvm2/upstream/current/lib/misc/lvm-string.h
==============================================================================
--- lvm2/upstream/current/lib/misc/lvm-string.h	(original)
+++ lvm2/upstream/current/lib/misc/lvm-string.h	Fri Jun 22 11:19:15 2007
@@ -30,4 +30,8 @@
 
 int validate_name(const char *n);
 
+void count_chars(const char *str, size_t *len, int *count,
+		 char c);
+unsigned count_chars_len(const char *str, size_t size, char c);
+
 #endif

Modified: lvm2/upstream/current/lib/report/report.c
==============================================================================
--- lvm2/upstream/current/lib/report/report.c	(original)
+++ lvm2/upstream/current/lib/report/report.c	Fri Jun 22 11:19:15 2007
@@ -49,7 +49,7 @@
 	case ALLOC_CONTIGUOUS:
 		return 'c';
 	case ALLOC_CLING:
-		return 'C';
+		return 'l';
 	case ALLOC_NORMAL:
 		return 'n';
 	case ALLOC_ANYWHERE:

Modified: lvm2/upstream/current/make.tmpl.in
==============================================================================
--- lvm2/upstream/current/make.tmpl.in	(original)
+++ lvm2/upstream/current/make.tmpl.in	Fri Jun 22 11:19:15 2007
@@ -56,7 +56,7 @@
 
 .SUFFIXES: .c .d .o .so .a .po .pot .mo .dylib
 
-CFLAGS += -fPIC -Wall -Wundef -Wshadow -Wcast-align -Wwrite-strings -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Winline -Wmissing-noreturn
+CFLAGS += -fPIC -Wall -Wundef -Wshadow -Wcast-align -Wwrite-strings -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Winline -Wmissing-noreturn -Wformat-security
 
 #CFLAGS += -W -Wconversion -Wpointer-arith -Wredundant-decls -Wbad-function-cast -Wcast-qual
 #CFLAGS += -pedantic -std=gnu99
@@ -94,7 +94,7 @@
 LIB_VERSION := $(shell cat $(top_srcdir)/VERSION | \
 		 awk -F '.' '{printf "%s.%s",$$1,$$2}')
 
-INCLUDES += -I. -I$(top_srcdir)/include
+INCLUDES += -I$(top_srcdir)/include
 
 ifneq ("@DMDIR@", "")
   INCLUDES += -I at DMDIR@/include

Modified: lvm2/upstream/current/man/Makefile.in
==============================================================================
--- lvm2/upstream/current/man/Makefile.in	(original)
+++ lvm2/upstream/current/man/Makefile.in	Fri Jun 22 11:19:15 2007
@@ -20,7 +20,7 @@
 MAN8=lvchange.8 lvconvert.8 lvcreate.8 lvdisplay.8 lvextend.8 lvm.8 \
 	lvmchange.8 lvmdiskscan.8 lvmdump.8 \
 	lvreduce.8 lvremove.8 lvrename.8 lvresize.8 lvs.8 \
-	lvscan.8 pvchange.8 pvcreate.8 pvdisplay.8 pvmove.8 pvremove.8 \
+	lvscan.8 pvchange.8 pvck.8 pvcreate.8 pvdisplay.8 pvmove.8 pvremove.8 \
 	pvresize.8 pvs.8 pvscan.8 vgcfgbackup.8 vgcfgrestore.8 vgchange.8 \
 	vgck.8 vgcreate.8 vgconvert.8 vgdisplay.8 vgexport.8 vgextend.8 \
 	vgimport.8 vgmerge.8 vgmknodes.8 vgreduce.8 vgremove.8 vgrename.8 \

Modified: lvm2/upstream/current/man/lvm.8
==============================================================================
--- lvm2/upstream/current/man/lvm.8	(original)
+++ lvm2/upstream/current/man/lvm.8	Fri Jun 22 11:19:15 2007
@@ -194,6 +194,7 @@
 .BR lvs (8),
 .BR lvscan (8),
 .BR pvchange (8),
+.BR pvck (8),
 .BR pvcreate (8),
 .BR pvdisplay (8),
 .BR pvmove (8),

Modified: lvm2/upstream/current/man/lvm.conf.5
==============================================================================
--- lvm2/upstream/current/man/lvm.conf.5	(original)
+++ lvm2/upstream/current/man/lvm.conf.5	Fri Jun 22 11:19:15 2007
@@ -81,6 +81,11 @@
 Devices in directories outside this hierarchy will be ignored.
 Defaults to "/dev".
 .IP
+\fBpreferred_names\fP \(em List of patterns compared in turn against
+all the pathnames referencing the same device in in the scanned directories.
+The pathname that matches the earliest pattern in the list is the
+one used in any output.
+.IP
 \fBfilter\fP \(em List of patterns to apply to devices found by a scan.
 Patterns are regular expressions delimited by any character and preceded
 by \fBa\fP (for accept) or \fBr\fP (for reject).  The list is traversed

Modified: lvm2/upstream/current/man/lvs.8
==============================================================================
--- lvm2/upstream/current/man/lvs.8	(original)
+++ lvm2/upstream/current/man/lvs.8	Fri Jun 22 11:19:15 2007
@@ -51,7 +51,7 @@
 .IP 2 3
 Permissions: (w)riteable, (r)ead-only
 .IP 3 3
-Allocation policy: (c)ontiguous, (n)ormal, (a)nywhere, (i)nherited
+Allocation policy: (c)ontiguous, c(l)ing, (n)ormal, (a)nywhere, (i)nherited
 This is capitalised if the volume is currently locked against allocation
 changes, for example during \fBpvmove\fP (8).
 .IP 4 3

Added: lvm2/upstream/current/man/pvck.8
==============================================================================
--- (empty file)
+++ lvm2/upstream/current/man/pvck.8	Fri Jun 22 11:19:15 2007
@@ -0,0 +1,33 @@
+.TH PVCK 8 "LVM TOOLS" "Sistina Software UK" \" -*- nroff -*-
+.SH NAME
+pvck \- check physical volume metadata
+.SH SYNOPSIS
+.B pvck
+.RB [ \-d | \-\-debug ]
+.RB [ \-h | \-\-help ]
+.RB [ \-v | \-\-verbose ]
+.RB [ \-\-labelsector ]
+.IR PhysicalVolume " [" PhysicalVolume ...]
+.SH DESCRIPTION
+pvck checks physical volume LVM metadata for consistency.
+.SH OPTIONS
+See \fBlvm\fP for common options.
+.TP
+.BR \-\-labelsector " sector"
+By default, 4 sectors of \fBPhysicalVolume\fP are scanned for an LVM label,
+starting at sector 0.  This parameter allows you to specify a different
+starting sector for the scan and is useful for recovery situations.  For
+example, suppose the partition table is corrupted or lost on /dev/sda,
+but you suspect there was an LVM partition at approximately 100 MB.  This
+area of the disk may be scanned by using the \fB--labelsector\fP parameter
+with a value of 204800 (100 * 1024 * 1024 / 512 = 204800):
+.sp
+.BI "pvck --labelsector 204800 /dev/sda"
+.sp
+Note that a script can be used with \fB--labelsector\fP to automate the
+process of finding LVM labels.
+.SH SEE ALSO
+.BR lvm (8),
+.BR pvcreate (8),
+.BR pvscan (8)
+.BR vgck (8)

Modified: lvm2/upstream/current/man/vgcfgrestore.8
==============================================================================
--- lvm2/upstream/current/man/vgcfgrestore.8	(original)
+++ lvm2/upstream/current/man/vgcfgrestore.8	Fri Jun 22 11:19:15 2007
@@ -5,18 +5,29 @@
 .B vgcfgrestore
 .RB [ \-d | \-\-debug ]
 .RB [ \-f | \-\-file " filename" ]
-.RB [ \-l[l] | \-\-list [--list] ]
+.RB [ \-l[l] | \-\-list ]
 .RB [ \-h | \-\-help ]
 .RB [ \-M | \-\-Metadatatype 1|2]
-.RB [ \-n | \-\-name " VolumeGroupName" ]
 .RB [ \-t | \-\-test ]
 .RB [ \-v | \-\-verbose ]
-.RI [ VolumeGroupName ...]
+.RI \fIVolumeGroupName\fP
 .SH DESCRIPTION
 .B vgcfgrestore
-allows you to restore the metadata 
-of your volume groups from a text backup file produced by \fBvgcfgbackup\fP.
+allows you to restore the metadata of \fIVolumeGroupName\fP from a text 
+backup file produced by \fBvgcfgbackup\fP.  You can specify a backup file 
+with \fP--file\fP.  If no backup file is specified, the most recent
+one is used.  Use \fB--list\fP for a list of the available
+backup and archive files of \fIVolumeGroupName\fP.
 .SH OPTIONS
+.TP
+\fB-l | --list\fP \(em List files pertaining to \fIVolumeGroupName\fP
+List metadata backup and archive files pertaining to \fIVolumeGroupName\fP.
+May be used with the \fB-f\fP option.  Does not restore \fIVolumeGroupName\fP.
+.TP
+\fB-f | --file\fP filename \(em Name of LVM metadata backup file
+Specifies a metadata backup or archive file to be used for restoring 
+VolumeGroupName.  Often this file has been created with \fBvgcfgbackup\fP.
+.TP
 See \fBlvm\fP for common options.
 .SH REPLACING PHYSICAL VOLUMES
 \fBvgdisplay --partial --verbose\fP will show you the UUIDs and sizes of

Modified: lvm2/upstream/current/man/vgrename.8
==============================================================================
--- lvm2/upstream/current/man/vgrename.8	(original)
+++ lvm2/upstream/current/man/vgrename.8	Fri Jun 22 11:19:15 2007
@@ -8,11 +8,15 @@
 [\-h/\-?/\-\-help]
 [\-t/\-\-test]
 [\-v/\-\-verbose]
-OldVolumeGroupPath/\-Name NewVolumeGroupPath/\-Name
+.IR OldVolumeGroup { Path | Name | UUID }
+.IR NewVolumeGroup { Path | Name }
 .SH DESCRIPTION
 vgrename renames an existing (see
 .B vgcreate(8)
-) volume group.
+) volume group from
+.IR OldVolumeGroup { Name | Path | UUID }
+to
+.IR NewVolumeGroup { Name | Path }.
 .SH OPTIONS
 See \fBlvm\fP for common options.
 .SH Examples
@@ -20,6 +24,24 @@
 volume group "vg02" to "my_volume_group".
 .TP
 "vgrename vg02 my_volume_group" does the same.
+.TP
+"vgrename Zvlifi-Ep3t-e0Ng-U42h-o0ye-KHu1-nl7Ns4 VolGroup00_tmp"
+changes the name of the Volume Group with UUID
+Zvlifi-Ep3t-e0Ng-U42h-o0ye-KHu1-nl7Ns4 to 
+"VolGroup00_tmp".
+
+All the Volume Groups visible to a system need to have different
+names.  Otherwise many LVM2 commands will refuse to run or give
+warning messages.
+
+This situation could arise when disks are moved between machines.  If
+a disk is connected and it contains a Volume Group with the same name
+as the Volume Group containing your root filesystem the machine might
+not even boot correctly.  However, the two Volume Groups should have
+different UUIDs (unless the disk was cloned) so you can rename
+one of the conflicting Volume Groups with
+\fBvgrename\fP.
+.TP
 .SH SEE ALSO
 .BR lvm (8), 
 .BR vgchange (8), 

Modified: lvm2/upstream/current/man/vgs.8
==============================================================================
--- lvm2/upstream/current/man/vgs.8	(original)
+++ lvm2/upstream/current/man/vgs.8	Fri Jun 22 11:19:15 2007
@@ -36,9 +36,24 @@
 vg_tags.
 Any "vg_" prefixes are optional.  Columns mentioned in either \fBpvs (8)\fP 
 or \fBlvs (8)\fP can also be chosen, but columns cannot be taken from both
-at the same time.  The vg_attr bits are: (w)riteable, (r)eadonly, 
-resi(z)eable, e(x)ported, (p)artial and (c)lustered.
+at the same time.  
 Use \fb-o help\fP to view the full list of fields available.
+.IP
+The vg_attr bits are:
+.RS
+.IP 1 3
+Permissions: (w)riteable, (r)ead-only
+.IP 2 3
+Resi(z)eable
+.IP 3 3
+E(x)ported
+.IP 4 3
+(p)artial
+.IP 5 3
+Allocation policy: (c)ontiguous, c(l)ing, (n)ormal, (a)nywhere, (i)nherited
+.IP 6 3
+(c)lustered
+.RE
 .TP
 .I \-O, \-\-sort
 Comma-separated ordered list of columns to sort by.  Replaces the default

Modified: lvm2/upstream/current/po/lvm2.po
==============================================================================
--- lvm2/upstream/current/po/lvm2.po	(original)
+++ lvm2/upstream/current/po/lvm2.po	Fri Jun 22 11:19:15 2007
@@ -1,12 +1,14 @@
 # SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR Free Software Foundation, Inc.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
 #
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2005-08-04 00:07+0100\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-04-27 21:46+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -14,719 +16,634 @@
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: activate/activate.c:42
+#: activate/activate.c:44
 msgid "LVM1 proc global snprintf failed"
 msgstr ""
 
-#: activate/activate.c:163
-msgid "Activation enabled. Device-mapper kernel driver will be used."
-msgstr ""
-
-#: activate/activate.c:166
-msgid "Activation disabled. No device-mapper interaction will be attempted."
-msgstr ""
-
-#: activate/activate.c:199
-msgid "Ignoring invalid string in config file activation/volume_list"
-msgstr ""
-
-#: activate/activate.c:205
-msgid "Ignoring empty string in config file activation/volume_list"
-msgstr ""
-
-#: activate/activate.c:214
-msgid "Ignoring empty tag in config file activation/volume_list"
-msgstr ""
-
-#: activate/activate.c:244
-#, c-format
-msgid "lvm_snprintf error from %s/%s"
-msgstr ""
-
-#: activate/activate.c:273
-msgid "Getting driver version"
+#: activate/activate.c:63
+msgid "module string allocation failed"
 msgstr ""
 
-#: activate/activate.c:275 activate/activate.c:304 activate/activate.c:347
-#: activate/activate.c:352 activate/activate.c:394 activate/activate.c:399
-#: activate/activate.c:418 activate/activate.c:426 activate/activate.c:431
-#: activate/activate.c:443 activate/activate.c:455 activate/activate.c:469
-#: activate/activate.c:474 activate/activate.c:486 activate/activate.c:491
-#: activate/activate.c:503 activate/activate.c:508 activate/activate.c:568
-#: activate/activate.c:614 activate/activate.c:659 activate/activate.c:728
-#: activate/activate.c:767 activate/dev_manager.c:179
-#: activate/dev_manager.c:197 activate/dev_manager.c:225
-#: activate/dev_manager.c:234 activate/dev_manager.c:239
-#: activate/dev_manager.c:245 activate/dev_manager.c:286
-#: activate/dev_manager.c:294 activate/dev_manager.c:367
-#: activate/dev_manager.c:375 activate/dev_manager.c:380
-#: activate/dev_manager.c:411 activate/dev_manager.c:467
-#: activate/dev_manager.c:472 activate/dev_manager.c:504
-#: activate/dev_manager.c:525 activate/dev_manager.c:539
-#: activate/dev_manager.c:555 activate/dev_manager.c:615
-#: activate/dev_manager.c:621 activate/dev_manager.c:628
-#: activate/dev_manager.c:657 activate/dev_manager.c:714
-#: activate/dev_manager.c:723 activate/dev_manager.c:766
-#: activate/dev_manager.c:772 activate/dev_manager.c:782
-#: activate/dev_manager.c:821 activate/dev_manager.c:835
-#: activate/dev_manager.c:860 activate/dev_manager.c:900
-#: activate/dev_manager.c:905 activate/dev_manager.c:913
-#: activate/dev_manager.c:936 activate/dev_manager.c:941
-#: activate/dev_manager.c:947 activate/dev_manager.c:952
-#: activate/dev_manager.c:958 activate/dev_manager.c:966
-#: activate/dev_manager.c:983 activate/dev_manager.c:988
-#: activate/dev_manager.c:1003 activate/dev_manager.c:1008
-#: activate/dev_manager.c:1041 activate/dev_manager.c:1051
-#: activate/dev_manager.c:1067 activate/dev_manager.c:1077
-#: activate/dev_manager.c:1099 activate/dev_manager.c:1108
-#: activate/dev_manager.c:1122 activate/dev_manager.c:1130
-#: activate/dev_manager.c:1143 activate/dev_manager.c:1163
-#: activate/dev_manager.c:1168 activate/dev_manager.c:1174
-#: activate/dev_manager.c:1196 activate/dev_manager.c:1216
-#: activate/dev_manager.c:1235 activate/dev_manager.c:1246
-#: activate/dev_manager.c:1261 activate/dev_manager.c:1273
-#: activate/dev_manager.c:1287 activate/dev_manager.c:1300
-#: activate/dev_manager.c:1310 activate/dev_manager.c:1350
-#: activate/dev_manager.c:1361 activate/dev_manager.c:1371
-#: activate/dev_manager.c:1379 activate/dev_manager.c:1386
-#: activate/dev_manager.c:1462 activate/dev_manager.c:1481
-#: activate/dev_manager.c:1503 activate/dev_manager.c:1511
-#: activate/dev_manager.c:1539 activate/dev_manager.c:1544
-#: activate/dev_manager.c:1573 activate/dev_manager.c:1579
-#: activate/dev_manager.c:1600 activate/dev_manager.c:1618
-#: activate/dev_manager.c:1632 activate/dev_manager.c:1642
-#: activate/dev_manager.c:1652 activate/dev_manager.c:1670
-#: activate/dev_manager.c:1693 activate/dev_manager.c:1727
-#: activate/dev_manager.c:1743 activate/dev_manager.c:1800
-#: activate/dev_manager.c:1809 activate/dev_manager.c:1818
-#: activate/dev_manager.c:1827 activate/dev_manager.c:1832
-#: activate/dev_manager.c:1837 activate/dev_manager.c:1849
-#: activate/dev_manager.c:1859 activate/dev_manager.c:1865
-#: activate/dev_manager.c:1901 activate/dev_manager.c:1906
-#: activate/dev_manager.c:1938 activate/dev_manager.c:1956
-#: activate/dev_manager.c:2132 activate/dev_manager.c:2144
-#: activate/dev_manager.c:2150 activate/dev_manager.c:2164
-#: activate/dev_manager.c:2169 activate/dev_manager.c:2176
-#: activate/dev_manager.c:2184 activate/dev_manager.c:2192
-#: activate/dev_manager.c:2198 activate/dev_manager.c:2205
-#: activate/dev_manager.c:2210 activate/dev_manager.c:2238 activate/fs.c:234
-#: activate/fs.c:241 activate/fs.c:248 activate/fs.c:251 activate/fs.c:325
+#: activate/activate.c:74 activate/activate.c:91 activate/activate.c:109
+#: activate/activate.c:364 activate/activate.c:417 activate/activate.c:438
+#: activate/activate.c:445 activate/activate.c:492 activate/activate.c:495
+#: activate/activate.c:514 activate/activate.c:520 activate/activate.c:523
+#: activate/activate.c:536 activate/activate.c:548 activate/activate.c:561
+#: activate/activate.c:564 activate/activate.c:576 activate/activate.c:579
+#: activate/activate.c:591 activate/activate.c:594 activate/activate.c:606
+#: activate/activate.c:609 activate/activate.c:764 activate/activate.c:768
+#: activate/activate.c:776 activate/activate.c:785 activate/activate.c:791
+#: activate/activate.c:836 activate/activate.c:848 activate/activate.c:882
+#: activate/activate.c:894 activate/activate.c:953 activate/activate.c:967
+#: activate/activate.c:996 activate/dev_manager.c:104
+#: activate/dev_manager.c:130 activate/dev_manager.c:139
+#: activate/dev_manager.c:142 activate/dev_manager.c:168
+#: activate/dev_manager.c:176 activate/dev_manager.c:250
+#: activate/dev_manager.c:258 activate/dev_manager.c:261
+#: activate/dev_manager.c:339 activate/dev_manager.c:347
+#: activate/dev_manager.c:350 activate/dev_manager.c:379
+#: activate/dev_manager.c:434 activate/dev_manager.c:439
+#: activate/dev_manager.c:452 activate/dev_manager.c:489
+#: activate/dev_manager.c:492 activate/dev_manager.c:500
+#: activate/dev_manager.c:523 activate/dev_manager.c:535
+#: activate/dev_manager.c:611 activate/dev_manager.c:628
+#: activate/dev_manager.c:631 activate/dev_manager.c:654
+#: activate/dev_manager.c:658 activate/dev_manager.c:661
+#: activate/dev_manager.c:664 activate/dev_manager.c:682
+#: activate/dev_manager.c:689 activate/dev_manager.c:698
+#: activate/dev_manager.c:737 activate/dev_manager.c:757
+#: activate/dev_manager.c:760 activate/dev_manager.c:780
+#: activate/dev_manager.c:783 activate/dev_manager.c:788
+#: activate/dev_manager.c:842 activate/dev_manager.c:851
+#: activate/dev_manager.c:854 activate/dev_manager.c:860
+#: activate/dev_manager.c:866 activate/dev_manager.c:869
+#: activate/dev_manager.c:871 activate/dev_manager.c:877
+#: activate/dev_manager.c:891 activate/dev_manager.c:894
+#: activate/dev_manager.c:920 activate/dev_manager.c:929
+#: activate/dev_manager.c:996 activate/dev_manager.c:1010
+#: activate/dev_manager.c:1018 activate/dev_manager.c:1025
+#: activate/dev_manager.c:1030 activate/dev_manager.c:1038
+#: activate/dev_manager.c:1044 activate/dev_manager.c:1048
+#: activate/dev_manager.c:1052 activate/dev_manager.c:1075
+#: activate/dev_manager.c:1138 activate/fs.c:179 activate/fs.c:229
+#: activate/fs.c:236 activate/fs.c:243 activate/fs.c:246 activate/fs.c:320
 #: archiver.c:68 archiver.c:75 archiver.c:87 archiver.c:163 archiver.c:236
 #: archiver.c:286 archiver.c:303 archiver.c:345 archiver.c:350
-#: cache/lvmcache.c:474 cache/lvmcache.c:515 cache/lvmcache.c:546
+#: cache/lvmcache.c:486 cache/lvmcache.c:490 cache/lvmcache.c:704
+#: cache/lvmcache.c:724 cache/lvmcache.c:750 cache/lvmcache.c:810
 #: commands/toolcontext.c:276 commands/toolcontext.c:295
 #: commands/toolcontext.c:302 commands/toolcontext.c:379
 #: commands/toolcontext.c:394 commands/toolcontext.c:418
-#: commands/toolcontext.c:469 commands/toolcontext.c:662
-#: commands/toolcontext.c:758 config/config.c:105 config/config.c:110
-#: config/config.c:140 config/config.c:161 config/config.c:192
-#: config/config.c:239 config/config.c:244 config/config.c:406
-#: config/config.c:424 config/config.c:429 config/config.c:439
-#: config/config.c:453 config/config.c:469 config/config.c:525
-#: config/config.c:708 datastruct/btree.c:90 datastruct/hash.c:96
-#: datastruct/hash.c:109 datastruct/str_list.c:24 datastruct/str_list.c:38
-#: datastruct/str_list.c:47 datastruct/str_list.c:77 device/dev-cache.c:204
-#: device/dev-cache.c:217 device/dev-cache.c:262 device/dev-cache.c:266
-#: device/dev-cache.c:337 device/dev-cache.c:368 device/dev-cache.c:407
-#: device/dev-cache.c:453 device/dev-cache.c:458 device/dev-io.c:174
-#: device/dev-io.c:204 device/dev-io.c:348 device/dev-io.c:516
-#: device/dev-io.c:537 device/dev-io.c:555 device/dev-io.c:574
-#: device/dev-io.c:602 device/dev-md.c:41 device/dev-md.c:49
-#: device/dev-md.c:64 device/device.c:61 device/device.c:66 device/device.c:90
-#: display/display.c:211 display/display.c:242 display/display.c:300
-#: display/display.c:346 display/display.c:577 display/display.c:613
-#: error/errseg.c:90 filters/filter-composite.c:54
-#: filters/filter-persistent.c:45 filters/filter-persistent.c:105
-#: filters/filter-persistent.c:110 filters/filter-persistent.c:239
-#: filters/filter-persistent.c:245 filters/filter-persistent.c:257
-#: filters/filter-regex.c:78 filters/filter-regex.c:105
-#: filters/filter-regex.c:126 filters/filter-regex.c:151
-#: filters/filter-regex.c:210 filters/filter-regex.c:215
-#: filters/filter-regex.c:222 filters/filter-regex.c:227
-#: filters/filter-sysfs.c:285 filters/filter.c:254 format1/disk-rep.c:220
-#: format1/disk-rep.c:232 format1/disk-rep.c:237 format1/disk-rep.c:256
-#: format1/disk-rep.c:259 format1/disk-rep.c:290 format1/disk-rep.c:293
-#: format1/disk-rep.c:312 format1/disk-rep.c:315 format1/disk-rep.c:332
-#: format1/disk-rep.c:342 format1/disk-rep.c:348 format1/disk-rep.c:413
-#: format1/disk-rep.c:420 format1/disk-rep.c:511 format1/disk-rep.c:532
-#: format1/disk-rep.c:544 format1/disk-rep.c:572 format1/disk-rep.c:586
-#: format1/disk-rep.c:619 format1/disk-rep.c:684 format1/disk-rep.c:691
-#: format1/disk-rep.c:707 format1/format1.c:174 format1/format1.c:189
-#: format1/format1.c:198 format1/format1.c:203 format1/format1.c:220
-#: format1/format1.c:234 format1/format1.c:252 format1/format1.c:263
-#: format1/format1.c:278 format1/format1.c:304 format1/format1.c:309
-#: format1/format1.c:314 format1/format1.c:319 format1/format1.c:356
-#: format1/format1.c:403 format1/format1.c:419 format1/format1.c:424
-#: format1/format1.c:431 format1/format1.c:443 format1/format1.c:494
-#: format1/format1.c:514 format1/format1.c:523 format1/format1.c:567
-#: format1/import-export.c:62 format1/import-export.c:96
-#: format1/import-export.c:128 format1/import-export.c:148
-#: format1/import-export.c:165 format1/import-export.c:173
-#: format1/import-export.c:208 format1/import-export.c:213
-#: format1/import-export.c:218 format1/import-export.c:296
-#: format1/import-export.c:428 format1/import-export.c:433
-#: format1/import-export.c:454 format1/import-export.c:461
-#: format1/import-export.c:483 format1/import-export.c:504
-#: format1/import-export.c:509 format1/import-export.c:518
-#: format1/import-export.c:528 format1/import-export.c:538
-#: format1/import-export.c:543 format1/import-export.c:646
-#: format1/import-export.c:694 format1/import-extents.c:65
-#: format1/import-extents.c:72 format1/import-extents.c:77
-#: format1/import-extents.c:130 format1/import-extents.c:196
-#: format1/import-extents.c:210 format1/import-extents.c:231
-#: format1/import-extents.c:280 format1/import-extents.c:312
-#: format1/import-extents.c:338 format1/import-extents.c:354
-#: format1/import-extents.c:369 format1/layout.c:124 format1/lvm1-label.c:66
-#: format1/vg_number.c:38 format1/vg_number.c:43 format_pool/disk_rep.c:51
-#: format_pool/disk_rep.c:104 format_pool/disk_rep.c:258
-#: format_pool/disk_rep.c:360 format_pool/disk_rep.c:370
-#: format_pool/disk_rep.c:375 format_pool/format_pool.c:134
-#: format_pool/format_pool.c:139 format_pool/format_pool.c:144
-#: format_pool/format_pool.c:154 format_pool/format_pool.c:163
-#: format_pool/format_pool.c:168 format_pool/format_pool.c:188
-#: format_pool/format_pool.c:197 format_pool/format_pool.c:203
-#: format_pool/format_pool.c:233 format_pool/format_pool.c:238
-#: format_pool/format_pool.c:248 format_pool/format_pool.c:253
-#: format_pool/import_export.c:94 format_pool/import_export.c:180
-#: format_pool/import_export.c:218 format_pool/import_export.c:232
-#: format_pool/import_export.c:256 format_pool/import_export.c:276
-#: format_pool/import_export.c:304 format_pool/import_export.c:309
-#: format_text/archive.c:119 format_text/archive.c:140
-#: format_text/archive.c:167 format_text/archive.c:259
-#: format_text/archive.c:270 format_text/archive.c:346
-#: format_text/archive.c:366 format_text/archiver.c:82
-#: format_text/archiver.c:89 format_text/archiver.c:101
-#: format_text/archiver.c:189 format_text/archiver.c:267
-#: format_text/archiver.c:317 format_text/archiver.c:334
-#: format_text/archiver.c:376 format_text/archiver.c:381
-#: format_text/export.c:113 format_text/export.c:178 format_text/export.c:188
-#: format_text/export.c:279 format_text/export.c:280 format_text/export.c:281
-#: format_text/export.c:282 format_text/export.c:284 format_text/export.c:285
-#: format_text/export.c:288 format_text/export.c:289 format_text/export.c:299
-#: format_text/export.c:303 format_text/export.c:305 format_text/export.c:308
-#: format_text/export.c:311 format_text/export.c:315 format_text/export.c:318
-#: format_text/export.c:322 format_text/export.c:326 format_text/export.c:329
-#: format_text/export.c:330 format_text/export.c:334 format_text/export.c:336
-#: format_text/export.c:360 format_text/export.c:367 format_text/export.c:371
-#: format_text/export.c:372 format_text/export.c:376 format_text/export.c:380
-#: format_text/export.c:382 format_text/export.c:385 format_text/export.c:388
-#: format_text/export.c:391 format_text/export.c:395 format_text/export.c:398
-#: format_text/export.c:401 format_text/export.c:404 format_text/export.c:409
-#: format_text/export.c:413 format_text/export.c:422 format_text/export.c:425
-#: format_text/export.c:428 format_text/export.c:432 format_text/export.c:433
-#: format_text/export.c:437 format_text/export.c:440 format_text/export.c:445
-#: format_text/export.c:450 format_text/export.c:461 format_text/export.c:463
-#: format_text/export.c:470 format_text/export.c:476 format_text/export.c:482
-#: format_text/export.c:490 format_text/export.c:500 format_text/export.c:501
-#: format_text/export.c:506 format_text/export.c:510 format_text/export.c:513
-#: format_text/export.c:516 format_text/export.c:520 format_text/export.c:523
-#: format_text/export.c:528 format_text/export.c:531 format_text/export.c:533
-#: format_text/export.c:535 format_text/export.c:536 format_text/export.c:537
-#: format_text/export.c:542 format_text/export.c:548 format_text/export.c:563
-#: format_text/export.c:573 format_text/export.c:582 format_text/export.c:588
-#: format_text/export.c:606 format_text/export.c:611 format_text/export.c:620
-#: format_text/export.c:625 format_text/export.c:630 format_text/export.c:653
-#: format_text/export.c:659 format_text/export.c:662 format_text/export.c:667
-#: format_text/export.c:669 format_text/export.c:671 format_text/export.c:673
-#: format_text/export.c:675 format_text/export.c:679 format_text/export.c:682
-#: format_text/export.c:705 format_text/export.c:732 format_text/export.c:750
-#: format_text/flags.c:91 format_text/flags.c:135
-#: format_text/format-text.c:128 format_text/format-text.c:176
-#: format_text/format-text.c:203 format_text/format-text.c:244
-#: format_text/format-text.c:249 format_text/format-text.c:257
-#: format_text/format-text.c:275 format_text/format-text.c:280
-#: format_text/format-text.c:305 format_text/format-text.c:315
-#: format_text/format-text.c:362 format_text/format-text.c:367
-#: format_text/format-text.c:402 format_text/format-text.c:415
-#: format_text/format-text.c:432 format_text/format-text.c:463
-#: format_text/format-text.c:494 format_text/format-text.c:532
-#: format_text/format-text.c:546 format_text/format-text.c:551
-#: format_text/format-text.c:574 format_text/format-text.c:588
-#: format_text/format-text.c:833 format_text/format-text.c:838
-#: format_text/format-text.c:847 format_text/format-text.c:858
-#: format_text/format-text.c:871 format_text/format-text.c:1063
-#: format_text/format-text.c:1119 format_text/format-text.c:1124
-#: format_text/format-text.c:1134 format_text/format-text.c:1136
-#: format_text/format-text.c:1144 format_text/format-text.c:1184
-#: format_text/format-text.c:1190 format_text/format-text.c:1366
-#: format_text/format-text.c:1372 format_text/format-text.c:1391
-#: format_text/format-text.c:1426 format_text/format-text.c:1445
-#: format_text/format-text.c:1461 format_text/format-text.c:1466
-#: format_text/format-text.c:1480 format_text/format-text.c:1492
-#: format_text/format-text.c:1498 format_text/format-text.c:1529
-#: format_text/format-text.c:1534 format_text/format-text.c:1539
-#: format_text/format-text.c:1548 format_text/format-text.c:1651
-#: format_text/import.c:53 format_text/import.c:72
-#: format_text/import_vsn1.c:124 format_text/import_vsn1.c:135
-#: format_text/import_vsn1.c:168 format_text/import_vsn1.c:214
-#: format_text/import_vsn1.c:280 format_text/import_vsn1.c:286
-#: format_text/import_vsn1.c:299 format_text/import_vsn1.c:364
-#: format_text/import_vsn1.c:406 format_text/import_vsn1.c:434
-#: format_text/import_vsn1.c:442 format_text/import_vsn1.c:459
-#: format_text/import_vsn1.c:466 format_text/import_vsn1.c:495
-#: format_text/import_vsn1.c:553 format_text/import_vsn1.c:606
-#: format_text/import_vsn1.c:631 format_text/import_vsn1.c:641
-#: format_text/import_vsn1.c:646 format_text/import_vsn1.c:716
-#: format_text/tags.c:29 format_text/tags.c:36 format_text/tags.c:43
-#: format_text/tags.c:49 format_text/tags.c:68 label/label.c:91
-#: label/label.c:122 label/label.c:193 label/label.c:214 label/label.c:265
-#: label/label.c:279 label/label.c:314 label/label.c:322 label/label.c:334
-#: label/label.c:346 locking/cluster_locking.c:85
-#: locking/cluster_locking.c:424 locking/cluster_locking.c:436
-#: locking/cluster_locking.c:440 locking/external_locking.c:76 lvchange.c:49
-#: lvchange.c:87 lvchange.c:93 lvchange.c:107 lvchange.c:114 lvchange.c:121
-#: lvchange.c:171 lvchange.c:179 lvchange.c:213 lvchange.c:298 lvchange.c:356
-#: lvchange.c:364 lvconvert.c:43 lvconvert.c:73 lvconvert.c:90 lvconvert.c:219
-#: lvcreate.c:141 lvcreate.c:309 lvcreate.c:333 lvcreate.c:349 lvcreate.c:469
-#: lvcreate.c:557 lvcreate.c:611 lvcreate.c:618 lvcreate.c:623 lvcreate.c:629
-#: lvcreate.c:636 lvcreate.c:663 lvcreate.c:703 lvcreate.c:711 lvcreate.c:717
-#: lvcreate.c:724 lvcreate.c:814 lvmcmdline.c:946 lvremove.c:86 lvrename.c:87
-#: lvrename.c:144 lvrename.c:155 lvrename.c:162 lvrename.c:167 lvresize.c:417
-#: lvresize.c:474 lvresize.c:481 lvresize.c:488 lvresize.c:500 lvresize.c:507
-#: lvresize.c:513 lvresize.c:532 lvresize.c:546 lvresize.c:571
-#: metadata/lv_manip.c:73 metadata/lv_manip.c:171 metadata/lv_manip.c:206
-#: metadata/lv_manip.c:272 metadata/lv_manip.c:281 metadata/lv_manip.c:296
-#: metadata/lv_manip.c:305 metadata/lv_manip.c:332 metadata/lv_manip.c:468
-#: metadata/lv_manip.c:476 metadata/lv_manip.c:511 metadata/lv_manip.c:720
-#: metadata/lv_manip.c:768 metadata/lv_manip.c:793 metadata/lv_manip.c:805
-#: metadata/lv_manip.c:816 metadata/lv_manip.c:897 metadata/lv_manip.c:905
-#: metadata/lv_manip.c:942 metadata/lv_manip.c:954 metadata/lv_manip.c:983
-#: metadata/lv_manip.c:993 metadata/lv_manip.c:1039 metadata/lv_manip.c:1069
-#: metadata/lv_manip.c:1076 metadata/lv_manip.c:1189 metadata/merge.c:207
-#: metadata/merge.c:246 metadata/merge.c:251 metadata/metadata.c:105
-#: metadata/metadata.c:131 metadata/metadata.c:158 metadata/metadata.c:228
-#: metadata/metadata.c:252 metadata/metadata.c:346 metadata/metadata.c:352
-#: metadata/metadata.c:358 metadata/metadata.c:369 metadata/metadata.c:375
-#: metadata/metadata.c:387 metadata/metadata.c:393 metadata/metadata.c:405
-#: metadata/metadata.c:413 metadata/metadata.c:420 metadata/metadata.c:427
-#: metadata/metadata.c:434 metadata/metadata.c:447 metadata/metadata.c:455
-#: metadata/metadata.c:464 metadata/metadata.c:495 metadata/metadata.c:510
-#: metadata/metadata.c:692 metadata/metadata.c:731 metadata/metadata.c:759
-#: metadata/metadata.c:765 metadata/metadata.c:772 metadata/metadata.c:783
-#: metadata/metadata.c:788 metadata/metadata.c:810 metadata/metadata.c:832
-#: metadata/metadata.c:849 metadata/metadata.c:915 metadata/metadata.c:920
-#: metadata/metadata.c:965 metadata/metadata.c:1005 metadata/metadata.c:1188
-#: metadata/metadata.c:1222 metadata/metadata.c:1274 metadata/metadata.c:1307
-#: metadata/mirror.c:34 metadata/mirror.c:53 metadata/mirror.c:58
-#: metadata/mirror.c:72 metadata/mirror.c:186 metadata/mirror.c:225
-#: metadata/mirror.c:234 metadata/mirror.c:362 metadata/mirror.c:383
-#: metadata/mirror.c:388 metadata/mirror.c:462 metadata/pv_manip.c:55
-#: metadata/pv_manip.c:74 metadata/pv_manip.c:95 metadata/pv_manip.c:132
-#: metadata/pv_manip.c:157 metadata/pv_manip.c:198 metadata/pv_map.c:42
-#: metadata/pv_map.c:90 metadata/pv_map.c:110 metadata/pv_map.c:120
-#: metadata/pv_map.c:138 metadata/pv_map.c:148 metadata/snapshot_manip.c:56
-#: metadata/snapshot_manip.c:63 mirror/mirrored.c:137 mirror/mirrored.c:142
-#: mirror/mirrored.c:144 mirror/mirrored.c:225 mirror/mirrored.c:305
-#: misc/lvm-string.c:152 pvchange.c:185 pvmove.c:98 pvmove.c:103 pvmove.c:188
-#: pvmove.c:216 pvmove.c:223 pvmove.c:287 pvmove.c:294 pvmove.c:303
-#: pvmove.c:332 pvmove.c:345 pvmove.c:352 pvmove.c:359 pvmove.c:367
-#: pvmove.c:379 pvmove.c:520 pvscan.c:54 regex/matcher.c:182
-#: regex/matcher.c:203 regex/matcher.c:208 regex/matcher.c:282
-#: regex/matcher.c:287 regex/matcher.c:300 regex/matcher.c:322
-#: regex/parse_rx.c:229 regex/parse_rx.c:280 regex/parse_rx.c:305
-#: regex/parse_rx.c:328 regex/parse_rx.c:340 regex/ttree.c:91
-#: regex/ttree.c:111 report/report.c:576 report/report.c:604
-#: report/report.c:736 snapshot/snapshot.c:75 snapshot/snapshot.c:84
-#: snapshot/snapshot.c:85 snapshot/snapshot.c:86 snapshot/snapshot.c:155
-#: striped/striped.c:92 striped/striped.c:171 striped/striped.c:220
-#: toollib.c:760 toollib.c:810 toollib.c:857 uuid/uuid.c:91 uuid/uuid.c:95
-#: vgcfgbackup.c:65 vgcfgbackup.c:74 vgcfgbackup.c:81 vgchange.c:302
-#: vgmerge.c:160 vgreduce.c:28 vgreduce.c:90 vgreduce.c:96 vgreduce.c:104
-#: vgreduce.c:140 vgreduce.c:156 zero/zero.c:90
+#: commands/toolcontext.c:469 commands/toolcontext.c:685
+#: commands/toolcontext.c:781 config/config.c:148 config/config.c:161
+#: config/config.c:176 config/config.c:194 config/config.c:215
+#: config/config.c:235 config/config.c:282 config/config.c:285
+#: config/config.c:467 config/config.c:485 config/config.c:490
+#: config/config.c:500 config/config.c:514 config/config.c:530
+#: config/config.c:586 config/config.c:777 datastruct/btree.c:90
+#: datastruct/str_list.c:24 datastruct/str_list.c:38 datastruct/str_list.c:47
+#: datastruct/str_list.c:77 device/dev-cache.c:240 device/dev-cache.c:253
+#: device/dev-cache.c:298 device/dev-cache.c:302 device/dev-cache.c:373
+#: device/dev-cache.c:404 device/dev-cache.c:443 device/dev-cache.c:511
+#: device/dev-cache.c:547 device/dev-cache.c:552 device/dev-cache.c:567
+#: device/dev-io.c:174 device/dev-io.c:204 device/dev-io.c:358
+#: device/dev-io.c:556 device/dev-io.c:606 device/dev-io.c:624
+#: device/dev-io.c:643 device/dev-io.c:671 device/dev-md.c:41
+#: device/dev-md.c:49 device/dev-md.c:66 device/device.c:61 device/device.c:66
+#: device/device.c:90 display/display.c:243 display/display.c:274
+#: display/display.c:333 display/display.c:379 display/display.c:605
+#: display/display.c:641 error/errseg.c:101 filters/filter-composite.c:54
+#: filters/filter-persistent.c:46 filters/filter-persistent.c:110
+#: filters/filter-persistent.c:114 filters/filter-persistent.c:117
+#: filters/filter-persistent.c:197 filters/filter-persistent.c:299
+#: filters/filter-persistent.c:305 filters/filter-persistent.c:316
+#: filters/filter-regex.c:74 filters/filter-regex.c:101
+#: filters/filter-regex.c:119 filters/filter-regex.c:142
+#: filters/filter-regex.c:196 filters/filter-regex.c:201
+#: filters/filter-regex.c:206 filters/filter-regex.c:209
+#: filters/filter-sysfs.c:288 filters/filter.c:278 format1/disk-rep.c:221
+#: format1/disk-rep.c:233 format1/disk-rep.c:238 format1/disk-rep.c:257
+#: format1/disk-rep.c:260 format1/disk-rep.c:291 format1/disk-rep.c:294
+#: format1/disk-rep.c:313 format1/disk-rep.c:316 format1/disk-rep.c:334
+#: format1/disk-rep.c:351 format1/disk-rep.c:361 format1/disk-rep.c:421
+#: format1/disk-rep.c:428 format1/disk-rep.c:522 format1/disk-rep.c:547
+#: format1/disk-rep.c:563 format1/disk-rep.c:591 format1/disk-rep.c:609
+#: format1/disk-rep.c:646 format1/disk-rep.c:711 format1/disk-rep.c:718
+#: format1/disk-rep.c:734 format1/format1.c:134 format1/format1.c:137
+#: format1/format1.c:149 format1/format1.c:154 format1/format1.c:157
+#: format1/format1.c:160 format1/format1.c:163 format1/format1.c:166
+#: format1/format1.c:171 format1/format1.c:186 format1/format1.c:195
+#: format1/format1.c:198 format1/format1.c:213 format1/format1.c:227
+#: format1/format1.c:245 format1/format1.c:256 format1/format1.c:271
+#: format1/format1.c:297 format1/format1.c:302 format1/format1.c:307
+#: format1/format1.c:312 format1/format1.c:348 format1/format1.c:394
+#: format1/format1.c:410 format1/format1.c:415 format1/format1.c:421
+#: format1/format1.c:431 format1/format1.c:477 format1/format1.c:498
+#: format1/format1.c:507 format1/format1.c:551 format1/import-export.c:63
+#: format1/import-export.c:118 format1/import-export.c:151
+#: format1/import-export.c:168 format1/import-export.c:185
+#: format1/import-export.c:193 format1/import-export.c:228
+#: format1/import-export.c:233 format1/import-export.c:238
+#: format1/import-export.c:316 format1/import-export.c:448
+#: format1/import-export.c:453 format1/import-export.c:474
+#: format1/import-export.c:481 format1/import-export.c:503
+#: format1/import-export.c:524 format1/import-export.c:529
+#: format1/import-export.c:538 format1/import-export.c:548
+#: format1/import-export.c:558 format1/import-export.c:563
+#: format1/import-export.c:666 format1/import-export.c:714
+#: format1/import-extents.c:63 format1/import-extents.c:68
+#: format1/import-extents.c:71 format1/import-extents.c:122
+#: format1/import-extents.c:193 format1/import-extents.c:220
+#: format1/import-extents.c:235 format1/import-extents.c:284
+#: format1/import-extents.c:314 format1/import-extents.c:338
+#: format1/import-extents.c:354 format1/import-extents.c:369
+#: format1/layout.c:126 format1/lvm1-label.c:75 format1/vg_number.c:37
+#: format1/vg_number.c:42 format_pool/disk_rep.c:49 format_pool/disk_rep.c:102
+#: format_pool/disk_rep.c:256 format_pool/disk_rep.c:358
+#: format_pool/disk_rep.c:368 format_pool/disk_rep.c:373
+#: format_pool/format_pool.c:132 format_pool/format_pool.c:137
+#: format_pool/format_pool.c:142 format_pool/format_pool.c:152
+#: format_pool/format_pool.c:161 format_pool/format_pool.c:166
+#: format_pool/format_pool.c:186 format_pool/format_pool.c:195
+#: format_pool/format_pool.c:201 format_pool/format_pool.c:231
+#: format_pool/format_pool.c:236 format_pool/format_pool.c:246
+#: format_pool/format_pool.c:251 format_pool/import_export.c:93
+#: format_pool/import_export.c:180 format_pool/import_export.c:218
+#: format_pool/import_export.c:232 format_pool/import_export.c:256
+#: format_pool/import_export.c:276 format_pool/import_export.c:304
+#: format_pool/import_export.c:309 format_text/archive.c:117
+#: format_text/archive.c:138 format_text/archive.c:165
+#: format_text/archive.c:258 format_text/archive.c:274
+#: format_text/archive.c:350 format_text/archive.c:370
+#: format_text/archiver.c:82 format_text/archiver.c:89
+#: format_text/archiver.c:101 format_text/archiver.c:189
+#: format_text/archiver.c:267 format_text/archiver.c:317
+#: format_text/archiver.c:334 format_text/archiver.c:376
+#: format_text/archiver.c:381 format_text/export.c:138
+#: format_text/export.c:198 format_text/export.c:206 format_text/export.c:293
+#: format_text/export.c:294 format_text/export.c:295 format_text/export.c:296
+#: format_text/export.c:298 format_text/export.c:299 format_text/export.c:300
+#: format_text/export.c:303 format_text/export.c:313 format_text/export.c:317
+#: format_text/export.c:319 format_text/export.c:322 format_text/export.c:325
+#: format_text/export.c:329 format_text/export.c:332 format_text/export.c:336
+#: format_text/export.c:340 format_text/export.c:343 format_text/export.c:344
+#: format_text/export.c:348 format_text/export.c:349 format_text/export.c:373
+#: format_text/export.c:380 format_text/export.c:384 format_text/export.c:385
+#: format_text/export.c:389 format_text/export.c:393 format_text/export.c:395
+#: format_text/export.c:398 format_text/export.c:401 format_text/export.c:404
+#: format_text/export.c:408 format_text/export.c:411 format_text/export.c:415
+#: format_text/export.c:419 format_text/export.c:422 format_text/export.c:427
+#: format_text/export.c:431 format_text/export.c:440 format_text/export.c:443
+#: format_text/export.c:446 format_text/export.c:450 format_text/export.c:451
+#: format_text/export.c:455 format_text/export.c:458 format_text/export.c:463
+#: format_text/export.c:468 format_text/export.c:479 format_text/export.c:481
+#: format_text/export.c:488 format_text/export.c:492 format_text/export.c:497
+#: format_text/export.c:508 format_text/export.c:518 format_text/export.c:519
+#: format_text/export.c:524 format_text/export.c:528 format_text/export.c:531
+#: format_text/export.c:534 format_text/export.c:538 format_text/export.c:541
+#: format_text/export.c:545 format_text/export.c:549 format_text/export.c:551
+#: format_text/export.c:553 format_text/export.c:554 format_text/export.c:555
+#: format_text/export.c:560 format_text/export.c:566 format_text/export.c:581
+#: format_text/export.c:591 format_text/export.c:600 format_text/export.c:606
+#: format_text/export.c:624 format_text/export.c:627 format_text/export.c:634
+#: format_text/export.c:637 format_text/export.c:640 format_text/export.c:652
+#: format_text/export.c:657 format_text/export.c:660 format_text/export.c:665
+#: format_text/export.c:667 format_text/export.c:669 format_text/export.c:671
+#: format_text/export.c:673 format_text/export.c:677 format_text/export.c:680
+#: format_text/export.c:702 format_text/export.c:729 format_text/export.c:747
+#: format_text/flags.c:94 format_text/flags.c:138
+#: format_text/format-text.c:158 format_text/format-text.c:161
+#: format_text/format-text.c:195 format_text/format-text.c:199
+#: format_text/format-text.c:238 format_text/format-text.c:295
+#: format_text/format-text.c:346 format_text/format-text.c:378
+#: format_text/format-text.c:420 format_text/format-text.c:425
+#: format_text/format-text.c:433 format_text/format-text.c:451
+#: format_text/format-text.c:456 format_text/format-text.c:481
+#: format_text/format-text.c:494 format_text/format-text.c:542
+#: format_text/format-text.c:547 format_text/format-text.c:587
+#: format_text/format-text.c:601 format_text/format-text.c:619
+#: format_text/format-text.c:650 format_text/format-text.c:700
+#: format_text/format-text.c:757 format_text/format-text.c:762
+#: format_text/format-text.c:785 format_text/format-text.c:799
+#: format_text/format-text.c:1059 format_text/format-text.c:1064
+#: format_text/format-text.c:1072 format_text/format-text.c:1082
+#: format_text/format-text.c:1103 format_text/format-text.c:1107
+#: format_text/format-text.c:1113 format_text/format-text.c:1125
+#: format_text/format-text.c:1309 format_text/format-text.c:1365
+#: format_text/format-text.c:1370 format_text/format-text.c:1380
+#: format_text/format-text.c:1382 format_text/format-text.c:1390
+#: format_text/format-text.c:1430 format_text/format-text.c:1436
+#: format_text/format-text.c:1621 format_text/format-text.c:1627
+#: format_text/format-text.c:1666 format_text/format-text.c:1711
+#: format_text/format-text.c:1730 format_text/format-text.c:1746
+#: format_text/format-text.c:1751 format_text/format-text.c:1765
+#: format_text/format-text.c:1777 format_text/format-text.c:1783
+#: format_text/format-text.c:1813 format_text/format-text.c:1818
+#: format_text/format-text.c:1823 format_text/format-text.c:1832
+#: format_text/format-text.c:1935 format_text/import.c:47
+#: format_text/import.c:52 format_text/import.c:63 format_text/import.c:98
+#: format_text/import.c:115 format_text/import_vsn1.c:123
+#: format_text/import_vsn1.c:134 format_text/import_vsn1.c:167
+#: format_text/import_vsn1.c:237 format_text/import_vsn1.c:303
+#: format_text/import_vsn1.c:309 format_text/import_vsn1.c:322
+#: format_text/import_vsn1.c:387 format_text/import_vsn1.c:429
+#: format_text/import_vsn1.c:457 format_text/import_vsn1.c:465
+#: format_text/import_vsn1.c:482 format_text/import_vsn1.c:489
+#: format_text/import_vsn1.c:518 format_text/import_vsn1.c:576
+#: format_text/import_vsn1.c:629 format_text/import_vsn1.c:654
+#: format_text/import_vsn1.c:664 format_text/import_vsn1.c:667
+#: format_text/import_vsn1.c:735 format_text/import_vsn1.c:846
+#: format_text/tags.c:28 format_text/tags.c:35 format_text/tags.c:42
+#: format_text/tags.c:48 format_text/tags.c:67 format_text/text_label.c:210
+#: format_text/text_label.c:246 label/label.c:90 label/label.c:207
+#: label/label.c:258 label/label.c:274 label/label.c:284 label/label.c:291
+#: label/label.c:321 label/label.c:329 label/label.c:341 label/label.c:360
+#: label/label.c:364 label/label.c:370 locking/cluster_locking.c:85
+#: locking/cluster_locking.c:420 locking/cluster_locking.c:432
+#: locking/cluster_locking.c:436 locking/external_locking.c:77 lvchange.c:57
+#: lvchange.c:99 lvchange.c:116 lvchange.c:122 lvchange.c:136 lvchange.c:143
+#: lvchange.c:150 lvchange.c:268 lvchange.c:282 lvchange.c:353 lvchange.c:361
+#: lvchange.c:395 lvchange.c:472 lvchange.c:479 lvchange.c:526 lvchange.c:534
+#: lvconvert.c:96 lvconvert.c:147 lvconvert.c:211 lvconvert.c:222
+#: lvconvert.c:273 lvconvert.c:285 lvconvert.c:298 lvconvert.c:332
+#: lvconvert.c:354 lvconvert.c:369 lvconvert.c:378 lvconvert.c:397
+#: lvconvert.c:404 lvconvert.c:470 lvconvert.c:481 lvconvert.c:544
+#: lvconvert.c:585 lvcreate.c:133 lvcreate.c:349 lvcreate.c:373 lvcreate.c:399
+#: lvcreate.c:529 lvcreate.c:661 lvcreate.c:698 lvcreate.c:728 lvcreate.c:755
+#: lvcreate.c:763 lvcreate.c:769 lvcreate.c:776 lvcreate.c:868
+#: lvmcmdline.c:830 lvmcmdline.c:836 lvmcmdline.c:839 lvmcmdline.c:842
+#: lvmcmdline.c:846 lvmcmdline.c:853 lvmcmdline.c:885 lvmcmdline.c:896
+#: lvmcmdline.c:906 lvmcmdline.c:936 lvmcmdline.c:1022 lvremove.c:99
+#: lvrename.c:85 lvrename.c:164 lvrename.c:175 lvrename.c:182 lvrename.c:188
+#: lvresize.c:466 lvresize.c:522 lvresize.c:529 lvresize.c:536 lvresize.c:547
+#: lvresize.c:554 lvresize.c:560 lvresize.c:579 lvresize.c:593 lvresize.c:618
+#: metadata/lv_manip.c:85 metadata/lv_manip.c:91 metadata/lv_manip.c:192
+#: metadata/lv_manip.c:227 metadata/lv_manip.c:258 metadata/lv_manip.c:316
+#: metadata/lv_manip.c:325 metadata/lv_manip.c:340 metadata/lv_manip.c:349
+#: metadata/lv_manip.c:379 metadata/lv_manip.c:580 metadata/lv_manip.c:588
+#: metadata/lv_manip.c:623 metadata/lv_manip.c:735 metadata/lv_manip.c:738
+#: metadata/lv_manip.c:748 metadata/lv_manip.c:846 metadata/lv_manip.c:874
+#: metadata/lv_manip.c:1048 metadata/lv_manip.c:1095 metadata/lv_manip.c:1100
+#: metadata/lv_manip.c:1130 metadata/lv_manip.c:1221 metadata/lv_manip.c:1228
+#: metadata/lv_manip.c:1265 metadata/lv_manip.c:1277 metadata/lv_manip.c:1306
+#: metadata/lv_manip.c:1316 metadata/lv_manip.c:1364 metadata/lv_manip.c:1429
+#: metadata/lv_manip.c:1436 metadata/lv_manip.c:1548 metadata/lv_manip.c:1619
+#: metadata/merge.c:253 metadata/merge.c:292 metadata/merge.c:297
+#: metadata/metadata.c:119 metadata/metadata.c:154 metadata/metadata.c:182
+#: metadata/metadata.c:252 metadata/metadata.c:276 metadata/metadata.c:284
+#: metadata/metadata.c:322 metadata/metadata.c:372 metadata/metadata.c:378
+#: metadata/metadata.c:384 metadata/metadata.c:395 metadata/metadata.c:401
+#: metadata/metadata.c:413 metadata/metadata.c:419 metadata/metadata.c:431
+#: metadata/metadata.c:439 metadata/metadata.c:446 metadata/metadata.c:453
+#: metadata/metadata.c:460 metadata/metadata.c:473 metadata/metadata.c:481
+#: metadata/metadata.c:490 metadata/metadata.c:549 metadata/metadata.c:564
+#: metadata/metadata.c:754 metadata/metadata.c:779 metadata/metadata.c:815
+#: metadata/metadata.c:846 metadata/metadata.c:874 metadata/metadata.c:880
+#: metadata/metadata.c:887 metadata/metadata.c:898 metadata/metadata.c:903
+#: metadata/metadata.c:925 metadata/metadata.c:947 metadata/metadata.c:964
+#: metadata/metadata.c:1063 metadata/metadata.c:1068 metadata/metadata.c:1079
+#: metadata/metadata.c:1137 metadata/metadata.c:1142 metadata/metadata.c:1168
+#: metadata/metadata.c:1183 metadata/metadata.c:1191 metadata/metadata.c:1246
+#: metadata/metadata.c:1250 metadata/metadata.c:1399 metadata/metadata.c:1433
+#: metadata/metadata.c:1490 metadata/metadata.c:1494 metadata/metadata.c:1527
+#: metadata/mirror.c:106 metadata/mirror.c:109 metadata/mirror.c:112
+#: metadata/mirror.c:205 metadata/mirror.c:484 metadata/mirror.c:526
+#: metadata/mirror.c:560 metadata/mirror.c:599 metadata/mirror.c:608
+#: metadata/mirror.c:736 metadata/mirror.c:757 metadata/mirror.c:762
+#: metadata/mirror.c:836 metadata/pv_manip.c:54 metadata/pv_manip.c:73
+#: metadata/pv_manip.c:94 metadata/pv_manip.c:131 metadata/pv_manip.c:156
+#: metadata/pv_manip.c:197 metadata/pv_manip.c:332 metadata/pv_map.c:44
+#: metadata/pv_map.c:92 metadata/pv_map.c:112 metadata/pv_map.c:122
+#: metadata/pv_map.c:149 metadata/pv_map.c:159 metadata/snapshot_manip.c:70
+#: metadata/snapshot_manip.c:77 mirror/mirrored.c:144 mirror/mirrored.c:149
+#: mirror/mirrored.c:151 mirror/mirrored.c:304 mirror/mirrored.c:328
+#: mirror/mirrored.c:331 mirror/mirrored.c:501 mirror/mirrored.c:552
+#: misc/lvm-file.c:291 misc/timestamp.c:44 pvchange.c:191 pvmove.c:102
+#: pvmove.c:107 pvmove.c:192 pvmove.c:220 pvmove.c:227 pvmove.c:292
+#: pvmove.c:299 pvmove.c:308 pvmove.c:337 pvmove.c:349 pvmove.c:356
+#: pvmove.c:363 pvmove.c:371 pvmove.c:383 pvmove.c:524 pvresize.c:165
+#: pvscan.c:55 report/report.c:187 report/report.c:513 report/report.c:543
+#: report/report.c:699 reporter.c:289 snapshot/snapshot.c:74
+#: snapshot/snapshot.c:83 snapshot/snapshot.c:84 snapshot/snapshot.c:85
+#: snapshot/snapshot.c:169 striped/striped.c:89 striped/striped.c:169
+#: striped/striped.c:172 striped/striped.c:216 toollib.c:912 toollib.c:962
+#: toollib.c:1020 toollib.c:1060 toollib.c:1085 toollib.c:1194 toollib.c:1332
+#: toollib.c:1337 toollib.c:1350 toollib.c:1357 uuid/uuid.c:90 uuid/uuid.c:94
+#: vgcfgbackup.c:69 vgcfgbackup.c:78 vgcfgbackup.c:85 vgchange.c:420
+#: vgmerge.c:193 vgreduce.c:29 vgreduce.c:96 vgreduce.c:102 vgreduce.c:124
+#: vgreduce.c:130 vgreduce.c:148 vgreduce.c:196 vgreduce.c:217 vgreduce.c:241
+#: vgreduce.c:307 vgreduce.c:353 zero/zero.c:99
 msgid "<backtrace>"
 msgstr ""
 
-#: activate/activate.c:280
-msgid "Failed to get driver version"
-msgstr ""
-
-#: activate/activate.c:302
-#, c-format
-msgid "Getting target version for %s"
-msgstr ""
-
-#: activate/activate.c:309
-#, c-format
-msgid "Failed to get %s target version"
+#: activate/activate.c:81
+msgid "snap_seg module string allocation failed"
 msgstr ""
 
-#: activate/activate.c:563
-#, c-format
-msgid "Skipping: Suspending '%s'."
+#: activate/activate.c:245
+msgid "Activation enabled. Device-mapper kernel driver will be used."
 msgstr ""
 
-#: activate/activate.c:609
-#, c-format
-msgid "Skipping: Resuming '%s'."
+#: activate/activate.c:248
+msgid ""
+"WARNING: Activation disabled. No device-mapper interaction will be attempted."
 msgstr ""
 
-#: activate/activate.c:654
-#, c-format
-msgid "Skipping: Deactivating '%s'."
+#: activate/activate.c:281
+msgid "Ignoring invalid string in config file activation/volume_list"
 msgstr ""
 
-#: activate/activate.c:667
-#, c-format
-msgid "LV %s/%s in use: not removing"
+#: activate/activate.c:287
+msgid "Ignoring empty string in config file activation/volume_list"
 msgstr ""
 
-#: activate/activate.c:693 activate/activate.c:717
-#, c-format
-msgid "Not activating %s/%s due to config file settings"
+#: activate/activate.c:296
+msgid "Ignoring empty tag in config file activation/volume_list"
 msgstr ""
 
-#: activate/activate.c:723
+#: activate/activate.c:326
 #, c-format
-msgid "Skipping: Activating '%s'."
+msgid "dm_snprintf error from %s/%s"
 msgstr ""
 
-#: activate/dev_manager.c:231 activate/dev_manager.c:291
-#: activate/dev_manager.c:372 activate/dev_manager.c:478
-#: activate/dev_manager.c:509 activate/dev_manager.c:603
-#: activate/dev_manager.c:662
-msgid "Failed to disable open_count"
+#: activate/activate.c:350
+msgid "Getting driver version"
 msgstr ""
 
-#: activate/dev_manager.c:392 activate/dev_manager.c:418
+#: activate/activate.c:362
 #, c-format
-msgid "Number of segments in active LV %s does not match metadata"
+msgid "Getting target version for %s"
 msgstr ""
 
-#: activate/dev_manager.c:428
+#: activate/activate.c:367
 #, c-format
-msgid "LV percent: %f"
+msgid "Failed to get %s target version"
 msgstr ""
 
-#: activate/dev_manager.c:460
+#: activate/activate.c:411
 #, c-format
-msgid "Couldn't split up dm layer name %s"
+msgid "target_present module name too long: %s"
 msgstr ""
 
-#: activate/dev_manager.c:464 format_text/format-text.c:681
-#: format_text/format-text.c:706 format_text/format-text.c:740
+#: activate/activate.c:440
 #, c-format
-msgid "Renaming %s to %s"
+msgid "Getting device info for %s"
 msgstr ""
 
-#: activate/dev_manager.c:481
+#: activate/activate.c:771
 #, c-format
-msgid "Couldn't rename device '%s'."
+msgid "Skipping: Suspending '%s'."
 msgstr ""
 
-#: activate/dev_manager.c:502
+#: activate/activate.c:831
 #, c-format
-msgid "%s %s"
+msgid "Skipping: Resuming '%s'."
 msgstr ""
 
-#: activate/dev_manager.c:512
+#: activate/activate.c:877
 #, c-format
-msgid "Couldn't %s device '%s'"
+msgid "Skipping: Deactivating '%s'."
 msgstr ""
 
-#: activate/dev_manager.c:552
+#: activate/activate.c:888
 #, c-format
-msgid "Loading %s"
+msgid "LV %s/%s in use: not deactivating"
 msgstr ""
 
-#: activate/dev_manager.c:563
+#: activate/activate.c:917 activate/activate.c:942
 #, c-format
-msgid "Couldn't populate device '%s'."
+msgid "Not activating %s/%s due to config file settings"
 msgstr ""
 
-#: activate/dev_manager.c:573
+#: activate/activate.c:948
 #, c-format
-msgid "Failed to set major number for %s to %d during activation."
+msgid "Skipping: Activating '%s'."
 msgstr ""
 
-#: activate/dev_manager.c:578
+#: activate/dev_manager.c:75
 #, c-format
-msgid "Set major number for %s to %d."
+msgid "_build_dlid: pool allocation failed for %zu %s %s."
 msgstr ""
 
-#: activate/dev_manager.c:584
-#, c-format
-msgid "Failed to set minor number for %s to %d during activation."
+#: activate/dev_manager.c:136 activate/dev_manager.c:255
+#: activate/dev_manager.c:344
+msgid "Failed to disable open_count"
 msgstr ""
 
-#: activate/dev_manager.c:589
-#, c-format
-msgid "Set minor number for %s to %d."
+#: activate/dev_manager.c:163
+msgid "Failed to allocate dm_task struct to check dev status"
 msgstr ""
 
-#: activate/dev_manager.c:595
-#, c-format
-msgid "Failed to set %s read-only during activation."
+#: activate/dev_manager.c:171
+msgid "Failed to get state of mapped device"
 msgstr ""
 
-#: activate/dev_manager.c:599
+#: activate/dev_manager.c:229 activate/dev_manager.c:528
 #, c-format
-msgid "Activating %s read-only"
+msgid "dlid build failed for %s"
 msgstr ""
 
-#: activate/dev_manager.c:606
+#: activate/dev_manager.c:360 activate/dev_manager.c:384
 #, c-format
-msgid "Couldn't load device '%s'."
+msgid "Number of segments in active LV %s does not match metadata"
 msgstr ""
 
-#: activate/dev_manager.c:609
+#: activate/dev_manager.c:394
 #, c-format
-msgid "Perhaps the persistent device number %d:%d is already in use?"
+msgid "LV percent: %f"
 msgstr ""
 
-#: activate/dev_manager.c:633
+#: activate/dev_manager.c:497
 #, c-format
-msgid "Activated %s %s %03u:%03u"
+msgid "Getting device status percentage for %s"
 msgstr ""
 
-#: activate/dev_manager.c:652 activate/dev_manager.c:654 activate/fs.c:103
-#: activate/fs.c:156 activate/fs.c:169
+#: activate/dev_manager.c:532
 #, c-format
-msgid "Removing %s"
+msgid "Getting device mirror status percentage for %s"
 msgstr ""
 
-#: activate/dev_manager.c:701
+#: activate/dev_manager.c:633
 #, c-format
-msgid "_emit_target: Internal error: Can't handle segment type %s"
+msgid "Getting device info for %s [%s]"
 msgstr ""
 
-#: activate/dev_manager.c:718
+#: activate/dev_manager.c:635
 #, c-format
-msgid "Adding target: %llu %llu %s %s"
+msgid "Failed to get info for %s [%s]."
 msgstr ""
 
-#: activate/dev_manager.c:736
+#: activate/dev_manager.c:640
 #, c-format
-msgid "%s device layer %s missing from hash"
+msgid "Failed to add device (%u:%u) to dtree"
 msgstr ""
 
-#: activate/dev_manager.c:743
+#: activate/dev_manager.c:677
 #, c-format
-msgid "Failed to format %s device number for %s as dm target (%u,%u)"
+msgid "Partial dtree creation failed for %s."
 msgstr ""
 
-#: activate/dev_manager.c:829
+#: activate/dev_manager.c:741
 #, c-format
 msgid "Internal error: Unassigned area found in LV %s."
 msgstr ""
 
-#: activate/dev_manager.c:852
-msgid "Insufficient space for target parameters."
-msgstr ""
-
-#: activate/dev_manager.c:865
-msgid "Insufficient space in params[%zu] for target parameters."
-msgstr ""
-
-#: activate/dev_manager.c:871
-msgid "Target parameter size too big. Aborting."
-msgstr ""
-
-#: activate/dev_manager.c:885
-#, c-format
-msgid "Unable to build table for '%s'"
-msgstr ""
-
-#: activate/dev_manager.c:909
-#, c-format
-msgid "Adding target: 0 %llu snapshot-origin %s"
-msgstr ""
-
-#: activate/dev_manager.c:930
+#: activate/dev_manager.c:775
 #, c-format
 msgid "Couldn't find snapshot for '%s'."
 msgstr ""
 
-#: activate/dev_manager.c:964
-#, c-format
-msgid "Adding target: 0 %llu snapshot %s"
-msgstr ""
-
-#: activate/dev_manager.c:1048 activate/dev_manager.c:1128
+#: activate/dev_manager.c:800
 #, c-format
-msgid "Getting device info for %s"
+msgid "_emit_target: Internal error: Can't handle segment type %s"
 msgstr ""
 
-#: activate/dev_manager.c:1074
+#: activate/dev_manager.c:828
 #, c-format
-msgid "Getting device status percentage for %s"
+msgid "Checking kernel supports %s segment type for %s%s%s"
 msgstr ""
 
-#: activate/dev_manager.c:1105
+#: activate/dev_manager.c:834
 #, c-format
-msgid "Getting device mirror status percentage for %s"
+msgid "Can't expand LV %s: %s target support missing from kernel?"
 msgstr ""
 
-#: activate/dev_manager.c:1405 activate/dev_manager.c:1411
+#: activate/dev_manager.c:847
 msgid "Clustered snapshots are not yet supported"
 msgstr ""
 
-#: activate/dev_manager.c:1448 activate/dev_manager.c:1608
-#, c-format
-msgid "Couldn't find device layer '%s'."
-msgstr ""
-
-#: activate/dev_manager.c:1528
+#: activate/dev_manager.c:902
 #, c-format
-msgid "_suspend_parents couldn't find device layer '%s' - skipping."
+msgid "_add_new_lv_to_dtree: pool alloc failed for %s %s."
 msgstr ""
 
-#: activate/dev_manager.c:1534
+#: activate/dev_manager.c:961
 #, c-format
-msgid "BUG: pre-suspend loop detected (%s)"
+msgid "_create_lv_symlinks: Couldn't split up old device name %s"
 msgstr ""
 
-#: activate/dev_manager.c:1562
+#: activate/dev_manager.c:987
 #, c-format
-msgid "_resume_with_deps couldn't find device layer '%s' - skipping."
+msgid "_clean_tree: Couldn't split up device name %s."
 msgstr ""
 
-#: activate/dev_manager.c:1568 activate/dev_manager.c:1613
-#, c-format
-msgid "BUG: pre-create loop detected (%s)"
-msgstr ""
-
-#: activate/dev_manager.c:1720 activate/dev_manager.c:1736
-#, c-format
-msgid ""
-"_populate_pre_suspend_lists: Couldn't find device layer '%s' - skipping."
-msgstr ""
-
-#: activate/dev_manager.c:1782
-#, c-format
-msgid "Couldn't deactivate device %s"
+#: activate/dev_manager.c:1013 activate/dev_manager.c:1133
+msgid "Lost dependency tree root node"
 msgstr ""
 
-#: activate/dev_manager.c:1898
+#: activate/dev_manager.c:1055
 #, c-format
-msgid "Found existing layer '%s'"
+msgid "Failed to create symlinks for %s."
 msgstr ""
 
-#: activate/dev_manager.c:2078
+#: activate/dev_manager.c:1060
 #, c-format
-msgid "Can't expand LV: %s target support missing from kernel?"
+msgid "_tree_action: Action %u not supported."
 msgstr ""
 
-#: activate/dev_manager.c:2090
-msgid "Can't expand LV: Mirror support missing from tools?"
+#: activate/dev_manager.c:1119
+msgid "partial dtree creation failed"
 msgstr ""
 
-#: activate/dev_manager.c:2097
-msgid "Can't expand LV: Mirror support missing from kernel?"
-msgstr ""
-
-#: activate/dev_manager.c:2105
-msgid "Can't expand LV: Snapshot support missing from tools?"
-msgstr ""
-
-#: activate/dev_manager.c:2112
-msgid "Can't expand LV: Snapshot support missing from kernel?"
-msgstr ""
-
-#: activate/dev_manager.c:2140
+#: activate/dev_manager.c:1124
 #, c-format
-msgid "Found active lv %s%s"
+msgid "Failed to add device %s (%u:%u) to dtree"
 msgstr ""
 
-#: activate/fs.c:40 activate/fs.c:63
+#: activate/fs.c:35 activate/fs.c:58
 msgid "Couldn't construct name of volume group directory."
 msgstr ""
 
-#: activate/fs.c:48
+#: activate/fs.c:43
 #, c-format
 msgid "Creating directory %s"
 msgstr ""
 
-#: activate/fs.c:50 activate/fs.c:85 activate/fs.c:105 activate/fs.c:158
-#: activate/fs.c:171 activate/fs.c:178 activate/fs.c:213
-#: commands/toolcontext.c:342 commands/toolcontext.c:799 config/config.c:155
-#: config/config.c:204 config/config.c:220 config/config.c:285
-#: config/config.c:382 device/dev-cache.c:172 device/dev-cache.c:176
-#: device/dev-cache.c:358 device/dev-cache.c:381 device/dev-cache.c:388
-#: device/dev-cache.c:581 device/dev-cache.c:583 device/dev-io.c:131
-#: device/dev-io.c:231 device/dev-io.c:249 device/dev-io.c:254
-#: device/dev-io.c:256 device/dev-io.c:262 device/dev-io.c:386
-#: device/dev-io.c:388 device/dev-io.c:451 filters/filter-persistent.c:186
-#: filters/filter-sysfs.c:43 filters/filter-sysfs.c:155
-#: filters/filter-sysfs.c:179 filters/filter-sysfs.c:222 filters/filter.c:153
-#: format_text/archive.c:216 format_text/archive.c:225
-#: format_text/format-text.c:656 format_text/format-text.c:670
-#: format_text/format-text.c:676 format_text/format-text.c:701
-#: format_text/format-text.c:763 format_text/format-text.c:768
-#: format_text/format-text.c:793 format_text/format-text.c:818
+#: activate/fs.c:45 activate/fs.c:80 activate/fs.c:100 activate/fs.c:153
+#: activate/fs.c:166 activate/fs.c:173 activate/fs.c:208
+#: commands/toolcontext.c:342 commands/toolcontext.c:820 config/config.c:209
+#: config/config.c:247 config/config.c:262 config/config.c:328
+#: config/config.c:428 config/config.c:452 device/dev-cache.c:208
+#: device/dev-cache.c:212 device/dev-cache.c:394 device/dev-cache.c:417
+#: device/dev-cache.c:424 device/dev-cache.c:681 device/dev-cache.c:683
+#: device/dev-io.c:131 device/dev-io.c:231 device/dev-io.c:249
+#: device/dev-io.c:254 device/dev-io.c:256 device/dev-io.c:262
+#: device/dev-io.c:396 device/dev-io.c:398 device/dev-io.c:481
+#: filters/filter-persistent.c:203 filters/filter-persistent.c:207
+#: filters/filter-persistent.c:230 filters/filter-persistent.c:243
+#: filters/filter-sysfs.c:42 filters/filter-sysfs.c:58
+#: filters/filter-sysfs.c:156 filters/filter-sysfs.c:163
+#: filters/filter-sysfs.c:182 filters/filter-sysfs.c:225 filters/filter.c:164
+#: filters/filter.c:221 filters/filter.c:232 filters/filter.c:240
+#: filters/filter.c:253 format_text/archive.c:214 format_text/archive.c:223
+#: format_text/archive.c:253 format_text/archive.c:260
+#: format_text/archive.c:265 format_text/format-text.c:873
+#: format_text/format-text.c:875 format_text/format-text.c:884
+#: format_text/format-text.c:889 format_text/format-text.c:891
+#: format_text/format-text.c:896 format_text/format-text.c:921
+#: format_text/format-text.c:983 format_text/format-text.c:988
+#: format_text/format-text.c:1013 format_text/format-text.c:1040
 #: locking/file_locking.c:61 locking/file_locking.c:69
 #: locking/file_locking.c:72 locking/file_locking.c:105
-#: locking/file_locking.c:171 locking/file_locking.c:187
-#: locking/file_locking.c:294 locking/file_locking.c:299 locking/locking.c:44
-#: locking/locking.c:49 locking/locking.c:65 locking/locking.c:203
-#: log/log.c:64 lvmcmdline.c:1347 misc/lvm-file.c:47 misc/lvm-file.c:96
-#: misc/lvm-file.c:106 misc/lvm-file.c:156 misc/lvm-file.c:169
-#: misc/lvm-file.c:198 misc/lvm-file.c:207 misc/lvm-file.c:235
-#: misc/lvm-file.c:240 mm/memlock.c:98 mm/memlock.c:106 mm/memlock.c:117
-#: toollib.c:992 uuid/uuid.c:84 uuid/uuid.c:89
+#: locking/file_locking.c:167 locking/file_locking.c:171
+#: locking/file_locking.c:187 locking/file_locking.c:296
+#: locking/file_locking.c:301 locking/locking.c:45 locking/locking.c:50
+#: locking/locking.c:66 locking/locking.c:221 log/log.c:69 lvmcmdline.c:1092
+#: lvmcmdline.c:1130 misc/lvm-exec.c:42 misc/lvm-file.c:47 misc/lvm-file.c:70
+#: misc/lvm-file.c:97 misc/lvm-file.c:107 misc/lvm-file.c:157
+#: misc/lvm-file.c:170 misc/lvm-file.c:199 misc/lvm-file.c:208
+#: misc/lvm-file.c:236 misc/lvm-file.c:241 misc/lvm-file.c:244
+#: misc/lvm-file.c:289 misc/lvm-file.c:297 misc/timestamp.c:47 mm/memlock.c:97
+#: mm/memlock.c:105 mm/memlock.c:116 uuid/uuid.c:83 uuid/uuid.c:88
 #, c-format
 msgid "%s: %s failed: %s"
 msgstr ""
 
-#: activate/fs.c:69
+#: activate/fs.c:64
 #, c-format
 msgid "Removing directory %s"
 msgstr ""
 
-#: activate/fs.c:96
+#: activate/fs.c:91
 #, c-format
 msgid "Couldn't create path for %s"
 msgstr ""
 
-#: activate/fs.c:119
+#: activate/fs.c:98 activate/fs.c:151 activate/fs.c:164
+#, c-format
+msgid "Removing %s"
+msgstr ""
+
+#: activate/fs.c:114
 #, c-format
 msgid "Couldn't create path for volume group dir %s"
 msgstr ""
 
-#: activate/fs.c:126
+#: activate/fs.c:121
 #, c-format
 msgid "Couldn't create source pathname for logical volume link %s"
 msgstr ""
 
-#: activate/fs.c:133
+#: activate/fs.c:128
 #, c-format
 msgid "Couldn't create destination pathname for logical volume link for %s"
 msgstr ""
 
-#: activate/fs.c:140
+#: activate/fs.c:135
 #, c-format
 msgid "Couldn't create pathname for LVM1 group file for %s"
 msgstr ""
 
-#: activate/fs.c:151
+#: activate/fs.c:146
 #, c-format
 msgid "Non-LVM1 character device found at %s"
 msgstr ""
 
-#: activate/fs.c:164
+#: activate/fs.c:159
 #, c-format
 msgid "Symbolic link %s not created: file exists"
 msgstr ""
 
-#: activate/fs.c:176
+#: activate/fs.c:171
 #, c-format
 msgid "Linking %s -> %s"
 msgstr ""
 
-#: activate/fs.c:200
+#: activate/fs.c:195
 msgid "Couldn't determine link pathname."
 msgstr ""
 
-#: activate/fs.c:207
+#: activate/fs.c:202
 #, c-format
 msgid "%s not symbolic link - not removing"
 msgstr ""
 
-#: activate/fs.c:211
+#: activate/fs.c:206
 #, c-format
 msgid "Removing link %s"
 msgstr ""
 
-#: activate/fs.c:287
+#: activate/fs.c:282
 msgid "No space to stack fs operation"
 msgstr ""
 
@@ -809,81 +726,165 @@
 msgid "Couldn't create backup object."
 msgstr ""
 
-#: cache/lvmcache.c:57 cache/lvmcache.c:202 cache/lvmcache.c:464
+#: cache/lvmcache.c:56 cache/lvmcache.c:235 cache/lvmcache.c:740
 msgid "Internal cache initialisation failed"
 msgstr ""
 
-#: cache/lvmcache.c:62
+#: cache/lvmcache.c:61
 #, c-format
 msgid "Cache locking failure for %s"
 msgstr ""
 
-#: cache/lvmcache.c:212 toollib.c:492
+#: cache/lvmcache.c:127
+msgid "device_list element allocation failed"
+msgstr ""
+
+#: cache/lvmcache.c:245 toollib.c:638
 msgid "dev_iter creation failed"
 msgstr ""
 
-#: cache/lvmcache.c:245
-msgid "vgnames list allocation failed"
+#: cache/lvmcache.c:278
+msgid "vgids list allocation failed"
 msgstr ""
 
-#: cache/lvmcache.c:252 toollib.c:150 toollib.c:195 toollib.c:203
-#: toollib.c:215 toollib.c:275 toollib.c:406 toollib.c:426 toollib.c:552
+#: cache/lvmcache.c:285 cache/lvmcache.c:308 cache/lvmcache.c:334
+#: toollib.c:271 toollib.c:306 toollib.c:314 toollib.c:326 toollib.c:405
+#: toollib.c:547 toollib.c:561 toollib.c:698
 msgid "strlist allocation failed"
 msgstr ""
 
-#: cache/lvmcache.c:346
+#: cache/lvmcache.c:301
+msgid "vgnames list allocation failed"
+msgstr ""
+
+#: cache/lvmcache.c:324
+msgid "pvids list allocation failed"
+msgstr ""
+
+#: cache/lvmcache.c:395
+#, c-format
+msgid "vg hash re-insertion failed: %s"
+msgstr ""
+
+#: cache/lvmcache.c:440
 #, c-format
 msgid "_lvmcache_update: pvid insertion failed: %s"
 msgstr ""
 
-#: cache/lvmcache.c:367
+#: cache/lvmcache.c:456
+#, c-format
+msgid "lvmcache: %s: clearing VGID"
+msgstr ""
+
+#: cache/lvmcache.c:463
 #, c-format
 msgid "_lvmcache_update: vgid hash insertion failed: %s"
 msgstr ""
 
-#: cache/lvmcache.c:395
+#: cache/lvmcache.c:468
+#, c-format
+msgid "lvmcache: %s: setting %s VGID to %s"
+msgstr ""
+
+#: cache/lvmcache.c:502
+#, c-format
+msgid ""
+"WARNING: Duplicate VG name %s: Existing %s takes precedence over exported %s"
+msgstr ""
+
+#: cache/lvmcache.c:508
+#, c-format
+msgid "WARNING: Duplicate VG name %s: %s takes precedence over exported %s"
+msgstr ""
+
+#: cache/lvmcache.c:516
+#, c-format
+msgid ""
+"WARNING: Duplicate VG name %s: Existing %s (created here) takes precedence "
+"over %s"
+msgstr ""
+
+#: cache/lvmcache.c:521
+#, c-format
+msgid ""
+"WARNING: Duplicate VG name %s: %s (with creation_host) takes precedence over "
+"%s"
+msgstr ""
+
+#: cache/lvmcache.c:529
+#, c-format
+msgid ""
+"WARNING: Duplicate VG name %s: %s (created here) takes precedence over %s"
+msgstr ""
+
+#: cache/lvmcache.c:547
+#, c-format
+msgid "cache_update: vg hash insertion failed: %s"
+msgstr ""
+
+#: cache/lvmcache.c:619
 msgid "lvmcache_update_vgname: list alloc failed"
 msgstr ""
 
-#: cache/lvmcache.c:401
+#: cache/lvmcache.c:625
 #, c-format
 msgid "cache vgname alloc failed for %s"
 msgstr ""
 
-#: cache/lvmcache.c:406
+#: cache/lvmcache.c:652
 #, c-format
-msgid "cache_update: vg hash insertion failed: %s"
+msgid "lvmcache: %s: now %s%s%s%s%s"
+msgstr ""
+
+#: cache/lvmcache.c:668
+#, c-format
+msgid "lvmcache: %s: VG %s %s exported"
+msgstr ""
+
+#: cache/lvmcache.c:685
+#, c-format
+msgid "cache creation host alloc failed for %s"
 msgstr ""
 
-#: cache/lvmcache.c:425
+#: cache/lvmcache.c:690
 #, c-format
-msgid "lvmcache: %s now %s%s"
+msgid "lvmcache: %s: VG %s: Set creation host to %s."
 msgstr ""
 
-#: cache/lvmcache.c:478
+#: cache/lvmcache.c:754
 msgid "lvmcache_info allocation failed"
 msgstr ""
 
-#: cache/lvmcache.c:493
+#: cache/lvmcache.c:769
 #, c-format
 msgid "Ignoring duplicate PV %s on %s - using md %s"
 msgstr ""
 
-#: cache/lvmcache.c:500
+#: cache/lvmcache.c:776
+#, c-format
+msgid "Ignoring duplicate PV %s on %s - using dm %s"
+msgstr ""
+
+#: cache/lvmcache.c:783
 #, c-format
 msgid "Duplicate PV %s on %s - using md %s"
 msgstr ""
 
-#: cache/lvmcache.c:505
+#: cache/lvmcache.c:789
+#, c-format
+msgid "Duplicate PV %s on %s - using dm %s"
+msgstr ""
+
+#: cache/lvmcache.c:798
 #, c-format
 msgid "Found duplicate PV %s: using %s not %s"
 msgstr ""
 
-#: cache/lvmcache.c:574
+#: cache/lvmcache.c:872
 msgid "Wiping internal VG cache"
 msgstr ""
 
-#: commands/toolcontext.c:73
+#: commands/toolcontext.c:70
 msgid "LVM_SYSTEM_DIR environment variable is too long."
 msgstr ""
 
@@ -906,7 +907,7 @@
 msgid "Warning: proc dir %s not found - some checks will be bypassed"
 msgstr ""
 
-#: commands/toolcontext.c:207 lvmcmdline.c:694
+#: commands/toolcontext.c:207 lvmcmdline.c:723
 msgid "Invalid units specification"
 msgstr ""
 
@@ -960,342 +961,380 @@
 msgid "Failed to create config tree"
 msgstr ""
 
-#: commands/toolcontext.c:475
+#: commands/toolcontext.c:473
 msgid "Failed to add /dev to internal device cache"
 msgstr ""
 
-#: commands/toolcontext.c:479
+#: commands/toolcontext.c:477
 msgid "device/scan not in config file: Defaulting to /dev"
 msgstr ""
 
-#: commands/toolcontext.c:486
+#: commands/toolcontext.c:484
 msgid "Invalid string in config file: devices/scan"
 msgstr ""
 
-#: commands/toolcontext.c:492 format_text/format-text.c:1692
+#: commands/toolcontext.c:490 format_text/format-text.c:1980
 #, c-format
 msgid "Failed to add %s to internal device cache"
 msgstr ""
 
-#: commands/toolcontext.c:503
+#: commands/toolcontext.c:501
 msgid "Invalid string in config file: devices/loopfiles"
 msgstr ""
 
-#: commands/toolcontext.c:509
+#: commands/toolcontext.c:507
 #, c-format
 msgid "Failed to add loopfile %s to internal device cache"
 msgstr ""
 
-#: commands/toolcontext.c:548
+#: commands/toolcontext.c:546
 msgid "devices/filter not found in config file: no regex filter installed"
 msgstr ""
 
-#: commands/toolcontext.c:552
+#: commands/toolcontext.c:550
 msgid "Failed to create regex device filter"
 msgstr ""
 
-#: commands/toolcontext.c:559
+#: commands/toolcontext.c:557
 msgid "Failed to create lvm type filter"
 msgstr ""
 
-#: commands/toolcontext.c:590
-#, c-format
-msgid "Persistent cache filename too long ('%s/.cache')."
+#: commands/toolcontext.c:602 commands/toolcontext.c:610
+msgid "Persistent cache filename too long."
 msgstr ""
 
-#: commands/toolcontext.c:598
+#: commands/toolcontext.c:615
 msgid "Failed to create persistent device filter"
 msgstr ""
 
-#: commands/toolcontext.c:612
+#: commands/toolcontext.c:634
 #, c-format
 msgid "Failed to load existing device cache from %s"
 msgstr ""
 
-#: commands/toolcontext.c:656
+#: commands/toolcontext.c:679
 msgid "Invalid string in config file: global/format_libraries"
 msgstr ""
 
-#: commands/toolcontext.c:667
+#: commands/toolcontext.c:690
 #, c-format
 msgid "Shared library %s does not contain format functions"
 msgstr ""
 
-#: commands/toolcontext.c:699
+#: commands/toolcontext.c:722
 #, c-format
 msgid "_init_formats: Default format (%s) not found"
 msgstr ""
 
-#: commands/toolcontext.c:752
+#: commands/toolcontext.c:775
 msgid "Invalid string in config file: global/segment_libraries"
 msgstr ""
 
-#: commands/toolcontext.c:763
+#: commands/toolcontext.c:786
 #, c-format
 msgid "Shared library %s does not contain segment type functions"
 msgstr ""
 
-#: commands/toolcontext.c:777
+#: commands/toolcontext.c:801
 #, c-format
 msgid "Duplicate segment type %s: unloading shared library %s"
 msgstr ""
 
-#: commands/toolcontext.c:804
-msgid "_init_hostname: pool_strdup failed"
+#: commands/toolcontext.c:825
+msgid "_init_hostname: dm_pool_strdup failed"
 msgstr ""
 
-#: commands/toolcontext.c:809
-msgid "_init_hostname: pool_strdup kernel_vsn failed"
+#: commands/toolcontext.c:830
+msgid "_init_hostname: dm_pool_strdup kernel_vsn failed"
 msgstr ""
 
-#: commands/toolcontext.c:823
+#: commands/toolcontext.c:844
 msgid "WARNING: Metadata changes will NOT be backed up"
 msgstr ""
 
-#: commands/toolcontext.c:843
+#: commands/toolcontext.c:864
 #, c-format
 msgid "Couldn't create default archive path '%s/%s'."
 msgstr ""
 
-#: commands/toolcontext.c:852 commands/toolcontext.c:872
+#: commands/toolcontext.c:873 commands/toolcontext.c:893
 msgid "backup_init failed."
 msgstr ""
 
-#: commands/toolcontext.c:864
+#: commands/toolcontext.c:885
 #, c-format
 msgid "Couldn't create default backup path '%s/%s'."
 msgstr ""
 
-#: commands/toolcontext.c:889
+#: commands/toolcontext.c:911
 msgid "setlocale failed"
 msgstr ""
 
-#: commands/toolcontext.c:898
+#: commands/toolcontext.c:920
 msgid "Failed to allocate command context"
 msgstr ""
 
-#: commands/toolcontext.c:916
+#: commands/toolcontext.c:940
 msgid ""
 "Failed to create LVM2 system dir for metadata backups, config files and "
 "internal cache."
 msgstr ""
 
-#: commands/toolcontext.c:918
+#: commands/toolcontext.c:942
 msgid ""
 "Set environment variable LVM_SYSTEM_DIR to alternative location or empty "
 "string."
 msgstr ""
 
-#: commands/toolcontext.c:924
+#: commands/toolcontext.c:948
 msgid "Library memory pool creation failed"
 msgstr ""
 
-#: commands/toolcontext.c:955
+#: commands/toolcontext.c:979
 msgid "Command memory pool creation failed"
 msgstr ""
 
-#: commands/toolcontext.c:1018
+#: commands/toolcontext.c:1042
 msgid "Reloading config files"
 msgstr ""
 
-#: config/config.c:165
-#, c-format
-msgid "Read from %s failed"
+#: config/config.c:111
+msgid "Failed to allocate config pool."
 msgstr ""
 
-#: config/config.c:171
-#, c-format
-msgid "Circular read from %s failed"
+#: config/config.c:116
+msgid "Failed to allocate config tree."
+msgstr ""
+
+#: config/config.c:165
+msgid "Failed to allocate config tree parser."
 msgstr ""
 
-#: config/config.c:181
+#: config/config.c:228
 #, c-format
 msgid "%s: Checksum error"
 msgstr ""
 
-#: config/config.c:226
+#: config/config.c:268
 #, c-format
 msgid "%s is not a regular file"
 msgstr ""
 
-#: config/config.c:234
+#: config/config.c:276
 #, c-format
 msgid "%s is empty"
 msgstr ""
 
-#: config/config.c:281
+#: config/config.c:324
 #, c-format
 msgid "Config file %s has disappeared!"
 msgstr ""
 
-#: config/config.c:286
+#: config/config.c:329
 msgid "Failed to reload configuration files"
 msgstr ""
 
-#: config/config.c:291
+#: config/config.c:334
 #, c-format
 msgid "Configuration file %s is not a regular file"
 msgstr ""
 
-#: config/config.c:301
+#: config/config.c:344
 #, c-format
 msgid "Detected config file change to %s"
 msgstr ""
 
-#: config/config.c:325
+#: config/config.c:368
 #, c-format
 msgid "_write_value: Unknown value type: %d"
 msgstr ""
 
-#: config/config.c:386
+#: config/config.c:432
 #, c-format
 msgid "Dumping configuration to %s"
 msgstr ""
 
-#: config/config.c:388
-msgid "Failure while writing configuration"
+#: config/config.c:435 config/config.c:441
+#, c-format
+msgid "Failure while writing to %s"
+msgstr ""
+
+#: config/config.c:445
+#, c-format
+msgid "Configuration node %s not found"
+msgstr ""
+
+#: config/config.c:494 config/config.c:497 config/config.c:510
+#: config/config.c:512 config/config.c:527 config/config.c:541
+#: config/config.c:543 config/config.c:572 config/config.c:578
+#: config/config.c:590
+#, c-format
+msgid "Parse error at byte %td (line %d): unexpected token"
 msgstr ""
 
-#: config/config.c:433 config/config.c:436 config/config.c:449
-#: config/config.c:451 config/config.c:466 config/config.c:480
-#: config/config.c:482 config/config.c:511 config/config.c:517
-#: config/config.c:529
+#: config/config.c:594
 #, c-format
-msgid "Parse error at line %d: unexpected token"
+msgid "Parse error at byte %td (line %d): expected a value"
 msgstr ""
 
-#: config/config.c:533
+#: config/config.c:810
 #, c-format
-msgid "Parse error at line %d: expected a value"
+msgid "WARNING: Ignoring duplicate config node: %s (seeking %s)"
 msgstr ""
 
-#: config/config.c:758
+#: config/config.c:858
 #, c-format
 msgid "Setting %s to %s"
 msgstr ""
 
-#: config/config.c:763
+#: config/config.c:863
 #, c-format
 msgid "%s not found in config: defaulting to %s"
 msgstr ""
 
-#: config/config.c:773
+#: config/config.c:881
 #, c-format
-msgid "Setting %s to %d"
+msgid "Setting %s to %ld"
 msgstr ""
 
-#: config/config.c:777
+#: config/config.c:885
 #, c-format
-msgid "%s not found in config: defaulting to %d"
+msgid "%s not found in config: defaulting to %ld"
 msgstr ""
 
-#: config/config.c:788
+#: config/config.c:903
 #, c-format
 msgid "Setting %s to %f"
 msgstr ""
 
-#: config/config.c:792
+#: config/config.c:907
 #, c-format
 msgid "%s not found in config: defaulting to %f"
 msgstr ""
 
-#: device/dev-cache.c:65 device/dev-cache.c:82 device/dev-cache.c:119
+#: device/dev-cache.c:64 device/dev-cache.c:81 device/dev-cache.c:118
 msgid "struct device allocation failed"
 msgstr ""
 
-#: device/dev-cache.c:69 device/dev-cache.c:86
+#: device/dev-cache.c:68 device/dev-cache.c:85
 msgid "struct str_list allocation failed"
 msgstr ""
 
-#: device/dev-cache.c:74 device/dev-cache.c:91 device/dev-cache.c:96
+#: device/dev-cache.c:73 device/dev-cache.c:90 device/dev-cache.c:95
 msgid "filename strdup failed"
 msgstr ""
 
-#: device/dev-cache.c:211
+#: device/dev-cache.c:142
+#, c-format
+msgid "%s: New preferred name"
+msgstr ""
+
+#: device/dev-cache.c:247
 #, c-format
 msgid "%s: Already in device cache"
 msgstr ""
 
-#: device/dev-cache.c:224
+#: device/dev-cache.c:260
 #, c-format
 msgid "%s: Aliased to %s in device cache%s"
 msgstr ""
 
-#: device/dev-cache.c:228
+#: device/dev-cache.c:264
 #, c-format
 msgid "%s: Added to device cache"
 msgstr ""
 
-#: device/dev-cache.c:271
+#: device/dev-cache.c:307
 msgid "Couldn't insert device into binary tree."
 msgstr ""
 
-#: device/dev-cache.c:278
+#: device/dev-cache.c:314
 msgid "Couldn't add alias to dev cache."
 msgstr ""
 
-#: device/dev-cache.c:283
+#: device/dev-cache.c:319
 msgid "Couldn't add name to hash in dev cache."
 msgstr ""
 
-#: device/dev-cache.c:363
+#: device/dev-cache.c:399
 #, c-format
 msgid "%s: Not a regular file"
 msgstr ""
 
-#: device/dev-cache.c:393
+#: device/dev-cache.c:429
 #, c-format
 msgid "%s: Symbolic link to directory"
 msgstr ""
 
-#: device/dev-cache.c:402
+#: device/dev-cache.c:438
 #, c-format
 msgid "%s: Not a block device"
 msgstr ""
 
-#: device/dev-cache.c:465
+#: device/dev-cache.c:496
+msgid ""
+"devices/preferred_names not found in config file: using built-in preferences"
+msgstr ""
+
+#: device/dev-cache.c:503
+msgid "preferred_names patterns must be enclosed in quotes"
+msgstr ""
+
+#: device/dev-cache.c:514
+msgid "Failed to allocate preferred device name pattern list."
+msgstr ""
+
+#: device/dev-cache.c:521
+msgid "Failed to allocate a preferred device name pattern."
+msgstr ""
+
+#: device/dev-cache.c:529
+msgid "Preferred device name pattern matcher creation failed."
+msgstr ""
+
+#: device/dev-cache.c:559
 msgid "Couldn't create binary tree for dev-cache."
 msgstr ""
 
-#: device/dev-cache.c:482
+#: device/dev-cache.c:579
 #, c-format
 msgid "Device '%s' has been left open."
 msgstr ""
 
-#: device/dev-cache.c:517 device/dev-cache.c:543
+#: device/dev-cache.c:617 device/dev-cache.c:643
 #, c-format
 msgid "Ignoring %s: %s"
 msgstr ""
 
-#: device/dev-cache.c:523
+#: device/dev-cache.c:623
 #, c-format
 msgid "Ignoring %s: Not a directory"
 msgstr ""
 
-#: device/dev-cache.c:528
+#: device/dev-cache.c:628
 msgid "dir_list allocation failed"
 msgstr ""
 
-#: device/dev-cache.c:549
+#: device/dev-cache.c:649
 #, c-format
 msgid "Ignoring %s: Not a regular file"
 msgstr ""
 
-#: device/dev-cache.c:554
+#: device/dev-cache.c:654
 msgid "dir_list allocation failed for file"
 msgstr ""
 
-#: device/dev-cache.c:586 device/dev-cache.c:590
+#: device/dev-cache.c:686 device/dev-cache.c:690
 #, c-format
 msgid "Path %s no longer valid for device(%d,%d)"
 msgstr ""
 
-#: device/dev-cache.c:607
+#: device/dev-cache.c:707
 #, c-format
 msgid "Aborting - please provide new pathname for what used to be %s"
 msgstr ""
 
-#: device/dev-cache.c:647
+#: device/dev-cache.c:747
 msgid "dev_iter allocation failed"
 msgstr ""
 
@@ -1306,17 +1345,17 @@
 
 #: device/dev-io.c:79
 #, c-format
-msgid "Read size too large: %llu"
+msgid "Read size too large: %lu"
 msgstr ""
 
 #: device/dev-io.c:84
 #, c-format
-msgid "%s: lseek %llu failed: %s"
+msgid "%s: lseek %lu failed: %s"
 msgstr ""
 
 #: device/dev-io.c:98
 #, c-format
-msgid "%s: %s failed after %llu of %llu at %llu: %s"
+msgid "%s: %s failed after %lu of %lu at %lu: %s"
 msgstr ""
 
 #: device/dev-io.c:134
@@ -1330,432 +1369,448 @@
 
 #: device/dev-io.c:238 device/dev-io.c:264
 #, c-format
-msgid "%s: size is %llu sectors"
+msgid "%s: size is %lu sectors"
 msgstr ""
 
-#: device/dev-io.c:333
+#: device/dev-io.c:343
 #, c-format
 msgid "WARNING: %s already opened read-only"
 msgstr ""
 
-#: device/dev-io.c:342
+#: device/dev-io.c:352
 #, c-format
 msgid "WARNING: dev_open(%s) called while suspended"
 msgstr ""
 
-#: device/dev-io.c:354
+#: device/dev-io.c:364
 #, c-format
 msgid "%s: stat failed: Has device name changed?"
 msgstr ""
 
-#: device/dev-io.c:380
+#: device/dev-io.c:390
 #, c-format
 msgid "%s: Not using O_DIRECT"
 msgstr ""
 
-#: device/dev-io.c:407
+#: device/dev-io.c:422
 #, c-format
 msgid "%s: fstat failed: Has device name changed?"
 msgstr ""
 
-#: device/dev-io.c:423
+#: device/dev-io.c:437
 #, c-format
-msgid "Opened %s %s%s"
+msgid "Opened %s %s%s%s"
 msgstr ""
 
-#: device/dev-io.c:456
+#: device/dev-io.c:486
 #, c-format
 msgid "Closed %s"
 msgstr ""
 
-#: device/dev-io.c:469
+#: device/dev-io.c:501
 #, c-format
 msgid "Attempt to close device '%s' which is not open."
 msgstr ""
 
-#: device/dev-io.c:579
-msgid "Wiping %s at %llu length %zu"
+#: device/dev-io.c:515
+#, c-format
+msgid "%s: Immediate close attempt while still referenced"
+msgstr ""
+
+#: device/dev-io.c:576
+#, c-format
+msgid "Read from %s failed"
+msgstr ""
+
+#: device/dev-io.c:588
+#, c-format
+msgid "Circular read from %s failed"
+msgstr ""
+
+#: device/dev-io.c:648
+#, c-format
+msgid "Wiping %s at %lu length %zu"
 msgstr ""
 
-#: device/dev-io.c:582
-msgid "Wiping %s at sector %llu length %zu sectors"
+#: device/dev-io.c:651
+#, c-format
+msgid "Wiping %s at sector %lu length %zu sectors"
 msgstr ""
 
-#: display/display.c:130
+#: display/display.c:145
 #, c-format
 msgid "Unrecognised allocation policy %s"
 msgstr ""
 
-#: display/display.c:155
+#: display/display.c:172
 msgid "no memory for size display buffer"
 msgstr ""
 
-#: display/display.c:215
+#: display/display.c:247
 #, c-format
-msgid "%s:%s:%llu:-1:%u:%u:-1:%u:%u:%u:%u:%s"
+msgid "%s:%s:%lu:-1:%u:%u:-1:%u:%u:%u:%u:%s"
 msgstr ""
 
-#: display/display.c:246
+#: display/display.c:278
 #, c-format
 msgid "--- %sPhysical volume ---"
 msgstr ""
 
-#: display/display.c:247
+#: display/display.c:279
 #, c-format
 msgid "PV Name               %s"
 msgstr ""
 
-#: display/display.c:248
+#: display/display.c:280
 #, c-format
 msgid "VG Name               %s%s"
 msgstr ""
 
-#: display/display.c:258
+#: display/display.c:290
 #, c-format
 msgid "PV Size               %s / not usable %s"
 msgstr ""
 
-#: display/display.c:265
+#: display/display.c:296
 #, c-format
 msgid "PV Size               %s"
 msgstr ""
 
-#: display/display.c:273
+#: display/display.c:304
 #, c-format
 msgid "Allocatable           yes %s"
 msgstr ""
 
-#: display/display.c:276
+#: display/display.c:307
 msgid "Allocatable           NO"
 msgstr ""
 
-#: display/display.c:281
+#: display/display.c:312
 #, c-format
 msgid "PE Size (KByte)       %u"
 msgstr ""
 
-#: display/display.c:282 display/display.c:563
+#: display/display.c:313 display/display.c:592
 #, c-format
 msgid "Total PE              %u"
 msgstr ""
 
-#: display/display.c:283
+#: display/display.c:314
 #, c-format
 msgid "Free PE               %u"
 msgstr ""
 
-#: display/display.c:284
+#: display/display.c:315
 #, c-format
 msgid "Allocated PE          %u"
 msgstr ""
 
-#: display/display.c:285 display/display.c:306
+#: display/display.c:316 display/display.c:339
 #, c-format
 msgid "PV UUID               %s"
 msgstr ""
 
-#: display/display.c:286 display/display.c:312 display/display.c:445
-#: display/display.c:496 display/display.c:582 format_text/archive.c:311
-#: lvmcmdline.c:729 mirror/mirrored.c:66 striped/striped.c:51
+#: display/display.c:317 display/display.c:345 display/display.c:476
+#: display/display.c:527 display/display.c:610 format_text/archive.c:315
+#: lvmcmdline.c:769 mirror/mirrored.c:73 striped/striped.c:49
 msgid " "
 msgstr ""
 
-#: display/display.c:304
+#: display/display.c:337
 #, c-format
 msgid "PV Name               %s     "
 msgstr ""
 
-#: display/display.c:307
+#: display/display.c:340
 #, c-format
 msgid "PV Status             %sallocatable"
 msgstr ""
 
-#: display/display.c:309
+#: display/display.c:342
 #, c-format
 msgid "Total PE / Free PE    %u / %u"
 msgstr ""
 
-#: display/display.c:322
+#: display/display.c:355
 #, c-format
-msgid "%s%s/%s:%s:%d:%d:-1:%d:%llu:%d:-1:%d:%d:%d:%d"
+msgid "%s%s/%s:%s:%d:%d:-1:%d:%lu:%d:-1:%d:%d:%d:%d"
 msgstr ""
 
-#: display/display.c:352
+#: display/display.c:385
 msgid "--- Logical volume ---"
 msgstr ""
 
-#: display/display.c:354
+#: display/display.c:387
 #, c-format
 msgid "LV Name                %s%s/%s"
 msgstr ""
 
-#: display/display.c:356
+#: display/display.c:389
 #, c-format
 msgid "VG Name                %s"
 msgstr ""
 
-#: display/display.c:358
+#: display/display.c:391
 #, c-format
 msgid "LV UUID                %s"
 msgstr ""
 
-#: display/display.c:360
+#: display/display.c:393
 #, c-format
 msgid "LV Write Access        %s"
 msgstr ""
 
-#: display/display.c:364
+#: display/display.c:397
 msgid "LV snapshot status     source of"
 msgstr ""
 
-#: display/display.c:373
+#: display/display.c:406
 #, c-format
 msgid "                       %s%s/%s [%s]"
 msgstr ""
 
-#: display/display.c:386
+#: display/display.c:419
 #, c-format
 msgid "LV snapshot status     %s destination for %s%s/%s"
 msgstr ""
 
-#: display/display.c:393
+#: display/display.c:426
 msgid "LV Status              suspended"
 msgstr ""
 
-#: display/display.c:395
+#: display/display.c:428
 #, c-format
 msgid "LV Status              %savailable"
 msgstr ""
 
-#: display/display.c:403
+#: display/display.c:436
 #, c-format
 msgid "# open                 %u"
 msgstr ""
 
-#: display/display.c:405
+#: display/display.c:438
 #, c-format
 msgid "LV Size                %s"
 msgstr ""
 
-#: display/display.c:410
+#: display/display.c:442
 #, c-format
 msgid "Current LE             %u"
 msgstr ""
 
-#: display/display.c:414
+#: display/display.c:446
 #, c-format
 msgid "COW-table size         %s"
 msgstr ""
 
-#: display/display.c:416
+#: display/display.c:448
 #, c-format
 msgid "COW-table LE           %u"
 msgstr ""
 
-#: display/display.c:419
+#: display/display.c:451
 #, c-format
 msgid "Allocated to snapshot  %.2f%% "
 msgstr ""
 
-#: display/display.c:421
+#: display/display.c:453
 #, c-format
 msgid "Snapshot chunk size    %s"
 msgstr ""
 
-#: display/display.c:426
+#: display/display.c:457
 #, c-format
 msgid "Segments               %u"
 msgstr ""
 
-#: display/display.c:432
+#: display/display.c:463
 #, c-format
 msgid "Allocation             %s"
 msgstr ""
 
-#: display/display.c:433
+#: display/display.c:464
 #, c-format
 msgid "Read ahead sectors     %u"
 msgstr ""
 
-#: display/display.c:437
+#: display/display.c:468
 #, c-format
 msgid "Persistent major       %d"
 msgstr ""
 
-#: display/display.c:438
+#: display/display.c:469
 #, c-format
 msgid "Persistent minor       %d"
 msgstr ""
 
-#: display/display.c:442
+#: display/display.c:473
 #, c-format
 msgid "Block device           %d:%d"
 msgstr ""
 
-#: display/display.c:455
+#: display/display.c:486
 #, c-format
 msgid "%sPhysical volume\t%s"
 msgstr ""
 
-#: display/display.c:461
+#: display/display.c:492
 #, c-format
 msgid "%sPhysical extents\t%d to %d"
 msgstr ""
 
-#: display/display.c:466
+#: display/display.c:497
 #, c-format
 msgid "%sLogical volume\t%s"
 msgstr ""
 
-#: display/display.c:471
+#: display/display.c:502
 #, c-format
 msgid "%sLogical extents\t%d to %d"
 msgstr ""
 
-#: display/display.c:476
+#: display/display.c:507
 #, c-format
 msgid "%sUnassigned area"
 msgstr ""
 
-#: display/display.c:484
+#: display/display.c:515
 msgid "--- Segments ---"
 msgstr ""
 
-#: display/display.c:487
+#: display/display.c:518
 #, c-format
 msgid "Logical extent %u to %u:"
 msgstr ""
 
-#: display/display.c:490
+#: display/display.c:521
 #, c-format
 msgid "  Type\t\t%s"
 msgstr ""
 
-#: display/display.c:516
+#: display/display.c:547
 msgid "--- Volume group ---"
 msgstr ""
 
-#: display/display.c:517
+#: display/display.c:548
 #, c-format
 msgid "VG Name               %s"
 msgstr ""
 
-#: display/display.c:518
+#: display/display.c:549
 #, c-format
 msgid "System ID             %s"
 msgstr ""
 
-#: display/display.c:519
+#: display/display.c:550
 #, c-format
 msgid "Format                %s"
 msgstr ""
 
-#: display/display.c:521
+#: display/display.c:552
 #, c-format
 msgid "Metadata Areas        %d"
 msgstr ""
 
-#: display/display.c:523
+#: display/display.c:554
 #, c-format
 msgid "Metadata Sequence No  %d"
 msgstr ""
 
-#: display/display.c:526
+#: display/display.c:557
 #, c-format
 msgid "VG Access             %s%s%s%s"
 msgstr ""
 
-#: display/display.c:531
+#: display/display.c:562
 #, c-format
 msgid "VG Status             %s%sresizable"
 msgstr ""
 
-#: display/display.c:538
+#: display/display.c:569
 msgid "Clustered             yes"
 msgstr ""
 
-#: display/display.c:539
+#: display/display.c:570
 #, c-format
 msgid "Shared                %s"
 msgstr ""
 
-#: display/display.c:542
+#: display/display.c:573
 #, c-format
 msgid "MAX LV                %u"
 msgstr ""
 
-#: display/display.c:543
+#: display/display.c:574
 #, c-format
 msgid "Cur LV                %u"
 msgstr ""
 
-#: display/display.c:544
+#: display/display.c:575
 #, c-format
 msgid "Open LV               %u"
 msgstr ""
 
-#: display/display.c:550
+#: display/display.c:581
 #, c-format
 msgid "Max PV                %u"
 msgstr ""
 
-#: display/display.c:551
+#: display/display.c:582
 #, c-format
 msgid "Cur PV                %u"
 msgstr ""
 
-#: display/display.c:552
+#: display/display.c:583
 #, c-format
 msgid "Act PV                %u"
 msgstr ""
 
-#: display/display.c:554
+#: display/display.c:585
 #, c-format
 msgid "VG Size               %s"
 msgstr ""
 
-#: display/display.c:559
+#: display/display.c:589
 #, c-format
 msgid "PE Size               %s"
 msgstr ""
 
-#: display/display.c:565
+#: display/display.c:594
 #, c-format
 msgid "Alloc PE / Size       %u / %s"
 msgstr ""
 
-#: display/display.c:571
+#: display/display.c:600
 #, c-format
 msgid "Free  PE / Size       %u / %s"
 msgstr ""
 
-#: display/display.c:581
+#: display/display.c:609
 #, c-format
 msgid "VG UUID               %s"
 msgstr ""
 
-#: display/display.c:617
+#: display/display.c:645
 #, c-format
-msgid "%s:%s:%d:-1:%u:%u:%u:-1:%u:%u:%u:%llu:%u:%u:%u:%u:%s"
+msgid "%s:%s:%d:-1:%u:%u:%u:-1:%u:%u:%u:%lu:%u:%u:%u:%u:%s"
 msgstr ""
 
-#: display/display.c:641
+#: display/display.c:669
 #, c-format
 msgid "\"%s\" %-9s [%-9s used / %s free]"
 msgstr ""
 
-#: display/display.c:661 display/display.c:670 pvscan.c:33
-#: report/report.c:1325 report/report.c:1477
+#: display/display.c:686 display/display.c:695 pvscan.c:34
 #, c-format
 msgid "%s"
 msgstr ""
 
-#: dumpconfig.c:26
-msgid "Please specify one file for output"
+#: error/errseg.c:73
+msgid "error module string list allocation failed"
 msgstr ""
 
-#: error/errseg.c:100 mirror/mirrored.c:315 snapshot/snapshot.c:165
-#: striped/striped.c:231 zero/zero.c:100
+#: error/errseg.c:109 mirror/mirrored.c:562 snapshot/snapshot.c:179
+#: striped/striped.c:227 zero/zero.c:109
 #, c-format
 msgid "Initialised segtype: %s"
 msgstr ""
@@ -1773,443 +1828,498 @@
 msgid "compsoite filters allocation failed"
 msgstr ""
 
-#: filters/filter-md.c:39
+#: filters/filter-md.c:31
 #, c-format
 msgid "%s: Skipping md component device"
 msgstr ""
 
-#: filters/filter-md.c:44
+#: filters/filter-md.c:36
 #, c-format
 msgid "%s: Skipping: error in md component detection"
 msgstr ""
 
-#: filters/filter-md.c:62
+#: filters/filter-md.c:54
 msgid "md filter allocation failed"
 msgstr ""
 
-#: filters/filter-persistent.c:56
+#: filters/filter-persistent.c:57
 msgid "Wiping cache of LVM-capable devices"
 msgstr ""
 
-#: filters/filter-persistent.c:72
+#: filters/filter-persistent.c:73
 #, c-format
 msgid "Couldn't find %s array in '%s'"
 msgstr ""
 
-#: filters/filter-persistent.c:83
+#: filters/filter-persistent.c:84
 msgid "Devices array contains a value which is not a string ... ignoring"
 msgstr ""
 
-#: filters/filter-persistent.c:89
+#: filters/filter-persistent.c:90
 #, c-format
 msgid "Couldn't add '%s' to filter ... ignoring"
 msgstr ""
 
-#: filters/filter-persistent.c:127
+#: filters/filter-persistent.c:108
+#, c-format
+msgid "%s: stat failed: %s"
+msgstr ""
+
+#: filters/filter-persistent.c:132
 #, c-format
 msgid "Loaded persistent filter cache from %s"
 msgstr ""
 
-#: filters/filter-persistent.c:171
+#: filters/filter-persistent.c:183
 #, c-format
 msgid "Internal persistent device cache empty - not writing to %s"
 msgstr ""
 
-#: filters/filter-persistent.c:176
+#: filters/filter-persistent.c:188
 #, c-format
 msgid "Device cache incomplete - not writing to %s"
 msgstr ""
 
-#: filters/filter-persistent.c:181
+#: filters/filter-persistent.c:193
 #, c-format
 msgid "Dumping persistent device cache to %s"
 msgstr ""
 
-#: filters/filter-persistent.c:216
+#: filters/filter-persistent.c:248 format_text/format-text.c:902
+#: format_text/format-text.c:928 format_text/format-text.c:965
+#: misc/lvm-file.c:91
+#, c-format
+msgid "%s: rename to %s failed: %s"
+msgstr ""
+
+#: filters/filter-persistent.c:276
 #, c-format
 msgid "%s: Skipping (cached)"
 msgstr ""
 
-#: filters/filter-persistent.c:252
+#: filters/filter-persistent.c:311
 msgid "Couldn't create hash table for persistent filter."
 msgstr ""
 
-#: filters/filter-regex.c:48
+#: filters/filter-regex.c:44
 msgid "pattern must begin with 'a' or 'r'"
 msgstr ""
 
-#: filters/filter-regex.c:87
+#: filters/filter-regex.c:83
 msgid "invalid separator at end of regex"
 msgstr ""
 
-#: filters/filter-regex.c:115
+#: filters/filter-regex.c:108
 msgid "filter patterns must be enclosed in quotes"
 msgstr ""
 
-#: filters/filter-regex.c:142
+#: filters/filter-regex.c:133
 msgid "invalid filter pattern"
 msgstr ""
 
-#: filters/filter-regex.c:172
-#, c-format
-msgid "%s: New preferred name"
-msgstr ""
-
-#: filters/filter-regex.c:188
+#: filters/filter-regex.c:174
 #, c-format
 msgid "%s: Skipping (regex)"
 msgstr ""
 
-#: filters/filter-sysfs.c:32
+#: filters/filter-sysfs.c:31
 msgid "No proc filesystem found: skipping sysfs filter"
 msgstr ""
 
-#: filters/filter-sysfs.c:38
+#: filters/filter-sysfs.c:37
 msgid "Failed to create /proc/mounts string"
 msgstr ""
 
-#: filters/filter-sysfs.c:136
+#: filters/filter-sysfs.c:137
 #, c-format
 msgid "Empty sysfs device file: %s"
 msgstr ""
 
-#: filters/filter-sysfs.c:141
+#: filters/filter-sysfs.c:142
 msgid "sysfs device file not correct format"
 msgstr ""
 
-#: filters/filter-sysfs.c:189
+#: filters/filter-sysfs.c:192
 #, c-format
 msgid "sysfs path name too long: %s in %s"
 msgstr ""
 
-#: filters/filter-sysfs.c:252
+#: filters/filter-sysfs.c:255
 #, c-format
 msgid "%s: Skipping (sysfs)"
 msgstr ""
 
-#: filters/filter-sysfs.c:275
+#: filters/filter-sysfs.c:278
 msgid "sysfs pool creation failed"
 msgstr ""
 
-#: filters/filter-sysfs.c:280
+#: filters/filter-sysfs.c:283
 msgid "sysfs dev_set creation failed"
 msgstr ""
 
-#: filters/filter.c:86
+#: filters/filter.c:90
+#, c-format
+msgid "%s: Skipping: Unrecognised LVM device type %lu"
+msgstr ""
+
+#: filters/filter.c:98
 #, c-format
-msgid "%s: Skipping: Unrecognised LVM device type %llu"
+msgid "%s: Skipping: Suspended dm device"
 msgstr ""
 
-#: filters/filter.c:93
+#: filters/filter.c:104
 #, c-format
 msgid "%s: Skipping: open failed"
 msgstr ""
 
-#: filters/filter.c:99
+#: filters/filter.c:110
 #, c-format
 msgid "%s: Skipping: dev_get_size failed"
 msgstr ""
 
-#: filters/filter.c:104
+#: filters/filter.c:115
 #, c-format
 msgid "%s: Skipping: Too small to hold a PV"
 msgstr ""
 
-#: filters/filter.c:109
+#: filters/filter.c:120
 #, c-format
 msgid "%s: Skipping: Partition table signature found"
 msgstr ""
 
-#: filters/filter.c:136
+#: filters/filter.c:147
 msgid "No proc filesystem found: using all block device types"
 msgstr ""
 
-#: filters/filter.c:148
+#: filters/filter.c:159
 msgid "Failed to create /proc/devices string"
 msgstr ""
 
-#: filters/filter.c:203
+#: filters/filter.c:218
 msgid "Expecting string in devices/types in config file"
 msgstr ""
 
-#: filters/filter.c:211
+#: filters/filter.c:228
 #, c-format
 msgid "Max partition count missing for %s in devices/types in config file"
 msgstr ""
 
-#: filters/filter.c:217
+#: filters/filter.c:236
 #, c-format
 msgid "Zero partition count invalid for %s in devices/types in config file"
 msgstr ""
 
-#: filters/filter.c:245
+#: filters/filter.c:269
 msgid "LVM type filter allocation failed"
 msgstr ""
 
-#: format1/disk-rep.c:189
+#: format1/disk-rep.c:190
 #, c-format
 msgid "%s does not have a valid LVM1 PV identifier"
 msgstr ""
 
-#: format1/disk-rep.c:195
+#: format1/disk-rep.c:196
 #, c-format
 msgid "format1: Unknown metadata version %d found on %s"
 msgstr ""
 
-#: format1/disk-rep.c:209 format_pool/disk_rep.c:45
+#: format1/disk-rep.c:210 format_pool/disk_rep.c:43
 #, c-format
 msgid "Failed to read PV data from %s"
 msgstr ""
 
-#: format1/disk-rep.c:359
+#: format1/disk-rep.c:367
 #, c-format
 msgid "%s is not a member of any format1 VG"
 msgstr ""
 
-#: format1/disk-rep.c:368
+#: format1/disk-rep.c:374
 #, c-format
 msgid "Failed to read VG data from PV (%s)"
 msgstr ""
 
-#: format1/disk-rep.c:376
+#: format1/disk-rep.c:380
 #, c-format
 msgid "%s is not a member of the VG %s"
 msgstr ""
 
-#: format1/disk-rep.c:382
+#: format1/disk-rep.c:390
 #, c-format
 msgid "Failed to read PV uuid list from %s"
 msgstr ""
 
-#: format1/disk-rep.c:387
+#: format1/disk-rep.c:395
 #, c-format
 msgid "Failed to read LV's from %s"
 msgstr ""
 
-#: format1/disk-rep.c:392
+#: format1/disk-rep.c:400
 #, c-format
 msgid "Failed to read extents from %s"
 msgstr ""
 
-#: format1/disk-rep.c:396
+#: format1/disk-rep.c:404
 #, c-format
 msgid "Found %s in %sVG %s"
 msgstr ""
 
-#: format1/disk-rep.c:435 format_pool/disk_rep.c:69
+#: format1/disk-rep.c:443 format_pool/disk_rep.c:67
 #, c-format
 msgid "Ignoring duplicate PV %s on %s"
 msgstr ""
 
-#: format1/disk-rep.c:440 format_pool/disk_rep.c:74
+#: format1/disk-rep.c:448 format_pool/disk_rep.c:72
 #, c-format
 msgid "Duplicate PV %s - using md %s"
 msgstr ""
 
-#: format1/disk-rep.c:486
+#: format1/disk-rep.c:494
 msgid "read_pvs_in_vg: dev_iter_create failed"
 msgstr ""
 
-#: format1/disk-rep.c:526
+#: format1/disk-rep.c:517
 #, c-format
-msgid "Too many uuids to fit on %s"
+msgid "Writing %s VG metadata to %s at %lu len %zu"
 msgstr ""
 
-#: format1/disk-rep.c:559
+#: format1/disk-rep.c:537
 #, c-format
-msgid "Couldn't zero lv area on device '%s'"
+msgid "Too many uuids to fit on %s"
 msgstr ""
 
-#: format1/disk-rep.c:567
+#: format1/disk-rep.c:542
 #, c-format
-msgid "lv_number %d too large"
+msgid "Writing %s uuidlist to %s at %lu len %d"
 msgstr ""
 
-#: format1/disk-rep.c:600
+#: format1/disk-rep.c:557
+#, c-format
+msgid "Writing %s LV %s metadata to %s at %lu len %zu"
+msgstr ""
+
+#: format1/disk-rep.c:578
+#, c-format
+msgid "Couldn't zero lv area on device '%s'"
+msgstr ""
+
+#: format1/disk-rep.c:586
+#, c-format
+msgid "lv_number %d too large"
+msgstr ""
+
+#: format1/disk-rep.c:603
+#, c-format
+msgid "Writing %s extents metadata to %s at %lu len %zu"
+msgstr ""
+
+#: format1/disk-rep.c:623
 msgid "Invalid PV structure size."
 msgstr ""
 
-#: format1/disk-rep.c:609
+#: format1/disk-rep.c:632
 msgid "Couldn't allocate temporary PV buffer."
 msgstr ""
 
-#: format1/disk-rep.c:635
+#: format1/disk-rep.c:639
+#, c-format
+msgid "Writing %s PV metadata to %s at %lu len %zu"
+msgstr ""
+
+#: format1/disk-rep.c:662
 #, c-format
 msgid "Failed to write PV structure onto %s"
 msgstr ""
 
-#: format1/disk-rep.c:654
+#: format1/disk-rep.c:681
 #, c-format
 msgid "Failed to write VG data to %s"
 msgstr ""
 
-#: format1/disk-rep.c:659
+#: format1/disk-rep.c:686
 #, c-format
 msgid "Failed to write PV uuid list to %s"
 msgstr ""
 
-#: format1/disk-rep.c:664
+#: format1/disk-rep.c:691
 #, c-format
 msgid "Failed to write LV's to %s"
 msgstr ""
 
-#: format1/disk-rep.c:669
+#: format1/disk-rep.c:696
 #, c-format
 msgid "Failed to write extents to %s"
 msgstr ""
 
-#: format1/disk-rep.c:709
+#: format1/disk-rep.c:736
 #, c-format
 msgid "Successfully wrote data to %s"
 msgstr ""
 
-#: format1/format1.c:75
+#: format1/format1.c:72
 #, c-format
 msgid "VG data differs between PVs %s and %s"
 msgstr ""
 
-#: format1/format1.c:77 format1/format1.c:92
+#: format1/format1.c:74 format1/format1.c:89
 #, c-format
 msgid "VG data on %s: %s %s %u %u  %u %u %u %u %u %u %u %u %u %u %u %u %u"
 msgstr ""
 
-#: format1/format1.c:118
+#: format1/format1.c:115
 #, c-format
 msgid "%d PV(s) found for VG %s: expected %d"
 msgstr ""
 
-#: format1/format1.c:301 format_pool/format_pool.c:230
+#: format1/format1.c:294 format_pool/format_pool.c:228
 #, c-format
 msgid "Reading physical volume data %s from disk"
 msgstr ""
 
-#: format1/format1.c:342
+#: format1/format1.c:335
 #, c-format
 msgid "Physical volumes cannot be bigger than %s"
 msgstr ""
 
-#: format1/format1.c:363
+#: format1/format1.c:355
 msgid "Metadata would overwrite physical extents"
 msgstr ""
 
-#: format1/format1.c:378
+#: format1/format1.c:370
 #, c-format
 msgid "logical volumes cannot contain more than %d extents."
 msgstr ""
 
-#: format1/format1.c:383
+#: format1/format1.c:375
 #, c-format
 msgid "logical volumes cannot be larger than %s"
 msgstr ""
 
-#: format1/format1.c:465
+#: format1/format1.c:451
 #, c-format
 msgid "Extent size must be between %s and %s"
 msgstr ""
 
-#: format1/format1.c:475
+#: format1/format1.c:459
 #, c-format
 msgid "Extent size must be multiple of %s"
 msgstr ""
 
-#: format1/format1.c:483 format_text/format-text.c:71
+#: format1/format1.c:466 format_text/format-text.c:79
 msgid "Extent size must be power of 2"
 msgstr ""
 
-#: format1/format1.c:579
+#: format1/format1.c:563
 msgid "Couldn't create lvm1 label handler."
 msgstr ""
 
-#: format1/format1.c:584
+#: format1/format1.c:568
 msgid "Couldn't register lvm1 label handler."
 msgstr ""
 
-#: format1/format1.c:588 format_pool/format_pool.c:355
-#: format_text/format-text.c:1706
+#: format1/format1.c:572 format_pool/format_pool.c:354
+#: format_text/format-text.c:1994
 #, c-format
 msgid "Initialised format: %s"
 msgstr ""
 
-#: format1/import-export.c:72
+#: format1/import-export.c:75
 #, c-format
 msgid "System ID %s on %s differs from %s for volume group"
 msgstr ""
 
-#: format1/import-export.c:108
+#: format1/import-export.c:98 format_text/import_vsn1.c:220
+#: metadata/metadata.c:569 metadata/metadata.c:1542 pvresize.c:121
+#: vgreduce.c:395 vgremove.c:62
+#, c-format
+msgid "%s: Couldn't get size."
+msgstr ""
+
+#: format1/import-export.c:101 format_text/import_vsn1.c:223
+#, c-format
+msgid "Fixing up missing format1 size (%s) for PV %s"
+msgstr ""
+
+#: format1/import-export.c:108 format_text/import_vsn1.c:230
+#, c-format
+msgid "WARNING: Physical Volume %s is too large for underlying device"
+msgstr ""
+
+#: format1/import-export.c:130
 msgid "Generated system_id too long"
 msgstr ""
 
-#: format1/import-export.c:154
+#: format1/import-export.c:174
 #, c-format
 msgid "Volume group name %s too long to export"
 msgstr ""
 
-#: format1/import-export.c:392
+#: format1/import-export.c:412
 #, c-format
 msgid "Segment type %s in LV %s: unsupported by format1"
 msgstr ""
 
-#: format1/import-export.c:398
+#: format1/import-export.c:418
 #, c-format
 msgid "Non-PV stripe found in LV %s: unsupported by format1"
 msgstr ""
 
-#: format1/import-export.c:590
+#: format1/import-export.c:610
 msgid "Logical volume number out of bounds."
 msgstr ""
 
-#: format1/import-export.c:597
+#: format1/import-export.c:617
 #, c-format
 msgid "Couldn't find logical volume '%s'."
 msgstr ""
 
-#: format1/import-export.c:617
+#: format1/import-export.c:637
 #, c-format
 msgid "Couldn't find origin logical volume for snapshot '%s'."
 msgstr ""
 
-#: format1/import-export.c:630
+#: format1/import-export.c:650
 msgid "Couldn't add snapshot."
 msgstr ""
 
-#: format1/import-extents.c:55
+#: format1/import-extents.c:53
 msgid "Unable to create hash table for holding extent maps."
 msgstr ""
 
-#: format1/import-extents.c:100
+#: format1/import-extents.c:92
 #, c-format
 msgid "Physical volume (%s) contains an unknown logical volume (%s)."
 msgstr ""
 
-#: format1/import-extents.c:145
-msgid "invalid lv in extent map"
+#: format1/import-extents.c:137
+#, c-format
+msgid "Invalid LV in extent map (PV %s, PE %u, LV %u, LE %u)"
 msgstr ""
 
-#: format1/import-extents.c:152
+#: format1/import-extents.c:149
 msgid "logical extent number out of bounds"
 msgstr ""
 
-#: format1/import-extents.c:158
+#: format1/import-extents.c:155
 #, c-format
 msgid "logical extent (%u) already mapped."
 msgstr ""
 
-#: format1/import-extents.c:178
+#: format1/import-extents.c:175
 #, c-format
 msgid "Logical volume (%s) contains an incomplete mapping table."
 msgstr ""
 
-#: format1/import-extents.c:225
+#: format1/import-extents.c:229
 msgid "Failed to allocate linear segment."
 msgstr ""
 
-#: format1/import-extents.c:273
+#: format1/import-extents.c:276
 #, c-format
 msgid ""
 "Number of stripes (%u) incompatible with logical extent count (%u) for %s"
 msgstr ""
 
-#: format1/import-extents.c:301
+#: format1/import-extents.c:303
 msgid "Failed to allocate striped segment."
 msgstr ""
 
@@ -2225,26 +2335,26 @@
 msgid "Couldn't build extent segments."
 msgstr ""
 
-#: format1/layout.c:77
+#: format1/layout.c:79
 #, c-format
 msgid "MaxLogicalVolumes of %d exceeds format limit of %d for VG '%s'"
 msgstr ""
 
-#: format1/layout.c:84
+#: format1/layout.c:86
 #, c-format
 msgid "MaxPhysicalVolumes of %d exceeds format limit of %d for VG '%s'"
 msgstr ""
 
-#: format1/layout.c:103
+#: format1/layout.c:105
 msgid "Insufficient space for metadata and PE's."
 msgstr ""
 
-#: format1/layout.c:139
+#: format1/layout.c:141
 #, c-format
 msgid "Too few extents on %s.  Try smaller extent size."
 msgstr ""
 
-#: format1/layout.c:160
+#: format1/layout.c:162
 #, c-format
 msgid "Metadata extent limit (%u) exceeded for %s - %u required"
 msgstr ""
@@ -2254,96 +2364,96 @@
 msgid "The '%s' operation is not supported for the lvm1 labeller."
 msgstr ""
 
-#: format1/lvm1-label.c:111 format_pool/pool_label.c:100
-#: format_text/text_label.c:276
+#: format1/lvm1-label.c:120 format_pool/pool_label.c:99
+#: format_text/text_label.c:285
 msgid "Couldn't allocate labeller object."
 msgstr ""
 
-#: format_pool/disk_rep.c:96 format_pool/disk_rep.c:100
+#: format_pool/disk_rep.c:94 format_pool/disk_rep.c:98
 #, c-format
 msgid "Calculated uuid %s for %s"
 msgstr ""
 
-#: format_pool/disk_rep.c:276
+#: format_pool/disk_rep.c:274
 #, c-format
 msgid "Unable to allocate %d 32-bit uints"
 msgstr ""
 
-#: format_pool/disk_rep.c:343
+#: format_pool/disk_rep.c:341
 #, c-format
 msgid "No devices for vg %s found in cache"
 msgstr ""
 
-#: format_pool/disk_rep.c:365
+#: format_pool/disk_rep.c:363
 msgid "Unable to allocate pool list structure"
 msgstr ""
 
-#: format_pool/format_pool.c:47
+#: format_pool/format_pool.c:44
 #, c-format
 msgid "Unable to allocate %d subpool structures"
 msgstr ""
 
-#: format_pool/format_pool.c:67
+#: format_pool/format_pool.c:64
 #, c-format
 msgid "Unable to allocate %d pool_device structures"
 msgstr ""
 
-#: format_pool/format_pool.c:89
+#: format_pool/format_pool.c:87
 #, c-format
 msgid "Missing subpool %d in pool %s"
 msgstr ""
 
-#: format_pool/format_pool.c:94
+#: format_pool/format_pool.c:92
 #, c-format
-msgid "Missing device %d for subpool %d in pool %s"
+msgid "Missing device %u for subpool %d in pool %s"
 msgstr ""
 
-#: format_pool/format_pool.c:115
+#: format_pool/format_pool.c:113
 msgid "Unable to allocate volume group structure"
 msgstr ""
 
-#: format_pool/format_pool.c:280
+#: format_pool/format_pool.c:279
 msgid "Unable to allocate format instance structure for pool format"
 msgstr ""
 
-#: format_pool/format_pool.c:290
+#: format_pool/format_pool.c:289
 msgid "Unable to allocate metadata area structure for pool format"
 msgstr ""
 
-#: format_pool/format_pool.c:333
+#: format_pool/format_pool.c:332
 msgid "Unable to allocate format type structure for pool format"
 msgstr ""
 
-#: format_pool/format_pool.c:346
+#: format_pool/format_pool.c:345
 msgid "Couldn't create pool label handler."
 msgstr ""
 
-#: format_pool/format_pool.c:351
+#: format_pool/format_pool.c:350
 msgid "Couldn't register pool label handler."
 msgstr ""
 
-#: format_pool/import_export.c:65
+#: format_pool/import_export.c:64
 msgid "Unable to allocate lv list structure"
 msgstr ""
 
-#: format_pool/import_export.c:70
+#: format_pool/import_export.c:69
 msgid "Unable to allocate logical volume structure"
 msgstr ""
 
-#: format_pool/import_export.c:99
+#: format_pool/import_export.c:98
 #, c-format
 msgid "Calculated lv uuid for lv %s: %s"
 msgstr ""
 
-#: format_pool/import_export.c:134
+#: format_pool/import_export.c:133
 msgid "Unable to allocate pv list structure"
 msgstr ""
 
-#: format_pool/import_export.c:138
+#: format_pool/import_export.c:137
 msgid "Unable to allocate pv structure"
 msgstr ""
 
-#: format_pool/import_export.c:166
+#: format_pool/import_export.c:165
 msgid "Unable to duplicate vg_name string"
 msgstr ""
 
@@ -2364,71 +2474,71 @@
 msgid "Unable to allocate linear lv_segment structure"
 msgstr ""
 
-#: format_pool/pool_label.c:29
+#: format_pool/pool_label.c:28
 #, c-format
 msgid "The '%s' operation is not supported for the pool labeller."
 msgstr ""
 
-#: format_text/archive.c:148
+#: format_text/archive.c:146
 #, c-format
 msgid "Couldn't scan the archive directory (%s)."
 msgstr ""
 
-#: format_text/archive.c:175
+#: format_text/archive.c:173
 msgid "Couldn't create new archive file."
 msgstr ""
 
-#: format_text/archive.c:223
+#: format_text/archive.c:221
 #, c-format
 msgid "Expiring archive %s"
 msgstr ""
 
-#: format_text/archive.c:248
+#: format_text/archive.c:246
 msgid "Couldn't create temporary archive name."
 msgstr ""
 
-#: format_text/archive.c:253
+#: format_text/archive.c:251
 msgid "Couldn't create FILE object for archive."
 msgstr ""
 
-#: format_text/archive.c:284
+#: format_text/archive.c:288
 msgid "Archive file name too long."
 msgstr ""
 
-#: format_text/archive.c:295
+#: format_text/archive.c:299
 #, c-format
 msgid "Archive rename failed for %s"
 msgstr ""
 
-#: format_text/archive.c:312
+#: format_text/archive.c:316
 #, c-format
 msgid "File:\t\t%s"
 msgstr ""
 
-#: format_text/archive.c:317
+#: format_text/archive.c:321
 msgid "Couldn't create text instance object."
 msgstr ""
 
-#: format_text/archive.c:327
+#: format_text/archive.c:331
 msgid "Unable to read archive file."
 msgstr ""
 
-#: format_text/archive.c:332
+#: format_text/archive.c:336
 #, c-format
 msgid "VG name:    \t%s"
 msgstr ""
 
-#: format_text/archive.c:333
+#: format_text/archive.c:337
 #, c-format
 msgid "Description:\t%s"
 msgstr ""
 
-#: format_text/archive.c:334
+#: format_text/archive.c:338
 #, c-format
 msgid "Backup Time:\t%s"
 msgstr ""
 
-#: format_text/archive.c:351
+#: format_text/archive.c:355
 #, c-format
 msgid "No archives found in %s."
 msgstr ""
@@ -2456,562 +2566,611 @@
 msgid "Failed to generate backup filename."
 msgstr ""
 
-#: format_text/export.c:69
+#: format_text/export.c:80
 #, c-format
 msgid "uname failed: %s"
 msgstr ""
 
-#: format_text/export.c:90
+#: format_text/export.c:101
 msgid "Internal error tracking indentation"
 msgstr ""
 
-#: format_text/export.c:740
+#: format_text/export.c:120
+#, c-format
+msgid "Doubling metadata output buffer to %u"
+msgstr ""
+
+#: format_text/export.c:124
+msgid "Buffer reallocation failed."
+msgstr ""
+
+#: format_text/export.c:737
 msgid "text_export buffer allocation failed"
 msgstr ""
 
-#: format_text/flags.c:76
+#: format_text/flags.c:79
 msgid "Unknown flag set requested."
 msgstr ""
 
-#: format_text/flags.c:122
+#: format_text/flags.c:125
 msgid "Metadata inconsistency: Not all flags successfully exported."
 msgstr ""
 
-#: format_text/flags.c:144
+#: format_text/flags.c:147
 msgid "Status value is not a string."
 msgstr ""
 
-#: format_text/flags.c:155
+#: format_text/flags.c:158
 #, c-format
 msgid "Unknown status flag '%s'."
 msgstr ""
 
-#: format_text/format-text.c:92
+#: format_text/format-text.c:152
+#, c-format
+msgid "Found text metadata area, offset=%lu, size=%lu"
+msgstr ""
+
+#: format_text/format-text.c:207
+#, c-format
+msgid ""
+"Found LVM2 metadata record at offset=%lu, size=%lu, offset2=%lu size2=%lu"
+msgstr ""
+
+#: format_text/format-text.c:259
 #, c-format
 msgid "Random lvid creation failed for %s/%s."
 msgstr ""
 
-#: format_text/format-text.c:123
+#: format_text/format-text.c:290
 msgid "struct mda_header allocation failed"
 msgstr ""
 
-#: format_text/format-text.c:136
+#: format_text/format-text.c:302
 msgid "Incorrect metadata area header checksum"
 msgstr ""
 
-#: format_text/format-text.c:143
+#: format_text/format-text.c:309
 msgid "Wrong magic number in metadata area header"
 msgstr ""
 
-#: format_text/format-text.c:148
+#: format_text/format-text.c:314
 #, c-format
 msgid "Incompatible metadata area header version: %d"
 msgstr ""
 
-#: format_text/format-text.c:154
+#: format_text/format-text.c:320
 #, c-format
-msgid "Incorrect start sector in metadata area header: %llu"
+msgid "Incorrect start sector in metadata area header: %lu"
 msgstr ""
 
-#: format_text/format-text.c:285
+#: format_text/format-text.c:461
 #, c-format
 msgid "VG %s not found on %s"
 msgstr ""
 
-#: format_text/format-text.c:293 format_text/format-text.c:390
+#: format_text/format-text.c:469 format_text/format-text.c:574
 #, c-format
 msgid "VG %s metadata too large for circular buffer"
 msgstr ""
 
-#: format_text/format-text.c:308
+#: format_text/format-text.c:484
 #, c-format
-msgid "Read %s %smetadata (%u) from %s at %llu size %llu"
+msgid "Read %s %smetadata (%u) from %s at %lu size %lu"
 msgstr ""
 
-#: format_text/format-text.c:375
+#: format_text/format-text.c:557
 #, c-format
 msgid "VG %s metadata writing failed"
 msgstr ""
 
-#: format_text/format-text.c:395
+#: format_text/format-text.c:579
+#, c-format
+msgid "Writing %s metadata to %s at %lu len %lu"
+msgstr ""
+
+#: format_text/format-text.c:592
 #, c-format
-msgid "Writing %s metadata to %s at %llu len %llu"
+msgid "Writing metadata to %s at %lu len %u"
 msgstr ""
 
-#: format_text/format-text.c:407
+#: format_text/format-text.c:681
 #, c-format
-msgid "Writing metadata to %s at %llu len %u"
+msgid "%sCommitting %s metadata (%u) to %s header at %lu"
 msgstr ""
 
-#: format_text/format-text.c:481
+#: format_text/format-text.c:685
 #, c-format
-msgid "%sCommitting %s metadata (%u) to %s header at %llu"
+msgid "Wiping pre-committed %s metadata from %s header at %lu"
 msgstr ""
 
-#: format_text/format-text.c:486 format_text/format-text.c:566
+#: format_text/format-text.c:691 format_text/format-text.c:777
 msgid "Failed to write metadata area header"
 msgstr ""
 
-#: format_text/format-text.c:599
+#: format_text/format-text.c:810
 #, c-format
 msgid "'%s' does not contain volume group '%s'."
 msgstr ""
 
-#: format_text/format-text.c:603
+#: format_text/format-text.c:814
 #, c-format
 msgid "Read volume group %s from %s"
 msgstr ""
 
-#: format_text/format-text.c:646
+#: format_text/format-text.c:863
 msgid "Text format failed to determine directory."
 msgstr ""
 
-#: format_text/format-text.c:651
+#: format_text/format-text.c:868
 msgid "Couldn't create temporary text file name."
 msgstr ""
 
-#: format_text/format-text.c:661
+#: format_text/format-text.c:879
 #, c-format
 msgid "Writing %s metadata to %s"
 msgstr ""
 
-#: format_text/format-text.c:664
+#: format_text/format-text.c:882
 #, c-format
 msgid "Failed to write metadata to %s."
 msgstr ""
 
-#: format_text/format-text.c:682 format_text/format-text.c:708
-#: format_text/format-text.c:745 misc/lvm-file.c:90
+#: format_text/format-text.c:901 format_text/format-text.c:926
+#: format_text/format-text.c:960
 #, c-format
-msgid "%s: rename to %s failed: %s"
+msgid "Renaming %s to %s"
 msgstr ""
 
-#: format_text/format-text.c:697
+#: format_text/format-text.c:917
 #, c-format
 msgid "Test mode: Skipping committing %s metadata (%u)"
 msgstr ""
 
-#: format_text/format-text.c:700
+#: format_text/format-text.c:920
 #, c-format
 msgid "Unlinking %s"
 msgstr ""
 
-#: format_text/format-text.c:705
+#: format_text/format-text.c:925
 #, c-format
 msgid "Committing %s metadata (%u)"
 msgstr ""
 
-#: format_text/format-text.c:742
+#: format_text/format-text.c:962
 msgid "Test mode: Skipping rename"
 msgstr ""
 
-#: format_text/format-text.c:805 format_text/format-text.c:1438
+#: format_text/format-text.c:1025 format_text/format-text.c:1723
 #, c-format
 msgid "Name too long %s/%s"
 msgstr ""
 
-#: format_text/format-text.c:933
+#: format_text/format-text.c:1089
+#, c-format
+msgid "%s: metadata too large for circular buffer"
+msgstr ""
+
+#: format_text/format-text.c:1118
+#, c-format
+msgid "%s: Found metadata at %lu size %lu for %s (%s)"
+msgstr ""
+
+#: format_text/format-text.c:1186
 #, c-format
 msgid "Physical extents end beyond end of device %s!"
 msgstr ""
 
-#: format_text/format-text.c:960
+#: format_text/format-text.c:1207
 #, c-format
 msgid "Warning: metadata area fills disk leaving no space for data on %s."
 msgstr ""
 
-#: format_text/format-text.c:990 format_text/format-text.c:1036
+#: format_text/format-text.c:1238 format_text/format-text.c:1283
 msgid "Failed to wipe new metadata area"
 msgstr ""
 
-#: format_text/format-text.c:1083
+#: format_text/format-text.c:1329
 #, c-format
-msgid "Creating metadata area on %s at sector %llu size %llu sectors"
+msgid "Creating metadata area on %s at sector %lu size %lu sectors"
 msgstr ""
 
-#: format_text/format-text.c:1164
+#: format_text/format-text.c:1410
 msgid "_add_raw allocation failed"
 msgstr ""
 
-#: format_text/format-text.c:1223
+#: format_text/format-text.c:1470
 #, c-format
 msgid "Must be exactly one data area (found %d) on PV %s"
 msgstr ""
 
-#: format_text/format-text.c:1238 format_text/format-text.c:1242
+#: format_text/format-text.c:1485 format_text/format-text.c:1489
 msgid "metadata_area allocation failed"
 msgstr ""
 
-#: format_text/format-text.c:1416
+#: format_text/format-text.c:1650
+#, c-format
+msgid "PV %s too large for extent size %s."
+msgstr ""
+
+#: format_text/format-text.c:1693
 msgid "Couldn't allocate format instance object."
 msgstr ""
 
-#: format_text/format-text.c:1523
+#: format_text/format-text.c:1699
+msgid "Couldn't allocate text_fid_context."
+msgstr ""
+
+#: format_text/format-text.c:1807
 #, c-format
 msgid "%s: Volume group filename may not end in .tmp"
 msgstr ""
 
-#: format_text/format-text.c:1557
+#: format_text/format-text.c:1841
 msgid "Couldn't allocate text format context object."
 msgstr ""
 
-#: format_text/format-text.c:1579
+#: format_text/format-text.c:1863
 msgid "_add_dir allocation failed"
 msgstr ""
 
-#: format_text/format-text.c:1582
+#: format_text/format-text.c:1866
 #, c-format
 msgid "Adding text format metadata dir: %s"
 msgstr ""
 
-#: format_text/format-text.c:1599
+#: format_text/format-text.c:1883
 msgid "Empty metadata disk_area section of config file"
 msgstr ""
 
-#: format_text/format-text.c:1604
+#: format_text/format-text.c:1888
 msgid "Missing start_sector in metadata disk_area section of config file"
 msgstr ""
 
-#: format_text/format-text.c:1611
+#: format_text/format-text.c:1895
 msgid "Missing size in metadata disk_area section of config file"
 msgstr ""
 
-#: format_text/format-text.c:1618
+#: format_text/format-text.c:1902
 msgid "Missing uuid in metadata disk_area section of config file"
 msgstr ""
 
-#: format_text/format-text.c:1624
+#: format_text/format-text.c:1908
 #, c-format
 msgid "Invalid uuid in metadata disk_area section of config file: %s"
 msgstr ""
 
-#: format_text/format-text.c:1633 format_text/import_vsn1.c:156
+#: format_text/format-text.c:1917 format_text/import_vsn1.c:155
 msgid "Couldn't find device."
 msgstr ""
 
-#: format_text/format-text.c:1635 format_text/import_vsn1.c:158
+#: format_text/format-text.c:1919 format_text/import_vsn1.c:157
 #, c-format
 msgid "Couldn't find device with uuid '%s'."
 msgstr ""
 
-#: format_text/format-text.c:1663
+#: format_text/format-text.c:1948
 msgid "Failed to allocate dir_list"
 msgstr ""
 
-#: format_text/format-text.c:1674
+#: format_text/format-text.c:1960
 msgid "Couldn't create text label handler."
 msgstr ""
 
-#: format_text/format-text.c:1679
+#: format_text/format-text.c:1966
 msgid "Couldn't register text label handler."
 msgstr ""
 
-#: format_text/format-text.c:1686
+#: format_text/format-text.c:1974
 msgid "Invalid string in config file: metadata/dirs"
 msgstr ""
 
-#: format_text/import.c:60
+#: format_text/import.c:103
 msgid "Couldn't read volume group metadata."
 msgstr ""
 
-#: format_text/import_vsn1.c:48
+#: format_text/import_vsn1.c:46
 #, c-format
 msgid "Can't process text format file - %s."
 msgstr ""
 
-#: format_text/import_vsn1.c:96
+#: format_text/import_vsn1.c:94
 msgid "Couldn't find uuid."
 msgstr ""
 
-#: format_text/import_vsn1.c:102
+#: format_text/import_vsn1.c:100
 msgid "uuid must be a string."
 msgstr ""
 
-#: format_text/import_vsn1.c:107
+#: format_text/import_vsn1.c:105
 msgid "Invalid uuid."
 msgstr ""
 
-#: format_text/import_vsn1.c:140
+#: format_text/import_vsn1.c:139
 msgid "Empty pv section."
 msgstr ""
 
-#: format_text/import_vsn1.c:145
+#: format_text/import_vsn1.c:144
 msgid "Couldn't read uuid for volume group."
 msgstr ""
 
-#: format_text/import_vsn1.c:173
+#: format_text/import_vsn1.c:174
 msgid "Couldn't find status flags for physical volume."
 msgstr ""
 
-#: format_text/import_vsn1.c:178
+#: format_text/import_vsn1.c:179
 msgid "Couldn't read status flags for physical volume."
 msgstr ""
 
-#: format_text/import_vsn1.c:183
+#: format_text/import_vsn1.c:187
 msgid "Couldn't read extent size for volume group."
 msgstr ""
 
-#: format_text/import_vsn1.c:188
+#: format_text/import_vsn1.c:192
 msgid "Couldn't find extent count (pe_count) for physical volume."
 msgstr ""
 
-#: format_text/import_vsn1.c:199
+#: format_text/import_vsn1.c:203
 #, c-format
 msgid "Couldn't read tags for physical volume %s in %s."
 msgstr ""
 
-#: format_text/import_vsn1.c:252
+#: format_text/import_vsn1.c:275
 msgid "Empty segment section."
 msgstr ""
 
-#: format_text/import_vsn1.c:257
+#: format_text/import_vsn1.c:280
 #, c-format
 msgid "Couldn't read 'start_extent' for segment '%s'."
 msgstr ""
 
-#: format_text/import_vsn1.c:263
+#: format_text/import_vsn1.c:286
 #, c-format
 msgid "Couldn't read 'extent_count' for segment '%s'."
 msgstr ""
 
-#: format_text/import_vsn1.c:273
+#: format_text/import_vsn1.c:296
 msgid "Segment type must be a string."
 msgstr ""
 
-#: format_text/import_vsn1.c:293
+#: format_text/import_vsn1.c:316
 msgid "Segment allocation failed"
 msgstr ""
 
-#: format_text/import_vsn1.c:306
+#: format_text/import_vsn1.c:329
 #, c-format
 msgid "Couldn't read tags for a segment of %s/%s."
 msgstr ""
 
-#: format_text/import_vsn1.c:335
+#: format_text/import_vsn1.c:358
 #, c-format
 msgid "Zero areas not allowed for segment '%s'"
 msgstr ""
 
-#: format_text/import_vsn1.c:371
+#: format_text/import_vsn1.c:394
 #, c-format
 msgid "Couldn't find volume '%s' for segment '%s'."
 msgstr ""
 
-#: format_text/import_vsn1.c:384
+#: format_text/import_vsn1.c:407
 #, c-format
 msgid "Incorrect number of areas in area array for segment '%s'."
 msgstr ""
 
-#: format_text/import_vsn1.c:414
+#: format_text/import_vsn1.c:437
 msgid "Only one segment permitted for snapshot"
 msgstr ""
 
-#: format_text/import_vsn1.c:420
+#: format_text/import_vsn1.c:443
 msgid "Couldn't read segment count for logical volume."
 msgstr ""
 
-#: format_text/import_vsn1.c:425
+#: format_text/import_vsn1.c:448
 msgid "segment_count and actual number of segments disagree."
 msgstr ""
 
-#: format_text/import_vsn1.c:471 format_text/import_vsn1.c:539
+#: format_text/import_vsn1.c:494 format_text/import_vsn1.c:562
 msgid "Empty logical volume section."
 msgstr ""
 
-#: format_text/import_vsn1.c:476
+#: format_text/import_vsn1.c:499
 msgid "Couldn't find status flags for logical volume."
 msgstr ""
 
-#: format_text/import_vsn1.c:481
+#: format_text/import_vsn1.c:504
 msgid "Couldn't read status flags for logical volume."
 msgstr ""
 
-#: format_text/import_vsn1.c:489 format_text/import_vsn1.c:710
+#: format_text/import_vsn1.c:512 format_text/import_vsn1.c:729
 msgid "allocation_policy must be a string."
 msgstr ""
 
-#: format_text/import_vsn1.c:512
+#: format_text/import_vsn1.c:535
 #, c-format
 msgid "Couldn't read tags for logical volume %s/%s."
 msgstr ""
 
-#: format_text/import_vsn1.c:532
+#: format_text/import_vsn1.c:555
 #, c-format
 msgid "Lost logical volume reference %s"
 msgstr ""
 
-#: format_text/import_vsn1.c:545
+#: format_text/import_vsn1.c:568
 #, c-format
 msgid "Couldn't read uuid for logical volume %s."
 msgstr ""
 
-#: format_text/import_vsn1.c:572
+#: format_text/import_vsn1.c:595
 #, c-format
 msgid "Couldn't read minor number for logical volume %s."
 msgstr ""
 
-#: format_text/import_vsn1.c:580
+#: format_text/import_vsn1.c:603
 #, c-format
 msgid "Couldn't read major number for logical volume %s."
 msgstr ""
 
-#: format_text/import_vsn1.c:597
+#: format_text/import_vsn1.c:620
 #, c-format
 msgid "Couldn't find section '%s'."
 msgstr ""
 
-#: format_text/import_vsn1.c:626
+#: format_text/import_vsn1.c:649 format_text/import_vsn1.c:841
 msgid "Couldn't find volume group in file."
 msgstr ""
 
-#: format_text/import_vsn1.c:654
+#: format_text/import_vsn1.c:673
 msgid "system_id must be a string"
 msgstr ""
 
-#: format_text/import_vsn1.c:661
+#: format_text/import_vsn1.c:680 format_text/import_vsn1.c:851
 #, c-format
 msgid "Couldn't read uuid for volume group %s."
 msgstr ""
 
-#: format_text/import_vsn1.c:666
+#: format_text/import_vsn1.c:685
 #, c-format
 msgid "Couldn't read 'seqno' for volume group %s."
 msgstr ""
 
-#: format_text/import_vsn1.c:672
+#: format_text/import_vsn1.c:691 format_text/import_vsn1.c:856
 #, c-format
 msgid "Couldn't find status flags for volume group %s."
 msgstr ""
 
-#: format_text/import_vsn1.c:678
+#: format_text/import_vsn1.c:697 format_text/import_vsn1.c:862
 #, c-format
 msgid "Couldn't read status flags for volume group %s."
 msgstr ""
 
-#: format_text/import_vsn1.c:684
+#: format_text/import_vsn1.c:703
 #, c-format
 msgid "Couldn't read extent size for volume group %s."
 msgstr ""
 
-#: format_text/import_vsn1.c:695
+#: format_text/import_vsn1.c:714
 #, c-format
 msgid "Couldn't read 'max_lv' for volume group %s."
 msgstr ""
 
-#: format_text/import_vsn1.c:701
+#: format_text/import_vsn1.c:720
 #, c-format
 msgid "Couldn't read 'max_pv' for volume group %s."
 msgstr ""
 
-#: format_text/import_vsn1.c:726
+#: format_text/import_vsn1.c:745
 msgid "Couldn't create hash table."
 msgstr ""
 
-#: format_text/import_vsn1.c:733
+#: format_text/import_vsn1.c:752
 #, c-format
 msgid "Couldn't find all physical volumes for volume group %s."
 msgstr ""
 
-#: format_text/import_vsn1.c:744
+#: format_text/import_vsn1.c:763
 #, c-format
 msgid "Couldn't read tags for volume group %s."
 msgstr ""
 
-#: format_text/import_vsn1.c:750
+#: format_text/import_vsn1.c:769
 #, c-format
 msgid "Couldn't read all logical volume names for volume group %s."
 msgstr ""
 
-#: format_text/import_vsn1.c:757
+#: format_text/import_vsn1.c:776
 #, c-format
 msgid "Couldn't read all logical volumes for volume group %s."
 msgstr ""
 
-#: format_text/tags.c:63
+#: format_text/import_vsn1.c:782
+#, c-format
+msgid "Failed to fixup mirror pointers after import for volume group %s."
+msgstr ""
+
+#: format_text/tags.c:62
 msgid "Found a tag that is not a string"
 msgstr ""
 
-#: format_text/text_label.c:96 format_text/text_label.c:101
+#: format_text/text_label.c:98 format_text/text_label.c:103
 msgid "struct data_area_list allocation failed"
 msgstr ""
 
-#: format_text/text_label.c:136 format_text/text_label.c:147
+#: format_text/text_label.c:138 format_text/text_label.c:149
 msgid "struct mda_list allocation failed"
 msgstr ""
 
-#: format_text/text_label.c:141 format_text/text_label.c:152
+#: format_text/text_label.c:143 format_text/text_label.c:154
 msgid "struct mda_context allocation failed"
 msgstr ""
 
-#: label/label.c:50
+#: label/label.c:49
 msgid "Couldn't allocate memory for labeller list object."
 msgstr ""
 
-#: label/label.c:131 label/label.c:225
+#: label/label.c:123 label/label.c:218
 #, c-format
 msgid "%s: Failed to read label area"
 msgstr ""
 
-#: label/label.c:143 label/label.c:170
+#: label/label.c:135 label/label.c:164
 #, c-format
-msgid "Ignoring additional label on %s at sector %llu"
+msgid "Ignoring additional label on %s at sector %lu"
 msgstr ""
 
-#: label/label.c:148
+#: label/label.c:140
 #, c-format
-msgid "%s: Label for sector %llu found at sector %llu - ignoring"
+msgid "%s: Label for sector %lu found at sector %lu - ignoring"
 msgstr ""
 
-#: label/label.c:157
+#: label/label.c:150
 #, c-format
 msgid "Label checksum incorrect on %s - ignoring"
 msgstr ""
 
-#: label/label.c:167
+#: label/label.c:161
 #, c-format
 msgid "%s: %s label detected"
 msgstr ""
 
-#: label/label.c:189
+#: label/label.c:185
 #, c-format
 msgid "%s: No label detected"
 msgstr ""
 
-#: label/label.c:211
+#: label/label.c:204
 #, c-format
 msgid "Scanning for labels to wipe from %s"
 msgstr ""
 
-#: label/label.c:251
+#: label/label.c:244
 #, c-format
-msgid "%s: Wiping label at sector %llu"
+msgid "%s: Wiping label at sector %lu"
 msgstr ""
 
-#: label/label.c:255
+#: label/label.c:248
 #, c-format
-msgid "Failed to remove label from %s at sector %llu"
+msgid "Failed to remove label from %s at sector %lu"
 msgstr ""
 
-#: label/label.c:297
+#: label/label.c:304
 msgid "Label handler does not support label writes"
 msgstr ""
 
-#: label/label.c:302
+#: label/label.c:309
 #, c-format
-msgid "Label sector %llu beyond range (%ld)"
+msgid "Label sector %lu beyond range (%ld)"
 msgstr ""
 
-#: label/label.c:326
+#: label/label.c:333
 #, c-format
-msgid "%s: Writing label to sector %llu"
+msgid "%s: Writing label to sector %lu"
 msgstr ""
 
-#: label/label.c:329
+#: label/label.c:336
 #, c-format
 msgid "Failed to write label to %s"
 msgstr ""
 
-#: label/label.c:364
+#: label/label.c:386
 msgid "label allocaction failed"
 msgstr ""
 
@@ -3044,37 +3203,37 @@
 msgid "cluster request failed: %s"
 msgstr ""
 
-#: locking/cluster_locking.c:351
+#: locking/cluster_locking.c:346
 #, c-format
 msgid "clvmd not running on node %s"
 msgstr ""
 
-#: locking/cluster_locking.c:356
+#: locking/cluster_locking.c:351
 #, c-format
 msgid "Error locking on node %s: %s"
 msgstr ""
 
-#: locking/cluster_locking.c:406 locking/file_locking.c:264
-#: locking/locking.c:247 locking/no_locking.c:71
+#: locking/cluster_locking.c:402 locking/file_locking.c:266
+#: locking/locking.c:265 locking/no_locking.c:71
 #, c-format
 msgid "Unrecognised lock scope: %d"
 msgstr ""
 
-#: locking/cluster_locking.c:412
+#: locking/cluster_locking.c:408
 #, c-format
 msgid "Locking %s at 0x%x"
 msgstr ""
 
-#: locking/external_locking.c:63
+#: locking/external_locking.c:64
 msgid "External locking already initialised"
 msgstr ""
 
-#: locking/external_locking.c:85
+#: locking/external_locking.c:86
 #, c-format
 msgid "Shared library %s does not contain locking functions"
 msgstr ""
 
-#: locking/external_locking.c:92
+#: locking/external_locking.c:93
 #, c-format
 msgid "Loaded external locking library %s"
 msgstr ""
@@ -3098,699 +3257,912 @@
 msgid "Locking %s %c%c"
 msgstr ""
 
-#: locking/file_locking.c:235
+#: locking/file_locking.c:237
 #, c-format
 msgid "Unlocking LV %s"
 msgstr ""
 
-#: locking/file_locking.c:240
+#: locking/file_locking.c:242
 #, c-format
 msgid "Locking LV %s (NL)"
 msgstr ""
 
-#: locking/file_locking.c:245
+#: locking/file_locking.c:247
 #, c-format
 msgid "Locking LV %s (R)"
 msgstr ""
 
-#: locking/file_locking.c:250
+#: locking/file_locking.c:252
 #, c-format
 msgid "Locking LV %s (W)"
 msgstr ""
 
-#: locking/file_locking.c:255
+#: locking/file_locking.c:257
 #, c-format
 msgid "Locking LV %s (EX)"
 msgstr ""
 
-#: locking/locking.c:132
+#: locking/locking.c:133
 msgid ""
 "WARNING: Locking disabled. Be careful! This could corrupt your metadata."
 msgstr ""
 
-#: locking/locking.c:139
-msgid "File-based locking enabled."
+#: locking/locking.c:138
+msgid "File-based locking selected."
 msgstr ""
 
 #: locking/locking.c:146
-msgid "External locking enabled."
+msgid "External locking selected."
 msgstr ""
 
-#: locking/locking.c:154
-msgid "Cluster locking enabled."
+#: locking/locking.c:156
+msgid "Falling back to internal clustered locking."
 msgstr ""
 
-#: locking/locking.c:159
-msgid "Unknown locking type requested."
+#: locking/locking.c:160
+msgid "Cluster locking selected."
 msgstr ""
 
 #: locking/locking.c:167
+msgid "Unknown locking type requested."
+msgstr ""
+
+#: locking/locking.c:174
+msgid "WARNING: Falling back to local file-based locking."
+msgstr ""
+
+#: locking/locking.c:175
+msgid "Volume Groups with the clustered attribute will be inaccessible."
+msgstr ""
+
+#: locking/locking.c:185
 msgid "Locking disabled - only read operations permitted."
 msgstr ""
 
-#: locking/locking.c:194
+#: locking/locking.c:212
 #, c-format
 msgid "LVM1 proc VG pathname too long for %s"
 msgstr ""
 
-#: locking/locking.c:199
+#: locking/locking.c:217
 #, c-format
 msgid "%s exists: Is the original LVM driver using this volume group?"
 msgstr ""
 
-#: locking/locking.c:284 lvresize.c:526
+#: locking/locking.c:302 lvresize.c:573
 #, c-format
 msgid "Failed to suspend %s"
 msgstr ""
 
-#: locking/locking.c:305
+#: locking/locking.c:323
 #, c-format
 msgid "Failed to activate %s"
 msgstr ""
 
-#: log/log.c:135
+#: log/log.c:145
 msgid "Test mode: Metadata will NOT be updated."
 msgstr ""
 
-#: log/log.c:264
-msgid "vsnprintf failed: skipping external logging function"
-msgstr ""
-
-#: lvchange.c:26
+#: lvchange.c:27
 #, c-format
 msgid "Logical volume \"%s\" is already writable"
 msgstr ""
 
-#: lvchange.c:32
+#: lvchange.c:33
 #, c-format
 msgid "Logical volume \"%s\" is already read only"
 msgstr ""
 
-#: lvchange.c:39
+#: lvchange.c:40
+#, c-format
+msgid "Cannot change permissions of mirror \"%s\" while active."
+msgstr ""
+
+#: lvchange.c:47
 #, c-format
 msgid "Setting logical volume \"%s\" read/write"
 msgstr ""
 
-#: lvchange.c:43
+#: lvchange.c:51
 #, c-format
 msgid "Setting logical volume \"%s\" read-only"
 msgstr ""
 
-#: lvchange.c:47 lvchange.c:168 lvchange.c:211 lvchange.c:296 lvchange.c:354
-#: lvconvert.c:87
+#: lvchange.c:55 lvchange.c:314 lvchange.c:350 lvchange.c:393 lvchange.c:470
+#: lvchange.c:524 lvconvert.c:401
 #, c-format
 msgid "Updating logical volume \"%s\" on disk(s)"
 msgstr ""
 
-#: lvchange.c:56 lvchange.c:220 lvchange.c:305 lvconvert.c:97
+#: lvchange.c:64 lvchange.c:402 lvconvert.c:409 metadata/mirror.c:227
 #, c-format
 msgid "Failed to lock %s"
 msgstr ""
 
-#: lvchange.c:66 lvchange.c:230 lvchange.c:315
+#: lvchange.c:74 lvchange.c:412
 #, c-format
 msgid "Updating permissions for \"%s\" in kernel"
 msgstr ""
 
-#: lvchange.c:68 lvchange.c:232 lvchange.c:317 lvconvert.c:110 lvresize.c:538
+#: lvchange.c:76 lvchange.c:414 lvconvert.c:422 lvresize.c:585
+#: metadata/mirror.c:240
 #, c-format
 msgid "Problem reactivating %s"
 msgstr ""
 
-#: lvchange.c:84
+#: lvchange.c:89
+#, c-format
+msgid "Logical volume, %s, is not active"
+msgstr ""
+
+#: lvchange.c:113
 #, c-format
 msgid "Deactivating logical volume \"%s\" locally"
 msgstr ""
 
-#: lvchange.c:91
+#: lvchange.c:120
 #, c-format
 msgid "Deactivating logical volume \"%s\""
 msgstr ""
 
-#: lvchange.c:98
+#: lvchange.c:127
 #, c-format
 msgid "Locking failed: ignoring clustered logical volume %s"
 msgstr ""
 
-#: lvchange.c:104
+#: lvchange.c:133
 #, c-format
 msgid "Activating logical volume \"%s\" exclusively"
 msgstr ""
 
-#: lvchange.c:111
+#: lvchange.c:140
 #, c-format
 msgid "Activating logical volume \"%s\" locally"
 msgstr ""
 
-#: lvchange.c:118
+#: lvchange.c:147
 #, c-format
 msgid "Activating logical volume \"%s\""
 msgstr ""
 
-#: lvchange.c:128
+#: lvchange.c:157
 #, c-format
 msgid "Spawning background pvmove process for %s"
 msgstr ""
 
-#: lvchange.c:139
+#: lvchange.c:168
 #, c-format
 msgid "Refreshing logical volume \"%s\" (if active)"
 msgstr ""
 
-#: lvchange.c:156
+#: lvchange.c:183
+#, c-format
+msgid "Unable to resync %s because it is not mirrored."
+msgstr ""
+
+#: lvchange.c:189
+#, c-format
+msgid "Unable to resync pvmove volume %s"
+msgstr ""
+
+#: lvchange.c:194
+#, c-format
+msgid "Unable to resync locked volume %s"
+msgstr ""
+
+#: lvchange.c:200
+#, c-format
+msgid "Can't resync open logical volume \"%s\""
+msgstr ""
+
+#: lvchange.c:210
+#, c-format
+msgid "Logical volume \"%s\" not resynced"
+msgstr ""
+
+#: lvchange.c:220
+#, c-format
+msgid "Can't get exclusive access to clustered volume %s"
+msgstr ""
+
+#: lvchange.c:226
+#, c-format
+msgid "Unable to deactivate %s for resync"
+msgstr ""
+
+#: lvchange.c:232
+#, c-format
+msgid "Starting resync of %s%s%s mirror \"%s\""
+msgstr ""
+
+#: lvchange.c:246
+#, c-format
+msgid "Failed to reactivate %s to resynchronize mirror"
+msgstr ""
+
+#: lvchange.c:262
+msgid "Failed to write intermediate VG metadata."
+msgstr ""
+
+#: lvchange.c:276
+msgid "Failed to commit intermediate VG metadata."
+msgstr ""
+
+#: lvchange.c:288
+#, c-format
+msgid "Unable to activate %s for mirror log resync"
+msgstr ""
+
+#: lvchange.c:293
+#, c-format
+msgid "Clearing log device %s"
+msgstr ""
+
+#: lvchange.c:295
+#, c-format
+msgid "Unable to reset sync status for %s"
+msgstr ""
+
+#: lvchange.c:297
+msgid "Failed to deactivate log LV after wiping failed"
+msgstr ""
+
+#: lvchange.c:303
+#, c-format
+msgid "Unable to deactivate log LV %s after wiping for resync"
+msgstr ""
+
+#: lvchange.c:316
+msgid "Failed to update metadata on disk."
+msgstr ""
+
+#: lvchange.c:321
+#, c-format
+msgid "Failed to reactivate %s after resync"
+msgstr ""
+
+#: lvchange.c:338
 #, c-format
 msgid "Allocation policy of logical volume \"%s\" is already %s"
 msgstr ""
 
-#: lvchange.c:165
+#: lvchange.c:347
 #, c-format
 msgid "Setting contiguous allocation policy for \"%s\" to %s"
 msgstr ""
 
-#: lvchange.c:201
+#: lvchange.c:383
 #, c-format
 msgid "Read ahead is already %u for \"%s\""
 msgstr ""
 
-#: lvchange.c:208
+#: lvchange.c:390
 #, c-format
 msgid "Setting read ahead to %u for \"%s\""
 msgstr ""
 
-#: lvchange.c:247
+#: lvchange.c:429
 #, c-format
 msgid "Minor number is already not persistent for \"%s\""
 msgstr ""
 
-#: lvchange.c:254
+#: lvchange.c:436
 #, c-format
 msgid "Disabling persistent device number for \"%s\""
 msgstr ""
 
-#: lvchange.c:258
+#: lvchange.c:440
 msgid "Minor number must be specified with -My"
 msgstr ""
 
-#: lvchange.c:262
+#: lvchange.c:444
 msgid "Major number must be specified with -My"
 msgstr ""
 
-#: lvchange.c:270
+#: lvchange.c:453
 #, c-format
 msgid "%s device number not changed."
 msgstr ""
 
-#: lvchange.c:276
+#: lvchange.c:457
 #, c-format
 msgid "Ensuring %s is inactive."
 msgstr ""
 
-#: lvchange.c:278
+#: lvchange.c:459
 #, c-format
 msgid "%s: deactivation failed"
 msgstr ""
 
-#: lvchange.c:284
+#: lvchange.c:465
 #, c-format
 msgid "Setting persistent device number to (%d, %d) for \"%s\""
 msgstr ""
 
-#: lvchange.c:287
+#: lvchange.c:484
 #, c-format
 msgid "Re-activating logical volume \"%s\""
 msgstr ""
 
-#: lvchange.c:290
+#: lvchange.c:486
 #, c-format
 msgid "%s: reactivation failed"
 msgstr ""
 
-#: lvchange.c:330 lvcreate.c:682 pvchange.c:49 vgchange.c:322 vgcreate.c:111
+#: lvchange.c:500 lvcreate.c:680 pvchange.c:49 vgchange.c:440 vgcreate.c:107
 msgid "Failed to get tag"
 msgstr ""
 
-#: lvchange.c:335
+#: lvchange.c:505
 #, c-format
 msgid "Logical volume %s/%s does not support tags"
 msgstr ""
 
-#: lvchange.c:342 lvcreate.c:693
+#: lvchange.c:512 lvcreate.c:746
 #, c-format
 msgid "Failed to add tag %s to %s/%s"
 msgstr ""
 
-#: lvchange.c:348
+#: lvchange.c:518
 #, c-format
 msgid "Failed to remove tag %s from %s/%s"
 msgstr ""
 
-#: lvchange.c:381
+#: lvchange.c:551
 #, c-format
 msgid "Only -a permitted with read-only volume group \"%s\""
 msgstr ""
 
-#: lvchange.c:390
+#: lvchange.c:560
 #, c-format
 msgid "Can't change logical volume \"%s\" under snapshot"
 msgstr ""
 
-#: lvchange.c:396
+#: lvchange.c:566
 #, c-format
 msgid "Can't change snapshot logical volume \"%s\""
 msgstr ""
 
-#: lvchange.c:402
+#: lvchange.c:572
 #, c-format
 msgid "Unable to change pvmove LV %s"
 msgstr ""
 
-#: lvchange.c:404
+#: lvchange.c:574
 msgid "Use 'pvmove --abort' to abandon a pvmove"
 msgstr ""
 
-#: lvchange.c:409
+#: lvchange.c:579
 #, c-format
 msgid "Unable to change mirror log LV %s directly"
 msgstr ""
 
-#: lvchange.c:414
+#: lvchange.c:584
 #, c-format
 msgid "Unable to change mirror image LV %s directly"
 msgstr ""
 
-#: lvchange.c:420
+#: lvchange.c:590
 #, c-format
 msgid "Unable to change internal LV %s directly"
 msgstr ""
 
-#: lvchange.c:474
+#: lvchange.c:648
 #, c-format
 msgid "Logical volume \"%s\" changed"
 msgstr ""
 
-#: lvchange.c:496
+#: lvchange.c:683
 msgid ""
-"One or more of -a, -C, -j, -m, -M, -p, -r, --refresh, --alloc, --addtag or --"
-"deltag required"
+"Need 1 or more of -a, -C, -j, -m, -M, -p, -r, --resync, --refresh, --alloc, "
+"--addtag, --deltag or --monitor"
 msgstr ""
 
-#: lvchange.c:506
+#: lvchange.c:694
 msgid "Only -a permitted with --ignorelockingfailure"
 msgstr ""
 
-#: lvchange.c:511 lvconvert.c:172
+#: lvchange.c:699
 msgid "Please give logical volume path(s)"
 msgstr ""
 
-#: lvchange.c:517
+#: lvchange.c:705
 msgid "--major and --minor require -My"
 msgstr ""
 
-#: lvchange.c:522
+#: lvchange.c:710
 msgid "Only give one logical volume when specifying minor"
 msgstr ""
 
-#: lvchange.c:527
+#: lvchange.c:715
 msgid "Only one of --alloc and --contiguous permitted"
 msgstr ""
 
-#: lvconvert.c:37
-#, c-format
-msgid "Logical volume %s is already not mirrored."
+#: lvconvert.c:50 lvcreate.c:69
+msgid "Please specify a logical volume to act as the snapshot origin."
 msgstr ""
 
-#: lvconvert.c:49
-#, c-format
-msgid "Logical volume %s has multiple mirror segments."
+#: lvconvert.c:58 lvcreate.c:77
+msgid "The origin name should include the volume group."
 msgstr ""
 
-#: lvconvert.c:57
-#, c-format
-msgid "Logical volume %s already has %u mirror(s)."
+#: lvconvert.c:69
+msgid "Please provide logical volume path"
 msgstr ""
 
-#: lvconvert.c:68 lvconvert.c:82
-msgid "Adding mirror images is not supported yet."
+#: lvconvert.c:79 lvrename.c:38
+#, c-format
+msgid "Please use a single volume group name (\"%s\" or \"%s\")"
 msgstr ""
 
-#: lvconvert.c:107
-#, c-format
-msgid "Updating \"%s\" in kernel"
+#: lvconvert.c:88 lvrename.c:52
+msgid "Please provide a valid volume group name"
 msgstr ""
 
-#: lvconvert.c:114
-#, c-format
-msgid "Logical volume %s converted."
+#: lvconvert.c:110
+msgid "Exactly one of --mirrors or --snapshot arguments required."
 msgstr ""
 
-#: lvconvert.c:125
-#, c-format
-msgid "Cannot convert locked LV %s"
+#: lvconvert.c:129
+msgid "--regionsize is only available with mirrors"
 msgstr ""
 
-#: lvconvert.c:130
-#, c-format
-msgid "Can't convert logical volume \"%s\" under snapshot"
+#: lvconvert.c:134 lvcreate.c:336
+msgid "Negative chunk size is invalid"
 msgstr ""
 
-#: lvconvert.c:136
-#, c-format
-msgid "Can't convert snapshot logical volume \"%s\""
+#: lvconvert.c:140 lvcreate.c:342
+msgid "Chunk size must be a power of 2 in the range 4K to 512K"
 msgstr ""
 
-#: lvconvert.c:142
+#: lvconvert.c:144 lvcreate.c:346
 #, c-format
-msgid "Unable to convert pvmove LV %s"
+msgid "Setting chunksize to %d sectors."
 msgstr ""
 
-#: lvconvert.c:167
-msgid "--mirrors argument required"
+#: lvconvert.c:156
+msgid "--chunksize is only available with snapshots"
 msgstr ""
 
-#: lvconvert.c:182 lvrename.c:54
-msgid "Please provide a valid volume group name"
+#: lvconvert.c:162
+msgid "--zero is only available with snapshots"
 msgstr ""
 
-#: lvconvert.c:189 lvrename.c:102 vgrename.c:65
-#, c-format
-msgid "Checking for existing volume group \"%s\""
+#: lvconvert.c:174 lvcreate.c:253
+msgid "Negative regionsize is invalid"
 msgstr ""
 
-#: lvconvert.c:192 lvcreate.c:809 lvrename.c:105 lvresize.c:566 pvchange.c:59
-#: pvmove.c:61 vgcreate.c:144 vgextend.c:47 vgmerge.c:33 vgmerge.c:57
-#: vgreduce.c:265 vgrename.c:68 vgrename.c:102 vgsplit.c:189 vgsplit.c:213
-#, c-format
-msgid "Can't get lock for %s"
+#: lvconvert.c:184 lvcreate.c:262
+msgid "Negative regionsize in configuration file is invalid"
 msgstr ""
 
-#: lvconvert.c:197 lvcreate.c:438 lvrename.c:110 pvmove.c:66 vgdisplay.c:24
-#: vgmerge.c:38 vgmerge.c:64 vgreduce.c:271 vgrename.c:73 vgsplit.c:194
+#: lvconvert.c:192 lvcreate.c:276
 #, c-format
-msgid "Volume group \"%s\" doesn't exist"
+msgid "Region size (%u) must be a multiple of machine memory page size (%d)"
 msgstr ""
 
-#: lvconvert.c:202 lvcreate.c:443 lvrename.c:115 metadata/metadata.c:1166
-#: polldaemon.c:200 pvchange.c:72 pvmove.c:72 toollib.c:42 vgchange.c:415
-#: vgck.c:32 vgconvert.c:54 vgextend.c:57 vgmerge.c:44 vgmerge.c:69
-#: vgreduce.c:321 vgremove.c:35 vgrename.c:80 vgsplit.c:200
+#: lvconvert.c:200 lvcreate.c:270
 #, c-format
-msgid "Volume group \"%s\" is exported"
+msgid "Region size (%u) must be a power of 2"
 msgstr ""
 
-#: lvconvert.c:207 lvcreate.c:448 lvremove.c:27 lvrename.c:120 pvchange.c:78
-#: pvmove.c:78 vgchange.c:410 vgconvert.c:49 vgexport.c:38 vgextend.c:62
-#: vgmerge.c:50 vgmerge.c:74 vgreduce.c:327 vgrename.c:86 vgsplit.c:206
-#, c-format
-msgid "Volume group \"%s\" is read-only"
+#: lvconvert.c:206 lvcreate.c:283
+msgid "Non-zero region size must be supplied."
 msgstr ""
 
-#: lvconvert.c:212
+#: lvconvert.c:216 lvcreate.c:390 metadata/mirror.c:566
 #, c-format
-msgid "Logical volume \"%s\" not found in volume group \"%s\""
-msgstr ""
-
-#: lvcreate.c:65
-msgid "Please specify a logical volume to act as the snapshot origin."
-msgstr ""
-
-#: lvcreate.c:73
-msgid "The origin name should include the volume group."
+msgid "%s: Required device-mapper target(s) not detected in your kernel"
 msgstr ""
 
-#: lvcreate.c:89 lvresize.c:102
-msgid "Please provide a volume group name"
+#: lvconvert.c:249
+#, c-format
+msgid "Logical volume %s only has %u mirrors."
 msgstr ""
 
-#: lvcreate.c:108
-msgid "Volume group name expected (no slash)"
+#: lvconvert.c:259
+msgid "Mirror log region size cannot be changed on an existing mirror."
 msgstr ""
 
-#: lvcreate.c:123
+#: lvconvert.c:266
 #, c-format
-msgid "Inconsistent volume group names given: \"%s\" and \"%s\""
+msgid "Logical volume %s is already not mirrored."
 msgstr ""
 
-#: lvcreate.c:146
+#: lvconvert.c:277
 #, c-format
-msgid "Logical volume name \"%s\" is invalid"
+msgid "Logical volume %s has multiple mirror segments."
 msgstr ""
 
-#: lvcreate.c:159 lvresize.c:64
-msgid "Please specify either size or extents (not both)"
+#: lvconvert.c:287 lvconvert.c:320
+msgid "Unable to determine mirror sync status."
 msgstr ""
 
-#: lvcreate.c:165
-msgid "Negative number of extents is invalid"
+#: lvconvert.c:311 lvconvert.c:389 lvcreate.c:721
+msgid "Failed to create mirror log."
 msgstr ""
 
-#: lvcreate.c:174
-msgid "Negative size is invalid"
+#: lvconvert.c:335
+#, c-format
+msgid "Logical volume %s already has %u mirror(s)."
 msgstr ""
 
-#: lvcreate.c:191
-msgid "Negative stripesize is invalid"
+#: lvconvert.c:346
+msgid "Adding mirror images is not supported yet."
 msgstr ""
 
-#: lvcreate.c:198
-msgid "Ignoring stripesize argument with single stripe"
+#: lvconvert.c:363
+msgid "Mirrors of striped volumes are not yet supported."
 msgstr ""
 
-#: lvcreate.c:206 lvresize.c:287
+#: lvconvert.c:419 metadata/mirror.c:237
 #, c-format
-msgid "Using default stripesize %dKB"
+msgid "Updating \"%s\" in kernel"
 msgstr ""
 
-#: lvcreate.c:210
+#: lvconvert.c:426
 #, c-format
-msgid "Too few physical volumes on command line for %d-way striping"
+msgid "Logical volume %s converted."
 msgstr ""
 
-#: lvcreate.c:216
+#: lvconvert.c:438 lvcreate.c:608
 #, c-format
-msgid "Number of stripes (%d) must be between %d and %d"
+msgid "Couldn't find origin volume '%s'."
 msgstr ""
 
-#: lvcreate.c:224
+#: lvconvert.c:443
 #, c-format
-msgid "Invalid stripe size %d"
+msgid "Unable to create a snapshot of a %s LV."
 msgstr ""
 
-#: lvcreate.c:238
+#: lvconvert.c:450 lvcreate.c:799
 #, c-format
-msgid "Too few physical volumes on command line for %d-way mirroring"
+msgid "WARNING: \"%s\" not zeroed"
 msgstr ""
 
-#: lvcreate.c:245
-msgid "Negative regionsize is invalid"
+#: lvconvert.c:452
+msgid "Aborting. Failed to wipe snapshot exception store."
 msgstr ""
 
-#: lvcreate.c:255
+#: lvconvert.c:458
 #, c-format
-msgid "Region size (%u) must be a power of 2"
+msgid "Couldn't deactivate LV %s."
 msgstr ""
 
-#: lvcreate.c:279
-msgid "Redundant stripes argument: default is 1"
+#: lvconvert.c:464 lvcreate.c:812
+msgid "Couldn't create snapshot."
 msgstr ""
 
-#: lvcreate.c:293
-msgid "Redundant mirrors argument: default is 0"
+#: lvconvert.c:475 lvcreate.c:821
+#, c-format
+msgid "Failed to suspend origin %s"
 msgstr ""
 
-#: lvcreate.c:298
-msgid "-Z is incompatible with snapshots"
+#: lvconvert.c:484 lvcreate.c:830
+#, c-format
+msgid "Problem reactivating origin %s"
 msgstr ""
 
-#: lvcreate.c:302
-msgid "Negative chunk size is invalid"
+#: lvconvert.c:488
+#, c-format
+msgid "Logical volume %s converted to snapshot."
 msgstr ""
 
-#: lvcreate.c:306
+#: lvconvert.c:499
 #, c-format
-msgid "Setting chunksize to %d sectors."
+msgid "Cannot convert locked LV %s"
 msgstr ""
 
-#: lvcreate.c:314
-msgid "-c is only available with snapshots"
+#: lvconvert.c:504
+#, c-format
+msgid "Can't convert logical volume \"%s\" under snapshot"
 msgstr ""
 
-#: lvcreate.c:321
-msgid "mirrors and snapshots are currently incompatible"
+#: lvconvert.c:510
+#, c-format
+msgid "Can't convert snapshot logical volume \"%s\""
 msgstr ""
 
-#: lvcreate.c:327
-msgid "mirrors and stripes are currently incompatible"
+#: lvconvert.c:516
+#, c-format
+msgid "Unable to convert pvmove LV %s"
 msgstr ""
 
-#: lvcreate.c:340 metadata/mirror.c:192
+#: lvconvert.c:548 lvrename.c:100 vgrename.c:62
 #, c-format
-msgid "%s: Required device-mapper target(s) not detected in your kernel"
+msgid "Checking for existing volume group \"%s\""
 msgstr ""
 
-#: lvcreate.c:368
-msgid "Conflicting contiguous and alloc arguments"
+#: lvconvert.c:551 lvcreate.c:863 lvrename.c:103 lvresize.c:613 pvchange.c:59
+#: pvmove.c:59 pvresize.c:69 vgcreate.c:140 vgextend.c:53 vgmerge.c:34
+#: vgmerge.c:65 vgreduce.c:476 vgrename.c:94 vgrename.c:133 vgsplit.c:240
+#: vgsplit.c:277
+#, c-format
+msgid "Can't get lock for %s"
 msgstr ""
 
-#: lvcreate.c:393
-msgid "Please specify minor number with --minor when using -My"
+#: lvconvert.c:556 lvcreate.c:492 lvrename.c:108 pvmove.c:64 vgdisplay.c:24
+#: vgmerge.c:39 vgmerge.c:72 vgreduce.c:482 vgsplit.c:245
+#, c-format
+msgid "Volume group \"%s\" doesn't exist"
 msgstr ""
 
-#: lvcreate.c:398
-msgid "Please specify major number with --major when using -My"
+#: lvconvert.c:562 lvcreate.c:498 lvrename.c:114 lvresize.c:146 pvchange.c:72
+#: pvdisplay.c:41 pvmove.c:71 pvresize.c:83 reporter.c:76 reporter.c:124
+#: toollib.c:363 toollib.c:383 toollib.c:490 toollib.c:741 vgextend.c:64
+#: vgmerge.c:46 vgmerge.c:78 vgreduce.c:489 vgreduce.c:511 vgrename.c:107
+#: vgsplit.c:252
+#, c-format
+msgid "Skipping clustered volume group %s"
 msgstr ""
 
-#: lvcreate.c:404
-msgid "--major and --minor incompatible with -Mn"
+#: lvconvert.c:567 lvcreate.c:503 lvrename.c:119 metadata/metadata.c:1377
+#: polldaemon.c:195 pvchange.c:78 pvmove.c:76 pvresize.c:89 toollib.c:163
+#: vgchange.c:534 vgck.c:34 vgconvert.c:54 vgextend.c:69 vgmerge.c:52
+#: vgmerge.c:83 vgreduce.c:541 vgremove.c:35 vgrename.c:113 vgsplit.c:258
+#, c-format
+msgid "Volume group \"%s\" is exported"
 msgstr ""
 
-#: lvcreate.c:435 pvmove.c:300 toollib.c:350 vgreduce.c:263
+#: lvconvert.c:572 lvcreate.c:508 lvremove.c:28 lvrename.c:124 pvchange.c:84
+#: pvmove.c:82 pvresize.c:95 vgchange.c:529 vgconvert.c:49 vgexport.c:42
+#: vgextend.c:74 vgmerge.c:58 vgmerge.c:88 vgreduce.c:547 vgrename.c:117
+#: vgsplit.c:270
 #, c-format
-msgid "Finding volume group \"%s\""
+msgid "Volume group \"%s\" is read-only"
 msgstr ""
 
-#: lvcreate.c:453 lvrename.c:125
+#: lvconvert.c:577
 #, c-format
-msgid "Logical volume \"%s\" already exists in volume group \"%s\""
+msgid "Logical volume \"%s\" not found in volume group \"%s\""
 msgstr ""
 
-#: lvcreate.c:459
-msgid "Metadata does not support mirroring."
+#: lvcreate.c:93 lvresize.c:105
+msgid "Please provide a volume group name"
 msgstr ""
 
-#: lvcreate.c:476
-#, c-format
-msgid "Setting stripe size %d KB to physical extent size %u KB"
+#: lvcreate.c:100
+msgid "Volume group name expected (no slash)"
 msgstr ""
 
-#: lvcreate.c:489 lvresize.c:206
+#: lvcreate.c:115
 #, c-format
-msgid "Rounding up size to full physical extent %s"
+msgid "Inconsistent volume group names given: \"%s\" and \"%s\""
 msgstr ""
 
-#: lvcreate.c:497
+#: lvcreate.c:138
 #, c-format
-msgid "Rounding size (%d extents) up to stripe boundary size (%d extents)"
+msgid "Logical volume name \"%s\" is invalid"
 msgstr ""
 
-#: lvcreate.c:505
-msgid "Can't create snapshot without using device-mapper kernel driver"
+#: lvcreate.c:151 lvresize.c:65
+msgid "Please specify either size or extents (not both)"
 msgstr ""
 
-#: lvcreate.c:510
-#, c-format
-msgid "Couldn't find origin volume '%s'."
+#: lvcreate.c:157
+msgid "Negative number of extents is invalid"
 msgstr ""
 
-#: lvcreate.c:515
-msgid "Snapshots of snapshots are not supported yet."
+#: lvcreate.c:167
+msgid "Negative size is invalid"
 msgstr ""
 
-#: lvcreate.c:520
-msgid "Snapshots of locked devices are not supported yet"
+#: lvcreate.c:189
+msgid "Negative stripesize is invalid"
 msgstr ""
 
-#: lvcreate.c:529
+#: lvcreate.c:194 lvresize.c:192
 #, c-format
-msgid "Unable to create logical volume %s with no extents"
+msgid "Stripe size cannot be larger than %s"
 msgstr ""
 
-#: lvcreate.c:536
+#: lvcreate.c:202
+msgid "Ignoring stripesize argument with single stripe"
+msgstr ""
+
+#: lvcreate.c:210 lvresize.c:330
 #, c-format
-msgid "Insufficient free extents (%u) in volume group %s: %u required"
+msgid "Using default stripesize %s"
 msgstr ""
 
-#: lvcreate.c:542
+#: lvcreate.c:215
 #, c-format
-msgid "Number of stripes (%u) must not exceed number of physical volumes (%d)"
+msgid "Too few physical volumes on command line for %d-way striping"
 msgstr ""
 
-#: lvcreate.c:549
-msgid "Can't create mirror without using device-mapper kernel driver."
+#: lvcreate.c:221
+#, c-format
+msgid "Number of stripes (%d) must be between %d and %d"
 msgstr ""
 
-#: lvcreate.c:568
-msgid "Failed to generate LV name."
+#: lvcreate.c:229 lvresize.c:407
+#, c-format
+msgid "Invalid stripe size %s"
 msgstr ""
 
-#: lvcreate.c:580 mirror/mirrored.c:218
+#: lvcreate.c:246
 #, c-format
-msgid "Using reduced mirror region size of %u sectors"
+msgid "Too few physical volumes on command line for %d-way mirroring"
 msgstr ""
 
-#: lvcreate.c:588 lvcreate.c:594 lvcreate.c:602
-msgid "log_name allocation failed. Remove new LV and retry."
+#: lvcreate.c:309
+msgid "Redundant stripes argument: default is 1"
 msgstr ""
 
-#: lvcreate.c:641
-msgid "Aborting. Failed to activate mirror log. Remove new LVs and retry."
+#: lvcreate.c:323
+msgid "Redundant mirrors argument: default is 0"
 msgstr ""
 
-#: lvcreate.c:647
-msgid "Aborting. Failed to wipe mirror log. Remove new LV and retry."
+#: lvcreate.c:325 lvresize.c:180
+msgid "Mirrors argument may not be negative"
 msgstr ""
 
-#: lvcreate.c:653
-msgid "Aborting. Failed to deactivate mirror log. Remove new LV and retry."
+#: lvcreate.c:332
+msgid "-Z is incompatible with snapshots"
 msgstr ""
 
-#: lvcreate.c:668
-msgid "Setting read ahead sectors"
+#: lvcreate.c:354
+msgid "-c is only available with snapshots"
+msgstr ""
+
+#: lvcreate.c:361
+msgid "mirrors and snapshots are currently incompatible"
+msgstr ""
+
+#: lvcreate.c:367
+msgid "mirrors and stripes are currently incompatible"
+msgstr ""
+
+#: lvcreate.c:378
+msgid "--corelog is only available with mirrors"
+msgstr ""
+
+#: lvcreate.c:383
+msgid "--nosync is only available with mirrors"
+msgstr ""
+
+#: lvcreate.c:419
+msgid "Conflicting contiguous and alloc arguments"
+msgstr ""
+
+#: lvcreate.c:448
+msgid "Please specify minor number with --minor when using -My"
+msgstr ""
+
+#: lvcreate.c:453
+msgid "Please specify major number with --major when using -My"
+msgstr ""
+
+#: lvcreate.c:459
+msgid "--major and --minor incompatible with -Mn"
 msgstr ""
 
-#: lvcreate.c:676
+#: lvcreate.c:489 pvmove.c:305 toollib.c:481 vgreduce.c:474
 #, c-format
-msgid "Setting device number to (%d, %d)"
+msgid "Finding volume group \"%s\""
 msgstr ""
 
-#: lvcreate.c:687 vgchange.c:327
+#: lvcreate.c:513 lvrename.c:129
 #, c-format
-msgid "Volume group %s does not support tags"
+msgid "Logical volume \"%s\" already exists in volume group \"%s\""
 msgstr ""
 
-#: lvcreate.c:731
-msgid ""
-"Aborting. Failed to activate snapshot exception store. Remove new LV and "
-"retry."
+#: lvcreate.c:519
+msgid "Metadata does not support mirroring."
 msgstr ""
 
-#: lvcreate.c:734
-msgid "Failed to activate new LV."
+#: lvcreate.c:536
+#, c-format
+msgid "Reducing requested stripe size %s to maximum, physical extent size %s"
 msgstr ""
 
-#: lvcreate.c:741
-msgid ""
-"Aborting. Failed to wipe snapshot exception store. Remove new LV and retry."
+#: lvcreate.c:547
+#, c-format
+msgid "Stripe size may not exceed %s"
 msgstr ""
 
-#: lvcreate.c:746
+#: lvcreate.c:559 lvresize.c:237
 #, c-format
-msgid "WARNING: \"%s\" not zeroed"
+msgid "Rounding up size to full physical extent %s"
 msgstr ""
 
-#: lvcreate.c:755
-msgid "Couldn't deactivate new snapshot."
+#: lvcreate.c:564
+#, c-format
+msgid "Volume too large (%s) for extent size %s. Upper limit is %s."
 msgstr ""
 
-#: lvcreate.c:761
+#: lvcreate.c:583
 #, c-format
-msgid "Failed to suspend origin %s"
+msgid "Please express size as %%VG or %%FREE."
 msgstr ""
 
-#: lvcreate.c:767
-msgid "Couldn't create snapshot."
+#: lvcreate.c:590
+#, c-format
+msgid "Rounding size (%d extents) up to stripe boundary size (%d extents)"
+msgstr ""
+
+#: lvcreate.c:598
+msgid "Can't create snapshot without using device-mapper kernel driver"
+msgstr ""
+
+#: lvcreate.c:604
+msgid "Clustered snapshots are not yet supported."
+msgstr ""
+
+#: lvcreate.c:613
+msgid "Snapshots of snapshots are not supported yet."
+msgstr ""
+
+#: lvcreate.c:618
+msgid "Snapshots of locked devices are not supported yet"
+msgstr ""
+
+#: lvcreate.c:625
+msgid "Snapshots and mirrors may not yet be mixed."
+msgstr ""
+
+#: lvcreate.c:634
+msgid "Unable to create new logical volume with no extents"
 msgstr ""
 
-#: lvcreate.c:776
+#: lvcreate.c:640
 #, c-format
-msgid "Problem reactivating origin %s"
+msgid "Insufficient free extents (%u) in volume group %s: %u required"
+msgstr ""
+
+#: lvcreate.c:646
+#, c-format
+msgid "Number of stripes (%u) must not exceed number of physical volumes (%d)"
+msgstr ""
+
+#: lvcreate.c:653
+msgid "Can't create mirror without using device-mapper kernel driver."
+msgstr ""
+
+#: lvcreate.c:672
+msgid "Failed to generate LV name."
+msgstr ""
+
+#: lvcreate.c:685 vgchange.c:445
+#, c-format
+msgid "Volume group %s does not support tags"
+msgstr ""
+
+#: lvcreate.c:709
+msgid ""
+"WARNING: New mirror won't be synchronised. Don't read what you didn't write!"
+msgstr ""
+
+#: lvcreate.c:733
+msgid "Setting read ahead sectors"
+msgstr ""
+
+#: lvcreate.c:741
+#, c-format
+msgid "Setting device number to (%d, %d)"
+msgstr ""
+
+#: lvcreate.c:782
+msgid ""
+"Aborting. Failed to activate snapshot exception store. Remove new LV and "
+"retry."
+msgstr ""
+
+#: lvcreate.c:787
+msgid "Failed to activate new LV."
+msgstr ""
+
+#: lvcreate.c:794
+msgid ""
+"Aborting. Failed to wipe snapshot exception store. Remove new LV and retry."
 msgstr ""
 
-#: lvcreate.c:783
+#: lvcreate.c:837
 #, c-format
 msgid "Logical volume \"%s\" created"
 msgstr ""
 
-#: lvdisplay.c:39 lvdisplay.c:48 pvdisplay.c:62 pvdisplay.c:72 vgdisplay.c:67
+#: lvdisplay.c:39 lvdisplay.c:48 pvdisplay.c:89 pvdisplay.c:99 vgdisplay.c:67
 #: vgdisplay.c:76
 msgid "Incompatible options selected"
 msgstr ""
@@ -3799,27 +4171,27 @@
 msgid "Options -v and -c are incompatible"
 msgstr ""
 
-#: lvmchange.c:20
+#: lvmchange.c:21
 msgid "With LVM2 and the device mapper, this program is obsolete."
 msgstr ""
 
-#: lvmcmdline.c:269
+#: lvmcmdline.c:289
 msgid "Minor number outside range 0-255"
 msgstr ""
 
-#: lvmcmdline.c:284
+#: lvmcmdline.c:304
 msgid "Major number outside range 0-255"
 msgstr ""
 
-#: lvmcmdline.c:373
+#: lvmcmdline.c:402
 msgid "Couldn't allocate memory."
 msgstr ""
 
-#: lvmcmdline.c:422
+#: lvmcmdline.c:451
 msgid "Out of memory."
 msgstr ""
 
-#: lvmcmdline.c:475
+#: lvmcmdline.c:504
 #, c-format
 msgid ""
 "%s: %s\n"
@@ -3827,150 +4199,142 @@
 "%s"
 msgstr ""
 
-#: lvmcmdline.c:569
+#: lvmcmdline.c:598
 msgid "Unrecognised option."
 msgstr ""
 
-#: lvmcmdline.c:575
+#: lvmcmdline.c:604
 #, c-format
 msgid "Option%s%c%s%s may not be repeated"
 msgstr ""
 
-#: lvmcmdline.c:584
+#: lvmcmdline.c:613
 msgid "Option requires argument."
 msgstr ""
 
-#: lvmcmdline.c:591
+#: lvmcmdline.c:620
 #, c-format
 msgid "Invalid argument %s"
 msgstr ""
 
-#: lvmcmdline.c:610
+#: lvmcmdline.c:639
 #, c-format
 msgid "%s and %s are synonyms.  Please only supply one."
 msgstr ""
 
-#: lvmcmdline.c:636
+#: lvmcmdline.c:667
 #, c-format
 msgid "LVM version:     %s"
 msgstr ""
 
-#: lvmcmdline.c:638
+#: lvmcmdline.c:669
 #, c-format
 msgid "Library version: %s"
 msgstr ""
 
-#: lvmcmdline.c:640
+#: lvmcmdline.c:671
 #, c-format
 msgid "Driver version:  %s"
 msgstr ""
 
-#: lvmcmdline.c:677
+#: lvmcmdline.c:706
 msgid "Partial mode. Incomplete volume groups will be activated read-only."
 msgstr ""
 
-#: lvmcmdline.c:727
+#: lvmcmdline.c:729
+msgid "--trustcache is incompatible with --all"
+msgstr ""
+
+#: lvmcmdline.c:733
+msgid ""
+"WARNING: Cache file of PVs will be trusted.  New devices holding PVs may get "
+"ignored."
+msgstr ""
+
+#: lvmcmdline.c:767
 msgid "Available lvm commands:"
 msgstr ""
 
-#: lvmcmdline.c:728
+#: lvmcmdline.c:768
 msgid "Use 'lvm help <command>' for more information"
 msgstr ""
 
-#: lvmcmdline.c:734
+#: lvmcmdline.c:774
 #, c-format
 msgid "%-16.16s%s"
 msgstr ""
 
-#: lvmcmdline.c:799
+#: lvmcmdline.c:794
+msgid "Failed to set overridden configuration entries."
+msgstr ""
+
+#: lvmcmdline.c:858
 msgid "Couldn't copy command line."
 msgstr ""
 
-#: lvmcmdline.c:812
+#: lvmcmdline.c:871
 #, c-format
 msgid "Parsing: %s"
 msgstr ""
 
-#: lvmcmdline.c:818
+#: lvmcmdline.c:877
 msgid "Error during parsing of command line."
 msgstr ""
 
-#: lvmcmdline.c:827
+#: lvmcmdline.c:890
 msgid "Updated config file invalid. Aborting."
 msgstr ""
 
-#: lvmcmdline.c:836
+#: lvmcmdline.c:899
 #, c-format
 msgid "Processing: %s"
 msgstr ""
 
-#: lvmcmdline.c:839
+#: lvmcmdline.c:902
 msgid "O_DIRECT will be used"
 msgstr ""
 
-#: lvmcmdline.c:852
+#: lvmcmdline.c:915
 #, c-format
 msgid "Locking type %d initialisation failed."
 msgstr ""
 
-#: lvmcmdline.c:864
+#: lvmcmdline.c:927
 msgid "Test mode: Wiping internal cache"
 msgstr ""
 
-#: lvmcmdline.c:994
-#, c-format
-msgid "Line too long (max 255) beginning: %s"
-msgstr ""
-
-#: lvmcmdline.c:1001
-#, c-format
-msgid "Too many arguments: %s"
-msgstr ""
-
-#: lvmcmdline.c:1133
-msgid "$HOME/.lvm_history: path too long"
-msgstr ""
-
-#: lvmcmdline.c:1148
+#: lvmcmdline.c:951
 #, c-format
-msgid "Couldn't read history from %s."
+msgid "Completed: %s"
 msgstr ""
 
-#: lvmcmdline.c:1163
+#: lvmcmdline.c:1073
 #, c-format
-msgid "Couldn't write history to %s."
-msgstr ""
-
-#: lvmcmdline.c:1196
-msgid "Too many arguments, sorry."
-msgstr ""
-
-#: lvmcmdline.c:1210
-msgid "Exiting."
+msgid "Line too long (max 255) beginning: %s"
 msgstr ""
 
-#: lvmcmdline.c:1216
+#: lvmcmdline.c:1080
 #, c-format
-msgid "No such command '%s'.  Try 'help'."
+msgid "Too many arguments: %s"
 msgstr ""
 
-#: lvmcmdline.c:1342
+#: lvmcmdline.c:1125
 msgid "Failed to create LVM1 tool pathname"
 msgstr ""
 
-#: lvmcmdline.c:1390
+#: lvmcmdline.c:1173
 msgid "Falling back to LVM1 tools, but no command specified."
 msgstr ""
 
-#: lvmcmdline.c:1406
+#: lvmcmdline.c:1189
 msgid "Please supply an LVM command."
 msgstr ""
 
-#: lvmcmdline.c:1420
+#: lvmcmdline.c:1203
 msgid "No such command.  Try 'help'."
 msgstr ""
 
-#: lvmdiskscan.c:38 lvmdiskscan.c:107
+#: lvmdiskscan.c:38 lvmdiskscan.c:108
 msgid "dev_iter_create failed"
 msgstr ""
 
@@ -3979,7 +4343,7 @@
 msgid "%-*s [%15s] %s"
 msgstr ""
 
-#: lvmdiskscan.c:83 lvmdiskscan.c:116
+#: lvmdiskscan.c:83 lvmdiskscan.c:117
 #, c-format
 msgid "Couldn't get size of \"%s\""
 msgstr ""
@@ -3989,476 +4353,552 @@
 msgid "dev_close on \"%s\" failed"
 msgstr ""
 
-#: lvmdiskscan.c:102
+#: lvmdiskscan.c:103
 msgid "WARNING: only considering LVM devices"
 msgstr ""
 
-#: lvmdiskscan.c:136
+#: lvmdiskscan.c:137
 #, c-format
 msgid "%d disk%s"
 msgstr ""
 
-#: lvmdiskscan.c:138
+#: lvmdiskscan.c:139
 #, c-format
 msgid "%d partition%s"
 msgstr ""
 
-#: lvmdiskscan.c:141
+#: lvmdiskscan.c:142
 #, c-format
 msgid "%d LVM physical volume whole disk%s"
 msgstr ""
 
-#: lvmdiskscan.c:143
+#: lvmdiskscan.c:144
 #, c-format
 msgid "%d LVM physical volume%s"
 msgstr ""
 
-#: lvremove.c:32
+#: lvremove.c:33
 #, c-format
 msgid "Can't remove logical volume \"%s\" under snapshot"
 msgstr ""
 
-#: lvremove.c:38
+#: lvremove.c:39
 #, c-format
 msgid "Can't remove logical volume %s used by a mirror"
 msgstr ""
 
-#: lvremove.c:44
+#: lvremove.c:45
 #, c-format
 msgid "Can't remove logical volume %s used as mirror log"
 msgstr ""
 
-#: lvremove.c:50
+#: lvremove.c:51
 #, c-format
 msgid "Can't remove locked LV %s"
 msgstr ""
 
-#: lvremove.c:58
+#: lvremove.c:59
 #, c-format
 msgid "Can't remove open logical volume \"%s\""
 msgstr ""
 
-#: lvremove.c:67
+#: lvremove.c:68
 #, c-format
 msgid "Logical volume \"%s\" not removed"
 msgstr ""
 
-#: lvremove.c:78
+#: lvremove.c:82
+#, c-format
+msgid "Can't get exclusive access to volume \"%s\""
+msgstr ""
+
+#: lvremove.c:90
 #, c-format
 msgid "Unable to deactivate logical volume \"%s\""
 msgstr ""
 
-#: lvremove.c:84
+#: lvremove.c:97
 #, c-format
 msgid "Removing snapshot %s"
 msgstr ""
 
-#: lvremove.c:91
+#: lvremove.c:104
 #, c-format
 msgid "Releasing logical volume \"%s\""
 msgstr ""
 
-#: lvremove.c:93
+#: lvremove.c:106
 #, c-format
 msgid "Error releasing logical volume \"%s\""
 msgstr ""
 
-#: lvremove.c:106
+#: lvremove.c:122
 #, c-format
-msgid "Logical volume \"%s\" successfully removed"
+msgid "Failed to refresh %s without snapshot."
 msgstr ""
 
-#: lvremove.c:113
-msgid "Please enter one or more logical volume paths"
+#: lvremove.c:124
+#, c-format
+msgid "Failed to resume %s."
 msgstr ""
 
-#: lvrename.c:40
+#: lvremove.c:127
 #, c-format
-msgid "Please use a single volume group name (\"%s\" or \"%s\")"
+msgid "Logical volume \"%s\" successfully removed"
+msgstr ""
+
+#: lvremove.c:134
+msgid "Please enter one or more logical volume paths"
 msgstr ""
 
-#: lvrename.c:49
+#: lvrename.c:47
 msgid "Old and new logical volume names required"
 msgstr ""
 
-#: lvrename.c:61
+#: lvrename.c:59
 #, c-format
 msgid "Logical volume names must have the same volume group (\"%s\" or \"%s\")"
 msgstr ""
 
-#: lvrename.c:76
+#: lvrename.c:74
+#, c-format
 msgid "New logical volume path exceeds maximum length of %zu!"
 msgstr ""
 
-#: lvrename.c:82
+#: lvrename.c:80
 msgid "New logical volume name may not be blank"
 msgstr ""
 
-#: lvrename.c:92
+#: lvrename.c:90
 #, c-format
 msgid "New logical volume name \"%s\" is invalid"
 msgstr ""
 
-#: lvrename.c:98
+#: lvrename.c:96
 msgid "Old and new logical volume names must differ"
 msgstr ""
 
-#: lvrename.c:131
+#: lvrename.c:135
 #, c-format
 msgid "Existing logical volume \"%s\" not found in volume group \"%s\""
 msgstr ""
 
-#: lvrename.c:139
+#: lvrename.c:143
 #, c-format
 msgid "Cannot rename locked LV %s"
 msgstr ""
 
-#: lvrename.c:149
+#: lvrename.c:150 lvrename.c:158
+#, c-format
+msgid "Mirrored LV, \"%s\" cannot be renamed: %s"
+msgstr ""
+
+#: lvrename.c:169
 msgid "Failed to allocate space for new name"
 msgstr ""
 
-#: lvrename.c:153 vgmerge.c:190 vgrename.c:134
+#: lvrename.c:173 vgmerge.c:223 vgrename.c:165
 msgid "Writing out updated volume group"
 msgstr ""
 
-#: lvrename.c:176
+#: lvrename.c:197
 #, c-format
 msgid "Renamed \"%s\" to \"%s\" in volume group \"%s\""
 msgstr ""
 
-#: lvresize.c:80
+#: lvresize.c:83
 msgid "Negative argument not permitted - use lvreduce"
 msgstr ""
 
-#: lvresize.c:85
+#: lvresize.c:88
 msgid "Positive sign not permitted - use lvextend"
 msgstr ""
 
-#: lvresize.c:93
+#: lvresize.c:96
 msgid "Please provide the logical volume name"
 msgstr ""
 
-#: lvresize.c:138
+#: lvresize.c:140
 #, c-format
 msgid "Volume group %s doesn't exist"
 msgstr ""
 
-#: lvresize.c:143
+#: lvresize.c:151
 #, c-format
 msgid "Volume group %s is exported"
 msgstr ""
 
-#: lvresize.c:148
+#: lvresize.c:156
 #, c-format
 msgid "Volume group %s is read-only"
 msgstr ""
 
-#: lvresize.c:154
+#: lvresize.c:162
 #, c-format
 msgid "Logical volume %s not found in volume group %s"
 msgstr ""
 
-#: lvresize.c:163
+#: lvresize.c:171
 msgid "Varied striping not supported. Ignoring."
 msgstr ""
 
-#: lvresize.c:170
+#: lvresize.c:178
 msgid "Mirrors not supported. Ignoring."
 msgstr ""
 
-#: lvresize.c:175
+#: lvresize.c:187
 msgid "Stripesize may not be negative."
 msgstr ""
 
-#: lvresize.c:182
+#: lvresize.c:198
 msgid "Varied stripesize not supported. Ignoring."
 msgstr ""
 
-#: lvresize.c:184
+#: lvresize.c:200
+#, c-format
+msgid "Reducing stripe size %s to maximum, physical extent size %s"
+msgstr ""
+
+#: lvresize.c:211
 msgid "Mirrors and striping cannot be combined yet."
 msgstr ""
 
-#: lvresize.c:192
+#: lvresize.c:215
+msgid "Stripe size must be power of 2"
+msgstr ""
+
+#: lvresize.c:223
 #, c-format
 msgid "Can't resize locked LV %s"
 msgstr ""
 
-#: lvresize.c:219
+#: lvresize.c:263
 #, c-format
 msgid "Unable to reduce %s below 1 extent"
 msgstr ""
 
-#: lvresize.c:228
+#: lvresize.c:272
 msgid "New size of 0 not permitted"
 msgstr ""
 
-#: lvresize.c:233 lvresize.c:365
+#: lvresize.c:277 lvresize.c:414
 #, c-format
 msgid "New size (%d extents) matches existing size (%d extents)"
 msgstr ""
 
-#: lvresize.c:248
+#: lvresize.c:291
 #, c-format
 msgid "VolumeType does not match (%s)"
 msgstr ""
 
-#: lvresize.c:265
+#: lvresize.c:308
 msgid "Please specify number of stripes (-i) and stripesize (-I)"
 msgstr ""
 
-#: lvresize.c:279
+#: lvresize.c:322
 #, c-format
-msgid "Using stripesize of last segment %dKB"
+msgid "Using stripesize of last segment %s"
 msgstr ""
 
-#: lvresize.c:303
+#: lvresize.c:346
 #, c-format
 msgid "Extending %u mirror images."
 msgstr ""
 
-#: lvresize.c:309
+#: lvresize.c:352
 msgid "Cannot vary number of mirrors in LV yet."
 msgstr ""
 
-#: lvresize.c:319
+#: lvresize.c:362
 msgid "Ignoring stripes, stripesize and mirrors arguments when reducing"
 msgstr ""
 
-#: lvresize.c:348
+#: lvresize.c:391
 msgid "Stripesize for striped segment should not be 0!"
 msgstr ""
 
-#: lvresize.c:357
+#: lvresize.c:400
 #, c-format
 msgid ""
 "Rounding size (%d extents) down to stripe boundary size for segment (%d "
 "extents)"
 msgstr ""
 
-#: lvresize.c:372
+#: lvresize.c:421
 #, c-format
 msgid "New size given (%d extents) not larger than existing size (%d extents)"
 msgstr ""
 
-#: lvresize.c:382
+#: lvresize.c:431
 #, c-format
 msgid "New size given (%d extents) not less than existing size (%d extents)"
 msgstr ""
 
-#: lvresize.c:392
+#: lvresize.c:441
 msgid "Mirrors cannot be resized while active yet."
 msgstr ""
 
-#: lvresize.c:398
+#: lvresize.c:447
 msgid "Snapshot origin volumes cannot be reduced in size yet."
 msgstr ""
 
-#: lvresize.c:406
+#: lvresize.c:455
 msgid ""
 "Snapshot origin volumes can be resized only while inactive: try lvchange -an"
 msgstr ""
 
-#: lvresize.c:414
+#: lvresize.c:463
 msgid "Ignoring PVs on command line when reducing"
 msgstr ""
 
-#: lvresize.c:425
+#: lvresize.c:474
 msgid "lv_info failed: aborting"
 msgstr ""
 
-#: lvresize.c:430
+#: lvresize.c:479
 #, c-format
 msgid "Logical volume %s must be activated before resizing filesystem"
 msgstr ""
 
-#: lvresize.c:436
+#: lvresize.c:485
 #, c-format
 msgid "WARNING: Reducing active%s logical volume to %s"
 msgstr ""
 
-#: lvresize.c:442
+#: lvresize.c:490
 msgid "THIS MAY DESTROY YOUR DATA (filesystem etc.)"
 msgstr ""
 
-#: lvresize.c:449
+#: lvresize.c:497
 #, c-format
 msgid "Logical volume %s NOT reduced"
 msgstr ""
 
-#: lvresize.c:460
+#: lvresize.c:508
 #, c-format
 msgid "Couldn't create LV path for %s"
 msgstr ""
 
-#: lvresize.c:468
+#: lvresize.c:516
 msgid "Couldn't generate new LV size string"
 msgstr ""
 
-#: lvresize.c:492
+#: lvresize.c:540
 #, c-format
 msgid "%sing logical volume %s to %s"
 msgstr ""
 
-#: lvresize.c:542
+#: lvresize.c:589
 #, c-format
 msgid "Logical volume %s successfully resized"
 msgstr ""
 
-#: lvresize.c:564
+#: lvresize.c:611
 #, c-format
 msgid "Finding volume group %s"
 msgstr ""
 
-#: lvscan.c:40
+#: lvscan.c:64
 #, c-format
 msgid "%s%s '%s%s/%s' [%s] %s"
 msgstr ""
 
-#: lvscan.c:55
+#: lvscan.c:79
 msgid "No additional command line arguments allowed"
 msgstr ""
 
-#: metadata/lv_manip.c:78
+#: metadata/lv_manip.c:96
 msgid "alloc_lv_segment: Missing segtype."
 msgstr ""
 
-#: metadata/lv_manip.c:110
+#: metadata/lv_manip.c:131
 msgid "Failed to find snapshot segtype"
 msgstr ""
 
-#: metadata/lv_manip.c:118
+#: metadata/lv_manip.c:139
 msgid "Couldn't allocate new snapshot segment."
 msgstr ""
 
-#: metadata/lv_manip.c:236
+#: metadata/lv_manip.c:280
 #, c-format
 msgid "Segment extent reduction %unot divisible by #stripes %u"
 msgstr ""
 
-#: metadata/lv_manip.c:381
+#: metadata/lv_manip.c:445
 msgid "Striped mirrors are not supported yet"
 msgstr ""
 
-#: metadata/lv_manip.c:386
+#: metadata/lv_manip.c:450
 msgid "Can't mix striping or mirroring with creation of a mirrored PV yet"
 msgstr ""
 
-#: metadata/lv_manip.c:392
+#: metadata/lv_manip.c:456
 msgid "Can't mix striping or pvmove with a mirror log yet."
 msgstr ""
 
-#: metadata/lv_manip.c:407
+#: metadata/lv_manip.c:471
 msgid "allocation handle allocation failed"
 msgstr ""
 
-#: metadata/lv_manip.c:415
+#: metadata/lv_manip.c:481
 msgid "allocation pool creation failed"
 msgstr ""
 
-#: metadata/lv_manip.c:462
+#: metadata/lv_manip.c:516 report/report.c:92 report/report.c:152
+msgid "dm_pool_begin_object failed"
+msgstr ""
+
+#: metadata/lv_manip.c:523 metadata/lv_manip.c:528 metadata/lv_manip.c:535
+#: report/report.c:112 report/report.c:123 report/report.c:129
+#: report/report.c:135 report/report.c:159 report/report.c:165
+msgid "dm_pool_grow_object failed"
+msgstr ""
+
+#: metadata/lv_manip.c:541
+#, c-format
+msgid "Parallel PVs at LE %u length %u: %s"
+msgstr ""
+
+#: metadata/lv_manip.c:574
 msgid "Couldn't allocate new LV segment."
 msgstr ""
 
-#: metadata/lv_manip.c:542
+#: metadata/lv_manip.c:654
 msgid "alloced_area allocation failed"
 msgstr ""
 
-#: metadata/lv_manip.c:754
+#: metadata/lv_manip.c:705
+#, c-format
+msgid "Failed to find segment for %s extent %u"
+msgstr ""
+
+#: metadata/lv_manip.c:907
+#, c-format
+msgid "Insufficient free space: %u extents needed, but only %u available"
+msgstr ""
+
+#: metadata/lv_manip.c:1081
 msgid "_allocate called with no work to do!"
 msgstr ""
 
-#: metadata/lv_manip.c:775
+#: metadata/lv_manip.c:1105
 msgid "Not enough PVs with free space available for parallel allocation."
 msgstr ""
 
-#: metadata/lv_manip.c:777
+#: metadata/lv_manip.c:1107
 msgid "Consider --alloc anywhere if desperate."
 msgstr ""
 
-#: metadata/lv_manip.c:785
+#: metadata/lv_manip.c:1120
 msgid "Couldn't allocate areas array."
 msgstr ""
 
-#: metadata/lv_manip.c:822
+#: metadata/lv_manip.c:1137
 #, c-format
 msgid ""
 "Insufficient suitable %sallocatable extents for logical volume %s: %u more "
 "required"
 msgstr ""
 
-#: metadata/lv_manip.c:846
+#: metadata/lv_manip.c:1147
+#, c-format
+msgid "Insufficient extents for log allocation for logical volume %s."
+msgstr ""
+
+#: metadata/lv_manip.c:1168
 msgid "Couldn't allocate new zero segment."
 msgstr ""
 
-#: metadata/lv_manip.c:878
+#: metadata/lv_manip.c:1201
 msgid "allocate_extents does not handle virtual segments"
 msgstr ""
 
-#: metadata/lv_manip.c:884
+#: metadata/lv_manip.c:1207
 #, c-format
 msgid "Metadata format (%s) does not support required LV segment type (%s)."
 msgstr ""
 
-#: metadata/lv_manip.c:887
+#: metadata/lv_manip.c:1210
 msgid "Consider changing the metadata format by running vgconvert."
 msgstr ""
 
-#: metadata/lv_manip.c:928
+#: metadata/lv_manip.c:1251
 msgid "Missing segtype in lv_add_segment()."
 msgstr ""
 
-#: metadata/lv_manip.c:933
+#: metadata/lv_manip.c:1256
 msgid "lv_add_segment cannot handle virtual segments"
 msgstr ""
 
-#: metadata/lv_manip.c:947
+#: metadata/lv_manip.c:1270
 msgid "Couldn't merge segments after extending logical volume."
 msgstr ""
 
-#: metadata/lv_manip.c:969
+#: metadata/lv_manip.c:1292
 msgid "Log segments can only be added to an empty LV"
 msgstr ""
 
-#: metadata/lv_manip.c:978
+#: metadata/lv_manip.c:1301
 msgid "Couldn't allocate new mirror log segment."
 msgstr ""
 
-#: metadata/lv_manip.c:1016
+#: metadata/lv_manip.c:1339
 #, c-format
 msgid "Log LV %s is empty."
 msgstr ""
 
-#: metadata/lv_manip.c:1026
+#: metadata/lv_manip.c:1349
 msgid "Couldn't allocate new mirror segment."
 msgstr ""
 
-#: metadata/lv_manip.c:1087
+#: metadata/lv_manip.c:1384
+msgid "Mirrored LV must only have one segment."
+msgstr ""
+
+#: metadata/lv_manip.c:1394
+#, c-format
+msgid "Failed to allocate widened LV segment for %s."
+msgstr ""
+
+#: metadata/lv_manip.c:1446
 #, c-format
 msgid "Aborting. Failed to extend %s."
 msgstr ""
 
-#: metadata/lv_manip.c:1140
+#: metadata/lv_manip.c:1499
 #, c-format
 msgid "Maximum number of logical volumes (%u) reached in volume group %s"
 msgstr ""
 
-#: metadata/lv_manip.c:1147
+#: metadata/lv_manip.c:1506
 msgid "Failed to generate unique name for the new logical volume"
 msgstr ""
 
-#: metadata/lv_manip.c:1153
+#: metadata/lv_manip.c:1512
 #, c-format
 msgid "Creating logical volume %s"
 msgstr ""
 
-#: metadata/lv_manip.c:1157
+#: metadata/lv_manip.c:1516
 msgid "lv_list allocation failed"
 msgstr ""
 
-#: metadata/lv_manip.c:1167
+#: metadata/lv_manip.c:1526
 msgid "lv name strdup failed"
 msgstr ""
 
+#: metadata/lv_manip.c:1574 metadata/metadata.c:986
+msgid "pv_list allocation failed"
+msgstr ""
+
+#: metadata/lv_manip.c:1596
+msgid "parallel_areas allocation failed"
+msgstr ""
+
+#: metadata/lv_manip.c:1604
+msgid "allocation failed"
+msgstr ""
+
 #: metadata/merge.c:72
 #, c-format
 msgid "LV %s invalid: segment %u should begin at LE %u (found %u)."
@@ -4471,475 +4911,665 @@
 
 #: metadata/merge.c:90
 #, c-format
+msgid "LV %s: segment %u has log LV but is not mirrored"
+msgstr ""
+
+#: metadata/merge.c:97
+#, c-format
+msgid "LV %s: segment %u log LV %s is not a mirror log"
+msgstr ""
+
+#: metadata/merge.c:105
+#, c-format
+msgid "LV %s: segment %u log LV does not point back to mirror segment"
+msgstr ""
+
+#: metadata/merge.c:115
+#, c-format
+msgid "LV %s: segment %u mirror image is not mirrored"
+msgstr ""
+
+#: metadata/merge.c:124
+#, c-format
 msgid "LV %s: segment %u has unassigned area %u."
 msgstr ""
 
-#: metadata/merge.c:98
+#: metadata/merge.c:132
 #, c-format
 msgid "LV %s: segment %u has inconsistent PV area %u"
 msgstr ""
 
-#: metadata/merge.c:107
+#: metadata/merge.c:141
 #, c-format
 msgid "LV %s: segment %u has inconsistent LV area %u"
 msgstr ""
 
-#: metadata/merge.c:128
+#: metadata/merge.c:152
+#, c-format
+msgid "LV %s: segment %u mirror image %u missing mirror ptr"
+msgstr ""
+
+#: metadata/merge.c:174
 #, c-format
 msgid "LV %s: inconsistent LE count %u != %u"
 msgstr ""
 
-#: metadata/merge.c:149
+#: metadata/merge.c:195
 #, c-format
 msgid "Unable to split the %s segment at LE %u in LV %s"
 msgstr ""
 
-#: metadata/merge.c:162
+#: metadata/merge.c:208
 msgid "Couldn't allocate cloned LV segment."
 msgstr ""
 
-#: metadata/merge.c:167
+#: metadata/merge.c:213
 msgid "LV segment tags duplication failed"
 msgstr ""
 
-#: metadata/merge.c:194
+#: metadata/merge.c:240
 #, c-format
 msgid "Split %s:%u[%u] at %u: %s LE %u"
 msgstr ""
 
-#: metadata/merge.c:210
+#: metadata/merge.c:256
 #, c-format
 msgid "Split %s:%u[%u] at %u: %s PE %u"
 msgstr ""
 
-#: metadata/merge.c:217 metadata/metadata.c:469
+#: metadata/merge.c:263 metadata/metadata.c:495
 #, c-format
 msgid "Unassigned area %u found in segment"
 msgstr ""
 
-#: metadata/merge.c:236
+#: metadata/merge.c:282
 #, c-format
 msgid "Segment with extent %u in LV %s not found"
 msgstr ""
 
-#: metadata/metadata.c:35
+#: metadata/metadata.c:43
 #, c-format
 msgid "Adding physical volume '%s' to volume group '%s'"
 msgstr ""
 
-#: metadata/metadata.c:39
+#: metadata/metadata.c:47 metadata/metadata.c:1008
 #, c-format
 msgid "pv_list allocation for '%s' failed"
 msgstr ""
 
-#: metadata/metadata.c:45
+#: metadata/metadata.c:53
 #, c-format
 msgid "%s not identified as an existing physical volume"
 msgstr ""
 
-#: metadata/metadata.c:51
+#: metadata/metadata.c:59
 #, c-format
 msgid "Physical volume '%s' is already in volume group '%s'"
 msgstr ""
 
-#: metadata/metadata.c:57
+#: metadata/metadata.c:65
 #, c-format
 msgid "Physical volume %s is of different format type (%s)"
 msgstr ""
 
-#: metadata/metadata.c:63 metadata/metadata.c:175
+#: metadata/metadata.c:72
+#, c-format
+msgid "Physical volume %s might be constructed from same volume group %s"
+msgstr ""
+
+#: metadata/metadata.c:78 metadata/metadata.c:199
 #, c-format
 msgid "vg->name allocation failed for '%s'"
 msgstr ""
 
-#: metadata/metadata.c:86
+#: metadata/metadata.c:100
 #, c-format
 msgid "Format-specific setup of physical volume '%s' failed."
 msgstr ""
 
-#: metadata/metadata.c:92
+#: metadata/metadata.c:106
 #, c-format
 msgid "Physical volume '%s' listed more than once."
 msgstr ""
 
-#: metadata/metadata.c:98
+#: metadata/metadata.c:112
 #, c-format
 msgid "No space for '%s' - volume group '%s' holds max %d physical volume(s)."
 msgstr ""
 
-#: metadata/metadata.c:125
+#: metadata/metadata.c:127
+#, c-format
+msgid "Unable to add %s to %s: new extent count (%lu) exceeds limit (%u)."
+msgstr ""
+
+#: metadata/metadata.c:148
 msgid "PV tags duplication failed"
 msgstr ""
 
-#: metadata/metadata.c:146
+#: metadata/metadata.c:170
 #, c-format
 msgid "get_pv_from_vg_by_id: vg_read failed to read VG %s"
 msgstr ""
 
-#: metadata/metadata.c:152
+#: metadata/metadata.c:176
 #, c-format
 msgid "Warning: Volume group %s is not consistent"
 msgstr ""
 
-#: metadata/metadata.c:181
+#: metadata/metadata.c:205
 #, c-format
 msgid "pv->vg_name allocation failed for '%s'"
 msgstr ""
 
-#: metadata/metadata.c:198
+#: metadata/metadata.c:222
 #, c-format
 msgid "Unable to add physical volume '%s' to volume group '%s'."
 msgstr ""
 
-#: metadata/metadata.c:236
+#: metadata/metadata.c:260
 #, c-format
 msgid "A volume group called '%s' already exists."
 msgstr ""
 
-#: metadata/metadata.c:242
+#: metadata/metadata.c:266
 #, c-format
 msgid "Couldn't create uuid for volume group '%s'."
 msgstr ""
 
-#: metadata/metadata.c:283 metadata/metadata.c:934 metadata/metadata.c:977
+#: metadata/metadata.c:309 metadata/metadata.c:1085 metadata/metadata.c:1151
 msgid "Failed to create format instance"
 msgstr ""
 
-#: metadata/metadata.c:289
+#: metadata/metadata.c:315
 #, c-format
 msgid "Format specific setup of volume group '%s' failed."
 msgstr ""
 
-#: metadata/metadata.c:312
+#: metadata/metadata.c:338
 #, c-format
-msgid "New size %llu for %s%s not an exact number of new extents."
+msgid "New size %lu for %s%s not an exact number of new extents."
 msgstr ""
 
-#: metadata/metadata.c:320
+#: metadata/metadata.c:346
 #, c-format
-msgid "New extent count %llu for %s%s exceeds 32 bits."
+msgid "New extent count %lu for %s%s exceeds 32 bits."
 msgstr ""
 
-#: metadata/metadata.c:502
+#: metadata/metadata.c:556
 #, c-format
 msgid "Failed to create random uuid for %s."
 msgstr ""
 
-#: metadata/metadata.c:517 vgreduce.c:196 vgremove.c:62
-#, c-format
-msgid "%s: Couldn't get size."
-msgstr ""
-
-#: metadata/metadata.c:523
+#: metadata/metadata.c:575 pvresize.c:128
 #, c-format
 msgid "WARNING: %s: Overriding real size. You could lose data."
 msgstr ""
 
-#: metadata/metadata.c:525
+#: metadata/metadata.c:577
 #, c-format
-msgid "%s: Pretending size is %llu sectors."
+msgid "%s: Pretending size is %lu sectors."
 msgstr ""
 
-#: metadata/metadata.c:531
+#: metadata/metadata.c:583 pvresize.c:136
 #, c-format
 msgid "%s: Size must exceed minimum of %ld sectors."
 msgstr ""
 
-#: metadata/metadata.c:549
+#: metadata/metadata.c:601
 #, c-format
 msgid "%s: Format-specific setup of physical volume failed."
 msgstr ""
 
-#: metadata/metadata.c:647
+#: metadata/metadata.c:699
 #, c-format
 msgid "Physical volume %s not found"
 msgstr ""
 
-#: metadata/metadata.c:652
+#: metadata/metadata.c:704
 #, c-format
 msgid "Physical volume %s not in a volume group"
 msgstr ""
 
-#: metadata/metadata.c:705 metadata/metadata.c:1066
+#: metadata/metadata.c:780
+#, c-format
+msgid "Internal error: Duplicate PV id %s detected for %s in %s."
+msgstr ""
+
+#: metadata/metadata.c:789
+#, c-format
+msgid "Internal error: VG name for PV %s is corrupted"
+msgstr ""
+
+#: metadata/metadata.c:796 metadata/metadata.c:1278
 #, c-format
 msgid "Internal error: PV segments corrupted in %s."
 msgstr ""
 
-#: metadata/metadata.c:712 metadata/metadata.c:1073
+#: metadata/metadata.c:806
+#, c-format
+msgid "Internal error: Duplicate LV name %s detected in %s."
+msgstr ""
+
+#: metadata/metadata.c:816
+#, c-format
+msgid "Internal error: Duplicate LV id %s detected for %s and %s in %s."
+msgstr ""
+
+#: metadata/metadata.c:827 metadata/metadata.c:1285
 #, c-format
 msgid "Internal error: LV segments corrupted in %s."
 msgstr ""
 
-#: metadata/metadata.c:736
+#: metadata/metadata.c:851
 #, c-format
 msgid "Cannot change metadata for partial volume group %s"
 msgstr ""
 
-#: metadata/metadata.c:742
+#: metadata/metadata.c:857
 msgid "Aborting vg_write: No metadata areas to write to!"
 msgstr ""
 
-#: metadata/metadata.c:751
+#: metadata/metadata.c:866
 msgid "Format does not support writing volumegroup metadata areas"
 msgstr ""
 
-#: metadata/metadata.c:854
+#: metadata/metadata.c:969
 msgid "vg allocation failed"
 msgstr ""
 
-#: metadata/metadata.c:862
+#: metadata/metadata.c:977
 msgid "vg name allocation failed"
 msgstr ""
 
-#: metadata/metadata.c:871
-msgid "pv_list allocation failed"
-msgstr ""
-
-#: metadata/metadata.c:901
+#: metadata/metadata.c:1049
 msgid "Internal error: vg_read requires vgname with pre-commit."
 msgstr ""
 
-#: metadata/metadata.c:927 metadata/metadata.c:970
+#: metadata/metadata.c:1113 metadata/metadata.c:1122
 #, c-format
-msgid "Internal error: %s doesn't support pre-commit"
+msgid "Cached VG %s had incorrect PV list"
 msgstr ""
 
-#: metadata/metadata.c:1014
+#: metadata/metadata.c:1201
 #, c-format
 msgid "Inconsistent pre-commit metadata copies for volume group %s"
 msgstr ""
 
-#: metadata/metadata.c:1025
+#: metadata/metadata.c:1212
 #, c-format
 msgid "Inconsistent metadata copies found for partial volume group %s"
 msgstr ""
 
-#: metadata/metadata.c:1031
+#: metadata/metadata.c:1220
+#, c-format
+msgid "Inconsistent metadata UUIDs found for volume group %s"
+msgstr ""
+
+#: metadata/metadata.c:1226
 #, c-format
-msgid "Inconsistent metadata copies found - updating to use version %u"
+msgid "Inconsistent metadata found for VG %s - updating to use version %u"
 msgstr ""
 
-#: metadata/metadata.c:1034
+#: metadata/metadata.c:1230
 msgid "Automatic metadata correction failed"
 msgstr ""
 
-#: metadata/metadata.c:1038
+#: metadata/metadata.c:1235
 msgid "Automatic metadata correction commit failed"
 msgstr ""
 
-#: metadata/metadata.c:1045
+#: metadata/metadata.c:1247
+#, c-format
+msgid "Removing PV %s (%s) that no longer belongs to VG %s"
+msgstr ""
+
+#: metadata/metadata.c:1257
 #, c-format
 msgid "WARNING: Interrupted pvmove detected in volume group %s"
 msgstr ""
 
-#: metadata/metadata.c:1047
+#: metadata/metadata.c:1259
 msgid "Please restore the metadata by running vgcfgrestore."
 msgstr ""
 
-#: metadata/metadata.c:1108 metadata/metadata.c:1138
+#: metadata/metadata.c:1316 metadata/metadata.c:1348
 #, c-format
 msgid "Volume group %s metadata is inconsistent"
 msgstr ""
 
-#: metadata/metadata.c:1126
+#: metadata/metadata.c:1335
 msgid "vg_read_by_vgid: get_vgs failed"
 msgstr ""
 
-#: metadata/metadata.c:1158
+#: metadata/metadata.c:1369
 #, c-format
 msgid "Finding volume group for uuid %s"
 msgstr ""
 
-#: metadata/metadata.c:1160
+#: metadata/metadata.c:1371
 #, c-format
 msgid "Volume group for uuid not found: %s"
 msgstr ""
 
-#: metadata/metadata.c:1164
+#: metadata/metadata.c:1375
 #, c-format
 msgid "Found volume group \"%s\""
 msgstr ""
 
-#: metadata/metadata.c:1170
+#: metadata/metadata.c:1381
 #, c-format
 msgid "Can't find logical volume id %s"
 msgstr ""
 
-#: metadata/metadata.c:1194
+#: metadata/metadata.c:1405
 #, c-format
 msgid "No physical volume label read from %s"
 msgstr ""
 
-#: metadata/metadata.c:1204
+#: metadata/metadata.c:1415
 #, c-format
 msgid "pv allocation for '%s' failed"
 msgstr ""
 
-#: metadata/metadata.c:1213
+#: metadata/metadata.c:1424
 #, c-format
 msgid "Failed to read existing physical volume '%s'"
 msgstr ""
 
-#: metadata/metadata.c:1250
+#: metadata/metadata.c:1466
 msgid "PV list allocation failed"
 msgstr ""
 
-#: metadata/metadata.c:1258
+#: metadata/metadata.c:1474
 msgid "get_pvs: get_vgs failed"
 msgstr ""
 
-#: metadata/metadata.c:1278
+#: metadata/metadata.c:1498
 #, c-format
 msgid "Warning: Volume Group %s is not consistent"
 msgstr ""
 
-#: metadata/metadata.c:1296
+#: metadata/metadata.c:1516
 msgid "Format does not support writing physical volumes"
 msgstr ""
 
-#: metadata/metadata.c:1301
+#: metadata/metadata.c:1521
 #, c-format
 msgid "Assertion failed: can't _pv_write non-orphan PV (in VG %s)"
 msgstr ""
 
-#: metadata/mirror.c:111
-msgid "img_lvs allocation failed. Remove new LV and retry."
+#: metadata/metadata.c:1547 vgreduce.c:410
+#, c-format
+msgid ""
+"Failed to clear metadata from physical volume \"%s\" after removal from \"%s"
+"\""
 msgstr ""
 
-#: metadata/mirror.c:118 metadata/mirror.c:124
-msgid "img_name allocation failed. Remove new LV and retry."
+#: metadata/metadata.c:1570 pvcreate.c:81
+#, c-format
+msgid "Device %s not found (or ignored by filtering)."
 msgstr ""
 
-#: metadata/mirror.c:132
-msgid "Aborting. Failed to create submirror LV. Remove new LV and retry."
+#: metadata/metadata.c:1579
+#, c-format
+msgid "Could not find LVM label on %s"
+msgstr ""
+
+#: metadata/metadata.c:1584
+#, c-format
+msgid "Found label on %s, sector %lu, type=%s"
+msgstr ""
+
+#: metadata/mirror.c:52 mirror/mirrored.c:322
+#, c-format
+msgid "Using reduced mirror region size of %u sectors"
+msgstr ""
+
+#: metadata/mirror.c:94
+msgid "Aborting. Unable to tag."
+msgstr ""
+
+#: metadata/mirror.c:100
+msgid "Intermediate VG commit for orphan volume failed."
+msgstr ""
+
+#: metadata/mirror.c:138
+#, c-format
+msgid "Reducing mirror set from %u to %u image(s)%s."
+msgstr ""
+
+#: metadata/mirror.c:183
+msgid "No mirror images found using specified PVs."
+msgstr ""
+
+#: metadata/mirror.c:222
+msgid "intermediate VG write failed."
+msgstr ""
+
+#: metadata/mirror.c:277
+msgid "Bad activation/mirror_log_fault_policy"
+msgstr ""
+
+#: metadata/mirror.c:279
+msgid "Bad activation/mirror_device_fault_policy"
+msgstr ""
+
+#: metadata/mirror.c:317
+#, c-format
+msgid "WARNING: Failed to replace mirror device in %s/%s"
+msgstr ""
+
+#: metadata/mirror.c:321
+#, c-format
+msgid ""
+"WARNING: Use 'lvconvert -m %d %s/%s --corelog' to replace failed devices"
+msgstr ""
+
+#: metadata/mirror.c:324 metadata/mirror.c:341
+#, c-format
+msgid "WARNING: Use 'lvconvert -m %d %s/%s' to replace failed devices"
+msgstr ""
+
+#: metadata/mirror.c:338
+#, c-format
+msgid "WARNING: Failed to replace mirror log device in %s/%s"
+msgstr ""
+
+#: metadata/mirror.c:362
+#, c-format
+msgid "WARNING: Unable to determine mirror sync status of %s/%s."
+msgstr ""
+
+#: metadata/mirror.c:380
+#, c-format
+msgid "WARNING: Bad device removed from mirror volume, %s/%s"
+msgstr ""
+
+#: metadata/mirror.c:393
+#, c-format
+msgid "WARNING: Unable to find substitute device for mirror volume, %s/%s"
+msgstr ""
+
+#: metadata/mirror.c:397
+#, c-format
+msgid ""
+"WARNING: Mirror volume, %s/%s restored - substitute for failed device found."
 msgstr ""
 
-#: metadata/mirror.c:142
+#: metadata/mirror.c:402
 #, c-format
 msgid ""
-"Aborting. Failed to add submirror segment to %s. Remove new LV and retry."
+"WARNING: Mirror volume, %s/%s converted to linear due to device failure."
 msgstr ""
 
-#: metadata/mirror.c:151
+#: metadata/mirror.c:405
+#, c-format
+msgid "WARNING: Mirror volume, %s/%s disk log removed due to device failure."
+msgstr ""
+
+#: metadata/mirror.c:428 metadata/mirror.c:434
+msgid "img_name allocation failed. Remove new LV and retry."
+msgstr ""
+
+#: metadata/mirror.c:443
+msgid "Aborting. Failed to create mirror image LV. Remove new LV and retry."
+msgstr ""
+
+#: metadata/mirror.c:455
+#, c-format
+msgid ""
+"Aborting. Failed to add mirror image segment to %s. Remove new LV and retry."
+msgstr ""
+
+#: metadata/mirror.c:477 metadata/mirror.c:518
+msgid "img_lvs allocation failed. Remove new LV and retry."
+msgstr ""
+
+#: metadata/mirror.c:499
 msgid "Aborting. Failed to add mirror segment. Remove new LV and retry."
 msgstr ""
 
-#: metadata/mirror.c:258
+#: metadata/mirror.c:632
 #, c-format
 msgid "Matched PE range %u-%u against %s %u len %u"
 msgstr ""
 
-#: metadata/mirror.c:267 metadata/mirror.c:498
+#: metadata/mirror.c:641 metadata/mirror.c:872 vgreduce.c:139
 msgid "lv_list alloc failed"
 msgstr ""
 
-#: metadata/mirror.c:277
+#: metadata/mirror.c:651
 #, c-format
 msgid "Moving %s:%u-%u of %s/%s"
 msgstr ""
 
-#: metadata/mirror.c:290
+#: metadata/mirror.c:664
 msgid "Unable to allocate temporary LV for pvmove."
 msgstr ""
 
-#: metadata/mirror.c:305
+#: metadata/mirror.c:679
 #, c-format
 msgid "Moving %u extents of logical volume %s/%s"
 msgstr ""
 
-#: metadata/mirror.c:337
+#: metadata/mirror.c:711
 msgid "No segment found with LE"
 msgstr ""
 
-#: metadata/mirror.c:348
+#: metadata/mirror.c:722
 msgid "Incompatible segments"
 msgstr ""
 
-#: metadata/mirror.c:373
+#: metadata/mirror.c:747
 msgid "Missing error segtype"
 msgstr ""
 
-#: metadata/mirror.c:479
+#: metadata/mirror.c:853
 msgid "lvs list alloc failed"
 msgstr ""
 
-#: metadata/pv_manip.c:31
+#: metadata/pv_manip.c:30
 msgid "pv_segment allocation failed"
 msgstr ""
 
-#: metadata/pv_manip.c:122
+#: metadata/pv_manip.c:121
 #, c-format
 msgid "Segment with extent %u in PV %s not found"
 msgstr ""
 
-#: metadata/pv_manip.c:162
+#: metadata/pv_manip.c:161
 #, c-format
 msgid "Missing PV segment on %s at %u."
 msgstr ""
 
-#: metadata/pv_manip.c:179
+#: metadata/pv_manip.c:178
 #, c-format
 msgid "release_pv_segment with unallocated segment: %s PE %u"
 msgstr ""
 
-#: metadata/pv_manip.c:239
+#: metadata/pv_manip.c:238
 #, c-format
 msgid "%s %u: %6u %6u: %s(%u:%u)"
 msgstr ""
 
-#: metadata/pv_manip.c:245
+#: metadata/pv_manip.c:244
 #, c-format
 msgid "Gap in pvsegs: %u, %u"
 msgstr ""
 
-#: metadata/pv_manip.c:251
+#: metadata/pv_manip.c:250
 msgid "Wrong lvseg area type"
 msgstr ""
 
-#: metadata/pv_manip.c:255
+#: metadata/pv_manip.c:254
 msgid "Inconsistent pvseg pointers"
 msgstr ""
 
-#: metadata/pv_manip.c:259
+#: metadata/pv_manip.c:258
 #, c-format
 msgid "Inconsistent length: %u %u"
 msgstr ""
 
-#: metadata/pv_manip.c:270
+#: metadata/pv_manip.c:269
 #, c-format
 msgid "PV segment pe_count mismatch: %u != %u"
 msgstr ""
 
-#: metadata/pv_manip.c:276
+#: metadata/pv_manip.c:275
 #, c-format
 msgid "PV segment pe_alloc_count mismatch: %u != %u"
 msgstr ""
 
-#: metadata/pv_manip.c:286
+#: metadata/pv_manip.c:285
 #, c-format
 msgid "PV segment VG pv_count mismatch: %u != %u"
 msgstr ""
 
-#: metadata/pv_manip.c:292
+#: metadata/pv_manip.c:291
 #, c-format
 msgid "PV segment VG free_count mismatch: %u != %u"
 msgstr ""
 
-#: metadata/pv_manip.c:298
+#: metadata/pv_manip.c:297
 #, c-format
 msgid "PV segment VG extent_count mismatch: %u != %u"
 msgstr ""
 
-#: metadata/pv_map.c:46
+#: metadata/pv_manip.c:311
+#, c-format
+msgid "%s: cannot resize to %u extents as %u are allocated."
+msgstr ""
+
+#: metadata/pv_manip.c:324
+#, c-format
+msgid "%s: cannot resize to %u extents as later ones are allocated."
+msgstr ""
+
+#: metadata/pv_manip.c:356
+#, c-format
+msgid "%s: cannot resize to %u extents as there is only room for %lu."
+msgstr ""
+
+#: metadata/pv_manip.c:385
+#, c-format
+msgid "No change to size of physical volume %s."
+msgstr ""
+
+#: metadata/pv_manip.c:390
+#, c-format
+msgid "Resizing physical volume %s from %u to %u extents."
+msgstr ""
+
+#: metadata/pv_map.c:48
 #, c-format
 msgid "Allowing allocation on %s start PE %u length %u"
 msgstr ""
 
-#: metadata/pv_map.c:165
+#: metadata/pv_map.c:176
 msgid "create_pv_maps alloc failed"
 msgstr ""
 
-#: metadata/pv_map.c:172
+#: metadata/pv_map.c:183
 #, c-format
 msgid "Couldn't create physical volume maps in %s"
 msgstr ""
@@ -4949,175 +5579,241 @@
 msgid "Unrecognised segment type %s"
 msgstr ""
 
-#: metadata/snapshot_manip.c:49
+#: metadata/snapshot_manip.c:63
 #, c-format
 msgid "'%s' is already in use as a snapshot."
 msgstr ""
 
-#: metadata/snapshot_manip.c:90
+#: metadata/snapshot_manip.c:104
 #, c-format
 msgid "Failed to remove internal snapshot LV %s"
 msgstr ""
 
-#: mirror/mirrored.c:50
+#: mirror/mirrored.c:57
 #, c-format
 msgid "  Mirrors\t\t%u"
 msgstr ""
 
-#: mirror/mirrored.c:51
+#: mirror/mirrored.c:58
 #, c-format
 msgid "  Mirror size\t\t%u"
 msgstr ""
 
-#: mirror/mirrored.c:53
+#: mirror/mirrored.c:60
 #, c-format
 msgid "  Mirror log volume\t%s"
 msgstr ""
 
-#: mirror/mirrored.c:59
+#: mirror/mirrored.c:65
 #, c-format
 msgid "  Mirror region size\t%s"
 msgstr ""
 
-#: mirror/mirrored.c:62
+#: mirror/mirrored.c:68
 msgid "  Mirror original:"
 msgstr ""
 
-#: mirror/mirrored.c:64
-msgid "  Mirror destination:"
+#: mirror/mirrored.c:70
+msgid "  Mirror destinations:"
 msgstr ""
 
-#: mirror/mirrored.c:72
+#: mirror/mirrored.c:79
 #, c-format
 msgid "Couldn't read 'mirror_count' for segment '%s'."
 msgstr ""
 
-#: mirror/mirrored.c:91
+#: mirror/mirrored.c:98
 #, c-format
 msgid "Couldn't read 'extents_moved' for segment '%s'."
 msgstr ""
 
-#: mirror/mirrored.c:100
+#: mirror/mirrored.c:107
 #, c-format
 msgid "Couldn't read 'region_size' for segment '%s'."
 msgstr ""
 
-#: mirror/mirrored.c:108
+#: mirror/mirrored.c:115
 msgid "Mirror log type must be a string."
 msgstr ""
 
-#: mirror/mirrored.c:113
+#: mirror/mirrored.c:120
 #, c-format
 msgid "Unrecognised mirror log in segment %s."
 msgstr ""
 
-#: mirror/mirrored.c:121
+#: mirror/mirrored.c:128
 #, c-format
 msgid "Missing region size for mirror log for segment '%s'."
 msgstr ""
 
-#: mirror/mirrored.c:127
+#: mirror/mirrored.c:134
 #, c-format
 msgid "Couldn't find mirrors array for segment '%s'."
 msgstr ""
 
-#: mirror/mirrored.c:156
+#: mirror/mirrored.c:163
 msgid "struct mirr_state allocation failed"
 msgstr ""
 
-#: mirror/mirrored.c:206
+#: mirror/mirrored.c:193
+#, c-format
+msgid "Mirror status: %s"
+msgstr ""
+
+#: mirror/mirrored.c:196
+#, c-format
+msgid "Failure parsing mirror status mirror count: %s"
+msgstr ""
+
+#: mirror/mirrored.c:204
+#, c-format
+msgid "Failure parsing mirror status devices: %s"
+msgstr ""
+
+#: mirror/mirrored.c:213
+#, c-format
+msgid "Failure parsing mirror status fraction: %s"
+msgstr ""
+
+#: mirror/mirrored.c:245
+#, c-format
+msgid "Failed to build uuid for log LV %s."
+msgstr ""
+
+#: mirror/mirrored.c:252
+#, c-format
+msgid "Failed to build uuid for mirror LV %s."
+msgstr ""
+
+#: mirror/mirrored.c:310
 msgid "Missing region size for mirror segment."
 msgstr ""
 
-#: mirror/mirrored.c:247
+#: mirror/mirrored.c:505
+msgid "cluster log string list allocation failed"
+msgstr ""
+
+#: mirror/mirrored.c:510
+msgid "mirror string list allocation failed"
+msgstr ""
+
+#: misc/lvm-exec.c:31
 #, c-format
-msgid "Mirror status: %s"
+msgid "Executing: %s %s %s %s"
+msgstr ""
+
+#: misc/lvm-exec.c:34 polldaemon.c:39
+#, c-format
+msgid "fork failed: %s"
+msgstr ""
+
+#: misc/lvm-exec.c:48
+#, c-format
+msgid "wait4 child process %u failed: %s"
+msgstr ""
+
+#: misc/lvm-exec.c:54
+#, c-format
+msgid "Child %u exited abnormally"
 msgstr ""
 
-#: mirror/mirrored.c:250
+#: misc/lvm-exec.c:59
 #, c-format
-msgid "Failure parsing mirror status: %s"
+msgid "%s failed: %u"
 msgstr ""
 
 #: misc/lvm-file.c:55
 msgid "Not enough space to build temporary file string."
 msgstr ""
 
-#: misc/lvm-file.c:101
+#: misc/lvm-file.c:102
 #, c-format
 msgid "%s: rename to %s failed"
 msgstr ""
 
-#: misc/lvm-file.c:147
+#: misc/lvm-file.c:148
 #, c-format
 msgid "Creating directory \"%s\""
 msgstr ""
 
-#: misc/lvm-file.c:188
+#: misc/lvm-file.c:189
 #, c-format
 msgid "Directory \"%s\" not found"
 msgstr ""
 
-#: misc/lvm-file.c:219
+#: misc/lvm-file.c:220
 msgid "sync_dir failed in strdup"
 msgstr ""
 
-#: misc/sharedlib.c:41
+#: misc/lvm-file.c:269
+msgid "fcntl_lock_file failed in strdup."
+msgstr ""
+
+#: misc/lvm-file.c:283
 #, c-format
-msgid "Opening shared %s library %s"
+msgid "Locking %s (%s, %hd)"
 msgstr ""
 
-#: misc/sharedlib.c:44
+#: misc/lvm-file.c:313
 #, c-format
-msgid "Unable to open external %s library %s"
+msgid "Unlocking fd %d"
 msgstr ""
 
-#: mm/dbg_malloc.c:239
-msgid "Huge memory allocation (size %zu) rejected - metadata corruption?"
+#: misc/lvm-file.c:316
+#, c-format
+msgid "fcntl unlock failed on fd %d: %s"
 msgstr ""
 
-#: mm/memlock.c:100
-msgid "Locking memory"
+#: misc/lvm-file.c:320
+#, c-format
+msgid "lock file close failed on fd %d: %s"
 msgstr ""
 
-#: mm/memlock.c:109 mm/memlock.c:123
+#: misc/lvm-string.c:107
 #, c-format
-msgid "setpriority %u failed: %s"
+msgid "build_dm_name: Allocation failed for %zu for %s %s %s."
 msgstr ""
 
-#: mm/memlock.c:119
-msgid "Unlocking memory"
+#: misc/sharedlib.c:48
+#, c-format
+msgid "Not loading shared %s library %s in static mode."
 msgstr ""
 
-#: mm/memlock.c:131
+#: misc/sharedlib.c:55
 #, c-format
-msgid "memlock_count inc to %d"
+msgid "Opening shared %s library %s"
 msgstr ""
 
-#: mm/memlock.c:138
+#: misc/sharedlib.c:59 misc/sharedlib.c:62
 #, c-format
-msgid "memlock_count dec to %d"
+msgid "Unable to open external %s library %s: %s"
 msgstr ""
 
-#: mm/pool-fast.c:45
-msgid "Couldn't create memory pool %s (size %zu)"
+#: mm/memlock.c:99
+msgid "Locking memory"
 msgstr ""
 
-#: mm/pool-fast.c:134
-msgid "Internal error: pool_free asked to free pointer not in pool"
+#: mm/memlock.c:108 mm/memlock.c:122
+#, c-format
+msgid "setpriority %u failed: %s"
 msgstr ""
 
-#: mm/pool-fast.c:223
-msgid "Out of memory.  Requested %zu bytes."
+#: mm/memlock.c:118
+msgid "Unlocking memory"
 msgstr ""
 
-#: polldaemon.c:34
-msgid "Forking background process"
+#: mm/memlock.c:130
+#, c-format
+msgid "memlock_count inc to %d"
 msgstr ""
 
-#: polldaemon.c:39 toollib.c:984
+#: mm/memlock.c:137
 #, c-format
-msgid "fork failed: %s"
+msgid "memlock_count dec to %d"
+msgstr ""
+
+#: polldaemon.c:34
+msgid "Forking background process"
 msgstr ""
 
 #: polldaemon.c:49
@@ -5125,48 +5821,48 @@
 msgid "Background process failed to setsid: %s"
 msgstr ""
 
-#: polldaemon.c:82
+#: polldaemon.c:80
 msgid "Failed to generate list of copied LVs: can't abort."
 msgstr ""
 
-#: polldaemon.c:92
+#: polldaemon.c:90
 msgid "ABORTING: Mirror percentage check failed."
 msgstr ""
 
-#: polldaemon.c:98 polldaemon.c:100
+#: polldaemon.c:96 polldaemon.c:98
 #, c-format
 msgid "%s: Moved: %.1f%%"
 msgstr ""
 
-#: polldaemon.c:112
+#: polldaemon.c:107
 msgid "ABORTING: Failed to generate list of copied LVs"
 msgstr ""
 
-#: polldaemon.c:124
+#: polldaemon.c:119
 msgid "ABORTING: Segment progression failed."
 msgstr ""
 
-#: polldaemon.c:154
+#: polldaemon.c:149
 #, c-format
 msgid "ABORTING: Can't reread VG for %s"
 msgstr ""
 
-#: polldaemon.c:161
+#: polldaemon.c:156
 #, c-format
 msgid "ABORTING: Can't find mirror LV in %s for %s"
 msgstr ""
 
-#: polldaemon.c:189
+#: polldaemon.c:184
 #, c-format
 msgid "Couldn't read volume group %s"
 msgstr ""
 
-#: polldaemon.c:194
+#: polldaemon.c:189
 #, c-format
 msgid "Volume Group %s inconsistent - skipping"
 msgstr ""
 
-#: polldaemon.c:246
+#: polldaemon.c:241
 #, c-format
 msgid "Checking progress every %u seconds"
 msgstr ""
@@ -5176,140 +5872,145 @@
 msgid "Finding volume group of physical volume \"%s\""
 msgstr ""
 
-#: pvchange.c:65
+#: pvchange.c:65 pvresize.c:75
 #, c-format
 msgid "Unable to find volume group of \"%s\""
 msgstr ""
 
-#: pvchange.c:85
+#: pvchange.c:90 pvresize.c:101
 #, c-format
 msgid "Unable to find \"%s\" in volume group \"%s\""
 msgstr ""
 
-#: pvchange.c:91
+#: pvchange.c:97
 #, c-format
 msgid "Volume group containing %s does not support tags"
 msgstr ""
 
-#: pvchange.c:97
+#: pvchange.c:103
 #, c-format
 msgid "Volume group containing %s has active logical volumes"
 msgstr ""
 
-#: pvchange.c:106
+#: pvchange.c:112
 #, c-format
 msgid "Can't change tag on Physical Volume %s not in volume group"
 msgstr ""
 
-#: pvchange.c:111
+#: pvchange.c:117 pvresize.c:48
 msgid "Can't get lock for orphans"
 msgstr ""
 
-#: pvchange.c:117
+#: pvchange.c:123 pvresize.c:54
 #, c-format
 msgid "Unable to read PV \"%s\""
 msgstr ""
 
-#: pvchange.c:126
+#: pvchange.c:132
 #, c-format
 msgid "Allocatability not supported by orphan %s format PV %s"
 msgstr ""
 
-#: pvchange.c:134
+#: pvchange.c:140
 #, c-format
 msgid "Physical volume \"%s\" is already allocatable"
 msgstr ""
 
-#: pvchange.c:144
+#: pvchange.c:150
 #, c-format
 msgid "Physical volume \"%s\" is already unallocatable"
 msgstr ""
 
-#: pvchange.c:154
+#: pvchange.c:160
 #, c-format
 msgid "Setting physical volume \"%s\" allocatable"
 msgstr ""
 
-#: pvchange.c:158
+#: pvchange.c:164
 #, c-format
 msgid "Setting physical volume \"%s\" NOT allocatable"
 msgstr ""
 
-#: pvchange.c:166
+#: pvchange.c:172
 #, c-format
 msgid "Failed to add tag %s to physical volume %s"
 msgstr ""
 
-#: pvchange.c:172
+#: pvchange.c:178
 #, c-format
 msgid "Failed to remove tag %s from physical volume%s"
 msgstr ""
 
-#: pvchange.c:180
+#: pvchange.c:186
 #, c-format
 msgid "Failed to generate new random UUID for %s."
 msgstr ""
 
-#: pvchange.c:188
+#: pvchange.c:194
 #, c-format
 msgid "Changing uuid of %s to %s."
 msgstr ""
 
-#: pvchange.c:195
+#: pvchange.c:201
 #, c-format
 msgid "pv_write with new uuid failed for %s."
 msgstr ""
 
-#: pvchange.c:204
+#: pvchange.c:210 pvresize.c:174
 #, c-format
 msgid "Updating physical volume \"%s\""
 msgstr ""
 
-#: pvchange.c:208
+#: pvchange.c:214 pvresize.c:178
 #, c-format
 msgid "Failed to store physical volume \"%s\" in volume group \"%s\""
 msgstr ""
 
-#: pvchange.c:217
+#: pvchange.c:223 pvresize.c:187
 #, c-format
 msgid "Failed to store physical volume \"%s\""
 msgstr ""
 
-#: pvchange.c:224
+#: pvchange.c:230 pvresize.c:194
 #, c-format
 msgid "Physical volume \"%s\" changed"
 msgstr ""
 
-#: pvchange.c:246
+#: pvchange.c:252
 msgid "Please give exactly one option of -x, -uuid, --addtag or --deltag"
 msgstr ""
 
-#: pvchange.c:252
+#: pvchange.c:258
 msgid "Please give a physical volume path"
 msgstr ""
 
-#: pvchange.c:257
+#: pvchange.c:263
 msgid "Option a and PhysicalVolumePath are exclusive"
 msgstr ""
 
-#: pvchange.c:262 toollib.c:537
+#: pvchange.c:268 toollib.c:683
 msgid "Using physical volume(s) on command line"
 msgstr ""
 
-#: pvchange.c:267
+#: pvchange.c:273
 #, c-format
 msgid "Failed to read physical volume %s"
 msgstr ""
 
-#: pvchange.c:275 toollib.c:607
+#: pvchange.c:281 toollib.c:766
 msgid "Scanning for physical volume names"
 msgstr ""
 
-#: pvchange.c:286
+#: pvchange.c:292
 #, c-format
 msgid "%d physical volume%s changed / %d physical volume%s not changed"
 msgstr ""
 
+#: pvck.c:32
+#, c-format
+msgid "Scanning %s"
+msgstr ""
+
 #: pvcreate.c:37 pvremove.c:31
 #, c-format
 msgid "%s: Not LVM partition type: use -f to override"
@@ -5326,840 +6027,817 @@
 msgid "%s: physical volume not initialized"
 msgstr ""
 
-#: pvcreate.c:72 pvcreate.c:162 pvremove.c:76 vgcreate.c:139 vgextend.c:40
-#: vgremove.c:91
+#: pvcreate.c:72 pvcreate.c:168 pvremove.c:81 vgcreate.c:135 vgextend.c:40
+#: vgremove.c:96
 msgid "Can't get lock for orphan PVs"
 msgstr ""
 
-#: pvcreate.c:81
+#: pvcreate.c:86
 #, c-format
-msgid "Device %s not found."
+msgid "Can't open %s exclusively.  Mounted filesystem?"
 msgstr ""
 
-#: pvcreate.c:92
+#: pvcreate.c:98
 #, c-format
 msgid "Wiping software RAID md superblock on %s"
 msgstr ""
 
-#: pvcreate.c:94
+#: pvcreate.c:100
 #, c-format
 msgid "Failed to wipe RAID md superblock on %s"
 msgstr ""
 
-#: pvcreate.c:101
+#: pvcreate.c:107
 #, c-format
 msgid "WARNING: Forcing physical volume creation on %s%s%s%s"
 msgstr ""
 
-#: pvcreate.c:134
+#: pvcreate.c:140
 #, c-format
 msgid "uuid %s already in use on \"%s\""
 msgstr ""
 
-#: pvcreate.c:146
+#: pvcreate.c:152
 #, c-format
 msgid "Unable to read volume group from %s"
 msgstr ""
 
-#: pvcreate.c:152
+#: pvcreate.c:158
 #, c-format
 msgid "Can't find uuid %s in backup file %s"
 msgstr ""
 
-#: pvcreate.c:170
+#: pvcreate.c:176 pvresize.c:212
 msgid "Physical volume size may not be negative"
 msgstr ""
 
-#: pvcreate.c:176 vgconvert.c:66
+#: pvcreate.c:182 vgconvert.c:66
 msgid "Metadata size may not be negative"
 msgstr ""
 
-#: pvcreate.c:193 pvremove.c:84
+#: pvcreate.c:199 pvremove.c:89
 #, c-format
 msgid "%s: Couldn't find device.  Check your filters?"
 msgstr ""
 
-#: pvcreate.c:202 vgconvert.c:127
+#: pvcreate.c:208 vgconvert.c:127
 #, c-format
 msgid "Failed to setup physical volume \"%s\""
 msgstr ""
 
-#: pvcreate.c:206 vgconvert.c:138
+#: pvcreate.c:212 vgconvert.c:138
 #, c-format
-msgid "Set up physical volume for \"%s\" with %llu available sectors"
+msgid "Set up physical volume for \"%s\" with %lu available sectors"
 msgstr ""
 
-#: pvcreate.c:211 vgconvert.c:143
+#: pvcreate.c:217 vgconvert.c:143
 #, c-format
 msgid "Failed to wipe existing label on %s"
 msgstr ""
 
-#: pvcreate.c:216
+#: pvcreate.c:222
 #, c-format
 msgid "Zeroing start of device %s"
 msgstr ""
 
-#: pvcreate.c:218
+#: pvcreate.c:224
 #, c-format
 msgid "%s not opened: device not zeroed"
 msgstr ""
 
-#: pvcreate.c:226 vgconvert.c:150
+#: pvcreate.c:229
+#, c-format
+msgid "%s not wiped: aborting"
+msgstr ""
+
+#: pvcreate.c:236 vgconvert.c:150
 #, c-format
 msgid "Writing physical volume data to disk \"%s\""
 msgstr ""
 
-#: pvcreate.c:230 vgconvert.c:155
+#: pvcreate.c:240 vgconvert.c:155
 #, c-format
 msgid "Failed to write physical volume \"%s\""
 msgstr ""
 
-#: pvcreate.c:234 vgconvert.c:161
+#: pvcreate.c:244 vgconvert.c:161
 #, c-format
 msgid "Physical volume \"%s\" successfully created"
 msgstr ""
 
-#: pvcreate.c:251 pvremove.c:112
+#: pvcreate.c:261 pvremove.c:123
 msgid "Please enter a physical volume path"
 msgstr ""
 
-#: pvcreate.c:256
+#: pvcreate.c:266
 msgid "--uuid is required with --restorefile"
 msgstr ""
 
-#: pvcreate.c:261
+#: pvcreate.c:271
 msgid "Can only set uuid on one volume at once"
 msgstr ""
 
-#: pvcreate.c:266 pvremove.c:117
+#: pvcreate.c:276 pvremove.c:128
 msgid "Option y can only be given with option f"
 msgstr ""
 
-#: pvcreate.c:271 vgconvert.c:205
+#: pvcreate.c:281 vgconvert.c:205
 #, c-format
 msgid "labelsector must be less than %lu"
 msgstr ""
 
-#: pvcreate.c:279 vgconvert.c:213
+#: pvcreate.c:289 vgconvert.c:213
 msgid "Metadata parameters only apply to text format"
 msgstr ""
 
-#: pvcreate.c:285 vgconvert.c:219
+#: pvcreate.c:295 vgconvert.c:219
 msgid "Metadatacopies may only be 0, 1 or 2"
 msgstr ""
 
-#: pvdisplay.c:31
+#: pvdisplay.c:30 reporter.c:65 reporter.c:113 toollib.c:347 toollib.c:477
+#, c-format
+msgid "Can't lock %s: skipping"
+msgstr ""
+
+#: pvdisplay.c:35 reporter.c:70 reporter.c:118
+#, c-format
+msgid "Can't read %s: skipping"
+msgstr ""
+
+#: pvdisplay.c:54
 #, c-format
 msgid "Device \"%s\" has a capacity of %s"
 msgstr ""
 
-#: pvdisplay.c:37
+#: pvdisplay.c:60
 #, c-format
 msgid "Physical volume \"%s\" of volume group \"%s\" is exported"
 msgstr ""
 
-#: pvdisplay.c:41
+#: pvdisplay.c:64
 #, c-format
 msgid "\"%s\" is a new physical volume of \"%s\""
 msgstr ""
 
-#: pvdisplay.c:77
+#: pvdisplay.c:104
 msgid "Option -v not allowed with option -c"
 msgstr ""
 
-#: pvmove.c:36
+#: pvmove.c:34
 msgid "--name takes a logical volume name"
 msgstr ""
 
-#: pvmove.c:41
+#: pvmove.c:39
 msgid "Named LV and old PV must be in the same VG"
 msgstr ""
 
-#: pvmove.c:47
+#: pvmove.c:45
 msgid "Incomplete LV name supplied with --name"
 msgstr ""
 
-#: pvmove.c:123
+#: pvmove.c:127
 msgid "No extents available for allocation"
 msgstr ""
 
-#: pvmove.c:146
+#: pvmove.c:150
 msgid "Creation of temporary pvmove LV failed"
 msgstr ""
 
-#: pvmove.c:153
+#: pvmove.c:157
 msgid "lvs_changed list struct allocation failed"
 msgstr ""
 
-#: pvmove.c:166
+#: pvmove.c:170
 #, c-format
 msgid "Skipping snapshot-related LV %s"
 msgstr ""
 
-#: pvmove.c:170
+#: pvmove.c:174
 #, c-format
 msgid "Skipping mirror LV %s"
 msgstr ""
 
-#: pvmove.c:174
+#: pvmove.c:178
 #, c-format
 msgid "Skipping mirror log LV %s"
 msgstr ""
 
-#: pvmove.c:178
+#: pvmove.c:182
 #, c-format
 msgid "Skipping mirror image LV %s"
 msgstr ""
 
-#: pvmove.c:182
+#: pvmove.c:186
 #, c-format
 msgid "Skipping locked LV %s"
 msgstr ""
 
-#: pvmove.c:195
+#: pvmove.c:199
 #, c-format
 msgid "No data to move for %s"
 msgstr ""
 
-#: pvmove.c:206
+#: pvmove.c:210
 msgid "Updating volume group metadata"
 msgstr ""
 
-#: pvmove.c:208 pvmove.c:232
+#: pvmove.c:212 pvmove.c:236
 msgid "ABORTING: Volume group metadata update failed."
 msgstr ""
 
-#: pvmove.c:244
+#: pvmove.c:249
 msgid "ABORTING: Temporary mirror activation failed.  Run pvmove --abort."
 msgstr ""
 
-#: pvmove.c:252 pvmove.c:434
-#, c-format
-msgid "Unable to reactivate logical volume \"%s\""
-msgstr ""
-
-#: pvmove.c:260
-msgid "Unable to resume logical volumes"
-msgstr ""
-
-#: pvmove.c:308
-#, c-format
-msgid "Detected pvmove in progress for %s"
-msgstr ""
-
-#: pvmove.c:310
-msgid "Ignoring remaining command line arguments"
-msgstr ""
-
-#: pvmove.c:314
-msgid "ABORTING: Failed to generate list of moving LVs"
-msgstr ""
-
-#: pvmove.c:322
-msgid "ABORTING: Temporary mirror activation failed."
-msgstr ""
-
-#: pvmove.c:399
-msgid "ABORTING: Removal of temporary mirror failed"
-msgstr ""
-
-#: pvmove.c:405 pvmove.c:424 pvmove.c:458
-msgid "ABORTING: Failed to write new data locations to disk."
-msgstr ""
-
-#: pvmove.c:412
-msgid "Locking LVs to remove temporary mirror failed"
-msgstr ""
-
-#: pvmove.c:418
-msgid "Suspension of temporary mirror LV failed"
-msgstr ""
-
-#: pvmove.c:444
-#, c-format
-msgid "ABORTING: Unable to deactivate temporary logical volume \"%s\""
-msgstr ""
-
-#: pvmove.c:449
-msgid "Removing temporary pvmove LV"
-msgstr ""
-
-#: pvmove.c:451
-msgid "ABORTING: Removal of temporary pvmove LV failed"
-msgstr ""
-
-#: pvmove.c:456
-msgid "Writing out final volume group after pvmove"
-msgstr ""
-
-#: pvmove.c:476
-#, c-format
-msgid "ABORTING: Can't reread PV %s"
-msgstr ""
-
-#: pvmove.c:512 toollib.c:908
-msgid "Failed to clone PV name"
-msgstr ""
-
-#: pvremove.c:47
-#, c-format
-msgid ""
-"Can't pvremove physical volume \"%s\" of volume group \"%s\" without -ff"
-msgstr ""
-
-#: pvremove.c:55
-#, c-format
-msgid "%s: physical volume label not removed"
-msgstr ""
-
-#: pvremove.c:60
-#, c-format
-msgid "WARNING: Wiping physical volume label from %s%s%s%s"
-msgstr ""
-
-#: pvremove.c:91
-#, c-format
-msgid "Failed to wipe existing label(s) on %s"
-msgstr ""
-
-#: pvremove.c:95
-#, c-format
-msgid "Labels on physical volume \"%s\" successfully wiped"
-msgstr ""
-
-#: pvscan.c:65
-#, c-format
-msgid "PV %-*s    %-*s %s [%s]"
-msgstr ""
-
-#: pvscan.c:75
-#, c-format
-msgid "PV %-*s  is in exported VG %s [%s / %s free]"
-msgstr ""
-
-#: pvscan.c:88
+#: pvmove.c:257 pvmove.c:438
 #, c-format
-msgid "PV %-*s VG %-*s %s [%s / %s free]"
+msgid "Unable to reactivate logical volume \"%s\""
 msgstr ""
 
-#: pvscan.c:117
-msgid "Options -e and -n are incompatible"
+#: pvmove.c:265
+msgid "Unable to resume logical volumes"
 msgstr ""
 
-#: pvscan.c:122
+#: pvmove.c:313
 #, c-format
-msgid "WARNING: only considering physical volumes %s"
+msgid "Detected pvmove in progress for %s"
 msgstr ""
 
-#: pvscan.c:129
-msgid "Walking through all physical volumes"
+#: pvmove.c:315
+msgid "Ignoring remaining command line arguments"
 msgstr ""
 
-#: pvscan.c:182
-msgid "No matching physical volumes found"
+#: pvmove.c:318
+msgid "ABORTING: Failed to generate list of moving LVs"
 msgstr ""
 
-#: pvscan.c:186
-#, c-format
-msgid "Total: %d [%s] / in use: %d [%s] / in no VG: %d [%s]"
+#: pvmove.c:326
+msgid "ABORTING: Temporary mirror activation failed."
 msgstr ""
 
-#: regex/matcher.c:137
-msgid "Internal error: Unknown calc node type"
+#: pvmove.c:403
+msgid "ABORTING: Removal of temporary mirror failed"
 msgstr ""
 
-#: regex/matcher.c:267
-#, c-format
-msgid "Matcher built with %d dfa states"
+#: pvmove.c:409 pvmove.c:428 pvmove.c:462
+msgid "ABORTING: Failed to write new data locations to disk."
 msgstr ""
 
-#: regex/matcher.c:312
-msgid "Couldn't parse regex"
+#: pvmove.c:416
+msgid "Locking LVs to remove temporary mirror failed"
 msgstr ""
 
-#: regex/parse_rx.c:89
-msgid "Incomplete rangespecification"
+#: pvmove.c:422
+msgid "Suspension of temporary mirror LV failed"
 msgstr ""
 
-#: regex/parse_rx.c:167
-msgid "Badly quoted character at end of expression"
+#: pvmove.c:448
+#, c-format
+msgid "ABORTING: Unable to deactivate temporary logical volume \"%s\""
 msgstr ""
 
-#: regex/parse_rx.c:241
-msgid "missing ')' in regular expression"
+#: pvmove.c:453
+msgid "Removing temporary pvmove LV"
 msgstr ""
 
-#: regex/parse_rx.c:323
-msgid "Badly formed 'or' expression"
+#: pvmove.c:455
+msgid "ABORTING: Removal of temporary pvmove LV failed"
 msgstr ""
 
-#: regex/parse_rx.c:351
-msgid "Parse error in regex"
+#: pvmove.c:460
+msgid "Writing out final volume group after pvmove"
 msgstr ""
 
-#: report/report.c:125 report/report.c:541 report/report.c:581
-#: report/report.c:609
-msgid "pool_strdup failed"
+#: pvmove.c:480
+#, c-format
+msgid "ABORTING: Can't reread PV %s"
 msgstr ""
 
-#: report/report.c:152 report/report.c:211
-msgid "pool_begin_object failed"
+#: pvmove.c:516 toollib.c:1074
+msgid "Failed to clone PV name"
 msgstr ""
 
-#: report/report.c:172 report/report.c:183 report/report.c:189
-#: report/report.c:195 report/report.c:218 report/report.c:224
-#: report/report.c:1322
-msgid "pool_grow_object failed"
+#: pvremove.c:41 vgsplit.c:107
+#, c-format
+msgid "Physical Volume %s not found"
 msgstr ""
 
-#: report/report.c:178
-msgid "Extent number lvm_snprintf failed"
+#: pvremove.c:52
+#, c-format
+msgid ""
+"Can't pvremove physical volume \"%s\" of volume group \"%s\" without -ff"
 msgstr ""
 
-#: report/report.c:271 report/report.c:276 report/report.c:332
-#: report/report.c:409 report/report.c:436 report/report.c:529
-#: report/report.c:586 report/report.c:614 report/report.c:731
-#: report/report.c:754 report/report.c:759 report/report.c:783
-#: report/report.c:788 report/report.c:826 report/report.c:847
-#: report/report.c:872 report/report.c:887
-msgid "pool_alloc failed"
+#: pvremove.c:60
+#, c-format
+msgid "%s: physical volume label not removed"
 msgstr ""
 
-#: report/report.c:281
+#: pvremove.c:65
 #, c-format
-msgid "int too big: %d"
+msgid "WARNING: Wiping physical volume label from %s%s%s%s"
 msgstr ""
 
-#: report/report.c:534
-msgid "lvname snprintf failed"
+#: pvremove.c:95
+#, c-format
+msgid "Can't open %s exclusively - not removing. Mounted filesystem?"
 msgstr ""
 
-#: report/report.c:764
+#: pvremove.c:102
 #, c-format
-msgid "uint32 too big: %u"
+msgid "Failed to wipe existing label(s) on %s"
 msgstr ""
 
-#: report/report.c:793
+#: pvremove.c:106
 #, c-format
-msgid "int32 too big: %d"
+msgid "Labels on physical volume \"%s\" successfully wiped"
 msgstr ""
 
-#: report/report.c:852
-msgid "snapshot percentage too large"
+#: pvresize.c:60
+#, c-format
+msgid "%s: too many metadata areas for pvresize"
 msgstr ""
 
-#: report/report.c:892
-msgid "copy percentage too large"
+#: pvresize.c:113
+#, c-format
+msgid "Physical volume %s format does not support resizing."
 msgstr ""
 
-#: report/report.c:949 report/report.c:985
-msgid "struct field_properties allocation failed"
+#: pvresize.c:130
+#, c-format
+msgid "%s: Pretending size is %lu not %lu sectors."
 msgstr ""
 
-#: report/report.c:998
+#: pvresize.c:143
 #, c-format
-msgid "Ignoring duplicate sort field: %s"
+msgid "%s: Size must exceed physical extent start of %lu sectors."
 msgstr ""
 
-#: report/report.c:1030
-msgid "Missing sort field name"
+#: pvresize.c:156
+#, c-format
+msgid ""
+"%s: Size must leave space for at least one physical extent of %u sectors."
 msgstr ""
 
-#: report/report.c:1061 report/report.c:1083
+#: pvresize.c:171
 #, c-format
-msgid "Unrecognised field: %.*s"
+msgid "Resizing volume \"%s\" to %lu sectors."
 msgstr ""
 
-#: report/report.c:1099
-msgid "report_handle pool_zalloc failed"
+#: pvresize.c:207
+msgid "Please supply physical volume(s)"
 msgstr ""
 
-#: report/report.c:1140
-msgid "Allocation of memory pool for report failed"
+#: pvresize.c:224
+#, c-format
+msgid "%d physical volume(s) resized / %d physical volume(s) not resized"
 msgstr ""
 
-#: report/report.c:1157
-msgid "Can't report LV and PV fields at the same time"
+#: pvscan.c:66
+#, c-format
+msgid "PV %-*s    %-*s %s [%s]"
 msgstr ""
 
-#: report/report.c:1198
-msgid "report_object: One of *lv and *pv must be NULL!"
+#: pvscan.c:76
+#, c-format
+msgid "PV %-*s  is in exported VG %s [%s / %s free]"
+msgstr ""
+
+#: pvscan.c:89
+#, c-format
+msgid "PV %-*s VG %-*s %s [%s / %s free]"
 msgstr ""
 
-#: report/report.c:1203
-msgid "struct row allocation failed"
+#: pvscan.c:117
+msgid "Options -e and -n are incompatible"
 msgstr ""
 
-#: report/report.c:1212
-msgid "row sort value structure allocation failed"
+#: pvscan.c:122
+#, c-format
+msgid "WARNING: only considering physical volumes %s"
 msgstr ""
 
-#: report/report.c:1224
-msgid "struct field allocation failed"
+#: pvscan.c:129
+msgid "Walking through all physical volumes"
 msgstr ""
 
-#: report/report.c:1254
-#, c-format
-msgid "report function failed for field %s"
+#: pvscan.c:182
+msgid "No matching physical volumes found"
 msgstr ""
 
-#: report/report.c:1294
-msgid "pool_begin_object failed for headings"
+#: pvscan.c:186
+#, c-format
+msgid "Total: %d [%s] / in use: %d [%s] / in no VG: %d [%s]"
 msgstr ""
 
-#: report/report.c:1307
-msgid "snprintf heading failed"
+#: report/report.c:118
+msgid "Extent number dm_snprintf failed"
 msgstr ""
 
-#: report/report.c:1330
-msgid "Failed to generate report headings for printing"
+#: report/report.c:182
+msgid "modules str_list allocation failed"
 msgstr ""
 
-#: report/report.c:1389
-msgid "sort array allocation failed"
+#: report/report.c:259 report/report.c:342 report/report.c:368
+#: report/report.c:466 report/report.c:523 report/report.c:553
+#: report/report.c:694 report/report.c:750 report/report.c:768
+#: report/report.c:793 report/report.c:807
+msgid "dm_pool_alloc failed"
 msgstr ""
 
-#: report/report.c:1432
-msgid "pool_begin_object failed for row"
+#: report/report.c:471
+msgid "lvname snprintf failed"
 msgstr ""
 
-#: report/report.c:1450 report/report.c:1459
-msgid "snprintf repstr failed"
+#: report/report.c:476 report/report.c:518 report/report.c:548
+msgid "dm_pool_strdup failed"
 msgstr ""
 
-#: report/report.c:1474
-msgid "pool_grow_object failed for row"
+#: report/report.c:773
+msgid "snapshot percentage too large"
 msgstr ""
 
-#: report/report.c:1487
-msgid "Failed to generate row for printing"
+#: report/report.c:812
+msgid "copy percentage too large"
 msgstr ""
 
-#: reporter.c:23
+#: reporter.c:24 reporter.c:146 reporter.c:158
 #, c-format
 msgid "Volume group %s not found"
 msgstr ""
 
-#: reporter.c:64 reporter.c:105 toollib.c:236 toollib.c:346
+#: reporter.c:254
 #, c-format
-msgid "Can't lock %s: skipping"
+msgid "Invalid options string: %s"
 msgstr ""
 
-#: reporter.c:69 reporter.c:110
-#, c-format
-msgid "Can't read %s: skipping"
+#: reporter.c:260
+msgid "options string allocation failed"
 msgstr ""
 
-#: reporter.c:212
-#, c-format
-msgid "Invalid options string: %s"
+#: reporter.c:297
+msgid "Can't report LV and PV fields at the same time"
 msgstr ""
 
-#: snapshot/snapshot.c:41
+#: snapshot/snapshot.c:40
 msgid "Couldn't read chunk size for snapshot."
 msgstr ""
 
-#: snapshot/snapshot.c:49
+#: snapshot/snapshot.c:48
 msgid "Snapshot cow storage not specified."
 msgstr ""
 
-#: snapshot/snapshot.c:55
+#: snapshot/snapshot.c:54
 msgid "Snapshot origin not specified."
 msgstr ""
 
-#: snapshot/snapshot.c:62
+#: snapshot/snapshot.c:61
 msgid "Unknown logical volume specified for snapshot cow store."
 msgstr ""
 
-#: snapshot/snapshot.c:68
+#: snapshot/snapshot.c:67
 msgid "Unknown logical volume specified for snapshot origin."
 msgstr ""
 
-#: striped/striped.c:43
+#: snapshot/snapshot.c:135
+msgid "snapshot string list allocation failed"
+msgstr ""
+
+#: striped/striped.c:41
 #, c-format
 msgid "  Stripes\t\t%u"
 msgstr ""
 
-#: striped/striped.c:44
+#: striped/striped.c:42
 #, c-format
 msgid "  Stripe size\t\t%u KB"
 msgstr ""
 
-#: striped/striped.c:47
+#: striped/striped.c:45
 #, c-format
 msgid "  Stripe %d:"
 msgstr ""
 
-#: striped/striped.c:57
+#: striped/striped.c:55
 #, c-format
 msgid "Couldn't read 'stripe_count' for segment '%s'."
 msgstr ""
 
-#: striped/striped.c:72
+#: striped/striped.c:70
 #, c-format
 msgid "Couldn't read stripe_size for segment '%s'."
 msgstr ""
 
-#: striped/striped.c:78
+#: striped/striped.c:76
 #, c-format
 msgid "Couldn't find stripes array for segment '%s'."
 msgstr ""
 
-#: striped/striped.c:175
-msgid "Internal error: striped target with no stripes"
+#: striped/striped.c:163
+#, c-format
+msgid "Internal error: striped add_target_line called with no areas for %s."
 msgstr ""
 
-#: stub.h:20 stub.h:21 stub.h:22
+#: stub.h:24 stub.h:31
 msgid "Command not implemented yet."
 msgstr ""
 
-#: stub.h:25
+#: stub.h:38
 msgid "There's no 'pvdata' command in LVM2."
 msgstr ""
 
-#: stub.h:26
+#: stub.h:39
 msgid ""
 "Use lvs, pvs, vgs instead; or use vgcfgbackup and read the text file backup."
 msgstr ""
 
-#: stub.h:27
+#: stub.h:40
 msgid ""
 "Metadata in LVM1 format can still be displayed using LVM1's pvdata command."
 msgstr ""
 
-#: toollib.c:94
+#: toollib.c:115
+#, c-format
+msgid "skip_dev_dir: Couldn't split up device name %s"
+msgstr ""
+
+#: toollib.c:124 toollib.c:322
+msgid "vg/lv string alloc failed"
+msgstr ""
+
+#: toollib.c:215
 msgid "One or more specified logical volume(s) not found."
 msgstr ""
 
-#: toollib.c:130
+#: toollib.c:251
 msgid "Using logical volume(s) on command line"
 msgstr ""
 
-#: toollib.c:143 toollib.c:399 toollib.c:543 toollib.c:889
+#: toollib.c:264 toollib.c:540 toollib.c:689 toollib.c:1051
 #, c-format
 msgid "Skipping invalid tag %s"
 msgstr ""
 
-#: toollib.c:170 toollib.c:648 toollib.c:659
+#: toollib.c:281 toollib.c:807 toollib.c:818
 #, c-format
 msgid "\"%s\": Invalid path for Logical Volume"
 msgstr ""
 
-#: toollib.c:211
-msgid "vg/lv string alloc failed"
-msgstr ""
-
-#: toollib.c:224
+#: toollib.c:335
 msgid "Finding all logical volumes"
 msgstr ""
 
-#: toollib.c:226 toollib.c:437
+#: toollib.c:337 toollib.c:572
 msgid "No volume groups found"
 msgstr ""
 
-#: toollib.c:246 vgcfgbackup.c:55 vgck.c:22 vgreduce.c:287 vgscan.c:22
+#: toollib.c:357 toollib.c:483 toollib.c:731 vgcfgbackup.c:59 vgck.c:24
+#: vgreduce.c:505 vgscan.c:23
 #, c-format
 msgid "Volume group \"%s\" not found"
 msgstr ""
 
-#: toollib.c:249 vgchange.c:404 vgck.c:27 vgconvert.c:43 vgscan.c:29
+#: toollib.c:369 vgchange.c:523 vgck.c:29 vgconvert.c:43 vgscan.c:30
 #, c-format
 msgid "Volume group \"%s\" inconsistent"
 msgstr ""
 
-#: toollib.c:393
+#: toollib.c:534
 msgid "Using volume group(s) on command line"
 msgstr ""
 
-#: toollib.c:420
+#: toollib.c:555
 #, c-format
 msgid "Invalid volume group name: %s"
 msgstr ""
 
-#: toollib.c:435
+#: toollib.c:570
 msgid "Finding all volume groups"
 msgstr ""
 
-#: toollib.c:559 toollib.c:914
+#: toollib.c:705 toollib.c:1080
 #, c-format
 msgid "Physical Volume \"%s\" not found in Volume Group \"%s\""
 msgstr ""
 
-#: toollib.c:570
+#: toollib.c:716
 #, c-format
 msgid "Failed to read physical volume \"%s\""
 msgstr ""
 
-#: toollib.c:596
+#: toollib.c:755
 msgid "Using all physical volume(s) in volume group"
 msgstr ""
 
-#: toollib.c:666
+#: toollib.c:825
 msgid "Allocation of vg_name failed"
 msgstr ""
 
-#: toollib.c:676
+#: toollib.c:835
 #, c-format
 msgid "Path required for Logical Volume \"%s\""
 msgstr ""
 
-#: toollib.c:707
+#: toollib.c:858
 #, c-format
 msgid "Environment Volume Group in LVM_VG_NAME invalid: \"%s\""
 msgstr ""
 
-#: toollib.c:723
+#: toollib.c:874
 #, c-format
-msgid "Adding PE range: start PE %u length %u"
+msgid "Adding PE range: start PE %u length %u on %s"
 msgstr ""
 
-#: toollib.c:731
+#: toollib.c:882
 #, c-format
-msgid "Overlapping PE ranges detected (%u-%u, %u-%u)"
+msgid "Overlapping PE ranges specified (%u-%u, %u-%u) on %s"
 msgstr ""
 
-#: toollib.c:740 toollib.c:877 toollib.c:934
+#: toollib.c:892 toollib.c:1039 toollib.c:1103
 msgid "Allocation of list failed"
 msgstr ""
 
-#: toollib.c:804
+#: toollib.c:956
 #, c-format
 msgid "PE range error: start extent %u to end extent %u"
 msgstr ""
 
-#: toollib.c:819
+#: toollib.c:971
 #, c-format
 msgid "Physical extent parsing error at %s"
 msgstr ""
 
-#: toollib.c:832
+#: toollib.c:984
 #, c-format
 msgid "Physical volume %s not allocatable"
 msgstr ""
 
-#: toollib.c:838
+#: toollib.c:990
 #, c-format
 msgid "No free extents on physical volume \"%s\""
 msgstr ""
 
-#: toollib.c:843 toollib.c:941
+#: toollib.c:1002 toollib.c:1110
 msgid "Unable to allocate physical volume list."
 msgstr ""
 
-#: toollib.c:850
+#: toollib.c:1009
 msgid "Allocation of pe_ranges list failed"
 msgstr ""
 
-#: toollib.c:922
+#: toollib.c:1091
 msgid "No specified PVs have space available"
 msgstr ""
 
-#: toollib.c:964
+#: toollib.c:1137
 #, c-format
 msgid "Can't lock %s for metadata recovery: skipping"
 msgstr ""
 
-#: toollib.c:981
+#: toollib.c:1148
+msgid ""
+"Names starting \"snapshot\" are reserved. Please choose a different LV name."
+msgstr ""
+
+#: toollib.c:1154
+msgid ""
+"Names starting \"pvmove\" are reserved. Please choose a different LV name."
+msgstr ""
+
+#: toollib.c:1160
+msgid ""
+"Names including \"_mlog\" are reserved. Please choose a different LV name."
+msgstr ""
+
+#: toollib.c:1166
+msgid ""
+"Names including \"_mimage\" are reserved. Please choose a different LV name."
+msgstr ""
+
+#: toollib.c:1183
 #, c-format
-msgid "Executing: %s %s %s %s"
+msgid "%s: already exists in filesystem"
+msgstr ""
+
+#: toollib.c:1227
+msgid "Name allocation failed - device not cleared"
 msgstr ""
 
-#: toollib.c:998
+#: toollib.c:1233
 #, c-format
-msgid "wait4 child process %u failed: %s"
+msgid "Name too long - device not cleared (%s)"
 msgstr ""
 
-#: toollib.c:1004
+#: toollib.c:1237
 #, c-format
-msgid "Child %u exited abnormally"
+msgid "Clearing start of logical volume \"%s\""
 msgstr ""
 
-#: toollib.c:1009
+#: toollib.c:1240
 #, c-format
-msgid "%s failed: %u"
+msgid "%s: not found: device not cleared"
 msgstr ""
 
-#: toollib.c:1019
-msgid ""
-"Names starting \"snapshot\" are reserved. Please choose a different LV name."
+#: toollib.c:1276
+#, c-format
+msgid "Name allocation failed - log header not written (%s)"
 msgstr ""
 
-#: toollib.c:1025
-msgid ""
-"Names starting \"pvmove\" are reserved. Please choose a different LV name."
+#: toollib.c:1283
+#, c-format
+msgid "Name too long - log header not written (%s)"
 msgstr ""
 
-#: toollib.c:1031
-msgid ""
-"Names including \"_mlog\" are reserved. Please choose a different LV name."
+#: toollib.c:1287
+#, c-format
+msgid "Writing log header to device, %s"
 msgstr ""
 
-#: toollib.c:1037
-msgid ""
-"Names including \"_mimage\" are reserved. Please choose a different LV name."
+#: toollib.c:1290
+#, c-format
+msgid "%s: not found: log header not written"
 msgstr ""
 
-#: toollib.c:1054
+#: toollib.c:1298
 #, c-format
-msgid "%s: already exists in filesystem"
+msgid "Failed to write log header to %s"
 msgstr ""
 
-#: toollib.c:1077
-msgid "Name allocation failed - device not zeroed"
+#: toollib.c:1324
+msgid "log_name allocation failed. Remove new LV and retry."
 msgstr ""
 
-#: toollib.c:1083
-#, c-format
-msgid "Name too long - device not zeroed (%s)"
+#: toollib.c:1344
+msgid "Aborting. Unable to tag mirror log."
 msgstr ""
 
-#: toollib.c:1087
-#, c-format
-msgid "Zeroing start of logical volume \"%s\""
+#: toollib.c:1362
+msgid ""
+"Aborting. Unable to create in-sync mirror log while activation is disabled."
+msgstr ""
+
+#: toollib.c:1368
+msgid "Aborting. Failed to activate mirror log. Remove new LVs and retry."
 msgstr ""
 
-#: toollib.c:1090
+#: toollib.c:1375
 #, c-format
-msgid "%s: not found: device not zeroed"
+msgid "Failed to remove tag %s from mirror log."
 msgstr ""
 
-#: uuid/uuid.c:133
+#: toollib.c:1380
+msgid "Aborting. Failed to wipe mirror log. Remove new LV and retry."
+msgstr ""
+
+#: toollib.c:1386
+msgid "Aborting. Failed to write mirror log header. Remove new LV and retry."
+msgstr ""
+
+#: toollib.c:1392
+msgid "Aborting. Failed to deactivate mirror log. Remove new LV and retry."
+msgstr ""
+
+#: uuid/uuid.c:132
 msgid "UUID contains invalid character"
 msgstr ""
 
-#: uuid/uuid.c:157
+#: uuid/uuid.c:156
 msgid "Couldn't write uuid, buffer too small."
 msgstr ""
 
-#: uuid/uuid.c:185
+#: uuid/uuid.c:184
 msgid "Too many characters to be uuid."
 msgstr ""
 
-#: uuid/uuid.c:193
+#: uuid/uuid.c:192
 msgid "Couldn't read uuid, incorrect number of characters."
 msgstr ""
 
-#: vgcfgbackup.c:28
+#: vgcfgbackup.c:27
+msgid "Failed to allocate filename."
+msgstr ""
+
+#: vgcfgbackup.c:32
 #, c-format
 msgid "Error processing filename template %s"
 msgstr ""
 
-#: vgcfgbackup.c:35
+#: vgcfgbackup.c:39
 #, c-format
 msgid ""
 "VGs must be backed up into different files. Use %%s in filename for VG name."
 msgstr ""
 
-#: vgcfgbackup.c:60
+#: vgcfgbackup.c:64
 #, c-format
 msgid "Warning: Volume group \"%s\" inconsistent"
 msgstr ""
 
-#: vgcfgbackup.c:72
+#: vgcfgbackup.c:76
 msgid "No backup taken: specify filename with -f to backup an inconsistent VG"
 msgstr ""
 
-#: vgcfgbackup.c:86
+#: vgcfgbackup.c:90
 #, c-format
 msgid "Volume group \"%s\" successfully backed up."
 msgstr ""
@@ -6168,180 +6846,212 @@
 msgid "Please specify a *single* volume group to restore."
 msgstr ""
 
-#: vgcfgrestore.c:33
+#: vgcfgrestore.c:30 vgextend.c:45 vgreduce.c:469 vgsplit.c:228
 #, c-format
 msgid "Volume group name \"%s\" is invalid"
 msgstr ""
 
-#: vgcfgrestore.c:49
+#: vgcfgrestore.c:46
 msgid "Unable to lock orphans"
 msgstr ""
 
-#: vgcfgrestore.c:54
+#: vgcfgrestore.c:51
 #, c-format
 msgid "Unable to lock volume group %s"
 msgstr ""
 
-#: vgcfgrestore.c:65
+#: vgcfgrestore.c:62
 msgid "Restore failed."
 msgstr ""
 
-#: vgcfgrestore.c:69
+#: vgcfgrestore.c:66
 #, c-format
 msgid "Restored volume group %s"
 msgstr ""
 
-#: vgchange.c:56
+#: vgchange.c:92
 #, c-format
 msgid "Spawning background process for %s %s"
 msgstr ""
 
-#: vgchange.c:81
+#: vgchange.c:111
+#, c-format
+msgid "%d logical volume(s) in volume group \"%s\" %smonitored"
+msgstr ""
+
+#: vgchange.c:132
 #, c-format
 msgid "Can't deactivate volume group \"%s\" with %d open logical volume(s)"
 msgstr ""
 
-#: vgchange.c:87
+#: vgchange.c:138
 #, c-format
 msgid "Locking inactive: ignoring clustered volume group %s"
 msgstr ""
 
-#: vgchange.c:97
+#: vgchange.c:148
 #, c-format
 msgid "%d logical volume(s) in volume group \"%s\" already active"
 msgstr ""
 
-#: vgchange.c:101
+#: vgchange.c:152
+#, c-format
+msgid "%d existing logical volume(s) in volume group \"%s\" %smonitored"
+msgstr ""
+
+#: vgchange.c:160
 #, c-format
 msgid "Activated logical volumes in volume group \"%s\""
 msgstr ""
 
-#: vgchange.c:105
+#: vgchange.c:164
 #, c-format
 msgid "Deactivated logical volumes in volume group \"%s\""
 msgstr ""
 
-#: vgchange.c:108
+#: vgchange.c:167
 #, c-format
 msgid "%d logical volume(s) in volume group \"%s\" now active"
 msgstr ""
 
-#: vgchange.c:120 vgcreate.c:47
+#: vgchange.c:179 vgcreate.c:47
 msgid "Volume Group allocation policy cannot inherit from anything"
 msgstr ""
 
-#: vgchange.c:126
+#: vgchange.c:185
 #, c-format
 msgid "Volume group allocation policy is already %s"
 msgstr ""
 
-#: vgchange.c:141 vgchange.c:176 vgchange.c:211 vgchange.c:253 vgchange.c:311
-#: vgchange.c:353 vgchange.c:385
+#: vgchange.c:200 vgchange.c:235 vgchange.c:282 vgchange.c:324 vgchange.c:371
+#: vgchange.c:429 vgchange.c:471 vgchange.c:504
 #, c-format
 msgid "Volume group \"%s\" successfully changed"
 msgstr ""
 
-#: vgchange.c:152
+#: vgchange.c:211
 #, c-format
 msgid "Volume group \"%s\" is already resizeable"
 msgstr ""
 
-#: vgchange.c:158
+#: vgchange.c:217
 #, c-format
 msgid "Volume group \"%s\" is already not resizeable"
 msgstr ""
 
-#: vgchange.c:187
+#: vgchange.c:247
 #, c-format
 msgid "Volume group \"%s\" is already clustered"
 msgstr ""
 
-#: vgchange.c:193
+#: vgchange.c:253
 #, c-format
 msgid "Volume group \"%s\" is already not clustered"
 msgstr ""
 
-#: vgchange.c:222
+#: vgchange.c:261
+#, c-format
+msgid "Volume group %s contains snapshots that are not yet supported."
+msgstr ""
+
+#: vgchange.c:293
 #, c-format
 msgid "Volume group \"%s\" must be resizeable to change MaxLogicalVolume"
 msgstr ""
 
-#: vgchange.c:231
+#: vgchange.c:302
 msgid "MaxLogicalVolume limit is 255"
 msgstr ""
 
-#: vgchange.c:237
+#: vgchange.c:308
 #, c-format
-msgid ""
-"MaxLogicalVolume is less than the current number %d of logical volume(s) for "
-"\"%s\""
+msgid "MaxLogicalVolume is less than the current number %d of LVs for \"%s\""
+msgstr ""
+
+#: vgchange.c:335
+#, c-format
+msgid "Volume group \"%s\" must be resizeable to change MaxPhysicalVolumes"
+msgstr ""
+
+#: vgchange.c:341
+msgid "MaxPhysicalVolumes may not be negative"
+msgstr ""
+
+#: vgchange.c:349
+msgid "MaxPhysicalVolume limit is 255"
+msgstr ""
+
+#: vgchange.c:355
+#, c-format
+msgid "MaxPhysicalVolumes is less than the current number %d of PVs for \"%s\""
 msgstr ""
 
-#: vgchange.c:263
+#: vgchange.c:381
 #, c-format
 msgid "Volume group \"%s\" must be resizeable to change PE size"
 msgstr ""
 
-#: vgchange.c:269 vgcreate.c:64
+#: vgchange.c:387 vgcreate.c:64
 msgid "Physical extent size may not be negative"
 msgstr ""
 
-#: vgchange.c:275 vgcreate.c:83
+#: vgchange.c:393 vgcreate.c:83
 msgid "Physical extent size may not be zero"
 msgstr ""
 
-#: vgchange.c:280
+#: vgchange.c:398
 #, c-format
 msgid "Physical extent size of VG %s is already %s"
 msgstr ""
 
-#: vgchange.c:286
+#: vgchange.c:404
 msgid "Physical extent size must be a power of 2."
 msgstr ""
 
-#: vgchange.c:293
+#: vgchange.c:411
 msgid "New extent size is not a perfect fit"
 msgstr ""
 
-#: vgchange.c:336 vgcreate.c:121
+#: vgchange.c:454 vgcreate.c:117
 #, c-format
 msgid "Failed to add tag %s to volume group %s"
 msgstr ""
 
-#: vgchange.c:342
+#: vgchange.c:460
 #, c-format
 msgid "Failed to remove tag %s from volume group %s"
 msgstr ""
 
-#: vgchange.c:363
+#: vgchange.c:482
 msgid "Volume group has active logical volumes"
 msgstr ""
 
-#: vgchange.c:371
+#: vgchange.c:490
 #, c-format
 msgid "Failed to generate new random UUID for VG %s."
 msgstr ""
 
-#: vgchange.c:397 vgconvert.c:36 vgexport.c:23
+#: vgchange.c:516 vgconvert.c:36 vgexport.c:27
 #, c-format
 msgid "Unable to find volume group \"%s\""
 msgstr ""
 
-#: vgchange.c:457
+#: vgchange.c:588
 msgid ""
-"One of -a, -c, -l, -s, -x, --uuid, --alloc, --addtag or --deltag required"
+"One of -a, -c, -l, -p, -s, -x, --uuid, --alloc, --addtag or --deltag required"
 msgstr ""
 
-#: vgchange.c:468
+#: vgchange.c:600
 msgid ""
-"Only one of -a, -c, -l, -s, -x, --uuid, --alloc, --addtag or --deltag allowed"
+"Only one of -a, -c, -l, -p, -s, -x, --uuid, --alloc, --addtag or --deltag "
+"allowed"
 msgstr ""
 
-#: vgchange.c:475
+#: vgchange.c:607
 msgid "--ignorelockingfailure only available with -a"
 msgstr ""
 
-#: vgchange.c:481
+#: vgchange.c:613
 msgid "-A option not necessary with -a option"
 msgstr ""
 
@@ -6419,26 +7129,26 @@
 msgid "Max Physical Volumes may not be negative"
 msgstr ""
 
-#: vgcreate.c:92 vgrename.c:55 vgsplit.c:226
+#: vgcreate.c:88 vgrename.c:52 vgsplit.c:290
 #, c-format
 msgid "New volume group name \"%s\" is invalid"
 msgstr ""
 
-#: vgcreate.c:102
+#: vgcreate.c:98
 #, c-format
 msgid "Warning: Setting maxlogicalvolumes to %d (0 means unlimited)"
 msgstr ""
 
-#: vgcreate.c:106
+#: vgcreate.c:102
 #, c-format
 msgid "Warning: Setting maxphysicalvolumes to %d (0 means unlimited)"
 msgstr ""
 
-#: vgcreate.c:116
+#: vgcreate.c:112
 msgid "Volume group format does not support tags"
 msgstr ""
 
-#: vgcreate.c:167
+#: vgcreate.c:163
 #, c-format
 msgid "Volume group \"%s\" successfully created"
 msgstr ""
@@ -6465,31 +7175,31 @@
 msgid "Option -A is not allowed with volume group names"
 msgstr ""
 
-#: vgexport.c:28
+#: vgexport.c:32
 #, c-format
 msgid "Volume group %s inconsistent"
 msgstr ""
 
-#: vgexport.c:33
+#: vgexport.c:37
 #, c-format
 msgid "Volume group \"%s\" is already exported"
 msgstr ""
 
-#: vgexport.c:43
+#: vgexport.c:47
 #, c-format
 msgid "Volume group \"%s\" has active logical volumes"
 msgstr ""
 
-#: vgexport.c:58
+#: vgexport.c:67
 #, c-format
 msgid "Volume group \"%s\" successfully exported"
 msgstr ""
 
-#: vgexport.c:69 vgimport.c:59
+#: vgexport.c:78 vgimport.c:68
 msgid "Please supply volume groups or use -a for all."
 msgstr ""
 
-#: vgexport.c:74 vgimport.c:64
+#: vgexport.c:83 vgimport.c:73
 msgid "No arguments permitted when using -a for all."
 msgstr ""
 
@@ -6501,207 +7211,247 @@
 msgid "Please enter physical volume(s)"
 msgstr ""
 
-#: vgextend.c:44 vgmerge.c:31 vgmerge.c:55 vgsplit.c:187 vgsplit.c:211
+#: vgextend.c:50 vgmerge.c:32 vgmerge.c:63 vgsplit.c:238 vgsplit.c:275
 #, c-format
 msgid "Checking for volume group \"%s\""
 msgstr ""
 
-#: vgextend.c:52
+#: vgextend.c:58
 #, c-format
 msgid "Volume group \"%s\" not found."
 msgstr ""
 
-#: vgextend.c:67
+#: vgextend.c:79
 #, c-format
 msgid "Volume group \"%s\" is not resizeable."
 msgstr ""
 
-#: vgextend.c:86
+#: vgextend.c:98
 #, c-format
 msgid "Volume group \"%s\" will be extended by %d new physical volumes"
 msgstr ""
 
-#: vgextend.c:98
+#: vgextend.c:110
 #, c-format
 msgid "Volume group \"%s\" successfully extended"
 msgstr ""
 
-#: vgimport.c:23
+#: vgimport.c:27
 #, c-format
 msgid "Unable to find exported volume group \"%s\""
 msgstr ""
 
-#: vgimport.c:29
+#: vgimport.c:33
 #, c-format
 msgid "Volume group \"%s\" is not exported"
 msgstr ""
 
-#: vgimport.c:34
+#: vgimport.c:38
 #, c-format
 msgid "Volume group \"%s\" is partially missing"
 msgstr ""
 
-#: vgimport.c:48
+#: vgimport.c:57
 #, c-format
 msgid "Volume group \"%s\" successfully imported"
 msgstr ""
 
-#: vgmerge.c:27 vgsplit.c:183
+#: vgmerge.c:28 vgsplit.c:234
 #, c-format
 msgid "Duplicate volume group name \"%s\""
 msgstr ""
 
-#: vgmerge.c:79 vgsplit.c:233
+#: vgmerge.c:93 vgsplit.c:297
 #, c-format
 msgid "Logical volumes in \"%s\" must be inactive"
 msgstr ""
 
-#: vgmerge.c:86
+#: vgmerge.c:100
 #, c-format
 msgid "Extent sizes differ: %d (%s) and %d (%s)"
 msgstr ""
 
-#: vgmerge.c:94
+#: vgmerge.c:108
 #, c-format
 msgid "Maximum number of physical volumes (%d) exceeded  for \"%s\" and \"%s\""
 msgstr ""
 
-#: vgmerge.c:102
+#: vgmerge.c:116
 #, c-format
 msgid "Maximum number of logical volumes (%d) exceeded  for \"%s\" and \"%s\""
 msgstr ""
 
-#: vgmerge.c:116
+#: vgmerge.c:130
 #, c-format
 msgid "Duplicate logical volume name \"%s\" in \"%s\" and \"%s\""
 msgstr ""
 
-#: vgmerge.c:153
+#: vgmerge.c:142 vgmerge.c:151
+#, c-format
+msgid "Physical volume %s might be constructed from same volume group %s."
+msgstr ""
+
+#: vgmerge.c:186
 #, c-format
 msgid "Failed to generate new random LVID for %s"
 msgstr ""
 
-#: vgmerge.c:164
+#: vgmerge.c:197
 #, c-format
 msgid "Changed LVID for %s to %s"
 msgstr ""
 
-#: vgmerge.c:202
+#: vgmerge.c:235
 #, c-format
 msgid "Volume group \"%s\" successfully merged into \"%s\""
 msgstr ""
 
-#: vgmerge.c:219
+#: vgmerge.c:252
 msgid "Please enter 2 or more volume groups to merge"
 msgstr ""
 
-#: vgreduce.c:23
+#: vgreduce.c:24
 msgid "Volume Groups must always contain at least one PV"
 msgstr ""
 
-#: vgreduce.c:32
+#: vgreduce.c:33
 #, c-format
 msgid "Removing PV with UUID %s from VG %s"
 msgstr ""
 
-#: vgreduce.c:35
+#: vgreduce.c:36
 #, c-format
 msgid "LVs still present on PV with UUID %s: Can't remove from VG %s"
 msgstr ""
 
-#: vgreduce.c:56
+#: vgreduce.c:61
 #, c-format
 msgid "%s/%s has missing extents: removing (including dependencies)"
 msgstr ""
 
-#: vgreduce.c:61
+#: vgreduce.c:68
 #, c-format
-msgid "Deactivating (if active) logical volume %s"
+msgid "Deactivating (if active) logical volume %s (origin of %s)"
 msgstr ""
 
-#: vgreduce.c:65 vgreduce.c:73
+#: vgreduce.c:72 vgreduce.c:89 vgreduce.c:333
 #, c-format
 msgid "Failed to deactivate LV %s"
 msgstr ""
 
-#: vgreduce.c:69
+#: vgreduce.c:99 vgreduce.c:146 vgreduce.c:348
 #, c-format
-msgid "Deactivating (if active) logical volume %s (origin of %s)"
+msgid "Removing LV %s from VG %s"
 msgstr ""
 
-#: vgreduce.c:93 vgreduce.c:102
+#: vgreduce.c:191
 #, c-format
-msgid "Removing LV %s from VG %s"
+msgid "Non-mirror-image LV %s found: can't remove."
+msgstr ""
+
+#: vgreduce.c:207
+msgid "Aborting because --mirrorsonly was specified."
+msgstr ""
+
+#: vgreduce.c:232 vgreduce.c:529
+#, c-format
+msgid "Failed to write out a consistent VG for %s"
+msgstr ""
+
+#: vgreduce.c:250
+#, c-format
+msgid "Failed to commit consistent VG for %s"
+msgstr ""
+
+#: vgreduce.c:258
+msgid "Failed to resume LVs using error segments."
+msgstr ""
+
+#: vgreduce.c:290
+#, c-format
+msgid "The log device for %s/%s has failed."
 msgstr ""
 
-#: vgreduce.c:172
+#: vgreduce.c:296
+#, c-format
+msgid "Log device for %s/%s has failed."
+msgstr ""
+
+#: vgreduce.c:312
+#, c-format
+msgid "Failed to write out updated VG for %s"
+msgstr ""
+
+#: vgreduce.c:318
+#, c-format
+msgid "Failed to commit updated VG for %s"
+msgstr ""
+
+#: vgreduce.c:329
+#, c-format
+msgid "Deactivating (if active) logical volume %s"
+msgstr ""
+
+#: vgreduce.c:371
 #, c-format
 msgid "Physical volume \"%s\" still in use"
 msgstr ""
 
-#: vgreduce.c:177
+#: vgreduce.c:376
 #, c-format
 msgid "Can't remove final physical volume \"%s\" from volume group \"%s\""
 msgstr ""
 
-#: vgreduce.c:187
+#: vgreduce.c:386
 #, c-format
 msgid "Removing \"%s\" from volume group \"%s\""
 msgstr ""
 
-#: vgreduce.c:205
+#: vgreduce.c:404
 #, c-format
 msgid "Removal of physical volume \"%s\" from \"%s\" failed"
 msgstr ""
 
-#: vgreduce.c:211
-#, c-format
-msgid ""
-"Failed to clear metadata from physical volume \"%s\" after removal from \"%s"
-"\""
-msgstr ""
-
-#: vgreduce.c:219
+#: vgreduce.c:418
 #, c-format
 msgid "Removed \"%s\" from volume group \"%s\""
 msgstr ""
 
-#: vgreduce.c:232
+#: vgreduce.c:431
 msgid "Please give volume group name and physical volume paths"
 msgstr ""
 
-#: vgreduce.c:238
+#: vgreduce.c:437
 msgid "Please give volume group name"
 msgstr ""
 
-#: vgreduce.c:244
+#: vgreduce.c:443
+msgid "--mirrorsonly requires --removemissing"
+msgstr ""
+
+#: vgreduce.c:449
 msgid "Please enter physical volume paths or option -a"
 msgstr ""
 
-#: vgreduce.c:249
+#: vgreduce.c:454
 msgid "Option -a and physical volume paths mutually exclusive"
 msgstr ""
 
-#: vgreduce.c:255
+#: vgreduce.c:460
 msgid "Please only specify the volume group"
 msgstr ""
 
-#: vgreduce.c:278
+#: vgreduce.c:496
 #, c-format
 msgid "Volume group \"%s\" is already consistent"
 msgstr ""
 
-#: vgreduce.c:309
-#, c-format
-msgid "Failed to write out a consistent VG for %s"
-msgstr ""
-
-#: vgreduce.c:317
+#: vgreduce.c:537
 #, c-format
 msgid "Wrote out consistent volume group %s"
 msgstr ""
 
-#: vgreduce.c:333
+#: vgreduce.c:553
 #, c-format
 msgid "Volume group \"%s\" is not reducible"
 msgstr ""
@@ -6745,63 +7495,81 @@
 msgid "Volume group \"%s\" not properly removed"
 msgstr ""
 
-#: vgrename.c:31
+#: vgremove.c:91
+msgid "Please enter one or more volume group paths"
+msgstr ""
+
+#: vgrename.c:34
 msgid "Old and new volume group names need specifying"
 msgstr ""
 
-#: vgrename.c:49
+#: vgrename.c:46
 #, c-format
 msgid "New volume group path exceeds maximum length of %d!"
 msgstr ""
 
-#: vgrename.c:61
+#: vgrename.c:58
 msgid "Old and new volume group names must differ"
 msgstr ""
 
-#: vgrename.c:92
+#: vgrename.c:66
+msgid "No complete volume groups found"
+msgstr ""
+
+#: vgrename.c:76
+#, c-format
+msgid "Found more than one VG called %s. Please supply VG uuid."
+msgstr ""
+
+#: vgrename.c:99
+#, c-format
+msgid "Volume group %s %s%s%snot found."
+msgstr ""
+
+#: vgrename.c:123
 #, c-format
 msgid "Volume group \"%s\" still has active LVs"
 msgstr ""
 
-#: vgrename.c:98
+#: vgrename.c:129
 #, c-format
 msgid "Checking for new volume group \"%s\""
 msgstr ""
 
-#: vgrename.c:108
+#: vgrename.c:139
 #, c-format
 msgid "New volume group \"%s\" already exists"
 msgstr ""
 
-#: vgrename.c:123
+#: vgrename.c:154
 #, c-format
 msgid "Renaming \"%s\" to \"%s\""
 msgstr ""
 
-#: vgrename.c:125
+#: vgrename.c:156
 msgid "Test mode: Skipping rename."
 msgstr ""
 
-#: vgrename.c:127
+#: vgrename.c:158
 #, c-format
 msgid "Renaming \"%s\" to \"%s\" failed: %s"
 msgstr ""
 
-#: vgrename.c:146
+#: vgrename.c:177
 #, c-format
 msgid "Volume group \"%s\" successfully renamed to \"%s\""
 msgstr ""
 
-#: vgscan.c:35
+#: vgscan.c:36
 #, c-format
 msgid "Found %svolume group \"%s\" using metadata type %s"
 msgstr ""
 
-#: vgscan.c:49
+#: vgscan.c:50
 msgid "Too many parameters on command line"
 msgstr ""
 
-#: vgscan.c:56
+#: vgscan.c:57
 msgid "Reading all physical volumes.  This may take a while..."
 msgstr ""
 
@@ -6810,40 +7578,53 @@
 msgid "Physical volume %s not in volume group %s"
 msgstr ""
 
-#: vgsplit.c:87
+#: vgsplit.c:90
 #, c-format
-msgid "Logical Volume %s split between Volume Groups"
+msgid "Can't split Logical Volume %s between two Volume Groups"
 msgstr ""
 
-#: vgsplit.c:104
+#: vgsplit.c:152
 #, c-format
-msgid "Physical Volume %s not found"
+msgid "Snapshot %s split"
 msgstr ""
 
-#: vgsplit.c:149
+#: vgsplit.c:193
 #, c-format
-msgid "Snapshot %s split"
+msgid "Mirror %s split"
 msgstr ""
 
-#: vgsplit.c:173
+#: vgsplit.c:218
 msgid "Existing VG, new VG and physical volumes required."
 msgstr ""
 
-#: vgsplit.c:221
+#: vgsplit.c:264
+#, c-format
+msgid "Volume group \"%s\" is not resizeable"
+msgstr ""
+
+#: vgsplit.c:285
 #, c-format
 msgid "Volume group \"%s\" already exists"
 msgstr ""
 
-#: vgsplit.c:269
+#: vgsplit.c:339
+msgid "Cannot split: Nowhere to store metadata for new Volume Group"
+msgstr ""
+
+#: vgsplit.c:348
 msgid "Writing out updated volume groups"
 msgstr ""
 
-#: vgsplit.c:291
+#: vgsplit.c:370
 #, c-format
 msgid "Volume group \"%s\" became inconsistent: please fix manually"
 msgstr ""
 
-#: vgsplit.c:306
+#: vgsplit.c:385
 #, c-format
 msgid "Volume group \"%s\" successfully split from \"%s\""
 msgstr ""
+
+#: zero/zero.c:71
+msgid "zero module string list allocation failed"
+msgstr ""

Modified: lvm2/upstream/current/scripts/lvm_dump.sh
==============================================================================
--- lvm2/upstream/current/scripts/lvm_dump.sh	(original)
+++ lvm2/upstream/current/scripts/lvm_dump.sh	Fri Jun 22 11:19:15 2007
@@ -147,7 +147,10 @@
 log "$CP -a /etc/lvm $dir/lvm 2>> $log"
 
 myecho "Gathering /dev listing..."
-log "$LS -la /dev > $dir/dev_listing 2>> $log"
+log "$LS -laR /dev > $dir/dev_listing 2>> $log"
+
+myecho "Gathering /sys/block listing..."
+log "$LS -laR /sys/block > $dir/sysblock_listing"
 
 if (( $metadata )); then
 	myecho "Gathering LVM metadata from Physical Volumes..."

Modified: lvm2/upstream/current/tools/Makefile.in
==============================================================================
--- lvm2/upstream/current/tools/Makefile.in	(original)
+++ lvm2/upstream/current/tools/Makefile.in	Fri Jun 22 11:19:15 2007
@@ -38,6 +38,7 @@
 	lvscan.c \
 	polldaemon.c \
 	pvchange.c \
+	pvck.c \
 	pvcreate.c \
 	pvdisplay.c \
 	pvmove.c \

Modified: lvm2/upstream/current/tools/commands.h
==============================================================================
--- lvm2/upstream/current/tools/commands.h	(original)
+++ lvm2/upstream/current/tools/commands.h	Fri Jun 22 11:19:15 2007
@@ -407,6 +407,18 @@
 
    physicalvolumesize_ARG, test_ARG)
 
+xx(pvck,
+   "Check the consistency of physical volume(s)",
+   "pvck "
+   "\t[-d|--debug]\n"
+   "\t[-h|--help]\n"
+   "\t[--labelsector sector] " "\n"
+   "\t[-v|--verbose]\n"
+   "\t[--version]" "\n"
+   "\tPhysicalVolume [PhysicalVolume...]\n",
+
+   labelsector_ARG)
+
 xx(pvcreate,
    "Initialize physical volume(s) for use by LVM",
    "pvcreate " "\n"

Modified: lvm2/upstream/current/tools/lvchange.c
==============================================================================
--- lvm2/upstream/current/tools/lvchange.c	(original)
+++ lvm2/upstream/current/tools/lvchange.c	Fri Jun 22 11:19:15 2007
@@ -212,6 +212,9 @@
 				return ECMD_FAILED;
 			}
 
+			if (sigint_caught())
+				return ECMD_FAILED;
+
 			active = 1;
 		}
 	}
@@ -454,6 +457,10 @@
 				  lv->name);
 			return 0;
 		}
+
+		if (sigint_caught())
+			return 0;
+
 		log_verbose("Ensuring %s is inactive.", lv->name);
 		if (!deactivate_lv(cmd, lv)) {
 			log_error("%s: deactivation failed", lv->name);
@@ -626,6 +633,8 @@
 			return ECMD_FAILED;
 		archived = 1;
 		doit += lvchange_persistent(cmd, lv);
+		if (sigint_caught())
+			return ECMD_FAILED;
 	}
 
 	/* add tag */

Modified: lvm2/upstream/current/tools/lvconvert.c
==============================================================================
--- lvm2/upstream/current/tools/lvconvert.c	(original)
+++ lvm2/upstream/current/tools/lvconvert.c	Fri Jun 22 11:19:15 2007
@@ -307,7 +307,7 @@
 					if (!(log_lv = create_mirror_log(cmd, lv->vg, ah,
 									 lp->alloc, lv->name,
 									 (sync_percent >= 100.0) ?
-									 1 : 0))) {
+									 1 : 0, &lv->tags))) {
 						log_error("Failed to create mirror log.");
 						return 0;
 					}
@@ -385,7 +385,7 @@
 			if (!arg_count(cmd, corelog_ARG) &&
 			    !(log_lv = create_mirror_log(cmd, lv->vg, ah,
 							 lp->alloc,
-							 lv->name, 0))) {
+							 lv->name, 0, &lv->tags))) {
 				log_error("Failed to create mirror log.");
 				return 0;
 			}
@@ -557,21 +557,8 @@
 		goto error;
 	}
 
-	if ((vg->status & CLUSTERED) && !locking_is_clustered() &&
-	    !lockingfailed()) {
-		log_error("Skipping clustered volume group %s", lp.vg_name);
+	if (!vg_check_status(vg, CLUSTERED | EXPORTED_VG | LVM_WRITE))
 		goto error;
-	}
-
-	if (vg->status & EXPORTED_VG) {
-		log_error("Volume group \"%s\" is exported", lp.vg_name);
-		goto error;
-	}
-
-	if (!(vg->status & LVM_WRITE)) {
-		log_error("Volume group \"%s\" is read-only", lp.vg_name);
-		goto error;
-	}
 
 	if (!(lvl = find_lv_in_vg(vg, lp.lv_name))) {
 		log_error("Logical volume \"%s\" not found in "

Modified: lvm2/upstream/current/tools/lvcreate.c
==============================================================================
--- lvm2/upstream/current/tools/lvcreate.c	(original)
+++ lvm2/upstream/current/tools/lvcreate.c	Fri Jun 22 11:19:15 2007
@@ -476,8 +476,8 @@
 	uint64_t tmp_size;
 	struct volume_group *vg;
 	struct logical_volume *lv, *org = NULL, *log_lv = NULL;
-	struct list *pvh;
-	const char *tag;
+	struct list *pvh, tags;
+	const char *tag = NULL;
 	int consistent = 1;
 	struct alloc_handle *ah = NULL;
 	char lv_name_buf[128];
@@ -493,21 +493,8 @@
 		return 0;
 	}
 
-	if ((vg->status & CLUSTERED) && !locking_is_clustered() &&
-	    !lockingfailed()) {
-		log_error("Skipping clustered volume group %s", lp->vg_name);
+	if (!vg_check_status(vg, CLUSTERED | EXPORTED_VG | LVM_WRITE))
 		return 0;
-	}
-
-	if (vg->status & EXPORTED_VG) {
-		log_error("Volume group \"%s\" is exported", lp->vg_name);
-		return 0;
-	}
-
-	if (!(vg->status & LVM_WRITE)) {
-		log_error("Volume group \"%s\" is read-only", lp->vg_name);
-		return 0;
-	}
 
 	if (lp->lv_name && find_lv_in_vg(vg, lp->lv_name)) {
 		log_error("Logical volume \"%s\" already exists in "
@@ -675,6 +662,19 @@
 		lv_name = &lv_name_buf[0];
 	}
 
+	if (arg_count(cmd, addtag_ARG)) {
+		if (!(tag = arg_str_value(cmd, addtag_ARG, NULL))) {
+			log_error("Failed to get tag");
+			return 0;
+		}
+
+		if (!(vg->fid->fmt->features & FMT_TAGS)) {
+			log_error("Volume group %s does not support tags",
+				  vg->name);
+			return 0;
+		}
+	}
+
 	if (lp->mirrors > 1) {
 		/* FIXME Calculate how many extents needed for the log */
 
@@ -698,9 +698,13 @@
 			status |= MIRROR_NOTSYNCED;
 		}
 
+		list_init(&tags);
+		if (tag)
+			str_list_add(cmd->mem, &tags, tag);
+
 		if (!lp->corelog &&
 		    !(log_lv = create_mirror_log(cmd, vg, ah, lp->alloc,
-						 lv_name, lp->nosync))) {
+						 lv_name, lp->nosync, &tags))) {
 			log_error("Failed to create mirror log.");
 			return 0;
 		}
@@ -725,23 +729,10 @@
 			    lv->minor);
 	}
 
-	if (arg_count(cmd, addtag_ARG)) {
-		if (!(tag = arg_str_value(cmd, addtag_ARG, NULL))) {
-			log_error("Failed to get tag");
-			goto error;
-		}
-
-		if (!(lv->vg->fid->fmt->features & FMT_TAGS)) {
-			log_error("Volume group %s does not support tags",
-				  lv->vg->name);
-			goto error;
-		}
-
-		if (!str_list_add(cmd->mem, &lv->tags, tag)) {
-			log_error("Failed to add tag %s to %s/%s",
-				  tag, lv->vg->name, lv->name);
-			goto error;
-		}
+	if (tag && !str_list_add(cmd->mem, &lv->tags, tag)) {
+		log_error("Failed to add tag %s to %s/%s",
+			  tag, lv->vg->name, lv->name);
+		goto error;
 	}
 
 	if (lp->mirrors > 1) {

Modified: lvm2/upstream/current/tools/lvmcmdline.c
==============================================================================
--- lvm2/upstream/current/tools/lvmcmdline.c	(original)
+++ lvm2/upstream/current/tools/lvmcmdline.c	Fri Jun 22 11:19:15 2007
@@ -373,6 +373,7 @@
 	int c = 0, ret = 0;
 	va_list ap;
 
+	sigint_allow();
 	do {
 		if (c == '\n' || !c) {
 			va_start(ap, prompt);
@@ -390,6 +391,8 @@
 			ret = c;
 	} while (!ret || c != '\n');
 
+	sigint_restore();
+
 	if (c != '\n')
 		printf("\n");
 
@@ -827,30 +830,30 @@
 	 * description for backups.
 	 */
 	if (!dm_pool_begin_object(cmd->mem, 128))
-		goto bad;
+		goto_bad;
 
 	for (i = 0; i < argc; i++) {
 		space = strchr(argv[i], ' ') ? 1 : 0;
 
 		if (space && !dm_pool_grow_object(cmd->mem, "'", 1))
-			goto bad;
+			goto_bad;
 
 		if (!dm_pool_grow_object(cmd->mem, argv[i], strlen(argv[i])))
-			goto bad;
+			goto_bad;
 
 		if (space && !dm_pool_grow_object(cmd->mem, "'", 1))
-			goto bad;
+			goto_bad;
 
 		if (i < (argc - 1))
 			if (!dm_pool_grow_object(cmd->mem, " ", 1))
-				goto bad;
+				goto_bad;
 	}
 
 	/*
 	 * Terminate.
 	 */
 	if (!dm_pool_grow_object(cmd->mem, "\0", 1))
-		goto bad;
+		goto_bad;
 
 	return dm_pool_end_object(cmd->mem);
 
@@ -865,6 +868,9 @@
 	int ret = 0;
 	int locking_type;
 
+	/* each command should start out with sigint flag cleared */
+	sigint_clear();
+
 	if (!(cmd->cmd_line = _copy_command_line(cmd, argc, argv)))
 		return ECMD_FAILED;
 

Modified: lvm2/upstream/current/tools/lvmdiskscan.c
==============================================================================
--- lvm2/upstream/current/tools/lvmdiskscan.c	(original)
+++ lvm2/upstream/current/tools/lvmdiskscan.c	Fri Jun 22 11:19:15 2007
@@ -112,7 +112,7 @@
 	/* Do scan */
 	for (dev = dev_iter_get(iter); dev; dev = dev_iter_get(iter)) {
 		/* Try if it is a PV first */
-		if ((label_read(dev, &label))) {
+		if ((label_read(dev, &label, UINT64_C(0)))) {
 			if (!dev_get_size(dev, &size)) {
 				log_error("Couldn't get size of \"%s\"",
 					  dev_name(dev));

Modified: lvm2/upstream/current/tools/lvrename.c
==============================================================================
--- lvm2/upstream/current/tools/lvrename.c	(original)
+++ lvm2/upstream/current/tools/lvrename.c	Fri Jun 22 11:19:15 2007
@@ -109,21 +109,8 @@
 		goto error;
 	}
 
-	if ((vg->status & CLUSTERED) && !locking_is_clustered() &&
-	    !lockingfailed()) {
-		log_error("Skipping clustered volume group %s", vg->name);
+	if (!vg_check_status(vg, CLUSTERED | EXPORTED_VG | LVM_WRITE))
 		goto error;
-	}
-
-	if (vg->status & EXPORTED_VG) {
-		log_error("Volume group \"%s\" is exported", vg->name);
-		goto error;
-	}
-
-	if (!(vg->status & LVM_WRITE)) {
-		log_error("Volume group \"%s\" is read-only", vg_name);
-		goto error;
-	}
 
 	if (find_lv_in_vg(vg, lv_name_new)) {
 		log_error("Logical volume \"%s\" already exists in "

Modified: lvm2/upstream/current/tools/lvresize.c
==============================================================================
--- lvm2/upstream/current/tools/lvresize.c	(original)
+++ lvm2/upstream/current/tools/lvresize.c	Fri Jun 22 11:19:15 2007
@@ -141,21 +141,8 @@
 		return ECMD_FAILED;
 	}
 
-	if ((vg->status & CLUSTERED) && !locking_is_clustered() &&
-	    !lockingfailed()) {
-		log_error("Skipping clustered volume group %s", vg->name);
+	if (!vg_check_status(vg, CLUSTERED | EXPORTED_VG | LVM_WRITE))
 		return ECMD_FAILED;
-	}
-
-	if (vg->status & EXPORTED_VG) {
-		log_error("Volume group %s is exported", vg->name);
-		return ECMD_FAILED;
-	}
-
-	if (!(vg->status & LVM_WRITE)) {
-		log_error("Volume group %s is read-only", lp->vg_name);
-		return ECMD_FAILED;
-	}
 
 	/* does LV exist? */
 	if (!(lvl = find_lv_in_vg(vg, lp->lv_name))) {
@@ -498,6 +485,8 @@
 						  "reduced", lp->lv_name);
 					return ECMD_FAILED;
 				}
+				if (sigint_caught())
+					return ECMD_FAILED;
 			}
 		}
 	}

Modified: lvm2/upstream/current/tools/pvchange.c
==============================================================================
--- lvm2/upstream/current/tools/pvchange.c	(original)
+++ lvm2/upstream/current/tools/pvchange.c	Fri Jun 22 11:19:15 2007
@@ -26,7 +26,7 @@
 	uint64_t sector;
 	uint32_t orig_pe_alloc_count;
 
-	const char *pv_name = dev_name(pv->dev);
+	const char *pv_name = dev_name(get_pv_dev(pv));
 	const char *tag = NULL;
 	const char *orig_vg_name;
 	char uuid[64] __attribute((aligned(8)));
@@ -51,55 +51,43 @@
 	}
 
 	/* If in a VG, must change using volume group. */
-	if (*pv->vg_name) {
+	if (*get_pv_vg_name(pv)) {
 		log_verbose("Finding volume group of physical volume \"%s\"",
 			    pv_name);
 
-		if (!lock_vol(cmd, pv->vg_name, LCK_VG_WRITE)) {
-			log_error("Can't get lock for %s", pv->vg_name);
+		if (!lock_vol(cmd, get_pv_vg_name(pv), LCK_VG_WRITE)) {
+			log_error("Can't get lock for %s", get_pv_vg_name(pv));
 			return 0;
 		}
 
-		if (!(vg = vg_read(cmd, pv->vg_name, NULL, &consistent))) {
-			unlock_vg(cmd, pv->vg_name);
+		if (!(vg = vg_read(cmd, get_pv_vg_name(pv), NULL, &consistent))) {
+			unlock_vg(cmd, get_pv_vg_name(pv));
 			log_error("Unable to find volume group of \"%s\"",
 				  pv_name);
 			return 0;
 		}
 
-		if ((vg->status & CLUSTERED) && !locking_is_clustered() &&
-		    !lockingfailed()) {
-			log_error("Skipping clustered volume group %s", vg->name);
-			return 0;
-		}
-
-		if (vg->status & EXPORTED_VG) {
-			unlock_vg(cmd, pv->vg_name);
-			log_error("Volume group \"%s\" is exported", vg->name);
-			return 0;
-		}
-
-		if (!(vg->status & LVM_WRITE)) {
-			unlock_vg(cmd, pv->vg_name);
-			log_error("Volume group \"%s\" is read-only", vg->name);
+		if (!vg_check_status(vg,
+				     CLUSTERED | EXPORTED_VG | LVM_WRITE)) {
+			unlock_vg(cmd, get_pv_vg_name(pv));
 			return 0;
 		}
 
 		if (!(pvl = find_pv_in_vg(vg, pv_name))) {
-			unlock_vg(cmd, pv->vg_name);
+			unlock_vg(cmd, get_pv_vg_name(pv));
 			log_error
 			    ("Unable to find \"%s\" in volume group \"%s\"",
 			     pv_name, vg->name);
 			return 0;
 		}
 		if (tagarg && !(vg->fid->fmt->features & FMT_TAGS)) {
-			unlock_vg(cmd, pv->vg_name);
+			unlock_vg(cmd, get_pv_vg_name(pv));
 			log_error("Volume group containing %s does not "
 				  "support tags", pv_name);
 			return 0;
 		}
 		if (arg_count(cmd, uuid_ARG) && lvs_in_vg_activated(vg)) {
-			unlock_vg(cmd, pv->vg_name);
+			unlock_vg(cmd, get_pv_vg_name(pv));
 			log_error("Volume group containing %s has active "
 				  "logical volumes", pv_name);
 			return 0;
@@ -127,7 +115,7 @@
 	}
 
 	if (arg_count(cmd, allocatable_ARG)) {
-		if (!*pv->vg_name &&
+		if (!*get_pv_vg_name(pv) &&
 		    !(pv->fmt->features & FMT_ORPHAN_ALLOCATABLE)) {
 			log_error("Allocatability not supported by orphan "
 				  "%s format PV %s", pv->fmt->name, pv_name);
@@ -136,21 +124,21 @@
 		}
 
 		/* change allocatability for a PV */
-		if (allocatable && (pv->status & ALLOCATABLE_PV)) {
+		if (allocatable && (get_pv_status(pv) & ALLOCATABLE_PV)) {
 			log_error("Physical volume \"%s\" is already "
 				  "allocatable", pv_name);
-			if (*pv->vg_name)
-				unlock_vg(cmd, pv->vg_name);
+			if (*get_pv_vg_name(pv))
+				unlock_vg(cmd, get_pv_vg_name(pv));
 			else
 				unlock_vg(cmd, ORPHAN);
 			return 1;
 		}
 
-		if (!allocatable && !(pv->status & ALLOCATABLE_PV)) {
+		if (!allocatable && !(get_pv_status(pv) & ALLOCATABLE_PV)) {
 			log_error("Physical volume \"%s\" is already "
 				  "unallocatable", pv_name);
-			if (*pv->vg_name)
-				unlock_vg(cmd, pv->vg_name);
+			if (*get_pv_vg_name(pv))
+				unlock_vg(cmd, get_pv_vg_name(pv));
 			else
 				unlock_vg(cmd, ORPHAN);
 			return 1;
@@ -192,9 +180,9 @@
 			return 0;
 		}
 		log_verbose("Changing uuid of %s to %s.", pv_name, uuid);
-		if (*pv->vg_name) {
-			orig_vg_name = pv->vg_name;
-			orig_pe_alloc_count = pv->pe_alloc_count;
+		if (*get_pv_vg_name(pv)) {
+			orig_vg_name = get_pv_vg_name(pv);
+			orig_pe_alloc_count = get_pv_pe_alloc_count(pv);
 			pv->vg_name = ORPHAN;
 			pv->pe_alloc_count = 0;
 			if (!(pv_write(cmd, pv, NULL, INT64_C(-1)))) {
@@ -208,15 +196,15 @@
 	}
 
 	log_verbose("Updating physical volume \"%s\"", pv_name);
-	if (*pv->vg_name) {
+	if (*get_pv_vg_name(pv)) {
 		if (!vg_write(vg) || !vg_commit(vg)) {
-			unlock_vg(cmd, pv->vg_name);
+			unlock_vg(cmd, get_pv_vg_name(pv));
 			log_error("Failed to store physical volume \"%s\" in "
 				  "volume group \"%s\"", pv_name, vg->name);
 			return 0;
 		}
 		backup(vg);
-		unlock_vg(cmd, pv->vg_name);
+		unlock_vg(cmd, get_pv_vg_name(pv));
 	} else {
 		if (!(pv_write(cmd, pv, NULL, INT64_C(-1)))) {
 			unlock_vg(cmd, ORPHAN);

Added: lvm2/upstream/current/tools/pvck.c
==============================================================================
--- (empty file)
+++ lvm2/upstream/current/tools/pvck.c	Fri Jun 22 11:19:15 2007
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
+ * Copyright (C) 2007 Red Hat, Inc. All rights reserved.
+ *
+ * This file is part of LVM2.
+ *
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU General Public License v.2.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "tools.h"
+
+int pvck(struct cmd_context *cmd, int argc, char **argv)
+{
+	int i;
+
+	/* FIXME: validate cmdline options */
+	/* FIXME: what does the cmdline look like? */
+	/*
+	 * Use what's on the cmdline directly, and avoid calling into
+	 * some of the other infrastructure functions, so as to avoid
+	 * hitting some of the lvmcache behavior, scanning other devices,
+	 * etc.
+	 */
+	for (i = 0; i < argc; i++) {
+		/* FIXME: warning and/or check if in use? */
+		log_verbose("Scanning %s", argv[i]);
+
+		pv_analyze(cmd, argv[i],
+			   arg_int64_value(cmd, labelsector_ARG,
+					   UINT64_C(0)));
+	}
+
+	return ECMD_PROCESSED;
+}

Modified: lvm2/upstream/current/tools/pvcreate.c
==============================================================================
--- lvm2/upstream/current/tools/pvcreate.c	(original)
+++ lvm2/upstream/current/tools/pvcreate.c	Fri Jun 22 11:19:15 2007
@@ -45,19 +45,22 @@
 
 	/* Allow partial & exported VGs to be destroyed. */
 	/* We must have -ff to overwrite a non orphan */
-	if (pv && pv->vg_name[0] && arg_count(cmd, force_ARG) != 2) {
+	if (pv && !is_orphan(pv) && arg_count(cmd, force_ARG) != 2) {
 		log_error("Can't initialize physical volume \"%s\" of "
-			  "volume group \"%s\" without -ff", name, pv->vg_name);
+			  "volume group \"%s\" without -ff", name, get_pv_vg_name(pv));
 		return 0;
 	}
 
 	/* prompt */
-	if (pv && pv->vg_name[0] && !arg_count(cmd, yes_ARG) &&
-	    yes_no_prompt(_really_init, name, pv->vg_name) == 'n') {
+	if (pv && !is_orphan(pv) && !arg_count(cmd, yes_ARG) &&
+	    yes_no_prompt(_really_init, name, get_pv_vg_name(pv)) == 'n') {
 		log_print("%s: physical volume not initialized", name);
 		return 0;
 	}
 
+	if (sigint_caught())
+		return 0;
+
 	dev = dev_cache_get(name, cmd->filter);
 
 	/* Is there an md superblock here? */
@@ -103,12 +106,15 @@
 		}
 	}
 
-	if (pv && pv->vg_name[0] && arg_count(cmd, force_ARG)) {
+	if (sigint_caught())
+		return 0;
+
+	if (pv && !is_orphan(pv) && arg_count(cmd, force_ARG)) {
 		log_print("WARNING: Forcing physical volume creation on "
 			  "%s%s%s%s", name,
-			  pv->vg_name[0] ? " of volume group \"" : "",
-			  pv->vg_name[0] ? pv->vg_name : "",
-			  pv->vg_name[0] ? "\"" : "");
+			  !is_orphan(pv) ? " of volume group \"" : "",
+			  !is_orphan(pv) ? get_pv_vg_name(pv) : "",
+			  !is_orphan(pv) ? "\"" : "");
 	}
 
 	return 1;
@@ -118,7 +124,8 @@
 			   void *handle)
 {
 	struct pvcreate_params *pp = (struct pvcreate_params *) handle;
-	struct physical_volume *pv, *existing_pv;
+	void *pv;
+	void *existing_pv;
 	struct id id, *idp = NULL;
 	const char *uuid = NULL;
 	uint64_t size = 0;
@@ -159,9 +166,9 @@
 				  uuid, restorefile);
 			return ECMD_FAILED;
 		}
-		pe_start = existing_pv->pe_start;
-		extent_size = existing_pv->pe_size;
-		extent_count = existing_pv->pe_count;
+		pe_start = get_pv_pe_start(existing_pv);
+		extent_size = get_pv_pe_size(existing_pv);
+		extent_count = get_pv_pe_count(existing_pv);
 	}
 
 	if (!lock_vol(cmd, ORPHAN, LCK_VG_WRITE)) {
@@ -172,6 +179,9 @@
 	if (!pvcreate_check(cmd, pv_name))
 		goto error;
 
+	if (sigint_caught())
+		goto error;
+
 	if (arg_sign_value(cmd, physicalvolumesize_ARG, 0) == SIGN_MINUS) {
 		log_error("Physical volume size may not be negative");
 		goto error;
@@ -210,10 +220,10 @@
 	}
 
 	log_verbose("Set up physical volume for \"%s\" with %" PRIu64
-		    " available sectors", pv_name, pv->size);
+		    " available sectors", pv_name, get_pv_size(pv));
 
 	/* Wipe existing label first */
-	if (!label_remove(pv->dev)) {
+	if (!label_remove(get_pv_dev(pv))) {
 		log_error("Failed to wipe existing label on %s", pv_name);
 		goto error;
 	}
@@ -235,7 +245,8 @@
 
 	log_very_verbose("Writing physical volume data to disk \"%s\"",
 			 pv_name);
-	if (!(pv_write(cmd, pv, &mdas, arg_int64_value(cmd, labelsector_ARG,
+	if (!(pv_write(cmd, (struct physical_volume *)pv, &mdas,
+		       arg_int64_value(cmd, labelsector_ARG,
 						       DEFAULT_LABELSECTOR)))) {
 		log_error("Failed to write physical volume \"%s\"", pv_name);
 		goto error;
@@ -307,6 +318,8 @@
 		r = pvcreate_single(cmd, argv[i], &pp);
 		if (r > ret)
 			ret = r;
+		if (sigint_caught())
+			return ret;
 	}
 
 	return ret;

Modified: lvm2/upstream/current/tools/pvdisplay.c
==============================================================================
--- lvm2/upstream/current/tools/pvdisplay.c	(original)
+++ lvm2/upstream/current/tools/pvdisplay.c	Fri Jun 22 11:19:15 2007
@@ -19,36 +19,48 @@
 			     struct volume_group *vg __attribute((unused)),
 			     struct physical_volume *pv, void *handle)
 {
+	struct pv_list *pvl;
 	int consistent = 0;
 	int ret = ECMD_PROCESSED;
 	uint64_t size;
 
-	const char *pv_name = dev_name(pv->dev);
+	const char *pv_name = dev_name(get_pv_dev(pv));
 
-	 if (pv->vg_name) {
-	         if (!lock_vol(cmd, pv->vg_name, LCK_VG_READ)) {
-	                 log_error("Can't lock %s: skipping", pv->vg_name);
+	 if (get_pv_vg_name(pv)) {
+	         if (!lock_vol(cmd, get_pv_vg_name(pv), LCK_VG_READ)) {
+	                 log_error("Can't lock %s: skipping", get_pv_vg_name(pv));
 	                 return ECMD_FAILED;
 	         }
 
-	         if (!(vg = vg_read(cmd, pv->vg_name, (char *)&pv->vgid, &consistent))) {
-	                 log_error("Can't read %s: skipping", pv->vg_name);
+	         if (!(vg = vg_read(cmd, get_pv_vg_name(pv), (char *)&pv->vgid, &consistent))) {
+	                 log_error("Can't read %s: skipping", get_pv_vg_name(pv));
 	                 goto out;
 	         }
 
-	         if ((vg->status & CLUSTERED) && !locking_is_clustered() &&
-	             !lockingfailed()) {
-	                 log_error("Skipping clustered volume group %s",
-	                           vg->name);
+		 if (!vg_check_status(vg, CLUSTERED)) {
 	                 ret = ECMD_FAILED;
 	                 goto out;
 	         }
-	 }
 
-	if (!*pv->vg_name)
-		size = pv->size;
+		 /*
+		  * Replace possibly incomplete PV structure with new one
+		  * allocated in vg_read() path.
+		  */
+		 if (!(pvl = find_pv_in_vg(vg, pv_name))) {
+			 log_error("Unable to find \"%s\" in volume group \"%s\"",
+				   pv_name, vg->name);
+	                 ret = ECMD_FAILED;
+	                 goto out;
+		 }
+
+		 pv = pvl->pv;
+	}
+
+	if (!*get_pv_vg_name(pv))
+		size = get_pv_size(pv);
 	else
-		size = (pv->pe_count - pv->pe_alloc_count) * pv->pe_size;
+		size = (get_pv_pe_count(pv) - get_pv_pe_alloc_count(pv)) * 
+			get_pv_pe_size(pv);
 
 	if (arg_count(cmd, short_ARG)) {
 		log_print("Device \"%s\" has a capacity of %s", pv_name,
@@ -56,11 +68,11 @@
 		goto out;
 	}
 
-	if (pv->status & EXPORTED_VG)
+	if (get_pv_status(pv) & EXPORTED_VG)
 		log_print("Physical volume \"%s\" of volume group \"%s\" "
-			  "is exported", pv_name, pv->vg_name);
+			  "is exported", pv_name, get_pv_vg_name(pv));
 
-	if (!pv->vg_name)
+	if (!get_pv_vg_name(pv))
 		log_print("\"%s\" is a new physical volume of \"%s\"",
 			  pv_name, display_size(cmd, size));
 
@@ -71,12 +83,12 @@
 
 	pvdisplay_full(cmd, pv, handle);
 
-	if (!arg_count(cmd, maps_ARG))
-		goto out;
+	if (arg_count(cmd, maps_ARG))
+		pvdisplay_segments(pv);
 
 out:
-        if (pv->vg_name)
-                unlock_vg(cmd, pv->vg_name);
+        if (get_pv_vg_name(pv))
+                unlock_vg(cmd, get_pv_vg_name(pv));
 
 	return ret;
 }

Modified: lvm2/upstream/current/tools/pvmove.c
==============================================================================
--- lvm2/upstream/current/tools/pvmove.c	(original)
+++ lvm2/upstream/current/tools/pvmove.c	Fri Jun 22 11:19:15 2007
@@ -66,20 +66,7 @@
 		return NULL;
 	}
 
-	if ((vg->status & CLUSTERED) && !locking_is_clustered() &&
-	    !lockingfailed()) {
-		log_error("Skipping clustered volume group %s", vgname);
-		return NULL;
-	}
-
-	if (vg->status & EXPORTED_VG) {
-		log_error("Volume group \"%s\" is exported", vgname);
-		unlock_vg(cmd, vgname);
-		return NULL;
-	}
-
-	if (!(vg->status & LVM_WRITE)) {
-		log_error("Volume group \"%s\" is read-only", vgname);
+	if (!vg_check_status(vg, CLUSTERED | EXPORTED_VG | LVM_WRITE)) {
 		unlock_vg(cmd, vgname);
 		return NULL;
 	}
@@ -113,7 +100,7 @@
 		pvl = list_item(pvh, struct pv_list);
 
 		/* Don't allocate onto the PV we're clearing! */
-		if ((alloc != ALLOC_ANYWHERE) && (pvl->pv->dev == pv->dev)) {
+		if ((alloc != ALLOC_ANYWHERE) && (pvl->pv->dev == get_pv_dev(pv))) {
 			list_del(&pvl->list);
 			continue;
 		}
@@ -294,7 +281,7 @@
 	}
 
 	if (arg_count(cmd, name_ARG)) {
-		if (!(lv_name = _extract_lvname(cmd, pv->vg_name,
+		if (!(lv_name = _extract_lvname(cmd, get_pv_vg_name(pv),
 						arg_value(cmd, name_ARG)))) {
 			stack;
 			return EINVALID_CMD_LINE;
@@ -302,14 +289,14 @@
 	}
 
 	/* Read VG */
-	log_verbose("Finding volume group \"%s\"", pv->vg_name);
+	log_verbose("Finding volume group \"%s\"", get_pv_vg_name(pv));
 
-	if (!(vg = _get_vg(cmd, pv->vg_name))) {
+	if (!(vg = _get_vg(cmd, get_pv_vg_name(pv)))) {
 		stack;
 		return ECMD_FAILED;
 	}
 
-	if ((lv_mirr = find_pvmove_lv(vg, pv->dev, PVMOVE))) {
+	if ((lv_mirr = find_pvmove_lv(vg, get_pv_dev(pv), PVMOVE))) {
 		log_print("Detected pvmove in progress for %s", pv_name);
 		if (argc || lv_name)
 			log_error("Ignoring remaining command line arguments");
@@ -317,7 +304,7 @@
 		if (!(lvs_changed = lvs_using_lv(cmd, vg, lv_mirr))) {
 			log_error
 			    ("ABORTING: Failed to generate list of moving LVs");
-			unlock_vg(cmd, pv->vg_name);
+			unlock_vg(cmd, get_pv_vg_name(pv));
 			return ECMD_FAILED;
 		}
 
@@ -325,7 +312,7 @@
 		if (!activate_lv_excl(cmd, lv_mirr)) {
 			log_error
 			    ("ABORTING: Temporary mirror activation failed.");
-			unlock_vg(cmd, pv->vg_name);
+			unlock_vg(cmd, get_pv_vg_name(pv));
 			return ECMD_FAILED;
 		}
 
@@ -335,7 +322,7 @@
 		if (!(source_pvl = create_pv_list(cmd->mem, vg, 1,
 						  &pv_name_arg, 0))) {
 			stack;
-			unlock_vg(cmd, pv->vg_name);
+			unlock_vg(cmd, get_pv_vg_name(pv));
 			return ECMD_FAILED;
 		}
 
@@ -347,12 +334,12 @@
 		if (!(allocatable_pvs = _get_allocatable_pvs(cmd, argc, argv,
 							     vg, pv, alloc))) {
 			stack;
-			unlock_vg(cmd, pv->vg_name);
+			unlock_vg(cmd, get_pv_vg_name(pv));
 			return ECMD_FAILED;
 		}
 
 		if (!archive(vg)) {
-			unlock_vg(cmd, pv->vg_name);
+			unlock_vg(cmd, get_pv_vg_name(pv));
 			stack;
 			return ECMD_FAILED;
 		}
@@ -361,7 +348,7 @@
 						  allocatable_pvs, alloc,
 						  &lvs_changed))) {
 			stack;
-			unlock_vg(cmd, pv->vg_name);
+			unlock_vg(cmd, get_pv_vg_name(pv));
 			return ECMD_FAILED;
 		}
 	}
@@ -369,7 +356,7 @@
 	/* Lock lvs_changed for exclusive use and activate (with old metadata) */
 	if (!activate_lvs_excl(cmd, lvs_changed)) {
 		stack;
-		unlock_vg(cmd, pv->vg_name);
+		unlock_vg(cmd, get_pv_vg_name(pv));
 		return ECMD_FAILED;
 	}
 
@@ -381,13 +368,13 @@
 		if (!_update_metadata
 		    (cmd, vg, lv_mirr, lvs_changed, first_time)) {
 			stack;
-			unlock_vg(cmd, pv->vg_name);
+			unlock_vg(cmd, get_pv_vg_name(pv));
 			return ECMD_FAILED;
 		}
 	}
 
 	/* LVs are all in status LOCKED */
-	unlock_vg(cmd, pv->vg_name);
+	unlock_vg(cmd, get_pv_vg_name(pv));
 
 	return ECMD_PROCESSED;
 }
@@ -482,7 +469,7 @@
 		return NULL;
 	}
 
-	return _get_vg(cmd, pv->vg_name);
+	return _get_vg(cmd, get_pv_vg_name(pv));
 }
 
 static struct poll_functions _pvmove_fns = {

Modified: lvm2/upstream/current/tools/pvremove.c
==============================================================================
--- lvm2/upstream/current/tools/pvremove.c	(original)
+++ lvm2/upstream/current/tools/pvremove.c	Fri Jun 22 11:19:15 2007
@@ -43,20 +43,20 @@
 	}
 
 	/* orphan ? */
-	if (!pv->vg_name[0])
+	if (is_orphan(pv))
 		return 1;
 
 	/* Allow partial & exported VGs to be destroyed. */
 	/* we must have -ff to overwrite a non orphan */
 	if (arg_count(cmd, force_ARG) < 2) {
 		log_error("Can't pvremove physical volume \"%s\" of "
-			  "volume group \"%s\" without -ff", name, pv->vg_name);
+			  "volume group \"%s\" without -ff", name, get_pv_vg_name(pv));
 		return 0;
 	}
 
 	/* prompt */
 	if (!arg_count(cmd, yes_ARG) &&
-	    yes_no_prompt(_really_wipe, name, pv->vg_name) == 'n') {
+	    yes_no_prompt(_really_wipe, name, get_pv_vg_name(pv)) == 'n') {
 		log_print("%s: physical volume label not removed", name);
 		return 0;
 	}
@@ -64,9 +64,9 @@
 	if (arg_count(cmd, force_ARG)) {
 		log_print("WARNING: Wiping physical volume label from "
 			  "%s%s%s%s", name,
-			  pv->vg_name[0] ? " of volume group \"" : "",
-			  pv->vg_name[0] ? pv->vg_name : "",
-			  pv->vg_name[0] ? "\"" : "");
+			  !is_orphan(pv) ? " of volume group \"" : "",
+			  !is_orphan(pv) ? get_pv_vg_name(pv) : "",
+			  !is_orphan(pv) ? "\"" : "");
 	}
 
 	return 1;

Modified: lvm2/upstream/current/tools/pvresize.c
==============================================================================
--- lvm2/upstream/current/tools/pvresize.c	(original)
+++ lvm2/upstream/current/tools/pvresize.c	Fri Jun 22 11:19:15 2007
@@ -33,7 +33,7 @@
 	uint64_t size = 0;
 	uint32_t new_pe_count = 0;
 	struct list mdas;
-	const char *pv_name = dev_name(pv->dev);
+	const char *pv_name = dev_name(get_pv_dev(pv));
 	struct pvresize_params *params = (struct pvresize_params *) handle;
 	const char *vg_name;
 
@@ -41,7 +41,7 @@
 
 	params->total++;
 
-	if (!*pv->vg_name) {
+	if (!*get_pv_vg_name(pv)) {
 		vg_name = ORPHAN;
 
 		if (!lock_vol(cmd, vg_name, LCK_VG_WRITE)) {
@@ -63,10 +63,10 @@
 			return ECMD_FAILED;
 		}
 	} else {
-		vg_name = pv->vg_name;
+		vg_name = get_pv_vg_name(pv);
 
 		if (!lock_vol(cmd, vg_name, LCK_VG_WRITE)) {
-			log_error("Can't get lock for %s", pv->vg_name);
+			log_error("Can't get lock for %s", get_pv_vg_name(pv));
 			return ECMD_FAILED;
 		}
 
@@ -77,22 +77,8 @@
 			return ECMD_FAILED;
 		}
 
-		if ((vg->status & CLUSTERED) && !locking_is_clustered() &&
-		    !lockingfailed()) {
+		if (!vg_check_status(vg, CLUSTERED | EXPORTED_VG | LVM_WRITE)) {
 			unlock_vg(cmd, vg_name);
-			log_error("Skipping clustered volume group %s", vg->name);
-			return ECMD_FAILED;
-		}
-
-		if (vg->status & EXPORTED_VG) {
-			unlock_vg(cmd, vg_name);
-			log_error("Volume group \"%s\" is exported", vg->name);
-			return ECMD_FAILED;
-		}
-
-		if (!(vg->status & LVM_WRITE)) {
-			unlock_vg(cmd, pv->vg_name);
-			log_error("Volume group \"%s\" is read-only", vg->name);
 			return ECMD_FAILED;
 		}
 
@@ -117,7 +103,7 @@
 	}
 
 	/* Get new size */
-	if (!dev_get_size(pv->dev, &size)) {
+	if (!dev_get_size(get_pv_dev(pv), &size)) {
 		log_error("%s: Couldn't get size.", pv_name);
 		unlock_vg(cmd, vg_name);
 		return ECMD_FAILED;
@@ -128,7 +114,7 @@
 			log_print("WARNING: %s: Overriding real size. "
 				  "You could lose data.", pv_name);
 		log_verbose("%s: Pretending size is %" PRIu64 " not %" PRIu64
-			    " sectors.", pv_name, params->new_size, pv->size);
+			    " sectors.", pv_name, params->new_size, get_pv_size(pv));
 		size = params->new_size;
 	}
 
@@ -139,9 +125,9 @@
 		return ECMD_FAILED;
 	}
 
-	if (size < pv->pe_start) {
+	if (size < get_pv_pe_start(pv)) {
 		log_error("%s: Size must exceed physical extent start of "
-			  "%" PRIu64 " sectors.", pv_name, pv->pe_start);
+			  "%" PRIu64 " sectors.", pv_name, get_pv_pe_start(pv));
 		unlock_vg(cmd, vg_name);
 		return ECMD_FAILED;
 	}
@@ -149,14 +135,14 @@
 	pv->size = size;
 
 	if (vg) {
-		pv->size -= pv->pe_start;
-		new_pe_count = pv->size / vg->extent_size;
+		pv->size -= get_pv_pe_start(pv);
+		new_pe_count = get_pv_size(pv) / vg->extent_size;
 		
  		if (!new_pe_count) {
 			log_error("%s: Size must leave space for at "
 				  "least one physical extent of "
 				  "%" PRIu32 " sectors.", pv_name,
-				  pv->pe_size);
+				  get_pv_pe_size(pv));
 			unlock_vg(cmd, vg_name);
 			return ECMD_FAILED;
 		}
@@ -169,12 +155,12 @@
 	}
 
 	log_verbose("Resizing volume \"%s\" to %" PRIu64 " sectors.",
-		    pv_name, pv->size);
+		    pv_name, get_pv_size(pv));
 
 	log_verbose("Updating physical volume \"%s\"", pv_name);
-	if (*pv->vg_name) {
+	if (*get_pv_vg_name(pv)) {
 		if (!vg_write(vg) || !vg_commit(vg)) {
-			unlock_vg(cmd, pv->vg_name);
+			unlock_vg(cmd, get_pv_vg_name(pv));
 			log_error("Failed to store physical volume \"%s\" in "
 				  "volume group \"%s\"", pv_name, vg->name);
 			return ECMD_FAILED;

Modified: lvm2/upstream/current/tools/pvscan.c
==============================================================================
--- lvm2/upstream/current/tools/pvscan.c	(original)
+++ lvm2/upstream/current/tools/pvscan.c	Fri Jun 22 11:19:15 2007
@@ -31,7 +31,7 @@
 
 	/* short listing? */
 	if (arg_count(cmd, short_ARG) > 0) {
-		log_print("%s", dev_name(pv->dev));
+		log_print("%s", dev_name(get_pv_dev(pv)));
 		return;
 	}
 
@@ -48,7 +48,7 @@
 
 	memset(pv_tmp_name, 0, sizeof(pv_tmp_name));
 
-	vg_name_len = strlen(pv->vg_name) + 1;
+	vg_name_len = strlen(get_pv_vg_name(pv)) + 1;
 
 	if (arg_count(cmd, uuid_ARG)) {
 		if (!id_write_format(&pv->id, uuid, sizeof(uuid))) {
@@ -57,42 +57,43 @@
 		}
 
 		sprintf(pv_tmp_name, "%-*s with UUID %s",
-			pv_max_name_len - 2, dev_name(pv->dev), uuid);
+			pv_max_name_len - 2, dev_name(get_pv_dev(pv)), uuid);
 	} else {
-		sprintf(pv_tmp_name, "%s", dev_name(pv->dev));
+		sprintf(pv_tmp_name, "%s", dev_name(get_pv_dev(pv)));
 	}
 
-	if (!*pv->vg_name) {
+	if (!*get_pv_vg_name(pv)) {
 		log_print("PV %-*s    %-*s %s [%s]",
 			  pv_max_name_len, pv_tmp_name,
 			  vg_max_name_len, " ",
 			  pv->fmt ? pv->fmt->name : "    ",
-			  display_size(cmd, pv->size));
+			  display_size(cmd, get_pv_size(pv)));
 		return;
 	}
 
-	if (pv->status & EXPORTED_VG) {
-		strncpy(vg_name_this, pv->vg_name, vg_name_len);
+	if (get_pv_status(pv) & EXPORTED_VG) {
+		strncpy(vg_name_this, get_pv_vg_name(pv), vg_name_len);
 		log_print("PV %-*s  is in exported VG %s "
 			  "[%s / %s free]",
 			  pv_max_name_len, pv_tmp_name,
 			  vg_name_this,
-			  display_size(cmd, (uint64_t) pv->pe_count *
-				       pv->pe_size),
-			  display_size(cmd, (uint64_t) (pv->pe_count -
-							pv->pe_alloc_count)
-				       * pv->pe_size));
+			  display_size(cmd, (uint64_t) get_pv_pe_count(pv) *
+				       get_pv_pe_size(pv)),
+			  display_size(cmd, (uint64_t) (get_pv_pe_count(pv) -
+						get_pv_pe_alloc_count(pv))
+				       * get_pv_pe_size(pv)));
 		return;
 	}
 
-	sprintf(vg_tmp_name, "%s", pv->vg_name);
+	sprintf(vg_tmp_name, "%s", get_pv_vg_name(pv));
 	log_print("PV %-*s VG %-*s %s [%s / %s free]", pv_max_name_len,
 		  pv_tmp_name, vg_max_name_len, vg_tmp_name,
 		  pv->fmt ? pv->fmt->name : "    ",
-		  display_size(cmd, (uint64_t) pv->pe_count * pv->pe_size),
-		  display_size(cmd,
-			       (uint64_t) (pv->pe_count - pv->pe_alloc_count) *
-					   pv->pe_size));
+		  display_size(cmd, (uint64_t) get_pv_pe_count(pv) * 
+					       get_pv_pe_size(pv)),
+		  display_size(cmd, (uint64_t) (get_pv_pe_count(pv) - 
+						get_pv_pe_alloc_count(pv)) *
+					   get_pv_pe_size(pv)));
 	return;
 }
 
@@ -135,8 +136,8 @@
 		pv = pvl->pv;
 
 		if ((arg_count(cmd, exported_ARG)
-		     && !(pv->status & EXPORTED_VG))
-		    || (arg_count(cmd, novolumegroup_ARG) && (*pv->vg_name))) {
+		     && !(get_pv_status(pv) & EXPORTED_VG))
+		    || (arg_count(cmd, novolumegroup_ARG) && (*get_pv_vg_name(pv)))) {
 			list_del(&pvl->list);
 			continue;
 		}
@@ -153,22 +154,22 @@
 ********/
 		pvs_found++;
 
-		if (!*pv->vg_name) {
+		if (!*get_pv_vg_name(pv)) {
 			new_pvs_found++;
-			size_new += pv->size;
-			size_total += pv->size;
+			size_new += get_pv_size(pv);
+			size_total += get_pv_size(pv);
 		} else
-			size_total += pv->pe_count * pv->pe_size;
+			size_total += get_pv_pe_count(pv) * get_pv_pe_size(pv);
 	}
 
 	/* find maximum pv name length */
 	pv_max_name_len = vg_max_name_len = 0;
 	list_iterate_items(pvl, pvslist) {
 		pv = pvl->pv;
-		len = strlen(dev_name(pv->dev));
+		len = strlen(dev_name(get_pv_dev(pv)));
 		if (pv_max_name_len < len)
 			pv_max_name_len = len;
-		len = strlen(pv->vg_name);
+		len = strlen(get_pv_vg_name(pv));
 		if (vg_max_name_len < len)
 			vg_max_name_len = len;
 	}

Modified: lvm2/upstream/current/tools/reporter.c
==============================================================================
--- lvm2/upstream/current/tools/reporter.c	(original)
+++ lvm2/upstream/current/tools/reporter.c	Fri Jun 22 11:19:15 2007
@@ -61,19 +61,17 @@
 	struct physical_volume *pv = pvseg->pv;
 	int ret = ECMD_PROCESSED;
 
-	if (!lock_vol(cmd, pv->vg_name, LCK_VG_READ)) {
-		log_error("Can't lock %s: skipping", pv->vg_name);
+	if (!lock_vol(cmd, get_pv_vg_name(pv), LCK_VG_READ)) {
+		log_error("Can't lock %s: skipping", get_pv_vg_name(pv));
 		return ECMD_FAILED;
 	}
 
-	if (!(vg = vg_read(cmd, pv->vg_name, NULL, &consistent))) {
-		log_error("Can't read %s: skipping", pv->vg_name);
+	if (!(vg = vg_read(cmd, get_pv_vg_name(pv), NULL, &consistent))) {
+		log_error("Can't read %s: skipping", get_pv_vg_name(pv));
 		goto out;
 	}
 
-	if ((vg->status & CLUSTERED) && !locking_is_clustered() &&
-	    !lockingfailed()) {
-		log_error("Skipping clustered volume group %s", vg->name);
+	if (!vg_check_status(vg, CLUSTERED)) {
 		ret = ECMD_FAILED;
 		goto out;
 	}
@@ -82,7 +80,7 @@
 		ret = ECMD_FAILED;
 
 out:
-	unlock_vg(cmd, pv->vg_name);
+	unlock_vg(cmd, get_pv_vg_name(pv));
 	return ret;
 }
 
@@ -108,21 +106,18 @@
 	int consistent = 0;
 	int ret = ECMD_PROCESSED;
 
-	if (pv->vg_name) {
-		if (!lock_vol(cmd, pv->vg_name, LCK_VG_READ)) {
-			log_error("Can't lock %s: skipping", pv->vg_name);
+	if (get_pv_vg_name(pv)) {
+		if (!lock_vol(cmd, get_pv_vg_name(pv), LCK_VG_READ)) {
+			log_error("Can't lock %s: skipping", get_pv_vg_name(pv));
 			return ECMD_FAILED;
 		}
 
-		if (!(vg = vg_read(cmd, pv->vg_name, (char *)&pv->vgid, &consistent))) {
-			log_error("Can't read %s: skipping", pv->vg_name);
+		if (!(vg = vg_read(cmd, get_pv_vg_name(pv), (char *)&pv->vgid, &consistent))) {
+			log_error("Can't read %s: skipping", get_pv_vg_name(pv));
 			goto out;
 		}
 
-		if ((vg->status & CLUSTERED) && !locking_is_clustered() &&
-		    !lockingfailed()) {
-			log_error("Skipping clustered volume group %s",
-				  vg->name);
+		if (!vg_check_status(vg, CLUSTERED)) {
 			ret = ECMD_FAILED;
 			goto out;
 		}
@@ -132,8 +127,8 @@
 		ret = ECMD_FAILED;
 
 out:
-	if (pv->vg_name)
-		unlock_vg(cmd, pv->vg_name);
+	if (get_pv_vg_name(pv))
+		unlock_vg(cmd, get_pv_vg_name(pv));
 
 	return ret;
 }

Modified: lvm2/upstream/current/tools/toollib.c
==============================================================================
--- lvm2/upstream/current/tools/toollib.c	(original)
+++ lvm2/upstream/current/tools/toollib.c	Fri Jun 22 11:19:15 2007
@@ -209,6 +209,8 @@
 		ret = process_single(cmd, lvl->lv, handle);
 		if (ret > ret_max)
 			ret_max = ret;
+		if (sigint_caught())
+			return ret_max;
 	}
 
 	if (lvargs_supplied && lvargs_matched != list_size(arg_lvnames)) {
@@ -357,11 +359,7 @@
 				log_error("Volume group \"%s\" "
 					  "not found", vgname);
 			else {
-				if ((vg->status & CLUSTERED) &&
-			    	    !locking_is_clustered() &&
-				    !lockingfailed()) {
-					log_error("Skipping clustered volume "
-						  "group %s", vgname);
+				if (!vg_check_status(vg, CLUSTERED)) {
 					if (ret_max < ECMD_FAILED)
 						ret_max = ECMD_FAILED;
 					continue;
@@ -377,10 +375,8 @@
 			}
 		}
 
-		if ((vg->status & CLUSTERED) && !locking_is_clustered() &&
-		    !lockingfailed()) {
+		if (!vg_check_status(vg, CLUSTERED)) {
 			unlock_vg(cmd, vgname);
-			log_error("Skipping clustered volume group %s", vgname);
 			if (ret_max < ECMD_FAILED)
 				ret_max = ECMD_FAILED;
 			continue;
@@ -413,6 +409,8 @@
 		unlock_vg(cmd, vgname);
 		if (ret > ret_max)
 			ret_max = ret;
+		if (sigint_caught())
+			return ret_max;
 	}
 
 	return ret_max;
@@ -435,6 +433,8 @@
 		ret = process_single(cmd, vg, pvseg, handle);
 		if (ret > ret_max)
 			ret_max = ret;
+		if (sigint_caught())
+			return ret_max;
 	}
 
 	return ret_max;
@@ -455,6 +455,8 @@
 		ret = process_single(cmd, seg, handle);
 		if (ret > ret_max)
 			ret_max = ret;
+		if (sigint_caught())
+			return ret_max;
 	}
 
 	return ret_max;
@@ -485,9 +487,7 @@
 		return ECMD_FAILED;
 	}
 
-	if ((vg->status & CLUSTERED) && !locking_is_clustered() &&
-	    !lockingfailed()) {
-		log_error("Skipping clustered volume group %s", vg_name);
+	if (!vg_check_status(vg, CLUSTERED)) {
 		unlock_vg(cmd, vg_name);
 		return ECMD_FAILED;
 	}
@@ -506,6 +506,9 @@
 		ret_max = ret;
 	}
 
+	if (sigint_caught())
+		return ret_max;
+
 	unlock_vg(cmd, vg_name);
 
 	return ret_max;
@@ -581,6 +584,8 @@
 						  &arg_vgnames,
 					  	  lock_type, consistent, handle,
 					  	  ret_max, process_single);
+			if (sigint_caught())
+				return ret_max;
 		}
 	} else {
 		list_iterate_items(sl, vgnames) {
@@ -591,6 +596,8 @@
 						  &arg_vgnames,
 					  	  lock_type, consistent, handle,
 					  	  ret_max, process_single);
+			if (sigint_caught())
+				return ret_max;
 		}
 	}
 
@@ -615,6 +622,8 @@
 		}
 		if ((ret = process_single(cmd, vg, pvl->pv, handle)) > ret_max)
 			ret_max = ret;
+		if (sigint_caught())
+			return ret_max;
 	}
 
 	return ret_max;
@@ -651,6 +660,8 @@
 		ret = process_single(cmd, NULL, pv, handle);
 		if (ret > ret_max)
 			ret_max = ret;
+		if (sigint_caught())
+			return ret_max;
 	}
 
 	dev_iter_destroy(iter);
@@ -723,6 +734,8 @@
 			ret = process_single(cmd, vg, pv, handle);
 			if (ret > ret_max)
 				ret_max = ret;
+			if (sigint_caught())
+				return ret_max;
 		}
 		if (!list_empty(&tags) && (vgnames = get_vgs(cmd, 0)) &&
 		    !list_empty(vgnames)) {
@@ -735,19 +748,16 @@
 				if (!consistent)
 					continue;
 
-				if ((vg->status & CLUSTERED) &&
-				    !locking_is_clustered() &&
-				    !lockingfailed()) {
-					log_error("Skipping clustered volume "
-						  "group %s", sll->str);
+				if (!vg_check_status(vg, CLUSTERED))
 					continue;
-				}
 
 				ret = process_each_pv_in_vg(cmd, vg, &tags,
 							    handle,
 							    process_single);
 				if (ret > ret_max)
 					ret_max = ret;
+				if (sigint_caught())
+					return ret_max;
 			}
 		}
 	} else {
@@ -758,10 +768,14 @@
 						    process_single);
 			if (ret > ret_max)
 				ret_max = ret;
+			if (sigint_caught())
+				return ret_max;
 		} else if (arg_count(cmd, all_ARG)) {
 			ret = _process_all_devs(cmd, handle, process_single);
 			if (ret > ret_max)
 				ret_max = ret;
+			if (sigint_caught())
+				return ret_max;
 		} else {
 			log_verbose("Scanning for physical volume names");
 			if (!(pvslist = get_pvs(cmd)))
@@ -772,6 +786,8 @@
 						     handle);
 				if (ret > ret_max)
 					ret_max = ret;
+				if (sigint_caught())
+					return ret_max;
 			}
 		}
 	}
@@ -1310,11 +1326,13 @@
 					 struct alloc_handle *ah,
 					 alloc_policy_t alloc,
 					 const char *lv_name,
-					 int in_sync)
+					 int in_sync,
+					 struct list *tags)
 {
 	struct logical_volume *log_lv;
 	char *log_name;
 	size_t len;
+	struct str_list *sl;
 
 	len = strlen(lv_name) + 32;
 	if (!(log_name = alloca(len)) ||
@@ -1336,6 +1354,13 @@
 		goto error;
 	}
 
+	/* Temporary tag mirror log */
+	list_iterate_items(sl, tags)
+		if (!str_list_add(cmd->mem, &log_lv->tags, sl->str)) {
+			log_error("Aborting. Unable to tag mirror log.");
+			goto error;
+		}
+
 	/* store mirror log on disk(s) */
 	if (!vg_write(vg)) {
 		stack;
@@ -1361,6 +1386,11 @@
 		goto error;
 	}
 
+	list_iterate_items(sl, tags)
+		if (!str_list_del(&log_lv->tags, sl->str))
+			log_error("Failed to remove tag %s from mirror log.",
+				  sl->str);
+
 	if (activation() && !set_lv(cmd, log_lv, log_lv->size,
 				    in_sync ? -1 : 0)) {
 		log_error("Aborting. Failed to wipe mirror log. "

Modified: lvm2/upstream/current/tools/toollib.h
==============================================================================
--- lvm2/upstream/current/tools/toollib.h	(original)
+++ lvm2/upstream/current/tools/toollib.h	Fri Jun 22 11:19:15 2007
@@ -100,7 +100,8 @@
 					 struct alloc_handle *ah,
 					 alloc_policy_t alloc,
 					 const char *lv_name,
-					 int in_sync);
+					 int in_sync,
+					 struct list *tags);
 
 int set_lv(struct cmd_context *cmd, struct logical_volume *lv,
 	   uint64_t sectors, int value);

Modified: lvm2/upstream/current/tools/vgcfgrestore.c
==============================================================================
--- lvm2/upstream/current/tools/vgcfgrestore.c	(original)
+++ lvm2/upstream/current/tools/vgcfgrestore.c	Fri Jun 22 11:19:15 2007
@@ -17,28 +17,29 @@
 
 int vgcfgrestore(struct cmd_context *cmd, int argc, char **argv)
 {
-	char *vg_name;
+	char *vg_name = NULL;
 
-	if (argc != 1) {
+	if (argc == 1) {
+		vg_name = skip_dev_dir(cmd, argv[0], NULL);
+		if (!validate_name(vg_name)) {
+			log_error("Volume group name \"%s\" is invalid", vg_name);
+			return ECMD_FAILED;
+		}
+	} else if (!(arg_count(cmd, list_ARG) && arg_count(cmd, file_ARG))) {
 		log_err("Please specify a *single* volume group to restore.");
 		return ECMD_FAILED;
 	}
 
-	vg_name = skip_dev_dir(cmd, argv[0], NULL);
-
-	if (!validate_name(vg_name)) {
-		log_error("Volume group name \"%s\" is invalid", vg_name);
-		return ECMD_FAILED;
-	}
-
 	/*
 	 * FIXME: overloading the -l arg for now to display a
 	 * list of archive files for a particular vg
 	 */
 	if (arg_count(cmd, list_ARG)) {
-		if (!archive_display(cmd, vg_name))
+		if (!(arg_count(cmd,file_ARG) ?
+			archive_display_file(cmd,
+					arg_str_value(cmd, file_ARG, "")) :
+			archive_display(cmd, vg_name)))
 			return ECMD_FAILED;
-
 		return ECMD_PROCESSED;
 	}
 

Modified: lvm2/upstream/current/tools/vgconvert.c
==============================================================================
--- lvm2/upstream/current/tools/vgconvert.c	(original)
+++ lvm2/upstream/current/tools/vgconvert.c	Fri Jun 22 11:19:15 2007
@@ -114,18 +114,18 @@
 	list_iterate_items(pvl, &vg->pvs) {
 		existing_pv = pvl->pv;
 
-		pe_start = existing_pv->pe_start;
-		pe_end = existing_pv->pe_count * existing_pv->pe_size
+		pe_start = get_pv_pe_start(existing_pv);
+		pe_end = get_pv_pe_count(existing_pv) * get_pv_pe_size(existing_pv)
 		    + pe_start - 1;
 
 		list_init(&mdas);
-		if (!(pv = pv_create(cmd->fmt, existing_pv->dev,
+		if (!(pv = pv_create(cmd->fmt, get_pv_dev(existing_pv),
 				     &existing_pv->id, size,
-				     pe_start, existing_pv->pe_count,
-				     existing_pv->pe_size, pvmetadatacopies,
+				     pe_start, get_pv_pe_count(existing_pv),
+				     get_pv_pe_size(existing_pv), pvmetadatacopies,
 				     pvmetadatasize, &mdas))) {
 			log_error("Failed to setup physical volume \"%s\"",
-				  dev_name(existing_pv->dev));
+				  dev_name(get_pv_dev(existing_pv)));
 			if (change_made)
 				log_error("Use pvcreate and vgcfgrestore to "
 					  "repair from archived metadata.");
@@ -136,30 +136,30 @@
 		change_made = 1;
 
 		log_verbose("Set up physical volume for \"%s\" with %" PRIu64
-			    " available sectors", dev_name(pv->dev), pv->size);
+			    " available sectors", dev_name(get_pv_dev(pv)), get_pv_size(pv));
 
 		/* Wipe existing label first */
-		if (!label_remove(pv->dev)) {
+		if (!label_remove(get_pv_dev(pv))) {
 			log_error("Failed to wipe existing label on %s",
-				  dev_name(pv->dev));
+				  dev_name(get_pv_dev(pv)));
 			log_error("Use pvcreate and vgcfgrestore to repair "
 				  "from archived metadata.");
 			return ECMD_FAILED;
 		}
 
 		log_very_verbose("Writing physical volume data to disk \"%s\"",
-				 dev_name(pv->dev));
+				 dev_name(get_pv_dev(pv)));
 		if (!(pv_write(cmd, pv, &mdas,
 			       arg_int64_value(cmd, labelsector_ARG,
 					       DEFAULT_LABELSECTOR)))) {
 			log_error("Failed to write physical volume \"%s\"",
-				  dev_name(pv->dev));
+				  dev_name(get_pv_dev(pv)));
 			log_error("Use pvcreate and vgcfgrestore to repair "
 				  "from archived metadata.");
 			return ECMD_FAILED;
 		}
 		log_verbose("Physical volume \"%s\" successfully created",
-			    dev_name(pv->dev));
+			    dev_name(get_pv_dev(pv)));
 
 	}
 

Modified: lvm2/upstream/current/tools/vgextend.c
==============================================================================
--- lvm2/upstream/current/tools/vgextend.c	(original)
+++ lvm2/upstream/current/tools/vgextend.c	Fri Jun 22 11:19:15 2007
@@ -59,26 +59,9 @@
 		goto error;
 	}
 
-	if ((vg->status & CLUSTERED) && !locking_is_clustered() &&
-	    !lockingfailed()) {
-		log_error("Skipping clustered volume group %s", vg->name);
+	if (!vg_check_status(vg, CLUSTERED | EXPORTED_VG |
+				 LVM_WRITE | RESIZEABLE_VG))
 		goto error;
-	}
-
-	if (vg->status & EXPORTED_VG) {
-		log_error("Volume group \"%s\" is exported", vg->name);
-		goto error;
-	}
-
-	if (!(vg->status & LVM_WRITE)) {
-		log_error("Volume group \"%s\" is read-only", vg_name);
-		goto error;
-	}
-
-	if (!(vg->status & RESIZEABLE_VG)) {
-		log_error("Volume group \"%s\" is not resizeable.", vg_name);
-		goto error;
-	}
 
 /********** FIXME
 	log_print("maximum logical volume size is %s",

Modified: lvm2/upstream/current/tools/vgmerge.c
==============================================================================
--- lvm2/upstream/current/tools/vgmerge.c	(original)
+++ lvm2/upstream/current/tools/vgmerge.c	Fri Jun 22 11:19:15 2007
@@ -41,21 +41,7 @@
 		return ECMD_FAILED;
 	}
 
-	if ((vg_to->status & CLUSTERED) && !locking_is_clustered() &&
-	    !lockingfailed()) {
-		log_error("Skipping clustered volume group %s", vg_name_to);
-		unlock_vg(cmd, vg_name_to);
-		return ECMD_FAILED;
-	}
-
-	if (vg_to->status & EXPORTED_VG) {
-		log_error("Volume group \"%s\" is exported", vg_to->name);
-		unlock_vg(cmd, vg_name_to);
-		return ECMD_FAILED;
-	}
-
-	if (!(vg_to->status & LVM_WRITE)) {
-		log_error("Volume group \"%s\" is read-only", vg_to->name);
+	if (!vg_check_status(vg_to, CLUSTERED | EXPORTED_VG | LVM_WRITE)) {
 		unlock_vg(cmd, vg_name_to);
 		return ECMD_FAILED;
 	}
@@ -73,21 +59,8 @@
 		goto error;
 	}
 
-        if ((vg_from->status & CLUSTERED) && !locking_is_clustered() &&
-            !lockingfailed()) {
-                log_error("Skipping clustered volume group %s", vg_name_from);
+	if (!vg_check_status(vg_from, CLUSTERED | EXPORTED_VG | LVM_WRITE))
                 goto error;
-        }
-
-	if (vg_from->status & EXPORTED_VG) {
-		log_error("Volume group \"%s\" is exported", vg_from->name);
-		goto error;
-	}
-
-	if (!(vg_from->status & LVM_WRITE)) {
-		log_error("Volume group \"%s\" is read-only", vg_from->name);
-		goto error;
-	}
 
 	if ((active = lvs_in_vg_activated(vg_from))) {
 		log_error("Logical volumes in \"%s\" must be inactive",

Modified: lvm2/upstream/current/tools/vgreduce.c
==============================================================================
--- lvm2/upstream/current/tools/vgreduce.c	(original)
+++ lvm2/upstream/current/tools/vgreduce.c	Fri Jun 22 11:19:15 2007
@@ -185,7 +185,7 @@
 				/* FIXME Also check for segs on deleted LVs */
 
 				pv = seg_pv(seg, s);
-				if (!pv || !pv->dev) {
+				if (!pv || !get_pv_dev(pv)) {
 					if (arg_count(cmd, mirrorsonly_ARG) &&
 					    !(lv->status & MIRROR_IMAGE)) {
 						log_error("Non-mirror-image LV %s found: can't remove.", lv->name);
@@ -365,9 +365,9 @@
 			    void *handle __attribute((unused)))
 {
 	struct pv_list *pvl;
-	const char *name = dev_name(pv->dev);
+	const char *name = dev_name(get_pv_dev(pv));
 
-	if (pv->pe_alloc_count) {
+	if (get_pv_pe_alloc_count(pv)) {
 		log_error("Physical volume \"%s\" still in use", name);
 		return ECMD_FAILED;
 	}
@@ -391,14 +391,14 @@
 	pv->vg_name = ORPHAN;
 	pv->status = ALLOCATABLE_PV;
 
-	if (!dev_get_size(pv->dev, &pv->size)) {
-		log_error("%s: Couldn't get size.", dev_name(pv->dev));
+	if (!dev_get_size(get_pv_dev(pv), &pv->size)) {
+		log_error("%s: Couldn't get size.", dev_name(get_pv_dev(pv)));
 		return ECMD_FAILED;
 	}
 
 	vg->pv_count--;
-	vg->free_count -= pv->pe_count - pv->pe_alloc_count;
-	vg->extent_count -= pv->pe_count;
+	vg->free_count -= get_pv_pe_count(pv) - get_pv_pe_alloc_count(pv);
+	vg->extent_count -= get_pv_pe_count(pv);
 
 	if (!vg_write(vg) || !vg_commit(vg)) {
 		log_error("Removal of physical volume \"%s\" from "
@@ -484,9 +484,7 @@
 		return ECMD_FAILED;
 	}
 
-	if (vg && (vg->status & CLUSTERED) && !locking_is_clustered() &&
-	    !lockingfailed()) {
-		log_error("Skipping clustered volume group %s", vg->name);
+	if (vg && !vg_check_status(vg, CLUSTERED)) {
 		unlock_vg(cmd, vg_name);
 		return ECMD_FAILED;
 	}
@@ -506,10 +504,7 @@
 			unlock_vg(cmd, vg_name);
 			return ECMD_FAILED;
 		}
-		if ((vg->status & CLUSTERED) && !locking_is_clustered() &&
-		    !lockingfailed()) {
-			log_error("Skipping clustered volume group %s",
-				  vg->name);
+		if (!vg_check_status(vg, CLUSTERED)) {
 			unlock_vg(cmd, vg_name);
 			return ECMD_FAILED;
 		}

Modified: lvm2/upstream/current/tools/vgremove.c
==============================================================================
--- lvm2/upstream/current/tools/vgremove.c	(original)
+++ lvm2/upstream/current/tools/vgremove.c	Fri Jun 22 11:19:15 2007
@@ -54,12 +54,12 @@
 	list_iterate_items(pvl, &vg->pvs) {
 		pv = pvl->pv;
 		log_verbose("Removing physical volume \"%s\" from "
-			    "volume group \"%s\"", dev_name(pv->dev), vg_name);
+			    "volume group \"%s\"", dev_name(get_pv_dev(pv)), vg_name);
 		pv->vg_name = ORPHAN;
 		pv->status = ALLOCATABLE_PV;
 
-		if (!dev_get_size(pv->dev, &pv->size)) {
-			log_error("%s: Couldn't get size.", dev_name(pv->dev));
+		if (!dev_get_size(get_pv_dev(pv), &pv->size)) {
+			log_error("%s: Couldn't get size.", dev_name(get_pv_dev(pv)));
 			ret = ECMD_FAILED;
 			continue;
 		}
@@ -68,7 +68,7 @@
 		if (!pv_write(cmd, pv, NULL, INT64_C(-1))) {
 			log_error("Failed to remove physical volume \"%s\""
 				  " from volume group \"%s\"",
-				  dev_name(pv->dev), vg_name);
+				  dev_name(get_pv_dev(pv)), vg_name);
 			ret = ECMD_FAILED;
 		}
 	}

Modified: lvm2/upstream/current/tools/vgrename.c
==============================================================================
--- lvm2/upstream/current/tools/vgrename.c	(original)
+++ lvm2/upstream/current/tools/vgrename.c	Fri Jun 22 11:19:15 2007
@@ -102,21 +102,13 @@
 		return ECMD_FAILED;
 	}
 
-	if ((vg_old->status & CLUSTERED) && !locking_is_clustered() &&
-	    !lockingfailed()) {
-		log_error("Skipping clustered volume group %s", vg_old->name);
+	if (!vg_check_status(vg_old, CLUSTERED | LVM_WRITE)) {
 		unlock_vg(cmd, vg_name_old);
 		return ECMD_FAILED;
 	}
 
-	if (vg_old->status & EXPORTED_VG)
-		log_info("Volume group \"%s\" is exported", vg_old->name);
-
-	if (!(vg_old->status & LVM_WRITE)) {
-		unlock_vg(cmd, vg_name_old);
-		log_error("Volume group \"%s\" is read-only", vg_old->name);
-		return ECMD_FAILED;
-	}
+	/* Don't return failure for EXPORTED_VG */
+	vg_check_status(vg_old, EXPORTED_VG);
 
 	if (lvs_in_vg_activated_by_uuid_only(vg_old)) {
 		unlock_vg(cmd, vg_name_old);

Modified: lvm2/upstream/current/tools/vgsplit.c
==============================================================================
--- lvm2/upstream/current/tools/vgsplit.c	(original)
+++ lvm2/upstream/current/tools/vgsplit.c	Fri Jun 22 11:19:15 2007
@@ -35,11 +35,11 @@
 
 	pv = list_item(pvl, struct pv_list)->pv;
 
-	vg_from->extent_count -= pv->pe_count;
-	vg_to->extent_count += pv->pe_count;
+	vg_from->extent_count -= get_pv_pe_count(pv);
+	vg_to->extent_count += get_pv_pe_count(pv);
 
-	vg_from->free_count -= pv->pe_count - pv->pe_alloc_count;
-	vg_to->free_count += pv->pe_count - pv->pe_alloc_count;
+	vg_from->free_count -= get_pv_pe_count(pv) - get_pv_pe_alloc_count(pv);
+	vg_to->free_count += get_pv_pe_count(pv) - get_pv_pe_alloc_count(pv);
 
 	return 1;
 }
@@ -105,7 +105,7 @@
 					continue;
 				}
 				log_error("Physical Volume %s not found",
-					  dev_name(pv->dev));
+					  dev_name(get_pv_dev(pv)));
 				return 0;
 			}
 
@@ -145,13 +145,16 @@
 		list_iterate_items(seg, &lv->segments) {
 			cow_from = _lv_is_in_vg(vg_from, seg->cow);
 			origin_from = _lv_is_in_vg(vg_from, seg->origin);
+
+			if (cow_from && origin_from)
+				continue;
+			if ((!cow_from && origin_from) ||
+			     (cow_from && !origin_from)) {
+				log_error("Can't split snapshot %s between"
+					  " two Volume Groups", seg->cow->name);
+				return 0;
+			}
 		}
-		if (cow_from && origin_from)
-			continue;
-		if ((!cow_from && origin_from) || (cow_from && !origin_from)) {
-			log_error("Snapshot %s split", seg->cow->name);
-			return 0;
-		}	
 
 		/* Move this snapshot */
 		list_del(lvh);
@@ -190,7 +193,8 @@
 		if ((seg_in && seg_in < seg->area_count) || 
 		    (seg_in && seg->log_lv && !log_in) || 
 		    (!seg_in && seg->log_lv && log_in)) {
-			log_error("Mirror %s split", lv->name);
+			log_error("Can't split mirror %s between "
+				  "two Volume Groups", lv->name);
 			return 0;
 		}
 
@@ -247,27 +251,8 @@
 		return ECMD_FAILED;
 	}
 
-	if ((vg_from->status & CLUSTERED) && !locking_is_clustered() &&
-	    !lockingfailed()) {
-		log_error("Skipping clustered volume group %s", vg_from->name);
-		unlock_vg(cmd, vg_name_from);
-		return ECMD_FAILED;
-	}
-
-	if (vg_from->status & EXPORTED_VG) {
-		log_error("Volume group \"%s\" is exported", vg_from->name);
-		unlock_vg(cmd, vg_name_from);
-		return ECMD_FAILED;
-	}
-
-	if (!(vg_from->status & RESIZEABLE_VG)) {
-		log_error("Volume group \"%s\" is not resizeable", vg_from->name);
-		unlock_vg(cmd, vg_name_from);
-		return ECMD_FAILED;
-	}
-
-	if (!(vg_from->status & LVM_WRITE)) {
-		log_error("Volume group \"%s\" is read-only", vg_from->name);
+	if (!vg_check_status(vg_from, CLUSTERED | EXPORTED_VG |
+				      RESIZEABLE_VG | LVM_WRITE)) {
 		unlock_vg(cmd, vg_name_from);
 		return ECMD_FAILED;
 	}
@@ -299,6 +284,10 @@
 		goto error;
 	}
 
+	/* Set metadata format of original VG */
+	/* FIXME: need some common logic */
+	cmd->fmt = vg_from->fid->fmt;
+
 	/* Create new VG structure */
 	if (!(vg_to = vg_create(cmd, vg_name_to, vg_from->extent_size,
 				vg_from->max_pv, vg_from->max_lv,
@@ -330,11 +319,15 @@
 	if (!(_move_mirrors(vg_from, vg_to)))
 		goto error;
 
-	/* FIXME Split mdas properly somehow too! */
-	/* Currently we cheat by sharing the format instance and relying on 
-	 * vg_write to ignore mdas outside the VG!  Done this way, with text 
-	 * format, vg_from disappears for a short time. */
-	vg_to->fid = vg_from->fid;
+	/* Split metadata areas and check if both vgs have at least one area */
+	if (!(vg_split_mdas(cmd, vg_from, vg_to))) {
+		log_error("Cannot split: Nowhere to store metadata for new Volume Group");
+		goto error;
+	}
+
+	/* Set proper name for all PVs in new VG */
+	if (!vg_rename(cmd, vg_to, vg_name_to))
+		goto error;
 
 	/* store it on disks */
 	log_verbose("Writing out updated volume groups");



More information about the pkg-lvm-commits mailing list