Date: Wed, 18 Feb 2009 18:21:26 +0200 From: Kostik Belousov <kostikbel@gmail.com> To: Cy Schubert <Cy.Schubert@komquats.com> Cc: pjd@freebsd.org, freebsd-stable@freebsd.org Subject: Re: ZFS Panic Message-ID: <20090218162126.GQ41617@deviant.kiev.zoral.com.ua> In-Reply-To: <200902180543.n1I5hVDF072033@cwsys.cwsent.com> References: <200902180543.n1I5hVDF072033@cwsys.cwsent.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--v+Mbu5iuT/5Blw/K Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, Feb 17, 2009 at 09:43:31PM -0800, Cy Schubert wrote: > I got this panic after issuing reboot(8). >=20 > FreeBSD 7.1-STABLE FreeBSD 7.1-STABLE #0: Tue Feb 17 19:29:23 PST 2009 = =20 > cy@cwsys:/export/obj/export/home/cy/test/test-stable7/sys/DEBUG i386 >=20 >=20 > FreeBSD/i386 (bob) (ttyd0) >=20 > login: Feb 17 21:22:56 bob reboot: rebooted by root > Feb 17 21:22:56 bob syslogd: exiting on signal 15 > Waiting (max 60 seconds) for system process `vnlru' to stop...done > Waiting (max 60 seconds) for system process `syncer' to stop... > Syncing disks, vnodes remaining...2 2 2 2 1 1 1 1 0 0 0 0 0 0 done > Waiting (max 60 seconds) for system process `bufdaemon' to stop...done > All buffers synced. > panic: insmntque() failed: error 16 > cpuid =3D 0 > KDB: enter: panic > [thread pid 1086 tid 100090 ] > Stopped at kdb_enter_why+0x3a: movl $0,kdb_why > db> bt > Tracing pid 1086 tid 100090 td 0xc2bfd230 > kdb_enter_why(c087ef4a,c087ef4a,c2b1b5b4,ebf8da58,0,...) at=20 > kdb_enter_why+0x3a > panic(c2b1b5b4,10,c2b24a40,ebf8da64,c38e6000,...) at panic+0x136 > gfs_file_create(84,c346d8a0,c342d5a0,c2b24a40,c346d8a0,...) at=20 > gfs_file_create+0x86 > gfs_dir_create(84,c346d8a0,c342d5a0,c2b24a40,0,...) at gfs_dir_create+0x2c > zfsctl_mknode_snapdir(c346d8a0,c2b1b54f,275,25d,c3419520,...) at=20 > zfsctl_mknode_snapdir+0x53 > gfs_dir_lookup(c346d8a0,c2b21126,ebf8db74,c091521c,ebf8db38,...) at=20 > gfs_dir_lookup+0xd1 > zfsctl_root_lookup(c346d8a0,c2b21126,ebf8db74,0,0,...) at=20 > zfsctl_root_lookup+0xdc > zfsctl_umount_snapshots(c342d5a0,80000,c3acb800,c3216844,0,...) at=20 > zfsctl_umount_snapshots+0x4e > zfs_umount(c342d5a0,80000,c2bfd230,c2bfd230,c088a687,...) at zfs_umount+0= x53 > dounmount(c342d5a0,80000,c2bfd230,e26988ac,0,...) at dounmount+0x430 > vfs_unmountall(c087ed87,0,c087edeb,128,0,...) at vfs_unmountall+0x4e > boot(c090b5d0,0,c087edeb,ab,ebf8dd2c,...) at boot+0x44f > reboot(c2bfd230,ebf8dcfc,4,c0885aef,c08c38a8,...) at reboot+0x4b > syscall(ebf8dd38) at syscall+0x2b3 > Xint0x80_syscall() at Xint0x80_syscall+0x20 > --- syscall (55, FreeBSD ELF32, reboot), eip =3D 0x280bc947, esp =3D=20 > 0xbfbfeb7c, ebp =3D 0xbfbfebb8 --- > db>=20 >=20 > Forceably unmounting ZFS filesystems prior to issuing reboot(8) mitigates= =20 > the panic. The patch below would fix the problem, unless I mis-merged it. Please note that I cannot test the patch myself, so I rely on ZFS users testing before the commit. Property changes on: . ___________________________________________________________________ Modified: svn:mergeinfo Merged /head/sys:r182781,182824,182840 Property changes on: dev/cxgb ___________________________________________________________________ Modified: svn:mergeinfo Merged /head/sys/dev/cxgb:r182781,182824,182840 Property changes on: dev/ath/ath_hal ___________________________________________________________________ Modified: svn:mergeinfo Merged /head/sys/dev/ath/ath_hal:r182781,182824,182840 Property changes on: contrib/pf ___________________________________________________________________ Modified: svn:mergeinfo Merged /head/sys/contrib/pf:r182781,182824,182840 Index: cddl/contrib/opensolaris/uts/common/fs/gfs.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- cddl/contrib/opensolaris/uts/common/fs/gfs.c (revision 188748) +++ cddl/contrib/opensolaris/uts/common/fs/gfs.c (working copy) @@ -358,6 +358,7 @@ fp =3D kmem_zalloc(size, KM_SLEEP); error =3D getnewvnode("zfs", vfsp, ops, &vp); ASSERT(error =3D=3D 0); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, curthread); vp->v_data =3D (caddr_t)fp; =20 /* @@ -368,7 +369,9 @@ fp->gfs_size =3D size; fp->gfs_type =3D GFS_FILE; =20 + vp->v_vflag |=3D VV_FORCEINSMQ; error =3D insmntque(vp, vfsp); + vp->v_vflag &=3D ~VV_FORCEINSMQ; KASSERT(error =3D=3D 0, ("insmntque() failed: error %d", error)); =20 /* Index: cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c (revision 188748) +++ cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c (working copy) @@ -113,6 +113,7 @@ if (cdrarg !=3D NULL) { error =3D getnewvnode("zfs", vfsp, &zfs_vnodeops, &vp); ASSERT(error =3D=3D 0); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, curthread); zp->z_vnode =3D vp; vp->v_data =3D (caddr_t)zp; vp->v_vnlock->lk_flags |=3D LK_CANRECURSE; @@ -348,7 +349,9 @@ if (vp =3D=3D NULL) return (zp); =20 + vp->v_vflag |=3D VV_FORCEINSMQ; error =3D insmntque(vp, zfsvfs->z_vfs); + vp->v_vflag &=3D ~VV_FORCEINSMQ; KASSERT(error =3D=3D 0, ("insmntque() failed: error %d", error)); =20 vp->v_type =3D IFTOVT((mode_t)zp->z_phys->zp_mode); @@ -535,8 +538,10 @@ =20 *zpp =3D zp; } else { - if (ZTOV(zp) !=3D NULL) + if (ZTOV(zp) !=3D NULL) { ZTOV(zp)->v_count =3D 0; + VOP_UNLOCK(ZTOV(zp), 0, curthread); + } dmu_buf_rele(dbp, NULL); zfs_znode_free(zp); } @@ -598,14 +603,18 @@ &zp->z_vnode); ASSERT(err =3D=3D 0); vp =3D ZTOV(zp); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, curthread); vp->v_data =3D (caddr_t)zp; vp->v_vnlock->lk_flags |=3D LK_CANRECURSE; vp->v_vnlock->lk_flags &=3D ~LK_NOSHARE; vp->v_type =3D IFTOVT((mode_t)zp->z_phys->zp_mode); if (vp->v_type =3D=3D VDIR) zp->z_zn_prefetch =3D B_TRUE; /* z_prefetch default is enabled */ + vp->v_vflag |=3D VV_FORCEINSMQ; err =3D insmntque(vp, zfsvfs->z_vfs); + vp->v_vflag &=3D ~VV_FORCEINSMQ; KASSERT(err =3D=3D 0, ("insmntque() failed: error %d", err)); + VOP_UNLOCK(vp, 0, curthread); } mutex_exit(&zp->z_lock); ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num); @@ -621,6 +630,8 @@ zfs_znode_dmu_init(zp); ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num); *zpp =3D zp; + if ((vp =3D ZTOV(zp)) !=3D NULL) + VOP_UNLOCK(vp, 0, curthread); return (0); } =20 Index: cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c (revision 188748) +++ cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c (working copy) @@ -1303,12 +1303,6 @@ } } out: - - if (error =3D=3D 0) { - *vpp =3D ZTOV(zp); - vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY, td); - } - if (dl) zfs_dirent_unlock(dl); =20 @@ -1588,8 +1582,6 @@ zfs_log_create(zilog, tx, TX_MKDIR, dzp, zp, dirname); dmu_tx_commit(tx); =20 - vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY, curthread); - zfs_dirent_unlock(dl); =20 ZFS_EXIT(zfsvfs); @@ -2773,7 +2765,6 @@ if (error =3D=3D 0) { zfs_log_symlink(zilog, tx, TX_SYMLINK, dzp, zp, name, link); *vpp =3D ZTOV(zp); - vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY, td); } =20 dmu_tx_commit(tx); Index: cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c (revision 18874= 8) +++ cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c (working copy) @@ -176,6 +176,8 @@ vp->v_vflag &=3D ~VV_ROOT; =20 zfsvfs->z_ctldir =3D vp; + + VOP_UNLOCK(vp, 0, curthread); } =20 /* @@ -789,6 +791,7 @@ mutex_init(&sdp->sd_lock, NULL, MUTEX_DEFAULT, NULL); avl_create(&sdp->sd_snaps, snapentry_compare, sizeof (zfs_snapentry_t), offsetof(zfs_snapentry_t, se_node)); + VOP_UNLOCK(vp, 0, curthread); return (vp); } =20 @@ -862,6 +865,7 @@ &zfsctl_ops_snapshot, NULL, NULL, MAXNAMELEN, NULL, NULL); zcp =3D vp->v_data; zcp->zc_id =3D objset; + VOP_UNLOCK(vp, 0, curthread); =20 return (vp); } --v+Mbu5iuT/5Blw/K Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (FreeBSD) iEYEARECAAYFAkmcNYUACgkQC3+MBN1Mb4gswwCgytR84hTQfx4QwxR9BiLRyGtL DAIAnA3iC7D0BHNXf9ff+iBDlEFGurvC =P8RF -----END PGP SIGNATURE----- --v+Mbu5iuT/5Blw/K--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090218162126.GQ41617>