summaryrefslogtreecommitdiffstats
path: root/misc-utils/wipefs.c
diff options
context:
space:
mode:
authorRichard W.M. Jones2012-11-19 16:02:13 +0100
committerKarel Zak2012-11-20 10:01:20 +0100
commit2968c3fc7388f88b8debe64d61d9785601c16436 (patch)
treeca1278490003244817a3612d5044764e87f616d0 /misc-utils/wipefs.c
parentagetty: make --autologin useful with --skip-login (prompt) (diff)
downloadkernel-qcow2-util-linux-2968c3fc7388f88b8debe64d61d9785601c16436.tar.gz
kernel-qcow2-util-linux-2968c3fc7388f88b8debe64d61d9785601c16436.tar.xz
kernel-qcow2-util-linux-2968c3fc7388f88b8debe64d61d9785601c16436.zip
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. Signed-off-by: Richard W.M. Jones <rjones@redhat.com>
Diffstat (limited to 'misc-utils/wipefs.c')
-rw-r--r--misc-utils/wipefs.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/misc-utils/wipefs.c b/misc-utils/wipefs.c
index 0ddc148d0..a29f3ccf8 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);
}
}