Re: [PATCH v1 2/2] check,common/{preamble,rc},soak: Decoupling init_rc() call from sourcing common/rc

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 3/7/25 23:10, Darrick J. Wong wrote:
On Fri, Mar 07, 2025 at 11:21:15AM +0530, Nirjhar Roy (IBM) wrote:
On 3/6/25 23:16, Darrick J. Wong wrote:
On Thu, Mar 06, 2025 at 08:17:41AM +0000, Nirjhar Roy (IBM) wrote:
Silently executing scripts during sourcing common/rc doesn't look good
and also causes unnecessary script execution. Decouple init_rc() call
and call init_rc() explicitly where required.

Signed-off-by: Nirjhar Roy (IBM) <nirjhar.roy.lists@xxxxxxxxx>
---
   check           | 10 ++--------
   common/preamble |  1 +
   common/rc       |  2 --
   soak            |  1 +
   4 files changed, 4 insertions(+), 10 deletions(-)

diff --git a/check b/check
index ea92b0d6..d30af1ba 100755
--- a/check
+++ b/check
@@ -840,16 +840,8 @@ function run_section()
   		_prepare_test_list
   	elif [ "$OLD_TEST_FS_MOUNT_OPTS" != "$TEST_FS_MOUNT_OPTS" ]; then
   		_test_unmount 2> /dev/null
-		if ! _test_mount
-		then
-			echo "check: failed to mount $TEST_DEV on $TEST_DIR"
-			status=1
-			exit
-		fi
Unrelated change?  I was expecting a mechanical ". ./common/rc" =>
". ./common/rc ; init_rc" change in this patch.
This patch adds an init_rc() call to _begin_fstests() in common/preamble and
hence the above _test_mount() will be executed during that call. So this
_test_mount isn't necessary here, right? _test_mount() will be executed (as
a part of init_rc() call) before every test run. Please let me know if my
understanding isn't correct.
It's true that in terms of getting the test filesystem mounted, the
_test_mount here and in init_rc are redundant.  But look at what happens
on error here -- we print "check: failed to mount..." to signal that the
new section's TEST_FS_MOUNT_OPTS are not valid, and exit the ./check
process.

By deferring the mount to the init_rc in _preamble, that means that
we'll run the whole section with bad mount options, most likely
resulting in every test spewing "common/rc: could not mount..." and
appearing to fail.
Aah, right. The exit should be at the check level if some parameter is not correct in a section. I will make the change in v2.

I think.  I'm not sure what "status=1; exit" does as compared to
"exit 1"; AFAICT the former actually results in an exit code of 0
because the (otherwise pointless) assignment succeeds.

I think "status=0; exit" has a reason. If we see the following trap handler registration in the check script:

if $OPTIONS_HAVE_SECTIONS; then
    trap "_kill_seq; _summary; exit \$status" 0 1 2 3 15
else
    trap "_kill_seq; _wrapup; exit \$status" 0 1 2 3 15
fi

So, "exit 1" will exit the check script without setting the correct return value. I ran with the following local.config file:

[xfs_4k_valid]
FSTYP=xfs
TEST_DEV=/dev/loop0
TEST_DIR=/mnt1/test
SCRATCH_DEV=/dev/loop1
SCRATCH_MNT=/mnt1/scratch

[xfs_4k_invalid]
FSTYP=xfs
TEST_DEV=/dev/loop0
TEST_DIR=/mnt1/invalid_dir
SCRATCH_DEV=/dev/loop1
SCRATCH_MNT=/mnt1/scratch

This caused the init_rc() to catch the case of invalid _test_mount options. Although the check script correctly failed during the execution of the "xfs_4k_invalid" section, the return value was 0, i.e "echo $?" returned 0. This is because init_rc exits with "exit 1" without correctly setting the value of "status".

However, when I executed with the following local.config file:

[xfs_4k_valid]
FSTYP=xfs
TEST_DEV=/dev/loop0
TEST_DIR=/mnt1/test
SCRATCH_DEV=/dev/loop1
SCRATCH_MNT=/mnt1/scratch

[xfs_4k_invalid]
FSTYP=xfs
TEST_DEV=/dev/loop0
TEST_DIR=/mnt1/invalid_dir
SCRATCH_DEV=/dev/loop1
SCRATCH_MNT=/mnt1/scratch
TEST_FS_MOUNT_OPTS="-o invalidss"

This caused the "elif [ "$OLD_TEST_FS_MOUNT_OPTS" != "$TEST_FS_MOUNT_OPTS" ]; then" to be executed. Now, when I checked the value of "echo $?", it showed 1. IMO, this is the correct behavior, and we should always use "status=<value>; exit" and NOT "exit 1" directly. Even if 1 section fails,   "./check <test-list>" command should return a non-zero value. Can you please let me know if my understanding is correct? If yes, maybe we can have a function like

_set_status_and_exit()
{

    status="$1"
    exit
}

and replace all the "status <value>; exit" and "exit <value>" with "_set_status_and_exit <value>"

--NR



Granted, the init_rc that you remove below would also catch that case
and exit ./check
Yes. init_rc can catch that case with an additional difference that it will attempt another mount "retrying test device mount with external set"

   	fi
-	init_rc
Why remove init_rc here?
Same reason as above.
But that's an additional change in behavior.  If there's no reason for
calling init_rc() from run_section() then that should be a separate
patch with a separate justification.

Since the check for _test_mount should be at the check script level and not at the _begin_fstest(), maybe we should

1. Keep the init_rc call here

2. Remove the _test_mount above (the one with "elif [ "$OLD_TEST_FS_MOUNT_OPTS" != "$TEST_FS_MOUNT_OPTS" ]; then" ) and have a separate patch for it with proper justification.

3. NOT have any init_rc call in _begin_fstest(), since the _test_mount related checks would already been done by the time _begin_fstests() gets executed.

The above changes will also not change any existing behavior. Can you please let me know your thoughts and I can send a V2 accordingly?

--NR


--D

-
   	seq="check.$$"
   	check="$RESULT_BASE/check"
@@ -870,6 +862,8 @@ function run_section()
   	needwrap=true
   	if [ ! -z "$SCRATCH_DEV" ]; then
+		_check_mounted_on SCRATCH_DEV $SCRATCH_DEV SCRATCH_MNT $SCRATCH_MNT
+		[ $? -le 1 ] || exit 1
   	  _scratch_unmount 2> /dev/null
   	  # call the overridden mkfs - make sure the FS is built
   	  # the same as we'll create it later.
diff --git a/common/preamble b/common/preamble
index 0c9ee2e0..c92e55bb 100644
--- a/common/preamble
+++ b/common/preamble
@@ -50,6 +50,7 @@ _begin_fstest()
   	_register_cleanup _cleanup
   	. ./common/rc
+	init_rc
   	# remove previous $seqres.full before test
   	rm -f $seqres.full $seqres.hints
diff --git a/common/rc b/common/rc
index d2de8588..f153ad81 100644
--- a/common/rc
+++ b/common/rc
@@ -5754,8 +5754,6 @@ _require_program() {
   	_have_program "$1" || _notrun "$tag required"
   }
-init_rc
-
   ################################################################################
   # make sure this script returns success
   /bin/true
diff --git a/soak b/soak
index d5c4229a..5734d854 100755
--- a/soak
+++ b/soak
@@ -5,6 +5,7 @@
   # get standard environment, filters and checks
   . ./common/rc
+# ToDo: Do we need an init_rc() here? How is soak used?
I have no idea what soak does and have never used it, but I think for
continuity's sake you should call init_rc here.
Okay. I think Dave has suggested removing this file[1]. This doesn't seem to
used anymore.

[1] https://lore.kernel.org/all/Z8oT_tBYG-a79CjA@xxxxxxxxxxxxxxxxxxx/

--NR

--D

   . ./common/filter
   tmp=/tmp/$$
--
2.34.1


--
Nirjhar Roy
Linux Kernel Developer
IBM, Bangalore


--
Nirjhar Roy
Linux Kernel Developer
IBM, Bangalore





[Index of Archives]     [Reiser Filesystem Development]     [Ceph FS]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite National Park]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Media]

  Powered by Linux