This sounds like the loop in softdep_process_worklist() is never
exiting.  It shouldn't run for more than a second, though.

FreeBSD breaks out of the loop if process_worklist_item() can't
make progress.  You could try the following (untested) diff to see
if it changes the behavior.

 - todd

Index: /sys/ufs/ffs/ffs_softdep.c
===================================================================
RCS file: /cvs/src/sys/ufs/ffs/ffs_softdep.c,v
retrieving revision 1.148
diff -u -p -u -r1.148 ffs_softdep.c
--- /sys/ufs/ffs/ffs_softdep.c  4 Feb 2020 04:09:11 -0000       1.148
+++ /sys/ufs/ffs/ffs_softdep.c  28 Feb 2020 20:42:39 -0000
@@ -591,7 +591,7 @@ int 
 softdep_process_worklist(struct mount *matchmnt)
 {
        struct proc *p = CURPROC;
-       int matchcnt, loopcount;
+       int cnt, matchcnt, loopcount;
        struct timeval starttime;
 
        /*
@@ -639,7 +639,9 @@ softdep_process_worklist(struct mount *m
        loopcount = 1;
        getmicrouptime(&starttime);
        while (num_on_worklist > 0) {
-               matchcnt += process_worklist_item(matchmnt, LK_NOWAIT);
+               if ((cnt = process_worklist_item(matchmnt, LK_NOWAIT)) == 0)
+                       break;
+               matchcnt += cnt;
 
                /*
                 * If a umount operation wants to run the worklist

Reply via email to