On Tue, Oct 27, 2020 at 12:02:21PM -0700, Darrick J. Wong wrote: > From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > > If systemd is available, run each test in its own temporary systemd > scope. This enables the test harness to forcibly clean up all of the > test's child processes (if it does not do so itself) so that we can move > into the post-test unmount and check cleanly. > > Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > --- > check | 21 ++++++++++++++++++++- > 1 file changed, 20 insertions(+), 1 deletion(-) > > > diff --git a/check b/check > index 5072dd82..47c72fa2 100755 > --- a/check > +++ b/check > @@ -521,6 +521,11 @@ _expunge_test() > return 0 > } > > +# Can we run systemd scopes? > +HAVE_SYSTEMD_SCOPES= > +systemd-run --quiet --unit "fstests-check" --scope bash -c "exit 77" &> /dev/null > +test $? -eq 77 && HAVE_SYSTEMD_SCOPES=yes > + > # Make the check script unattractive to the OOM killer... > OOM_SCORE_ADJ="/proc/self/oom_score_adj" > test -w ${OOM_SCORE_ADJ} && echo -1000 > ${OOM_SCORE_ADJ} > @@ -528,8 +533,22 @@ test -w ${OOM_SCORE_ADJ} && echo -1000 > ${OOM_SCORE_ADJ} > # ...and make the tests themselves somewhat more attractive to it, so that if > # the system runs out of memory it'll be the test that gets killed and not the > # test framework. > +# > +# If systemd is available, run the entire test script in a scope so that we can > +# kill all subprocesses of the test if it fails to clean up after itself. This > +# is essential for ensuring that the post-test unmount succeeds. > _run_seq() { > - bash -c "test -w ${OOM_SCORE_ADJ} && echo 250 > ${OOM_SCORE_ADJ}; exec ./$seq" > + local cmd=(bash -c "test -w ${OOM_SCORE_ADJ} && echo 250 > ${OOM_SCORE_ADJ}; exec ./$seq") > + > + if [ -n "${HAVE_SYSTEMD_SCOPES}" ]; then > + local unit="$(systemd-escape "fs$seq").scope" > + systemd-run --quiet --unit "${unit}" --scope "${cmd[@]}" /me discovers that systemd preserves failed transient scopes (where "failed" means the processes get killed, not that they return nonzero), so this patch has to reset-failed the scope in case the user calls fstests before rebooting. Hence, self NAK. --D > + res=$? > + systemctl stop "${unit}" &> /dev/null > + return "${res}" > + else > + "${cmd[@]}" > + fi > } > > _detect_kmemleak >