fixing "umount -f" for the NFS client

Rick Macklem rmacklem at uoguelph.ca
Thu Aug 29 00:15:28 UTC 2013


I've been doing a little more testing of "umount -f" for NFS
mounts and they seem to be working unless some other process/thread
has busied the file system via vfs_busy().

Unfortunately, it is pretty easy to vfs_busy() the file system
by using a command like "df" that is stuck on the unresponsive
NFS server.

The problem seems to be that dounmount() msleep()s while
mnt_lockref != 0 before calling VFS_UNMOUNT().

If some call into the NFS client was done before this
while (mp->mnt_lockref) loop with msleep() in it, it
can easily kill off RPCs in progress. (It currently
does this in nfs_unmount() using the newnfs_nmcancelreqs()
call.

In summary:
- Would it be appropriate to add a new vfs_XXX method that
  dounmount() would call before the while() loop for the
  forced dismount case?
  (The default would be a no-op and I have no idea if any
   file system other than NFS would have a use for it?)
  Alternately, there could be a function pointer set non-NULL
  that would specifically be used by the NFS client for this.
  This would avoid adding a vfs_XXX() method, but would mean
  an NFS specific call ends up in the generic dounmount() code.

Anyone have comments on this?

Thanks, rick



More information about the freebsd-fs mailing list