tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: [PATCH] Fixing soft NFS umount -f, round 5



On Fri, Jul 10, 2015 at 03:43:54AM +0000, Emmanuel Dreyfus wrote:
> On Wed, Jul 08, 2015 at 06:07:11PM +0000, Emmanuel Dreyfus wrote:
> > http://ftp.espci.fr/shadow/manu/umount_f4.patch
> > 
> > With default values, timeout = 3 and retrans = 10, we now wait
> > for ages or the unmount to completes. In the umount -f case
> > it does not makes sense to wait for too long.
> 
> Here is an improved version that still use your proposed timeouts:
> http://ftp.espci.fr/shadow/manu/umount_f5.patch

the new variable "before_ts" should be time_t rather than int.

it looks like "nmp->nm_iflag" is supposed to be protected by "nmp->nm_lock",
you ought to use hold that lock while modifying nm_iflag in nfs_unmount().

otherwise the latest diff looks ok to me.


> I introduced a NFS mount private flag NFSMNT_DISMNTFORCE that informs
> the NFS subsystem that we want to forcibly unmount the filesystem, 
> which can be done at the expense of cutting timeout corners.
> 
> An important point is that with the flag set, we do not attempt any
> NFS server reconnect. It makes sense since dounmount() calls 
> VFS_SYNC() before VFS_UNMOUNT(). NFSMNT_DISMNTFORCE being set in 
> VFS_UNMOUNT() / nfs_unmount(), we already made reconnection attempts
> withinin VFS_SYNC(), hence thereis benefit for doint it again.
> 
> Now with that change, in the umount -f while NFS server is gone case,
> we spend 20s in VFS_SYNC(), and VFS_UNMOUNT() returns in less than a
> second.
> 
> Now I think it would be nice to also cut coners in VFS_SYNC() when 
> the force flag is used, but that touches filesystem-indpendent code,
> in dounmount():
>         if ((mp->mnt_flag & MNT_RDONLY) == 0) {
>                 error = VFS_SYNC(mp, MNT_WAIT, l->l_cred);
>         }       
>         if (error == 0 || (flags & MNT_FORCE)) {
>                 error = VFS_UNMOUNT(mp, flags);
>         }
> 
> The first VFS_SYNC() is making us wait even if MNT_FORCE is set. This could
> be solved by adding a IMNT_UMOUNTFORCE to struct mount's mnt_iflag, just
> like I did for NFS in this patch. The flag would instruct underlying 
> filesystem that force unmount is required and that fast return is expected.

I haven't kept up with the VFS-level locking changes in the last few years
so I'll let someone else comment about all that.

in particular, I don't know what (if anything) prevents vnodes from becoming
dirty again in between the VFS_SYNC() and the VFS_UNMOUNT().  every file system
driver appears to flush everything again (via vflush()) in its *_unmount()
method, so I don't know what benefit the VFS_SYNC() in dounmount() is providing.

-Chuck


> Opinions?
> 
> -- 
> Emmanuel Dreyfus
> manu%netbsd.org@localhost


Home | Main Index | Thread Index | Old Index