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