[gparted] Add clearing of ZFS labels
- From: Curtis Gedak <gedakc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gparted] Add clearing of ZFS labels
- Date: Mon, 2 Nov 2015 19:21:17 +0000 (UTC)
commit 32b5106aa12c51d63273ab8e43f27ff6ef3b4826
Author: Mike Fleetwood <mike fleetwood googlemail com>
Date: Sat Oct 31 12:55:07 2015 +0000
Add clearing of ZFS labels
ZFS labels were not cleared by GParted when clearing old file system
signatures.
# wget
https://git.kernel.org/cgit/utils/util-linux/util-linux.git/plain/tests/ts/blkid/images-fs/zfs.img.bz2
# bzip2 -dc zfs.img.bz2 > /dev/sdb1
[In GParted format to cleared /dev/sdb1]
# blkid /dev/sdb1
/dev/sdb1: LABEL="tank" UUID="1782036546311300980" UUID_SUB="13179280127379850514" TYPE="zfs_member"
Update to also zero all 4 ZFS labels.
NOTE:
GParted now writes a little over 1 MiB when clearing old file system
signatures. As this is performed in the main thread the UI is not able
to respond during this action. Testing this on a range of USB flash
keys and hard drives found the slowest normal time to write this was
0.25 seconds, with an occasional outlier up to 2.8 seconds from a USB
flash key. This is considered acceptable.
src/GParted_Core.cc | 46 ++++++++++++++++++++++++++++++++++------------
1 files changed, 34 insertions(+), 12 deletions(-)
---
diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc
index 87f9578..eee3194 100644
--- a/src/GParted_Core.cc
+++ b/src/GParted_Core.cc
@@ -3623,14 +3623,24 @@ bool GParted_Core::erase_filesystem_signatures( const Partition & partition, Ope
// don't try to surgically overwrite just the few bytes of each signature as this
// code overwrites whole sectors and it embeds more knowledge that is necessary.
//
- // First byte range from offset 0 of length 68 KiB covers the primary super block
- // of all currently supported file systems and is also likely to include future
- // file system super blocks too. Only a few file systems have super blocks and
- // signatures located elsewhere.
+ // First byte range from offset 0 of length 512 KiB covers the primary super
+ // block of all currently supported file systems and is also likely to include
+ // future file system super blocks too. Only a few file systems have super
+ // blocks and signatures located elsewhere.
//
// Btrfs super blocks are located at: 64 KiB, 64 MiB, 256 GiB and 1 PiB.
+ // (The super block at 64 KiB will be erased by the zeroing from offset 0. Other
+ // super block mirror copies need to be explicitly cleared).
// https://btrfs.wiki.kernel.org/index.php/On-disk_Format#Superblock
//
+ // ZFS labels are 256 KiB in size and 4 copies are stored on every member device,
+ // 2 at the beginning and 2 at the end of the device, aligned to 256 KiB. (The
+ // front two labels, L0 and L1, will be erased by the zeroing from offset 0. The
+ // back two labels, L2 and L3, need to be explicitly cleared).
+ // Reference:
+ // ZFS On-Disk Specification
+ // http://maczfs.googlecode.com/files/ZFSOnDiskFormat.pdf
+ //
// Linux Software RAID metadata 0.90 stores it's super block at 64 KiB before the
// end of the device, aligned to 64 KiB boundary. Length 4 KiB.
// Ref: mdadm/super0.c load_super0()
@@ -3646,19 +3656,31 @@ bool GParted_Core::erase_filesystem_signatures( const Partition & partition, Ope
// Nilfs2 secondary super block is located at the last whole 4 KiB block.
// Ref: nilfs-utils-2.1.4/include/nilfs2_fs.h
// #define NILFS_SB2_OFFSET_BYTES(devsize) ((((devsize) >> 12) - 1) << 12)
+ //
+ // NOTE:
+ // Most of the time partitions are aligned to whole MiBs so the writing of zeros
+ // at offsets -64 KiB and -8 KiB will be overwriting zeros already just written
+ // at offset -512 KiB, length 512 KiB. This will double write 12 KiB of zeros.
+ // However partitions don't have to be MiB aligned and real disk drives generally
+ // aren't an exact multiple of 1024^2 bytes in size either. So zeroing at offsets
+ // -64 KiB and -8 KiB with their smaller rounding / alignment requirements will
+ // write outside the -512 KiB zeroed region and needs to be kept. Because of the
+ // small amount of double writing it is not worth the effort to suppress it when
+ // not needed.
struct {
Byte_Value offset; //Negative offsets work backwards from the end of the partition
Byte_Value rounding; //Minimum desired rounding for offset
Byte_Value length;
} ranges[] = {
- //offset , rounding , length
- { 0LL , 1LL , 68LL * KIBIBYTE }, // All primary super blocks
- { 64LL * MEBIBYTE, 1LL , 4LL * KIBIBYTE }, // Btrfs super block mirror copy
- { 256LL * GIBIBYTE, 1LL , 4LL * KIBIBYTE }, // Btrfs super block mirror copy
- { 1LL * PEBIBYTE, 1LL , 4LL * KIBIBYTE }, // Btrfs super block mirror copy
- { -64LL * KIBIBYTE, 64LL * KIBIBYTE, 4LL * KIBIBYTE }, // SWRaid metadata 0.90 super block
- { -8LL * KIBIBYTE, 4LL * KIBIBYTE, 8LL * KIBIBYTE } // @-8K SWRaid metadata 1.0 super
block
- // and @-4K Nilfs2 secondary super
block
+ //offset , rounding , length
+ { 0LL , 1LL , 512LL * KIBIBYTE }, // All primary super blocks
+ { 64LL * MEBIBYTE, 1LL , 4LL * KIBIBYTE }, // Btrfs super block mirror copy
+ { 256LL * GIBIBYTE, 1LL , 4LL * KIBIBYTE }, // Btrfs super block mirror copy
+ { 1LL * PEBIBYTE, 1LL , 4LL * KIBIBYTE }, // Btrfs super block mirror copy
+ { -512LL * KIBIBYTE, 256LL * KIBIBYTE, 512LL * KIBIBYTE }, // ZFS labels L2 and L3
+ { -64LL * KIBIBYTE, 64LL * KIBIBYTE, 4LL * KIBIBYTE }, // SWRaid metadata 0.90 super
block
+ { -8LL * KIBIBYTE, 4LL * KIBIBYTE, 8LL * KIBIBYTE } // @-8K SWRaid metadata 1.0 super
block
+ // and @-4K Nilfs2 secondary
super block
} ;
for ( unsigned int i = 0 ; overall_success && i < sizeof( ranges ) / sizeof( ranges[0] ) ; i ++ )
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]