busybox/testsuite/mount.tests
Denys Vlasenko 9df54deead testsuite/mount.tests: accomodate umount failure seen on 5.18.0
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2022-12-13 15:12:31 +01:00

128 lines
3.7 KiB
Bash
Executable File

#!/bin/sh
# Copyright 2007 by Denys Vlasenko <vda.linux@googlemail.com>
# Licensed under GPLv2, see file LICENSE in this source tree.
. ./testing.sh
test -f "$bindir/.config" && . "$bindir/.config"
test "`id -u`" = 0 || {
echo "SKIPPED: mount (must be root to test this)"
exit 0
}
# Without MOUNT_LOOP_CREATE, the test will fail if /dev/loopN's do not exist
if test x"$CONFIG_MKFS_MINIX" != x"y" \
|| test x"$CONFIG_FEATURE_MINIX2" != x"y" \
|| test x"$CONFIG_FEATURE_MOUNT_LOOP" != x"y" \
|| test x"$CONFIG_FEATURE_MOUNT_LOOP_CREATE" != x"y" \
|| test x"$CONFIG_FEATURE_MOUNT_FLAGS" != x"y" \
|| test x"$CONFIG_FEATURE_DEVFS" = x"y" \
; then
echo "SKIPPED: mount"
exit 0
fi
testdir="$PWD/mount.testdir"
dd if=/dev/zero of=mount.image1m count=1 bs=1M 2>/dev/null || { echo "dd error"; exit 1; }
mkfs.minix -v mount.image1m >/dev/null 2>&1 || { echo "mkfs.minix error"; exit 1; }
modprobe minix 2>/dev/null
mkdir "$testdir" 2>/dev/null
umount -d "$testdir" 2>/dev/null
# testing "test name" "command" "expected result" "file input" "stdin"
# file input will be file called "input"
# test can create a file "actual" instead of writing to stdout
# This will always fail on !CONFIG_MANDATORY_FILE_LOCKING kernels
test "$SKIP_MOUNT_MAND_TESTS" = "1" || \
testing "mount -o remount,mand" \
"mount -o loop mount.image1m $testdir "\
"&& grep -Fc $testdir </proc/mounts "\
"&& mount -o remount,mand $testdir "\
"&& grep -F $testdir </proc/mounts | grep -c '[, ]mand[, ]'"\
"|| grep -F $testdir </proc/mounts" \
"1\n""1\n" \
"" ""
umount -d "$testdir"
rmdir "$testdir"
rm mount.image1m
# Bug: mount.shared1 directory shows no files (has to show files a and b)
optional FEATURE_LS_RECURSIVE FEATURE_LS_SORTFILES
testing "mount bind+rshared" "\
mkdir -p mount.dir mount.shared1 mount.shared2
touch mount.dir/a mount.dir/b
mount --bind mount.shared1 mount.shared1 2>&1
mount --make-rshared mount.shared1 2>&1
mount --bind mount.shared2 mount.shared2 2>&1
mount --make-rshared mount.shared2 2>&1
mount --bind mount.shared2 mount.shared1 2>&1
mount --bind mount.dir mount.shared2 2>&1
ls -R mount.dir mount.shared1 mount.shared2 2>&1
umount mount.dir mount.shared1 mount.shared2 2>/dev/null
umount mount.dir mount.shared1 mount.shared2 2>/dev/null
umount mount.dir mount.shared1 mount.shared2 2>/dev/null
rm -f mount.dir/a mount.dir/b mount.dir/c
rmdir mount.dir mount.shared1 mount.shared2
" \
"\
mount.dir:
a
b
mount.shared1:
a
b
mount.shared2:
a
b
" \
"" ""
SKIP=
testing "mount RO loop" "\
exec 2>&1
umount -d mount.dir 2>/dev/null
rmdir mount.dir 2>/dev/null
mkdir -p mount.dir
(
cd mount.dir || { echo 'cd error'; exit 1; }
mkdir z1 z2 || { echo 'mkdir error'; exit 1; }
mount -t tmpfs tmpfs z1 || { echo 'mount tmpfs error'; exit 1; }
dd if=/dev/zero of=z1/e2img count=10 bs=1M 2>/dev/null || { echo 'dd error'; exit 1; }
mke2fs -F z1/e2img 2>/dev/null >&2 || { echo 'mke2fs error'; exit 1; }
mount -r -o loop -t ext2 z1/e2img z2 || { echo 'mount -r -o loop error'; exit 1; }
mount -o remount,ro z1 || { echo 'mount -o remount,ro error'; exit 1; }
)
umount -d mount.dir/z2
##sleep 0.1
umount -d mount.dir/z1
rm -rf mount.dir
echo DONE
" \
"DONE\n" "" ""
# On 5.18.0, "umount -d mount.dir/z1" above fails.
# (It would work with "sleep 0.1" - looks like z1/e2img
# is momentarily keeping z1 mountpoint busy, even though
# the "umount" which freed z1/e2img from being the base
# of z2 mountpoint has returned).
# Fixing the mess if it did fail:
if test -d mount.dir/z1; then
ls -ld mount.dir/z1/* mount.dir/z1
sleep 1
umount -d mount.dir/z1
rmdir mount.dir/z1 mount.dir
fi
exit $FAILCOUNT