Date: Fri, 10 Apr 2009 11:50:04 GMT From: Jaakko Heinonen <jh@saunalahti.fi> To: freebsd-fs@FreeBSD.org Subject: Re: kern/132068: [zfs] page fault when using ZFS over NFS on 7.1-RELEASE/amd64 Message-ID: <200904101150.n3ABo4Lg066334@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/132068; it has been noted by GNATS. From: Jaakko Heinonen <jh@saunalahti.fi> To: Edward Fisk <7ogcg7g02@sneakemail.com> Cc: bug-followup@FreeBSD.org, Weldon Godfrey <wgodfrey@ena.com> Subject: Re: kern/132068: [zfs] page fault when using ZFS over NFS on 7.1-RELEASE/amd64 Date: Fri, 10 Apr 2009 14:46:02 +0300 On 2009-03-26, Jaakko Heinonen wrote: > I now know what is going on. The vnode may be reclaimed during > zfs_zget() because it doesn't hold the vnode lock (except when a new > znode is created). OK, I have now put together a patch which should avoid the original panic you reported. The same panic was also reported by Weldon Godfrey (Cc'd) on -fs: http://lists.freebsd.org/pipermail/freebsd-fs/2008-August/004998.html --- patch begins here --- Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c =================================================================== --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c (revision 190593) +++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c (working copy) @@ -890,8 +890,9 @@ again: if (zp->z_unlinked) { err = ENOENT; } else { - if (ZTOV(zp) != NULL) - VN_HOLD(ZTOV(zp)); + vp = ZTOV(zp); + if (vp != NULL) + VN_HOLD(vp); else { if (first) { ZFS_LOG(1, "dying znode detected (zp=%p)", zp); @@ -907,12 +908,25 @@ again: tsleep(zp, 0, "zcollide", 1); goto again; } - *zpp = zp; err = 0; } dmu_buf_rele(db, NULL); mutex_exit(&zp->z_lock); ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num); + if (err == 0) { + /* + * Check if we lost lost race against reclaim. + */ + VI_LOCK(vp); + if (vp->v_iflag & VI_DOOMED) { + VI_UNLOCK(vp); + VN_RELE(vp); + ZFS_LOG(1, "doomed vnode detected (zp=%p)", zp); + goto again; + } + VI_UNLOCK(vp); + *zpp = zp; + } return (err); } --- patch ends here --- The fix isn't perfect. Vnodes may be still reclaimed during zfs_zget() in forced unmount case. However zfs doesn't support forced unmounts at all right now. The patch is againt 8.0-CURRENT. -- Jaakko
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200904101150.n3ABo4Lg066334>