wipefs: Add --force option to force it to erase.
Commit c550f728f7
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>
This commit is contained in:
parent
933956cb49
commit
2968c3fc73
|
@ -38,6 +38,9 @@ erased.
|
||||||
.IP "\fB\-a, \-\-all\fP"
|
.IP "\fB\-a, \-\-all\fP"
|
||||||
Erase all available signatures. This set of erased signatures could be
|
Erase all available signatures. This set of erased signatures could be
|
||||||
restricted by \fB\-t <list>\fP option.
|
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"
|
.IP "\fB\-h, \-\-help\fP"
|
||||||
Print help and exit.
|
Print help and exit.
|
||||||
.IP "\fB\-n, \-\-no\-act\fP"
|
.IP "\fB\-n, \-\-no\-act\fP"
|
||||||
|
|
|
@ -307,12 +307,17 @@ static void do_wipe_real(blkid_probe pr, const char *devname, struct wipe_desc *
|
||||||
}
|
}
|
||||||
|
|
||||||
static 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);
|
struct wipe_desc *w, *wp0 = clone_offset(wp);
|
||||||
int zap = all ? 1 : wp->zap;
|
int zap = all ? 1 : wp->zap;
|
||||||
|
|
||||||
|
flags = O_RDWR;
|
||||||
|
if (!force)
|
||||||
|
flags |= O_EXCL;
|
||||||
|
pr = new_probe(devname, flags);
|
||||||
if (!pr)
|
if (!pr)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -362,6 +367,7 @@ usage(FILE *out)
|
||||||
|
|
||||||
fputs(_("\nOptions:\n"), out);
|
fputs(_("\nOptions:\n"), out);
|
||||||
fputs(_(" -a, --all wipe all magic strings (BE CAREFUL!)\n"
|
fputs(_(" -a, --all wipe all magic strings (BE CAREFUL!)\n"
|
||||||
|
" -f, --force force erasure\n"
|
||||||
" -h, --help show this help text\n"
|
" -h, --help show this help text\n"
|
||||||
" -n, --no-act do everything except the actual write() call\n"
|
" -n, --no-act do everything except the actual write() call\n"
|
||||||
" -o, --offset <num> offset to erase, in bytes\n"
|
" -o, --offset <num> offset to erase, in bytes\n"
|
||||||
|
@ -380,11 +386,12 @@ int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct wipe_desc *wp0 = NULL, *wp;
|
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;
|
int mode = WP_MODE_PRETTY;
|
||||||
|
|
||||||
static const struct option longopts[] = {
|
static const struct option longopts[] = {
|
||||||
{ "all", 0, 0, 'a' },
|
{ "all", 0, 0, 'a' },
|
||||||
|
{ "force", 0, 0, 'f' },
|
||||||
{ "help", 0, 0, 'h' },
|
{ "help", 0, 0, 'h' },
|
||||||
{ "no-act", 0, 0, 'n' },
|
{ "no-act", 0, 0, 'n' },
|
||||||
{ "offset", 1, 0, 'o' },
|
{ "offset", 1, 0, 'o' },
|
||||||
|
@ -414,6 +421,9 @@ main(int argc, char **argv)
|
||||||
case 'a':
|
case 'a':
|
||||||
all++;
|
all++;
|
||||||
break;
|
break;
|
||||||
|
case 'f':
|
||||||
|
force++;
|
||||||
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
usage(stdout);
|
usage(stdout);
|
||||||
break;
|
break;
|
||||||
|
@ -463,7 +473,8 @@ main(int argc, char **argv)
|
||||||
*/
|
*/
|
||||||
while (optind < argc) {
|
while (optind < argc) {
|
||||||
wp = clone_offset(wp0);
|
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);
|
free_wipe(wp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue