kern/107439: 6.2-PRE repeatable panic: userret: Returning with 1 locks held

Mikolaj Golub to.my.trociny at gmail.com
Fri Apr 2 06:50:08 UTC 2010


The following reply was made to PR kern/107439; it has been noted by GNATS.

From: Mikolaj Golub <to.my.trociny at gmail.com>
To: bug-followup at FreeBSD.org, Eugene Grosbein <eugen at grosbein.pp.ru>
Cc:  
Subject: Re: kern/107439: 6.2-PRE repeatable panic: userret: Returning with 1 locks held
Date: Fri, 02 Apr 2010 09:07:37 +0300

 --=-=-=
 
 I have reproduced the problem on 8.0-STABLE following the Eugene's
 instructions.
 
 On the system compiled without WITNESS I have:
 
 mv: rename /mnt/ntfs/test to /mnt/ufs/test: Operation not supported
 
 and any access to /mnt/ufs/test is being locked after this.
 
 On the system with WITNESS when running mv I have a witness_warn panic:
 
 System call rename returning with the following locks held:
 exclusive lockmgr ufs (ufs) r = 0 (0xc76ab058) locked @ /usr/src/sys/kern/vfs_subr.c:2091
 panic: witness_warn
 cpuid = 2
 KDB: enter: panic
 exclusive lockmgr ufs (ufs) r = 0 (0xc76ab058) locked @ /usr/src/sys/kern/vfs_subr.c:2091
 exclusive lockmgr ufs (ufs) r = 0 (0xc76ab058) locked @ /usr/src/sys/kern/vfs_subr.c:2091
 
 0xc76ab000: tag ufs, type VDIR
     usecount 1, writecount 0, refcount 3 mountedhere 0
     flags (VV_ROOT)
     v_object 0xc77637f8 ref 0 pages 1
     lock type ufs: EXCL by thread 0xc76b14a0 (pid 2100)
 #0 0xc088feb2 at __lockmgr_args+0x592
 #1 0xc0af20b1 at ffs_lock+0xa1
 #2 0xc0c047b3 at VOP_LOCK1_APV+0xf3
 #3 0xc09488d8 at _vn_lock+0x78
 #4 0xc093b98b at vget+0xbb
 #5 0xc092e7cd at vfs_hash_get+0xed
 #6 0xc0aec9d9 at ffs_vgetf+0x49
 #7 0xc0aecf4e at ffs_vget+0x2e
 #8 0xc0afc6b8 at ufs_root+0x28
 #9 0xc092fd61 at lookup+0x9a1
 #10 0xc09308bf at namei+0x5bf
 #11 0xc0944433 at kern_renameat+0x1b3
 #12 0xc0944736 at kern_rename+0x36
 #13 0xc0944769 at rename+0x29
 #14 0xc0beab50 at syscall+0x270
 #15 0xc0bcce20 at Xint0x80_syscall+0x20
         ino 2, on dev md0
 
 So we have ufs lock leakage here. The VOP_RENAME(9) routine is expected to
 vput(9) both the destination directory and file prior to returning. But for
 ntfs vop_rename() is not implemented and as a result vop_bypass() is called
 instead in VOP_RENAME_APV() and the vnods remain locked.
 
 So we need to add the vnods unlocking somewhere. I have not thought of a
 better place then in vop_rename_post() (see the patch below). The better place
 would be VOP_RENAME_APV(), after calling vop_bypass(), but VOP_RENAME_APV() is
 generated automatically by tools/vnode_if.awk and it looks like this can't be
 done there.
 
 I have tested the patch and it works for me.
 
 Also note the problem with leaked lock also exists when trying to rename
 files inside ntfs folder -- operation failed and after this you can't unmount
 ntfs. The patch cures this case too.
 
 -- 
 Mikolaj Golub
 
 
 --=-=-=
 Content-Type: text/x-patch
 Content-Disposition: inline; filename=vfs_subr.c.vop_rename.patch
 
 --- sys/kern/vfs_subr.c.orig	2010-04-02 07:42:16.000000000 +0300
 +++ sys/kern/vfs_subr.c	2010-04-02 07:58:01.000000000 +0300
 @@ -3946,6 +3946,20 @@ vop_rename_post(void *ap, int rc)
  		if (a->a_tvp)
  			VFS_KNOTE_UNLOCKED(a->a_tvp, NOTE_DELETE);
  	}
 +	/* 
 +	 * The VOP routine is expected to vput(9) both the destination
 +	 * directory and file prior to returning. If rc is EOPNOTSUPP then
 +	 * vop_rename() is not implemented for this fs and vop_bypass() has
 +	 * been called instead, so we need to unlock the vnods here.
 +	 */
 +	if (rc == EOPNOTSUPP) {
 +		if (a->a_tdvp == a->a_tvp)
 +			vrele(a->a_tdvp);
 +		else
 +			vput(a->a_tdvp);
 +		vrele(a->a_fdvp);
 +		vrele(a->a_fvp);
 +	}
  	if (a->a_tdvp != a->a_fdvp)
  		vdrop(a->a_fdvp);
  	if (a->a_tvp != a->a_fvp)
 
 --=-=-=--


More information about the freebsd-bugs mailing list