]> sourceware.org Git - lvm2.git/commitdiff
thin: allow restore with --force
authorZdenek Kabelac <zkabelac@redhat.com>
Mon, 26 Nov 2012 22:45:35 +0000 (23:45 +0100)
committerZdenek Kabelac <zkabelac@redhat.com>
Tue, 27 Nov 2012 13:08:24 +0000 (14:08 +0100)
Allow restoring metadata with thin pool volumes.
No validation is done for this case within vgcfgrestore tool -
thus incorrect metadata may lead to destruction of pool content.

WHATS_NEW
lib/format_text/archiver.c
lib/format_text/archiver.h
man/vgcfgrestore.8.in
tools/args.h
tools/commands.h
tools/vgcfgrestore.c

index 2c6ad4c0877dc33ecfeae662e8eeafd55ba91a7a..1655a7eef3e2bf6d29142dfcc4453506c89052af 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.99 - 
 ===================================
+  Allow forced vgcfgrestore of lvm2 metadata with thin volumes.
   Recognise STEC skd devices in filter.
   Recognise Violin Memory vtms devices in filter.
   Add lvm.conf thin pool defs thin_pool_{chunk_size|discards|zero}.
index ccefb4cea032f03f0a57c60b19de94f90c3df370..8599e3b28e32d8ba94905bf60d0448a56ddb8a40 100644 (file)
@@ -347,7 +347,7 @@ int backup_restore_vg(struct cmd_context *cmd, struct volume_group *vg)
 
 /* ORPHAN and VG locks held before calling this */
 int backup_restore_from_file(struct cmd_context *cmd, const char *vg_name,
-                            const char *file)
+                            const char *file, int force)
 {
        struct volume_group *vg;
        int missing_pvs, r = 0;
@@ -360,14 +360,20 @@ int backup_restore_from_file(struct cmd_context *cmd, const char *vg_name,
                return_0;
 
        /* FIXME: Restore support is missing for now */
-       dm_list_iterate_items(lvl, &vg->lvs)
+       dm_list_iterate_items(lvl, &vg->lvs) {
                if (lv_is_thin_type(lvl->lv)) {
-                       log_error("Cannot restore Volume Group %s with "
-                                 "thin logical volumes. "
-                                 "(not yet supported).", vg->name);
-                       r = 0;
-                       goto out;
+                       if (!force) {
+                               log_error("Consider using option --force to restore "
+                                         "Volume Group %s with thin volumes.",
+                                         vg->name);
+                               goto out;
+                       } else {
+                               log_warn("WARNING: Forced restore of Volume Group "
+                                        "%s with thin volumes.", vg->name);
+                               break;
+                       }
                }
+       }
 
        missing_pvs = vg_missing_pv_count(vg);
        if (missing_pvs == 0)
@@ -381,7 +387,7 @@ out:
        return r;
 }
 
-int backup_restore(struct cmd_context *cmd, const char *vg_name)
+int backup_restore(struct cmd_context *cmd, const char *vg_name, int force)
 {
        char path[PATH_MAX];
 
@@ -391,7 +397,7 @@ int backup_restore(struct cmd_context *cmd, const char *vg_name)
                return 0;
        }
 
-       return backup_restore_from_file(cmd, vg_name, path);
+       return backup_restore_from_file(cmd, vg_name, path, force);
 }
 
 int backup_to_file(const char *file, const char *desc, struct volume_group *vg)
index 7346f93beffd20cead6ed9469f39b7fef6b8020e..ddff687fcc4648255c7f85783424dc0d882c42fb 100644 (file)
@@ -53,8 +53,8 @@ struct volume_group *backup_read_vg(struct cmd_context *cmd,
                                    const char *vg_name, const char *file);
 int backup_restore_vg(struct cmd_context *cmd, struct volume_group *vg);
 int backup_restore_from_file(struct cmd_context *cmd, const char *vg_name,
-                            const char *file);
-int backup_restore(struct cmd_context *cmd, const char *vg_name);
+                            const char *file, int force);
+int backup_restore(struct cmd_context *cmd, const char *vg_name, int force);
 
 int backup_to_file(const char *file, const char *desc, struct volume_group *vg);
 
index 3b7b038b2356a1328ddb3ccf765e22b4fa28fbf4..7b8dd5914fb1f8f156763617e4b782edd965ddee 100644 (file)
@@ -6,6 +6,7 @@ vgcfgrestore \- restore volume group descriptor area
 .RB [ \-d | \-\-debug ]
 .RB [ \-f | \-\-file
 .RI < filename >]
+.RB [ \-\-force ]
 .RB [ \-l [ l ]| \-\-list ]
 .RB [ \-h | \-\-help ]
 .RB [ \-M | \-\-metadatatype
@@ -32,6 +33,14 @@ May be used with the \fB\-f\fP option.  Does not restore \fIVolumeGroupName\fP.
 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
+.B \-\-force
+To restore metadata with thin pool volumes, user currently
+needs to use this flag. The tool DOES NOT make any validation.
+.br
+WARNING: Restoring lvm2 metadata that are not matching thin pool
+kernel metadata may lead to the destruction of the pool content.
+Use with extreme caution.
 .SH REPLACING PHYSICAL VOLUMES
 \fBvgdisplay \-\-partial \-\-verbose\fP will show you the UUIDs and sizes of
 any PVs that are no longer present.
index 0d9605a8911aa972c213981392da661543b37397..d4d6c4012757c0f1b47c8fb4f53f895b0ddea9f2 100644 (file)
@@ -73,6 +73,7 @@ arg(poll_ARG, '\0', "poll", yes_no_arg, 0)
 arg(poolmetadata_ARG, '\0', "poolmetadata", string_arg, 0)
 arg(poolmetadatasize_ARG, '\0', "poolmetadatasize", size_mb_arg, 0)
 arg(discards_ARG, '\0', "discards", discards_arg, 0)
+arg(force_long_ARG, '\0', "force", NULL, ARG_COUNTABLE)
 arg(stripes_long_ARG, '\0', "stripes", int_arg, 0)
 arg(sysinit_ARG, '\0', "sysinit", NULL, 0)
 arg(thinpool_ARG, '\0', "thinpool", string_arg, 0)
index 8d5d190f0df43aec2a9e55c4993e39a4d7ee5b54..986539e130eb31389752fd9bf1955bfb2a9783e9 100644 (file)
@@ -725,6 +725,7 @@ xx(vgcfgrestore,
    "vgcfgrestore " "\n"
    "\t[-d|--debug] " "\n"
    "\t[-f|--file filename] " "\n"
+   "\t[--force]\n"
    "\t[-l[l]|--list [--list]]" "\n"
    "\t[-M|--metadatatype 1|2]" "\n"
    "\t[-h|--help]" "\n"
@@ -733,7 +734,7 @@ xx(vgcfgrestore,
    "\t[--version] " "\n"
    "\tVolumeGroupName",
 
-   file_ARG, list_ARG, metadatatype_ARG, test_ARG)
+   file_ARG, force_long_ARG, list_ARG, metadatatype_ARG, test_ARG)
 
 xx(vgchange,
    "Change volume group attributes",
index d62df99f7675e34089c295603d9e563ae552eddf..20ca16b35fa58bc9d91db3daaebc61e00ec4f394 100644 (file)
@@ -62,8 +62,9 @@ int vgcfgrestore(struct cmd_context *cmd, int argc, char **argv)
 
        if (!(arg_count(cmd, file_ARG) ?
              backup_restore_from_file(cmd, vg_name,
-                                      arg_str_value(cmd, file_ARG, "")) :
-             backup_restore(cmd, vg_name))) {
+                                      arg_str_value(cmd, file_ARG, ""),
+                                      arg_count(cmd, force_long_ARG)) :
+             backup_restore(cmd, vg_name, arg_count(cmd, force_long_ARG)))) {
                unlock_vg(cmd, VG_ORPHANS);
                unlock_vg(cmd, vg_name);
                log_error("Restore failed.");
This page took 0.047146 seconds and 5 git commands to generate.