* [PATCH 1/2] Add pvck ability to scan for labels on any area of disk
@ 2007-04-20 17:45 Dave Wysochanski
2007-04-23 22:04 ` [REPOST PATCH " Dave Wysochanski
0 siblings, 1 reply; 2+ messages in thread
From: Dave Wysochanski @ 2007-04-20 17:45 UTC (permalink / raw)
To: lvm-devel
Update pvck to read labels on disk, with flexible --labelsector
parameter.
Index: LVM2/lib/metadata/metadata.c
===================================================================
--- LVM2.orig/lib/metadata/metadata.c 2007-04-20 13:39:28.000000000 -0400
+++ LVM2/lib/metadata/metadata.c 2007-04-20 13:43:03.000000000 -0400
@@ -1555,3 +1555,39 @@ int pv_write_orphan(struct cmd_context *
return 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;
+
+ /*
+ * Take the pv directly, and ignore any filters. We do this
+ * because we're often in recovery mode here, and side-effects
+ * with things like filters would probably be unexpected.
+ */
+ dev = dev_cache_get(pv_name, NULL);
+ if (!dev)
+ goto error;
+
+ /*
+ * First, scan for LVM labels.
+ */
+ if (label_read(dev, &label, label_sector)) {
+ log_print("Found label on %s, sector %"PRIu64", type=%s",
+ pv_name, label->sector, label->type);
+ } else {
+ log_error("Could not find LVM label on %s - "
+ "try --labelsector option?", pv_name);
+ goto error;
+ }
+
+ return 1;
+ error:
+ return 0;
+}
Index: LVM2/lib/metadata/metadata.h
===================================================================
--- LVM2.orig/lib/metadata/metadata.h 2007-04-20 13:39:28.000000000 -0400
+++ LVM2/lib/metadata/metadata.h 2007-04-20 13:43:03.000000000 -0400
@@ -443,6 +443,8 @@ struct physical_volume *pv_create(const
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,
Index: LVM2/man/pvck.8
===================================================================
--- LVM2.orig/man/pvck.8 2007-04-20 13:39:28.000000000 -0400
+++ LVM2/man/pvck.8 2007-04-20 13:43:03.000000000 -0400
@@ -3,11 +3,27 @@
pvck \- check physical volume metadata
.SH SYNOPSIS
.B pvck
-[\-d/\-\-debug] [\-h/\-?/\-\-help] [\-v/\-\-verbose] [PhysicalVolume...]
+.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 the PV(s) are scanned for an LVM identifier (label) in its second
+sector (sector 1). This lets you scan a different sector for an LVM label,
+and is useful for recovery situations. For example, suppose the partition
+table is corrupted or lost on /dev/sda, but you know there were LVM partitions
+on it. You can guess at the location of the partition, and pass this sector
+offset to pvck /dev/sda as the \fB--labelsector\fP parameter. (With a script, you
+can automate this process if you are unsure about the location.) Note that
+pvck scans a few sectors starting at labelsector (see LABEL_SCAN_SECTORS in
+the source) so you don't need to specify the exact sector for the label.
+For LVM1, you should use \fB--labelsector\fP 0.
.SH SEE ALSO
.BR lvm (8),
.BR pvcreate (8),
Index: LVM2/tools/commands.h
===================================================================
--- LVM2.orig/tools/commands.h 2007-04-20 13:39:28.000000000 -0400
+++ LVM2/tools/commands.h 2007-04-20 13:43:03.000000000 -0400
@@ -412,9 +412,11 @@ xx(pvck,
"pvck "
"\t[-d|--debug]\n"
"\t[-h|--help]\n"
- "\t[-v|--verbose]\n"
+ "\t[--labelsector sector] " "\n"
+ "\t[-v|--verbose]\n"
"\t[--version]" "\n"
- "\tPhysicalVolume [PhysicalVolume...]\n" )
+ "\tPhysicalVolume [PhysicalVolume...]\n",
+ labelsector_ARG)
xx(pvcreate,
"Initialize physical volume(s) for use by LVM",
Index: LVM2/tools/pvck.c
===================================================================
--- LVM2.orig/tools/pvck.c 2007-04-20 13:39:28.000000000 -0400
+++ LVM2/tools/pvck.c 2007-04-20 13:43:03.000000000 -0400
@@ -15,16 +15,29 @@
#include "tools.h"
-static int _pvck_single(struct cmd_context * cmd,
- struct volume_group * vg,
- struct physical_volume * pv,
- void *handle)
-{
- return ECMD_PROCESSED;
-}
-
int pvck(struct cmd_context *cmd, int argc, char **argv)
{
- /* FIXME: Correlate findings of each PV */
- return process_each_pv(cmd, argc, argv, NULL, NULL, _pvck_single);
+ 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]);
+
+ if (!pv_analyze(cmd, argv[i],
+ arg_int64_value(cmd, labelsector_ARG,
+ DEFAULT_LABELSECTOR)))
+ goto error;
+ }
+
+ return ECMD_PROCESSED;
+ error:
+ return ECMD_FAILED;
}
Index: LVM2/WHATS_NEW
===================================================================
--- LVM2.orig/WHATS_NEW 2007-04-20 13:39:28.000000000 -0400
+++ LVM2/WHATS_NEW 2007-04-20 13:43:03.000000000 -0400
@@ -1,5 +1,6 @@
Version 2.02.25 -
=================================
+ Add ability for pvck to detect LVM2 and LVM1 labels.
Add start_sector param to label_read and _find_labeller.
Add lib/config support functions.
Add count_chars_null and count_chars_len.
^ permalink raw reply [flat|nested] 2+ messages in thread
* [REPOST PATCH 1/2] Add pvck ability to scan for labels on any area of disk
2007-04-20 17:45 [PATCH 1/2] Add pvck ability to scan for labels on any area of disk Dave Wysochanski
@ 2007-04-23 22:04 ` Dave Wysochanski
0 siblings, 0 replies; 2+ messages in thread
From: Dave Wysochanski @ 2007-04-23 22:04 UTC (permalink / raw)
To: lvm-devel
I think all comments incorporated / addressed.
Update pvck to read labels on disk, with flexible --labelsector
parameter.
Index: LVM2-label-read/lib/metadata/metadata.c
===================================================================
--- LVM2-label-read.orig/lib/metadata/metadata.c 2007-04-23 14:21:01.000000000 -0400
+++ LVM2-label-read/lib/metadata/metadata.c 2007-04-23 17:53:02.000000000 -0400
@@ -1555,3 +1555,35 @@ int pv_write_orphan(struct cmd_context *
return 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;
+
+ 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);
+
+ return 1;
+}
Index: LVM2-label-read/lib/metadata/metadata.h
===================================================================
--- LVM2-label-read.orig/lib/metadata/metadata.h 2007-03-23 08:43:17.000000000 -0400
+++ LVM2-label-read/lib/metadata/metadata.h 2007-04-23 15:13:43.000000000 -0400
@@ -443,6 +443,8 @@ struct physical_volume *pv_create(const
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,
Index: LVM2-label-read/man/pvck.8
===================================================================
--- LVM2-label-read.orig/man/pvck.8 2007-03-30 17:00:25.000000000 -0400
+++ LVM2-label-read/man/pvck.8 2007-04-23 17:31:28.000000000 -0400
@@ -3,11 +3,29 @@
pvck \- check physical volume metadata
.SH SYNOPSIS
.B pvck
-[\-d/\-\-debug] [\-h/\-?/\-\-help] [\-v/\-\-verbose] [PhysicalVolume...]
+.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),
Index: LVM2-label-read/tools/commands.h
===================================================================
--- LVM2-label-read.orig/tools/commands.h 2007-03-30 17:00:26.000000000 -0400
+++ LVM2-label-read/tools/commands.h 2007-04-23 17:57:03.000000000 -0400
@@ -412,9 +412,12 @@ xx(pvck,
"pvck "
"\t[-d|--debug]\n"
"\t[-h|--help]\n"
+ "\t[--labelsector sector] " "\n"
"\t[-v|--verbose]\n"
"\t[--version]" "\n"
- "\tPhysicalVolume [PhysicalVolume...]\n" )
+ "\tPhysicalVolume [PhysicalVolume...]\n",
+
+ labelsector_ARG)
xx(pvcreate,
"Initialize physical volume(s) for use by LVM",
Index: LVM2-label-read/tools/pvck.c
===================================================================
--- LVM2-label-read.orig/tools/pvck.c 2007-03-30 17:00:26.000000000 -0400
+++ LVM2-label-read/tools/pvck.c 2007-04-23 17:33:00.000000000 -0400
@@ -15,16 +15,26 @@
#include "tools.h"
-static int _pvck_single(struct cmd_context * cmd,
- struct volume_group * vg,
- struct physical_volume * pv,
- void *handle)
-{
- return ECMD_PROCESSED;
-}
-
int pvck(struct cmd_context *cmd, int argc, char **argv)
{
- /* FIXME: Correlate findings of each PV */
- return process_each_pv(cmd, argc, argv, NULL, NULL, _pvck_single);
+ 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;
}
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2007-04-23 22:04 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-04-20 17:45 [PATCH 1/2] Add pvck ability to scan for labels on any area of disk Dave Wysochanski
2007-04-23 22:04 ` [REPOST PATCH " Dave Wysochanski
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.