svn commit: r248653 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs

Andriy Gapon avg at FreeBSD.org
Fri Oct 25 07:48:18 UTC 2013


on 23/03/2013 18:34 Will Andrews said the following:
> Author: will
> Date: Sat Mar 23 16:34:56 2013
> New Revision: 248653
> URL: http://svnweb.freebsd.org/changeset/base/248653
> 
> Log:
>   ZFS: Fix a panic while unmounting a busy filesystem.
>   
>   This particular scenario was easily reproduced using a NFS export.  When the
>   first 'zfs unmount' occurred, it returned EBUSY via this path, while
>   vflush() had flushed references on the filesystem's root vnode, which in
>   turn caused its v_interlock to be destroyed.  The next time 'zfs unmount'
>   was called, vflush() tried to obtain this lock, which caused this panic.
>   
>   Since vflush() on FreeBSD is a definitive call, there is no need to check
>   vfsp->vfs_count after it completes.  Simply #ifdef sun this check.
>   
>   Submitted by:	avg
>   Reviewed by:	avg
>   Approved by:	ken (mentor)
>   MFC after:	1 month

MFC timer expired half a year ago.  Could you please MFC this change?
I believe that we've just run into the same or similar panic on stable/9 (no NFS
was involved though):

#2  0xffffffff808f9d07 in panic (fmt=0x1 <Address 0x1 out of bounds>) at
/usr/src/sys/kern/kern_shutdown.c:637
#3  0xffffffff80cecac0 in trap_fatal (frame=0xc, eva=<value optimized out>) at
/usr/src/sys/amd64/amd64/trap.c:879
#4  0xffffffff80cece21 in trap_pfault (frame=0xffffff911d7e85b0, usermode=0) at
/usr/src/sys/amd64/amd64/trap.c:795
#5  0xffffffff80ced3d4 in trap (frame=0xffffff911d7e85b0) at
/usr/src/sys/amd64/amd64/trap.c:463
#6  0xffffffff80cd61e3 in calltrap () at /usr/src/sys/amd64/amd64/exception.S:232
#7  0xffffffff808e5d1d in _mtx_lock_sleep (m=0xfffffe01ec9a50c8,
tid=18446741917998455072, opts=<value optimized out>, file=<value optimized
out>, line=0) at /usr/src/sys/kern/kern_mutex.c:394
#8  0xffffffff8099f38d in vflush (mp=<value optimized out>, rootrefs=1,
flags=<value optimized out>, td=0xfffffe0a159b1920) at
/usr/src/sys/kern/vfs_subr.c:2705
#9  0xffffffff817ed852 in zfs_umount (vfsp=0xfffffe02aa9ad9a8, fflag=<value
optimized out>) at
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c:1982

(kgdb) p *rootvp
$1 = {v_type = VBAD, v_tag = 0xffffffff80f7fd7c "none", v_op =
0xffffffff812eb6a0, v_data = 0x0, v_mount = 0x0, v_nmntvnodes = {tqe_next =
0xfffffe0fc06a3800, tqe_prev = 0xfffffe02aa9ada08}, v_un = {vu_mount = 0x0,
    vu_socket = 0x0, vu_cdev = 0x0, vu_fifoinfo = 0x0}, v_hashlist = {le_next =
0x0, le_prev = 0x0}, v_hash = 2155554452, v_cache_src = {lh_first = 0x0},
v_cache_dst = {tqh_first = 0x0, tqh_last = 0xfffffe01ec9a5060},
  v_cache_dd = 0x0, v_cstart = 0, v_lasta = 0, v_lastw = 0, v_clen = 0, v_lock =
{lock_object = {lo_name = 0xffffffff8185f1ac "zfs", lo_flags = 108658688,
lo_data = 0, lo_witness = 0x0}, lk_lock = 1, lk_exslpfail = 0,
    lk_timo = 51, lk_pri = 96}, v_interlock = {lock_object = {lo_name =
0xffffffff80f9ae39 "vnode interlock", lo_flags = 16908288, lo_data = 0,
lo_witness = 0x0}, mtx_lock = 6}, v_vnlock = 0xfffffe01ec9a5098, v_holdcnt = 0,
  v_usecount = 0, v_iflag = 128, v_vflag = 1, v_writecount = 0, v_actfreelist =
{tqe_next = 0x0, tqe_prev = 0xfffffe02aa9ada20}, v_bufobj = {bo_mtx =
{lock_object = {lo_name = 0xffffffff80f9ae49 "bufobj interlock",
        lo_flags = 16908288, lo_data = 0, lo_witness = 0x0}, mtx_lock = 6},
bo_clean = {bv_hd = {tqh_first = 0x0, tqh_last = 0xfffffe01ec9a5140}, bv_root =
0x0, bv_cnt = 0}, bo_dirty = {bv_hd = {tqh_first = 0x0,
        tqh_last = 0xfffffe01ec9a5160}, bv_root = 0x0, bv_cnt = 0}, bo_numoutput
= 0, bo_flag = 0, bo_ops = 0xffffffff81316f20, bo_bsize = 131072, bo_object =
0x0, bo_synclist = {le_next = 0x0, le_prev = 0x0},
    bo_private = 0xfffffe01ec9a5000, __bo_vnode = 0xfffffe01ec9a5000},
v_pollinfo = 0x0, v_label = 0x0, v_lockf = 0x0, v_rl = {rl_waiters = {tqh_first
= 0x0, tqh_last = 0xfffffe01ec9a51e0}, rl_currdep = 0x0},
  v_fullpath = '\0' <repeats 1023 times>}

> Modified:
>   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
> 
> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c	Sat Mar 23 16:06:20 2013	(r248652)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c	Sat Mar 23 16:34:56 2013	(r248653)
> @@ -1968,6 +1968,7 @@ zfs_umount(vfs_t *vfsp, int fflag)
>  		return (ret);
>  	}
>  
> +#ifdef sun
>  	if (!(fflag & MS_FORCE)) {
>  		/*
>  		 * Check the number of active vnodes in the file system.
> @@ -1988,6 +1989,7 @@ zfs_umount(vfs_t *vfsp, int fflag)
>  				return (EBUSY);
>  		}
>  	}
> +#endif
>  
>  	VERIFY(zfsvfs_teardown(zfsvfs, B_TRUE) == 0);
>  	os = zfsvfs->z_os;
> 


-- 
Andriy Gapon


More information about the svn-src-head mailing list