Bug 22726

Summary: mkfifo can cause ext2fs to break sync at shutdown
Product: Base System Reporter: Jimmy Olgeni <olgeni>
Component: kernAssignee: freebsd-bugs (Nobody) <bugs>
Status: Closed FIXED    
Severity: Affects Only Me    
Priority: Normal    
Version: Unspecified   
Hardware: Any   
OS: Any   

Description Jimmy Olgeni 2000-11-09 22:10:00 UTC
Running mkfifo on a mounted ext2 filesystem (removable media) can
cause the sync at shutdown time to fail. Filesystems are not umounted
and checked by fsck at the next reboot.

Fix: 

Running shutdown with the media still in the drive helps, but I didn't
try to insert a different disk and see what gets written.
How-To-Repeat: 
* Create an ext2fs partition on a removable media (I tried with a SCSI
  MO drive)

* Mount the partition, run "mkfifo SOMEFIFO" on the mounted
  filesystem.

* Run "sync" just to be sure, and umount the partition. sysstat will report
  that there are 0 dirty buffers.

* Eject the media (the drive becomes unlocked at umount time and allows eject). 

* Run "shutdown -h now", the kernel will try to write on the removed media
  (even after umount) and will complain about the missing disk. The "syncing
  disks" sequence will fail and the system will shut down with some buffers
  not committed. At the next reboot the other filesystems will be checked by
  fsck. ext2fs must be repaired on Linux: e2fsck will complain about "bitmap
  differences".
Comment 1 Bruce Evans 2000-11-10 15:21:22 UTC
On Thu, 9 Nov 2000, Jimmy wrote:

> >Synopsis:       mkfifo can cause ext2fs to break sync at shutdown

Syncing at unmount time was actually broken for all types of files.

This is now fixed in -current.  The commit message was:
---
Quick fix for not writing group descriptor group, inode bitmaps or
                                           ^^^^^ oops, should be "blocks"
block bitmaps before unmount() completes.  They were written using
bdwrite(), so they were normally written less than 32 seconds after
unmount(), but this is too late if the media is removed or the system
is rebooted soon after unmount().  sync()ing before unmount() didn't
help, because ext2fs uses buggy private caching for these blocks --
it doesn't even bdwrite() them until they are uncached or the filesystem
is unmounted.  sync()ing after unmount() didn't help, because sync()
only applies to (vnodes for) mounted filesystems.
---

> >How-To-Repeat:

Thanks for the detailed instructions.

> >Fix:
> 
> Running shutdown with the media still in the drive helps, but I didn't
> try to insert a different disk and see what gets written.

FreeBSD now retries until shutdown after write errors, so inserting the
same disk is a safe workaround, but inserting a different disk will
clobber that disk.

Bruce
Comment 2 Bruce Evans freebsd_committer freebsd_triage 2000-11-11 13:16:14 UTC
State Changed
From-To: open->closed

Fixed in: 
rev.1.6 in -current 
rev.1.5.2.1 in RELENG_4 
rev.1.4.2.1 in RELENG_3