mkswap: wipe old signature if there is no part table by default
Historically mkswap avoids wiping any signature on "whole disk", until force option is given. While the idea is that it should not wipe possible boot loader, in reality it leads to many situations where e.g. LUKS device is overwritten but still can be detected as LUKS (but unusable). Patch chnges behaviour that only if partition table is detected, signatures are not wiped. Also it removes check for block device - loop device can now map partitions in-kernel, so using mkswap on disk image in file should behave the same as on disk. Also it adds warning that know signature was wiped. Signed-off-by: Milan Broz <mbroz@redhat.com>
This commit is contained in:
parent
4082ab2c6f
commit
c1f1b30171
|
@ -54,7 +54,7 @@ like many others mkfs-like utils,
|
||||||
However,
|
However,
|
||||||
.B mkswap
|
.B mkswap
|
||||||
refuses to erase the first block on a device with a disk
|
refuses to erase the first block on a device with a disk
|
||||||
label (SUN, BSD, ...) and on a whole disk (e.g. /dev/sda).
|
label (SUN, BSD, ...).
|
||||||
|
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.TP
|
.TP
|
||||||
|
@ -70,8 +70,7 @@ or partition it resides on.
|
||||||
|
|
||||||
Also, without this option,
|
Also, without this option,
|
||||||
.B mkswap
|
.B mkswap
|
||||||
will refuse to erase the first block on a device with a partition table and on
|
will refuse to erase the first block on a device with a partition table.
|
||||||
a whole disk (e.g. /dev/sda).
|
|
||||||
.TP
|
.TP
|
||||||
.BR \-L , " \-\-label " \fIlabel\fR
|
.BR \-L , " \-\-label " \fIlabel\fR
|
||||||
Specify a \fIlabel\fR for the device, to allow
|
Specify a \fIlabel\fR for the device, to allow
|
||||||
|
|
|
@ -363,10 +363,9 @@ new_prober(int fd)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
wipe_device(int fd, const char *devname, int force, int is_blkdevice)
|
wipe_device(int fd, const char *devname, int force)
|
||||||
{
|
{
|
||||||
char *type = NULL;
|
char *type = NULL;
|
||||||
int whole = 0;
|
|
||||||
int zap = 1;
|
int zap = 1;
|
||||||
#ifdef HAVE_LIBBLKID
|
#ifdef HAVE_LIBBLKID
|
||||||
blkid_probe pr = NULL;
|
blkid_probe pr = NULL;
|
||||||
|
@ -375,29 +374,21 @@ wipe_device(int fd, const char *devname, int force, int is_blkdevice)
|
||||||
if (lseek(fd, 0, SEEK_SET) != 0)
|
if (lseek(fd, 0, SEEK_SET) != 0)
|
||||||
errx(EXIT_FAILURE, _("unable to rewind swap-device"));
|
errx(EXIT_FAILURE, _("unable to rewind swap-device"));
|
||||||
|
|
||||||
if (is_blkdevice && is_whole_disk_fd(fd, devname)) {
|
|
||||||
/* don't zap bootbits on whole disk -- we know nothing
|
|
||||||
* about bootloaders on the device */
|
|
||||||
whole = 1;
|
|
||||||
zap = 0;
|
|
||||||
} else {
|
|
||||||
#ifdef HAVE_LIBBLKID
|
#ifdef HAVE_LIBBLKID
|
||||||
pr = new_prober(fd);
|
pr = new_prober(fd);
|
||||||
blkid_probe_enable_partitions(pr, 1);
|
blkid_probe_enable_partitions(pr, 1);
|
||||||
blkid_probe_enable_superblocks(pr, 0);
|
blkid_probe_enable_superblocks(pr, 0);
|
||||||
|
|
||||||
if (blkid_do_fullprobe(pr) == 0 &&
|
if (blkid_do_fullprobe(pr) == 0 &&
|
||||||
blkid_probe_lookup_value(pr, "PTTYPE",
|
blkid_probe_lookup_value(pr, "PTTYPE",
|
||||||
(const char **) &type, NULL) == 0 &&
|
(const char **) &type, NULL) == 0 && type) {
|
||||||
type) {
|
type = xstrdup(type);
|
||||||
type = xstrdup(type);
|
|
||||||
zap = 0;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* don't zap if compiled without libblkid */
|
|
||||||
zap = 0;
|
zap = 0;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
/* don't zap if compiled without libblkid */
|
||||||
|
zap = 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (zap) {
|
if (zap) {
|
||||||
|
@ -405,6 +396,7 @@ wipe_device(int fd, const char *devname, int force, int is_blkdevice)
|
||||||
* Wipe boodbits
|
* Wipe boodbits
|
||||||
*/
|
*/
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
|
const char *data = NULL;
|
||||||
|
|
||||||
if (lseek(fd, 0, SEEK_SET) != 0)
|
if (lseek(fd, 0, SEEK_SET) != 0)
|
||||||
errx(EXIT_FAILURE, _("unable to rewind swap-device"));
|
errx(EXIT_FAILURE, _("unable to rewind swap-device"));
|
||||||
|
@ -421,18 +413,19 @@ wipe_device(int fd, const char *devname, int force, int is_blkdevice)
|
||||||
|
|
||||||
blkid_probe_enable_superblocks(pr, 1);
|
blkid_probe_enable_superblocks(pr, 1);
|
||||||
blkid_probe_enable_partitions(pr, 0);
|
blkid_probe_enable_partitions(pr, 0);
|
||||||
blkid_probe_set_superblocks_flags(pr, BLKID_SUBLKS_MAGIC);
|
blkid_probe_set_superblocks_flags(pr, BLKID_SUBLKS_MAGIC|BLKID_SUBLKS_TYPE);
|
||||||
|
|
||||||
while (blkid_do_probe(pr) == 0)
|
while (blkid_do_probe(pr) == 0) {
|
||||||
|
if (blkid_probe_lookup_value(pr, "TYPE", &data, NULL) == 0 && data)
|
||||||
|
warnx(_("%s: warning: wiping old %s signature."), devname, data);
|
||||||
blkid_do_wipe(pr, 0);
|
blkid_do_wipe(pr, 0);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
warnx(_("%s: warning: don't erase bootbits sectors"),
|
warnx(_("%s: warning: don't erase bootbits sectors"),
|
||||||
devname);
|
devname);
|
||||||
if (type)
|
if (type)
|
||||||
fprintf(stderr, _(" (%s partition table detected). "), type);
|
fprintf(stderr, _(" (%s partition table detected). "), type);
|
||||||
else if (whole)
|
|
||||||
fprintf(stderr, _(" on whole disk. "));
|
|
||||||
else
|
else
|
||||||
fprintf(stderr, _(" (compiled without libblkid). "));
|
fprintf(stderr, _(" (compiled without libblkid). "));
|
||||||
fprintf(stderr, "Use -f to force.\n");
|
fprintf(stderr, "Use -f to force.\n");
|
||||||
|
@ -603,7 +596,7 @@ main(int argc, char **argv) {
|
||||||
if (check)
|
if (check)
|
||||||
check_blocks();
|
check_blocks();
|
||||||
|
|
||||||
wipe_device(DEV, device_name, force, S_ISBLK(statbuf.st_mode));
|
wipe_device(DEV, device_name, force);
|
||||||
|
|
||||||
hdr = (struct swap_header_v1_2 *) signature_page;
|
hdr = (struct swap_header_v1_2 *) signature_page;
|
||||||
hdr->version = 1;
|
hdr->version = 1;
|
||||||
|
|
Loading…
Reference in New Issue