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>
index | next in thread | previous in thread | raw e-mail
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) {
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200407052045.i65KjVfo002006>
