]> err.no Git - util-linux/commitdiff
mkswap: zap bootbits
authorKarel Zak <kzak@redhat.com>
Thu, 12 Mar 2009 15:01:59 +0000 (16:01 +0100)
committerKarel Zak <kzak@redhat.com>
Thu, 12 Mar 2009 15:01:59 +0000 (16:01 +0100)
/dev/sdb1 originally initialized by cryptsetup:

and OLD mkswap:

        # vol_id /dev/sdb1 | grep TYPE
        ID_FS_TYPE=swap

        # blkid -s TYPE /dev/sdb1
        /dev/sdb1: TYPE="crypt_LUKS"

So, we have two different *valid* signatures on the device now!

NEW mkswap:

        # blkid -s TYPE /dev/sdb1
        /dev/sdb1: TYPE="swap"

        # /lib/udev/vol_id /dev/sdb1 | grep TYPE
        ID_FS_TYPE=swap

the bootbits (first 1024 bytes) was erased.

We shouldn't zap disk labels (BSD, SUN, ...) and boot loaders (on whole
disk):

        # mkswap  /dev/sdb2
        mkswap: /dev/sdb2: warning: don't erase bootbits sectors
                (BSD partition table detected). Use -f to force.
        Setting up swapspace version 1, size = 4348 KiB
        no label, UUID=69d87cef-71ac-4fb0-a689-ce3e930dea17

        # mkswap  /dev/sdb
        mkswap: /dev/sdb: warning: don't erase bootbits sectors
                on whole disk. Use -f to force.
        Setting up swapspace version 1, size = 8188 KiB
        no label, UUID=97757ad7-8a84-43d9-bcb4-16fefd93a2ac

Signed-off-by: Karel Zak <kzak@redhat.com>
disk-utils/Makefile.am
disk-utils/mkswap.c

index 9e9db95beec22b9181f7d950b3162ecf1211b5eb..4854d5f61b468f19f7f368c3022e62a3fbb612a5 100644 (file)
@@ -12,7 +12,7 @@ sbin_PROGRAMS = mkfs mkswap fsck.minix mkfs.minix mkfs.bfs
 fsck_minix_SOURCES = fsck.minix.c minix.h
 mkfs_minix_SOURCES = mkfs.minix.c minix.h $(utils_common)
 mkfs_bfs_SOURCES = mkfs.bfs.c $(utils_common)
-mkswap_SOURCES = mkswap.c $(utils_common)
+mkswap_SOURCES = mkswap.c $(utils_common) ../lib/wholedisk.c ../lib/pttype.c
 
 usrbinexec_PROGRAMS = isosize
 usrsbinexec_PROGRAMS =
index 6e151af38531383c97086634f0022da3d9b36d26..4acc73b2305b47097f444cec026525a855e0d5cf 100644 (file)
@@ -53,6 +53,8 @@
 #include "nls.h"
 #include "blkdev.h"
 #include "pathnames.h"
+#include "pttype.h"
+#include "wholedisk.h"
 
 #ifdef HAVE_LIBUUID
 #include <uuid/uuid.h>
@@ -379,6 +381,47 @@ write_all(int fd, const void *buf, size_t count) {
        return 0;
 }
 
+static void
+zap_bootbits(int fd, const char *devname, int force)
+{
+       const char *type = NULL;
+       int zap = 1;
+
+       if (!force) {
+               if (lseek(fd, 0, SEEK_SET) != 0)
+                       die(_("unable to rewind swap-device"));
+
+               if (is_whole_disk_fd(fd, devname))
+                       /* don't zap bootbits on whole disk -- we know nothing
+                        * about bootloaders on the device */
+                       zap = 0;
+
+               else if ((type = get_pt_type_fd(fd)))
+                       /* don't zap partition table */
+                       zap = 0;
+       }
+
+       if (zap) {
+               char buf[1024];
+
+               if (lseek(fd, 0, SEEK_SET) != 0)
+                       die(_("unable to rewind swap-device"));
+
+               memset(buf, 0, sizeof(buf));
+               if (write_all(fd, buf, sizeof(buf)))
+                       die(_("unable to erase bootbits sectors"));
+               return;
+       }
+
+       fprintf(stderr, _("%s: %s: warning: don't erase bootbits sectors\n"),
+               program_name, devname);
+       if (type)
+               fprintf(stderr, _("        (%s partition table detected). "), type);
+       else
+               fprintf(stderr, _("        on whole disk. "));
+       fprintf(stderr, "Use -f to force.\n");
+}
+
 int
 main(int argc, char ** argv) {
        struct stat statbuf;
@@ -561,6 +604,8 @@ main(int argc, char ** argv) {
        if (check)
                check_blocks();
 
+       zap_bootbits(DEV, device_name, force);
+
        p->version = 1;
        p->last_page = PAGES-1;
        p->nr_badpages = badpages;