From: "Richard W.M. Jones" <rjones@redhat.com>
To: util-linux@vger.kernel.org
Subject: [PATCH] wipefs: Add --force option
Date: Mon, 19 Nov 2012 15:41:16 +0000 [thread overview]
Message-ID: <20121119154116.GA28909@rhmail.home.annexia.org> (raw)
[-- Attachment #1: Type: text/plain, Size: 762 bytes --]
https://bugzilla.redhat.com/show_bug.cgi?id=872831
https://bugzilla.redhat.com/show_bug.cgi?id=865961
Unfortunately this means you nearly always need to use the --force
option with wipefs when trying to wipe something which is not an
unmounted filesystem.
Tested using a modified version of libguestfs which detects if wipefs
supports the --force option, and if it does unconditionally adds it.
I verified that this fixes the virt-format utility on Fedora 18.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
New in Fedora 11: Fedora Windows cross-compiler. Compile Windows
programs, test, and build Windows installers. Over 70 libraries supprt'd
http://fedoraproject.org/wiki/MinGW http://www.annexia.org/fedora_mingw
[-- Attachment #2: 0001-wipefs-Add-force-option-to-force-it-to-erase.patch --]
[-- Type: text/plain, Size: 3445 bytes --]
>From 87d3843615d2ada2f474e2804acfe5a7d7529d72 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 19 Nov 2012 15:02:13 +0000
Subject: [PATCH] wipefs: Add --force option to force it to erase.
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.
---
misc-utils/wipefs.8 | 3 +++
misc-utils/wipefs.c | 19 +++++++++++++++----
2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/misc-utils/wipefs.8 b/misc-utils/wipefs.8
index 05a5496..67261ee 100644
--- a/misc-utils/wipefs.8
+++ b/misc-utils/wipefs.8
@@ -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"
diff --git a/misc-utils/wipefs.c b/misc-utils/wipefs.c
index 0ddc148..a29f3cc 100644
--- a/misc-utils/wipefs.c
+++ b/misc-utils/wipefs.c
@@ -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);
}
}
--
1.7.11.4
next reply other threads:[~2012-11-19 15:41 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-19 15:41 Richard W.M. Jones [this message]
2012-11-20 11:16 ` [PATCH] wipefs: Add --force option Karel Zak
2012-11-20 13:52 ` Karel Zak
2012-11-20 14:41 ` Richard W.M. Jones
2012-11-20 15:07 ` Milan Broz
2012-11-20 15:41 ` Richard W.M. Jones
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20121119154116.GA28909@rhmail.home.annexia.org \
--to=rjones@redhat.com \
--cc=util-linux@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).