Syncer "giving up" on buffers

Bruce Evans bde at zeta.org.au
Mon Sep 1 12:11:37 PDT 2003


On Mon, 1 Sep 2003, Lefteris Chatzibarbas wrote:

> I have a problem with kernels,  built the last couple of days, where
> during shutdown syncer is "giving up" on buffers.  During the next boot
> all filesystems are checked because of improper dismount.  Here follow
> the exact messages I get:
>
>   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...stopped
>
>   syncing disks, buffers remaining... 8 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
>   giving up on 6 buffers
>   Uptime: 41m20s
>   pfs_vncache_unload(): 1 entries remaining
>   Shutting down ACPI
>   Rebooting...
>
> After some testing I found out that this does _not_ happen if I manually
> unmount my ext2 filesystems, before shutting down.  In this case syncer
> finishes without any problems.
>
> My last kernel which did not have this problem, is the one I built on
> Wed Aug 27 23:14:12 EEST 2003.

Apparently the bug fixed in ext2fs/fs.h revs 1.3, 1.4 and 1.6 (etc.)
was restored in rev.1.14.  I think this is because B_LOCKED buffers
were ignored in the sync() in boot() and flushed later when
vfs_unmountall() calls ext2fs_unmount(), but they are now seen in the
sync() so vfs_unmountall() is not called.

Rev.1.3 of ext2fs/fs.h (etc.) abuses B_LOCKED to do little more than
make the sync() ignore ext2fs's private buffers (its complications are
mainly to handle the resulting B_LOCKED buffers).  It wants to brelse()
the buffers so that their BUF_REFCOUNT() is 0 and the sync() in boot()
is happy to handle them.  In the original fix, I think the buffers
could be B_DELWRI and then the sync() would fulush them, but setting
B_DELWRI was wrong and was changed (in rev.1.4) to setting the private
flag B_DIRTY instead.  Rev.1.13 esssentially removes the brelse() and
adds a new complication (BUF_KERNPROC()) and keeps the old ones.  I
think the BUF_KERNPROC() is less than useful -- without the brelse()'s,
the buffers are completely private to the file system.

Bruce


More information about the freebsd-current mailing list