]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
wipefs: Add --force option to force it to erase.
authorRichard W.M. Jones <rjones@redhat.com>
Mon, 19 Nov 2012 15:02:13 +0000 (15:02 +0000)
committerKarel Zak <kzak@redhat.com>
Tue, 20 Nov 2012 09:01:20 +0000 (10:01 +0100)
Commit c550f728f724360f99aae0fdb45b0589d9a347e0 added O_EXCL when
opening the thing to erase.  This broke the wipefs utility when used
on anything which isn't an unmounted filesystem.  eg. If you use it on
a block device containing partitions, then it won't work because the
kernel recognizes the partitions and so thinks the device is in use.

This change adds the --force option which, when used, undoes the above
flag change.  However you still have to use --force most of the time
when erasing something that isn't a plain unmounted filesystem.

Signed-off-by: Richard W.M. Jones <rjones@redhat.com>
misc-utils/wipefs.8
misc-utils/wipefs.c

index 05a549686a5da0e096a58eb76f8c3a8f06812f0a..67261eebeb23ce9176a112e385ce82c862427ca6 100644 (file)
@@ -38,6 +38,9 @@ erased.
 .IP "\fB\-a, \-\-all\fP"
 Erase all available signatures. This set of erased signatures could be
 restricted by \fB\-t <list>\fP option.
+.IP "\fB\-f, \-\-force\fP"
+Force erasure, even if the filesystem is mounted.  This is required in
+order to erase the partition table on a block device.
 .IP "\fB\-h, \-\-help\fP"
 Print help and exit.
 .IP "\fB\-n, \-\-no\-act\fP"
index 0ddc148d023d818cc63443b58dc5c02979ef0eb5..a29f3ccf8004e0f73c8b40354e786c4c3ba9fbcd 100644 (file)
@@ -307,12 +307,17 @@ static void do_wipe_real(blkid_probe pr, const char *devname, struct wipe_desc *
 }
 
 static struct wipe_desc *
-do_wipe(struct wipe_desc *wp, const char *devname, int noact, int all, int quiet)
+do_wipe(struct wipe_desc *wp, const char *devname, int noact, int all, int quiet, int force)
 {
-       blkid_probe pr = new_probe(devname, O_RDWR | O_EXCL);
+       int flags;
+       blkid_probe pr;
        struct wipe_desc *w, *wp0 = clone_offset(wp);
        int zap = all ? 1 : wp->zap;
 
+       flags = O_RDWR;
+       if (!force)
+               flags |= O_EXCL;
+       pr = new_probe(devname, flags);
        if (!pr)
                return NULL;
 
@@ -362,6 +367,7 @@ usage(FILE *out)
 
        fputs(_("\nOptions:\n"), out);
        fputs(_(" -a, --all           wipe all magic strings (BE CAREFUL!)\n"
+               " -f, --force         force erasure\n"
                " -h, --help          show this help text\n"
                " -n, --no-act        do everything except the actual write() call\n"
                " -o, --offset <num>  offset to erase, in bytes\n"
@@ -380,11 +386,12 @@ int
 main(int argc, char **argv)
 {
        struct wipe_desc *wp0 = NULL, *wp;
-       int c, all = 0, has_offset = 0, noact = 0, quiet = 0;
+       int c, all = 0, force = 0, has_offset = 0, noact = 0, quiet = 0;
        int mode = WP_MODE_PRETTY;
 
        static const struct option longopts[] = {
            { "all",       0, 0, 'a' },
+           { "force",     0, 0, 'f' },
            { "help",      0, 0, 'h' },
            { "no-act",    0, 0, 'n' },
            { "offset",    1, 0, 'o' },
@@ -414,6 +421,9 @@ main(int argc, char **argv)
                case 'a':
                        all++;
                        break;
+               case 'f':
+                       force++;
+                       break;
                case 'h':
                        usage(stdout);
                        break;
@@ -463,7 +473,8 @@ main(int argc, char **argv)
                 */
                while (optind < argc) {
                        wp = clone_offset(wp0);
-                       wp = do_wipe(wp, argv[optind++], noact, all, quiet);
+                       wp = do_wipe(wp, argv[optind++], noact, all, quiet,
+                                    force);
                        free_wipe(wp);
                }
        }