On Fri, Oct 15, 2021 at 08:50:24PM -0700, Darrick J. Wong wrote: > On Sat, Oct 16, 2021 at 10:14:56AM +0800, Zorro Lang wrote: > > Sometimes g/648 fail to unmount dmerror with this error: > > > > umount: /mnt/xfstests/scratch: target is busy. > > > > Even worse, it will cause all later test cases fail as: > > > > mount: bad usage > > Try 'mount --help' for more information. > > check: failed to mount $SCRATCH_DEV using specified options > > Interrupted! > > > > So we shouldn't _fail directly if dmerror_unmount fails, use a while > > loop to try to make sure it's unmounted. > > Can we preserve the "iteration XXX scratch unmount failed" message, > please? Sure, how about this: - _dmerror_unmount || _fail "iteration $i scratch unmount failed" + _dmerror_unmount >> $seqres.full 2>&1 + while [ $? -ne 0 ]; do + echo "iteration $i scratch unmount failed" >> $seqres.full + sleep 1 + _dmerror_unmount >> $seqres.full 2>&1 + done Or this (if you don't like the infinite while loop). + is_unmounted=1 + for ((j = 0; j < 50; j++)); do + sleep 1 + _dmerror_unmount > $tmp.unmount.err 2>&1 + if [ $? -eq 0 ];then + is_unmounted=0 + break + fi + done + if [ $is_unmounted -ne 0 ];then + cat $tmp.unmount.err + _fail "iteration $i scratch unmount failed" + fi Or other suggestions you have :) Thanks, Zorro > > --D > > > Signed-off-by: Zorro Lang <zlang@xxxxxxxxxx> > > --- > > tests/generic/648 | 8 ++++++-- > > 1 file changed, 6 insertions(+), 2 deletions(-) > > > > diff --git a/tests/generic/648 b/tests/generic/648 > > index 83dd111d..218f207b 100755 > > --- a/tests/generic/648 > > +++ b/tests/generic/648 > > @@ -104,7 +104,7 @@ for i in $(seq 1 $((25 * TIME_FACTOR)) ); do > > wait > /dev/null 2>&1 > > ps -e | grep fsstress > /dev/null 2>&1 > > done > > - for ((i = 0; i < 10; i++)); do > > + for ((j = 0; j < 10; j++)); do > > test -e "$snap_aliveflag" || break > > sleep 1 > > done > > @@ -112,7 +112,11 @@ for i in $(seq 1 $((25 * TIME_FACTOR)) ); do > > # Mount again to replay log after loading working table, so we have a > > # consistent fs after test. > > $UMOUNT_PROG $loopmnt > > - _dmerror_unmount || _fail "iteration $i scratch unmount failed" > > + _dmerror_unmount > /dev/null 2>&1 > > + while [ $? -ne 0 ]; do > > + sleep 1 > > + _dmerror_unmount > /dev/null 2>&1 > > + done > > _dmerror_load_working_table > > if ! _dmerror_mount; then > > _metadump_dev $DMERROR_DEV $seqres.scratch.$i.md > > -- > > 2.31.1 > > >