CFR: Fix panic in zfs_umount() due to dropped root vnode refcount

Will Andrews will at firepipe.net
Sat Mar 23 16:21:15 UTC 2013


Sounds good to me.  I tried your approach, and it also fixes the problem.
 If you'd like, I'll commit it for you.

Thanks,
--Will.


On Wed, Mar 13, 2013 at 3:57 PM, Andriy Gapon <avg at freebsd.org> wrote:

> on 13/03/2013 23:21 Will Andrews said the following:
> > Hi,
> >
> > Diff:
> > http://people.freebsd.org/~will/zfs/zfs_vfsops.c-fix-unmount-panic.diff
> >
> > Change 660985 by willa at willa_SpectraBSD on 2013/03/08 17:43:49
> >
> >         Fix the zfs unmount panic that is due to a missed refcount drop.
> >
> >         When checking for activity in a non-forced unmount, remember that
> >         we called vflush() releasing the refcount that zfs_mount() placed
> >         on the filesystem's root vnode using VFS_ROOT, and restore it.
> >
> >         Without this change, the next time around, the missing refcount
> >         led to a second release of the root vnode when its refcount was
> >         already zero, and thus the panic occurred while trying to grab
> >         the vnode's interlock, which had been destroyed when the vnode's
> >         refcount dropped to zero.
> >
> >         While I'm here, refactor the unmount failure code to ensure that
> >         the zfs ctldir (i.e. .zfs/.snapshots) is always restored, along
> > with,
> >         if needed, zfsvfs->z_unmounted = B_FALSE.  In short, if the
> unmount
> >         fails, restore all original functionality prior to unmounting.
> >
> > This particular panic manifests easily if you have active NFS I/O on a
> ZFS
> > while trying to do a non-forced unmount.  We've also seen it happen on
> > shutdown occasionally.
> >
> > I would like to commit this or a version of it, to FreeBSD/head next
> week.
>
> I propose to put the whole troublesome if (!(fflag & MS_FORCE)) {... }
> block
> under #ifdef sun -- that's what I have in my tree.
> Solaris uses its own mechanism to decide whether unmounting is allowed, but
> FreeBSD has its own -- vflush success is sufficient.
>
> References:
>
> http://code.metager.de/source/xref/freebsd/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c#1942
>
> http://code.metager.de/source/search?q=&defs=&refs=mnt_ref&path=%2Ffreebsd%2F&hist=&project=freebsd
>
> http://src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/fs/zfs/zfs_vfsops.c#1866
>
> Thank you for catching this edge case.
> --
> Andriy Gapon
>


More information about the zfs-devel mailing list