Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 13 Mar 1998 19:45:20 +0100
From:      Tor Egge <Tor.Egge@idi.ntnu.no>
To:        michaelh@cet.co.jp
Cc:        freebsd-current@FreeBSD.ORG
Subject:   Re: 4 WILLRELE's to bite the dust
Message-ID:  <199803131845.TAA26656@pat.idi.ntnu.no>
In-Reply-To: Your message of "Fri, 13 Mar 1998 13:22:20 %2B0900 (JST)"
References:  <Pine.SV4.3.95.980313130507.15693A-101000@parkplace.cet.co.jp>

next in thread | previous in thread | raw e-mail | index | archive | help
> I did some simple testing of nullfs and union.  It's seems Kato-san has
> gotten them pretty stable.  What kind of things cause problems with null
> and union?

	- coherence. When the different layers operates on separate
	  vm objects, the vm objects might get out of sync.
	  E.g. page fault algorithms checks the size of the upper
	  vm object, and gets the wrong value, since a VOP_WRITE
	  only extended the size of the lower vm object.
	
	  Symptom: install -C during make world gets a SIBGUS
	  if /usr/obj is nullfs mounted.
	
	- freeing of resources.  When the file is unlinked, the 
	  lower vnode still has a reference from the upper vnode
	  which is left until the upper vnode is recycled. Currently
	  null_inactive calls VOP_INACTIVE on the lower vnode. 
	  This is wrong (e.g. a process directly accessing the lower
	  vnode will see a truncated file, which is an unintended
	  side effect).

	  Symptom: Removing a file that has been opend via nullfs
	  will not necessarily free the space on the file system
	  before the null vnode is recycled.

	- locking.

		 - Missing vnode locking during vnode recycling,
		   i.e. does not wait for inactive to complete.
		   Symptom: lock manager panic when trying
		   to release the lock in vclean.

		 - During object recycling, the VOP_ISLOCKED method
	 	   can cause a trap 12.  This problem might not
		   occur anymore, since vfs_msync now checks for
		   the VXLOCK vnode flag.

		-  Use of VOP_ISLOCKED() is very often a kludge, since
		   it is assumed that the current process is the owner
		   of an exclusive lock on the vnode, while it might
		   be a different process or a shared lock.

	- vnode leakage in null_node_alloc.

	- During vnode recycling, fsync is called several times on
	  the lower vnode.  This only affects performance.

	- Access to files on a nullfs file system gives spurious
	  EDEADLK errors, due to a bogus deadlock detection in
	  nullfs_root.  That deadlock detection is not needed
	  if the generic mount system call is slightly changed.
	  (most local file systems has the same kind of deadlock
	   problem, thus a generic solution is preferrable).

	
I've been using nullfs since Nov 7 1997 without any serious problems
after having fixed some of the above mentioned problems in my local
source tree.  The code is not perfect, panics are still possible due
to heuristics (due to VOP_ISLOCKED()) being wrong, but I've yet 
not experienced any problems.

Using the nullfs in -current without any fixes, a make world would
very likely not succeed if /usr/obj is nullfs mounted.

By modifying null_mount, I've played around with hierarchical mounts:

       ikke# find /usr/zzz -print
        /usr/zzz
        /usr/zzz/zzz4
        /usr/zzz/zzz4/test4
        ikke# mount -t null /usr/zzz /usr/zzz
        null: Resource deadlock avoided
        ikke# mount -t null /usr/zzz /usr/zzz/zzz4
        ikke# find /usr/zzz -print
        /usr/zzz
        /usr/zzz/zzz4
        /usr/zzz/zzz4/zzz4
        /usr/zzz/zzz4/zzz4/test4
        ikke# umount /usr/zzz/zzz4
        ikke# mount -t null /usr/zzz/zzz4 /usr/zzz
        ikke# find /usr/zzz -print
        /usr/zzz
        /usr/zzz/test4
        ikke# umount /usr/zzz
        ikke# mount -t null /usr/zzz /usr/yyy
        ikke# mount -t null /usr/zzz /usr/yyy
        null: Resource deadlock avoided
        ikke# mount -t null /usr/yyy /usr/zzz
        null: Resource deadlock avoided
        ikke# mount -t null /usr/yyy /usr/yyy
        null: Resource deadlock avoided
        ikke# mount -t null /usr/zzz /usr/yyy
        null: Resource deadlock avoided
        ikke# mount -t null /usr/zzz /usr/zzz
        null: Resource deadlock avoided
        ikke# umount /usr/yyy

I saw the need for a general change in the mount system call when I issued 

       mount /usr/zzz /usr/zzz

instead of 

       mount -t null /usr/zzz /usr/zzz

when testing the nullfs deadlock handling, and got a panic, due to bugs in the 
the ufs mount code.

With a changed mount system call, I get

        ikke# mount /usr/zzz /usr/zzz
        /usr/zzz on /usr/zzz: Block device required
        ikke# mount -t null /usr/zzz /usr/zzz
        null: Device busy
        ikke# mount -t msdos /usr/zzz /usr/zzz
        msdos: /usr/zzz: Block device required
        ikke# mount -t cd9660 /usr/zzz /usr/zzz
        cd9660: Block device required
        ikke# ls -ld /usr/zzz
        drwxr-xr-x  3 root  wheel  512 Feb 10 02:02 /usr/zzz


- Tor Egge

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message



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