Subject: mklabel does not clear mdraid version 0.90 metadata

From: Michael Hudson-Doyle <[email-masked]>
Date: Tue, 30 Jul 2019 21:19:49 +1200

Chasing down a bug report
https://bugs.launchpad.net/ubuntu/+source/ubiquity/+bug/1828558 where
installing over a device previously used in a RAID array, I found that
parted's mklabel does not erase mdraid metadata 0.90 metadata (and only
that version). Here's my test script

#!/bin/bash
set -xeu
parted --version
rm -f image.img
truncate -s 1G image.img
n=$(uuidgen | cut -d- -f1)
dev="$(losetup -Pf --show image.img)"
mdadm --create --metadata 0.90 --force --level 1 -n 1 --assume-clean
/dev/md/$n $dev
mdadm --stop /dev/md/$n
losetup -d $dev
parted --script --align optimal image.img --  mklabel msdos
wipefs image.img

and here's the output on my system:

+ parted --version
parted (GNU parted) 3.2
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html
>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by <
http://git.debian.org/?p=parted/parted.git;a=blob_plain;f=AUTHORS>.
+ rm -f image.img
+ truncate -s 1G image.img
++ uuidgen
++ cut -d- -f1
+ n=e0c43267
++ losetup -Pf --show image.img
+ dev=/dev/loop44
+ mdadm --create --metadata 0.90 --force --level 1 -n 1 --assume-clean
/dev/md/e0c43267 /dev/loop44
mdadm: array /dev/md/e0c43267 started.
+ mdadm --stop /dev/md/e0c43267
mdadm: stopped /dev/md/e0c43267
+ losetup -d /dev/loop44
+ parted --script --align optimal image.img -- mklabel msdos
+ wipefs image.img
DEVICE    OFFSET     TYPE              UUID
LABEL
image.img 0x3fff0000 linux_raid_member 6dbbfe69-809c-7a77-14d5-894fb9296617
image.img 0x1fe      dos

Looking at ped_disk_clobber none of this is surprising: the 0.90 metadata
is somewhere between 127 and 64 kiB from the end of the device and this
isn't touched.

If this is indeed deemed a bug it could be pragmatically fixed by wiping
more from the end of the disk or more cleverly by using libblkid to locate
and zap all superblocks.

Cheers,
mwh