diff --git a/WHATS_NEW b/WHATS_NEW index 70821da05..848b696af 100644 --- 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 ================================== diff --git a/lib/Makefile.in b/lib/Makefile.in index ae8104053..1c58bdd8c 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -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 index 000000000..6337992e5 --- /dev/null +++ b/lib/device/dev-luks.c @@ -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; +} diff --git a/lib/device/device.h b/lib/device/device.h index 8bf33e658..5a5995086 100644 --- a/lib/device/device.h +++ b/lib/device/device.h @@ -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); diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index db196d647..ed00ffa18 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -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;