diff --git a/WHATS_NEW b/WHATS_NEW index 1df0fe9bf..20a87a2e2 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.46 - ================================ + Detect and conditionally wipe swapspace signatures in pvcreate. Fix maximal volume count check for snapshots if max_lv set for volume group. Fix lvcreate to remove cow volume if the snapshot creation fails. Fix error messages when PV uuid or pe_start reading fails. diff --git a/lib/Makefile.in b/lib/Makefile.in index ee1f8ff93..e65d0c269 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -42,6 +42,7 @@ SOURCES =\ device/dev-cache.c \ device/dev-io.c \ device/dev-md.c \ + device/dev-swap.c \ device/device.c \ display/display.c \ error/errseg.c \ diff --git a/lib/device/device.h b/lib/device/device.h index ac300231d..abec65025 100644 --- a/lib/device/device.h +++ b/lib/device/device.h @@ -93,6 +93,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); unsigned long dev_md_chunk_size(const char *sysfs_dir, struct device *dev); int is_partitioned_dev(struct device *dev); diff --git a/test/t-pvcreate-operation.sh b/test/t-pvcreate-operation.sh index 2affcfc99..a0b67e20b 100755 --- a/test/t-pvcreate-operation.sh +++ b/test/t-pvcreate-operation.sh @@ -108,3 +108,10 @@ not pvcreate --uuid $uuid1 --restorefile $backupfile $dev1 pvcreate --uuid $uuid1 $dev1 vgcfgbackup -f $backupfile not pvcreate --uuid $uuid2 --restorefile $backupfile $dev2 + +# pvcreate wipes swap signature when forced +dd if=/dev/zero of=$dev1 bs=1024 count=64 +mkswap $dev1 +file -s $dev1 | grep "swap file" +pvcreate -f $dev1 +file -s $dev1 | not grep "swap file" diff --git a/tools/pvcreate.c b/tools/pvcreate.c index 8ec95f451..aa3dcff40 100644 --- a/tools/pvcreate.c +++ b/tools/pvcreate.c @@ -45,7 +45,7 @@ static int pvcreate_check(struct cmd_context *cmd, const char *name, { struct physical_volume *pv; struct device *dev; - uint64_t md_superblock; + uint64_t md_superblock, swap_signature; /* FIXME Check partition type is LVM unless --force is given */ @@ -129,6 +129,17 @@ static int pvcreate_check(struct cmd_context *cmd, const char *name, } } + if (dev_is_swap(dev, &swap_signature) && + ((!pp->idp && !pp->restorefile) || pp->yes || + (yes_no_prompt("Swap signature detected on %s. Wipe it? [y/n] ", + name) == 'y'))) { + log_print("Wiping swap signature on %s", name); + if (!dev_set(dev, swap_signature, 10, 0)) { + log_error("Failed to wipe swap signature on %s", name); + return 0; + } + } + if (sigint_caught()) return 0;