[LTP] [RFC PATCH 1/2] tst_acquire_device: clear first sectors of LTP_DEV
Stanislav Kholmanskikh
stanislav.kholmanskikh@oracle.com
Sat Feb 20 14:34:10 CET 2016
mkfs.ext{2,3,4} on sparc64 does not clear the first two
sectors of a partition. Therefore, if one creates a vfat
file system on a block device and then creates an ext2 file
system, this new ext2 file system will not be mountable without
'-t specified':
~# dd if=/dev/zero of=/dev/vg/test
~# mkfs.vfat /dev/vg/test
~# mkfs.ext2 /dev/vg/test
~# mount /dev/vg/test /mnt
mount: you must specify the filesystem type
This situation may be reproduced with runtest/commands, where
df01_vfat may be followed (if there is no mkfs.exfat, mkfs.ntfs)
by mkfs01, mkfs01_ext2 and etc. If this is the case, then
mkfs01_ext{2,3,4} will fail.
As we see in [1] ZAP_BOOTBLOCK is defined on all archs except SPARC.
I could not find the exact reason why it's so, but tend to think
that it was implemented to let ext{2,3,4} be created on the first
partition of a Sun disk label. The thing is that with Sun disk labels
it's absolutely fine to have the first partition starting at sector 0,
which is used by the disk label itself:
~# fdisk -lu /dev/vdiska
Disk /dev/vdiska (Sun disk label): 255 heads, 63 sectors, 3916 cylinders
Units = sectors of 1 * 512 bytes
Device Flag Start End Blocks Id System
/dev/vdiska1 0 2104515 1052257+ 1 Boot
/dev/vdiska2 2104515 62910540 30403012+ 83 Linux native
/dev/vdiska3 0 62910540 31455270 5 Whole disk
If mkfs.ext{2,3,4} overwrote the first two sectors, then
'mkfs.ext{2,3,4} /dev/vdiska1' would destroy the disk label.
Clearing the first 512k of LTP_DEV solves this issue. I don't expect
it to make a noticeable impact on test execution time. 512k is fine
to cover superblocks of all file systems supported by libblkid [2].
Just in case.
[1] http://git.kernel.org/cgit/fs/ext2/e2fsprogs.git/tree/misc/mke2fs.c
[2] https://github.com/karelzak/util-linux/tree/master/libblkid/src/superblocks
Signed-off-by: Stanislav Kholmanskikh <stanislav.kholmanskikh@oracle.com>
---
lib/tst_device.c | 5 +++++
testcases/lib/test.sh | 3 +++
2 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/lib/tst_device.c b/lib/tst_device.c
index 260ed7b..ed6b2a1 100644
--- a/lib/tst_device.c
+++ b/lib/tst_device.c
@@ -203,6 +203,11 @@ const char *tst_acquire_device(void (cleanup_fn)(void))
"%s is not a block device", dev);
}
+ if (tst_fill_file(dev, 0, 1024, 512)) {
+ tst_brkm(TBROK | TERRNO, cleanup_fn,
+ "Failed to clear the first 512k of %s", dev);
+ }
+
return dev;
}
diff --git a/testcases/lib/test.sh b/testcases/lib/test.sh
index eeaf0b6..9b652c0 100644
--- a/testcases/lib/test.sh
+++ b/testcases/lib/test.sh
@@ -259,6 +259,9 @@ tst_acquire_device()
if [ ! -b ${LTP_DEV} ]; then
tst_brkm TBROK "${LTP_DEV} is not a block device"
fi
+
+ ROD_SILENT dd if=/dev/zero of="${LTP_DEV}" bs=1024 count=512
+
TST_DEVICE=${LTP_DEV}
TST_DEVICE_FLAG=0
return
--
1.7.1
More information about the Ltp
mailing list