]> sourceware.org Git - lvm2.git/commitdiff
Detect LUKS signature in pvcreate
authorMilan Broz <mbroz@redhat.com>
Thu, 19 Aug 2010 23:08:18 +0000 (23:08 +0000)
committerMilan Broz <mbroz@redhat.com>
Thu, 19 Aug 2010 23:08:18 +0000 (23:08 +0000)
One shiny day we should use libblkid here. But now using LUKS is
very common together with LVM and pvcreate destroys LUKS completely.

So for user's convenience, try to detect LUKS signature and allow abort.

WHATS_NEW
lib/Makefile.in
lib/device/dev-luks.c [new file with mode: 0644]
lib/device/device.h
lib/metadata/metadata.c

index 70821da05d945a756cf571f9fe23122078506951..848b696af3a9e0ba5ce5d1e6ccbb89c0a709533d 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -3,6 +3,7 @@ Version 2.02.74 -
   Simplify MD/swap signature detection in pvcreate and allow aborting.
   Remove assumption that --yes must be used only in --force mode.
   Fix file descriptor leak in swap signature detection error path.
+  Detect and allow abort in pvcreate if LUKS signature is detected.
 
 Version 2.02.73 - 18th August 2010
 ==================================
index ae81040536802cf442a31acb6e6cbc06edcefafe..1c58bdd8c55faa65f413da21f3aa52571199e69b 100644 (file)
@@ -47,6 +47,7 @@ SOURCES =\
        device/dev-io.c \
        device/dev-md.c \
        device/dev-swap.c \
+       device/dev-luks.c \
        device/device.c \
        display/display.c \
        error/errseg.c \
diff --git a/lib/device/dev-luks.c b/lib/device/dev-luks.c
new file mode 100644 (file)
index 0000000..6337992
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2010 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 Lesser General Public License v.2.1.
+ *
+ * You should have received a copy of the GNU Lesser 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 "lib.h"
+#include "metadata.h"
+
+#define LUKS_SIGNATURE "LUKS\xba\xbe"
+#define LUKS_SIGNATURE_SIZE 6
+
+int dev_is_luks(struct device *dev, uint64_t *signature)
+{
+       char buf[LUKS_SIGNATURE_SIZE];
+       int ret = -1;
+
+       if (!dev_open(dev)) {
+               stack;
+               return -1;
+       }
+
+       *signature = 0;
+
+       if (!dev_read(dev, 0, LUKS_SIGNATURE_SIZE, buf))
+               goto_out;
+
+       ret = memcmp(buf, LUKS_SIGNATURE, LUKS_SIGNATURE_SIZE) ? 0 : 1;
+
+out:
+       if (!dev_close(dev))
+               stack;
+
+       return ret;
+}
index 8bf33e6589964654576c8b494cf1a51d21721409..5a59950864fe88d7b7b0ec82726da8729653d765 100644 (file)
@@ -96,6 +96,7 @@ const char *dev_name_confirmed(struct device *dev, int quiet);
 /* Does device contain md superblock?  If so, where? */
 int dev_is_md(struct device *dev, uint64_t *sb);
 int dev_is_swap(struct device *dev, uint64_t *signature);
+int dev_is_luks(struct device *dev, uint64_t *signature);
 unsigned long dev_md_stripe_width(const char *sysfs_dir, struct device *dev);
 
 int is_partitioned_dev(struct device *dev);
index db196d6479a4f28ccc3a59475a3c162402c5a538..ed00ffa181ebc44427b8c13883d33c8e176d5441 100644 (file)
@@ -1640,6 +1640,9 @@ static int pvcreate_check(struct cmd_context *cmd, const char *name,
        if (!_wipe_sb(dev, "swap signature", name, 10, pp, dev_is_swap))
                return 0;
 
+       if (!_wipe_sb(dev, "LUKS signature", name, 8, pp, dev_is_luks))
+               return 0;
+
        if (sigint_caught())
                return 0;
 
This page took 0.045941 seconds and 5 git commands to generate.