summaryrefslogtreecommitdiffstats
path: root/misc-utils/wipefs.c
diff options
context:
space:
mode:
authorKarel Zak2014-04-24 13:42:54 +0200
committerKarel Zak2014-04-24 13:42:54 +0200
commit24ed07818403f2ce52f9116a749036d58b91ca81 (patch)
treeb9cfac8da2bd0d21bb075266ef715b2eaf776b31 /misc-utils/wipefs.c
parentdocs: update TODO (diff)
downloadkernel-qcow2-util-linux-24ed07818403f2ce52f9116a749036d58b91ca81.tar.gz
kernel-qcow2-util-linux-24ed07818403f2ce52f9116a749036d58b91ca81.tar.xz
kernel-qcow2-util-linux-24ed07818403f2ce52f9116a749036d58b91ca81.zip
wipefs: don't erase nested partition tables by default
It's possible the partition contains a partition table (BSD, or hybrid boot images). It could be unexpected for users that the lost all (or another) partitions when work with non-whole disk device. Let's require --force. For example: # wipefs --all /dev/sdb erases all including partition table, but on hybrid disk where the first partition starts at first sector (so partition table is within the first partition): # wipefs --all /dev/sdb1 /dev/sdb1: ignore nested "dos" partition table on non-whole disk device wipefs: Use the --force option to force erase. asks for --force. Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1077310 Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'misc-utils/wipefs.c')
-rw-r--r--misc-utils/wipefs.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/misc-utils/wipefs.c b/misc-utils/wipefs.c
index 5dfaf0c55..2c1ea5947 100644
--- a/misc-utils/wipefs.c
+++ b/misc-utils/wipefs.c
@@ -365,7 +365,7 @@ static void rereadpt(int fd, const char *devname)
static struct wipe_desc *
do_wipe(struct wipe_desc *wp, const char *devname, int flags)
{
- int mode = O_RDWR, reread = 0;
+ int mode = O_RDWR, reread = 0, need_force = 0;
blkid_probe pr;
struct wipe_desc *w, *wp0;
int zap = (flags & WP_FL_ALL) ? 1 : wp->zap;
@@ -405,6 +405,15 @@ do_wipe(struct wipe_desc *wp, const char *devname, int flags)
if (!wp->on_disk)
continue;
+ if (!(flags & WP_FL_FORCE)
+ && wp->is_parttable
+ && !blkid_probe_is_wholedisk(pr)) {
+ warnx(_("%s: ignore nested \"%s\" partition "
+ "table on non-whole disk device."), devname, wp->type);
+ need_force = 1;
+ continue;
+ }
+
if (zap) {
if (backup)
do_backup(wp, backup);
@@ -419,6 +428,9 @@ do_wipe(struct wipe_desc *wp, const char *devname, int flags)
warnx(_("%s: offset 0x%jx not found"), devname, w->offset);
}
+ if (need_force)
+ warnx(_("Use the --force option to force erase."));
+
fsync(blkid_probe_get_fd(pr));
if (reread && (mode & O_EXCL))