Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 5 Jul 2004 13:45:31 -0700 (PDT)
From:      Don Lewis <truckman@FreeBSD.org>
To:        phk@phk.freebsd.dk
Cc:        current@FreeBSD.org
Subject:   Re: current syncer bug... 
Message-ID:  <200407052045.i65KjVfo002006@gw.catspoiler.org>
In-Reply-To: <4418.1089058432@critter.freebsd.dk>

next in thread | previous in thread | raw e-mail | index | archive | help
On  5 Jul, Poul-Henning Kamp wrote:
> In message <200407052006.i65K6Lrf001926@gw.catspoiler.org>, Don Lewis writes:
>>On  5 Jul, Poul-Henning Kamp wrote:
>>> 
>>> Waiting (max 60 seconds) for system process `vnlru' to stop...stopped
>>> Waiting (max 60 seconds) for system process `bufdaemon' to stop...stopped
>>> Waiting (max 60 seconds) for system process `syncer' to stop...0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
>>
>>Interesting ...
>>
>>Does it ever print "stopped", or does it hit the 60 second timeout?
> 
> Dunno, havn't waited that long.
> 
> This is a diskless system which boots single-user to run a test, there's
> never a R/w mount done.

I can reproduce this here by booting into single-user mode and then
rebooting.  At least it does time out after 60 seconds and let the
shutdown continue.

The following patch works for me (and fixes another bug):

Index: sys/kern/vfs_subr.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/vfs_subr.c,v
retrieving revision 1.503
diff -u -r1.503 vfs_subr.c
--- sys/kern/vfs_subr.c	5 Jul 2004 01:07:33 -0000	1.503
+++ sys/kern/vfs_subr.c	5 Jul 2004 20:43:23 -0000
@@ -1531,7 +1531,7 @@
 	int syncer_final_iter;
 
 	mtx_lock(&Giant);
-	last_work_seen = -1;
+	last_work_seen = 0;
 	syncer_final_iter = 0;
 	syncer_state = SYNCER_RUNNING;
 	starttime = time_second;
@@ -1585,11 +1585,10 @@
 		 * Return to the SHUTTING_DOWN state if any
 		 * new work appears.
 		 */
-		if (net_worklist_len > 0) {
+		if (net_worklist_len > 0 || syncer_state == SYNCER_RUNNING)
 			last_work_seen = syncer_delayno;
-			if (syncer_state == SYNCER_FINAL_DELAY)
-				syncer_state = SYNCER_SHUTTING_DOWN;
-		}
+		if (net_worklist_len > 0 && syncer_state == SYNCER_FINAL_DELAY)
+			syncer_state = SYNCER_SHUTTING_DOWN;
 		while ((vp = LIST_FIRST(slp)) != NULL) {
 			if (VOP_ISLOCKED(vp, NULL) != 0 ||
 			    vn_start_write(vp, &mp, V_NOWAIT) != 0) {




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200407052045.i65KjVfo002006>