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