From owner-freebsd-fs@FreeBSD.ORG Fri Apr 10 11:50:05 2009 Return-Path: Delivered-To: freebsd-fs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 48A3F106566B for ; Fri, 10 Apr 2009 11:50:05 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 1B9F78FC15 for ; Fri, 10 Apr 2009 11:50:05 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.14.3/8.14.3) with ESMTP id n3ABo4vm066335 for ; Fri, 10 Apr 2009 11:50:04 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.3/8.14.3/Submit) id n3ABo4Lg066334; Fri, 10 Apr 2009 11:50:04 GMT (envelope-from gnats) Date: Fri, 10 Apr 2009 11:50:04 GMT Message-Id: <200904101150.n3ABo4Lg066334@freefall.freebsd.org> To: freebsd-fs@FreeBSD.org From: Jaakko Heinonen Cc: Subject: Re: kern/132068: [zfs] page fault when using ZFS over NFS on 7.1-RELEASE/amd64 X-BeenThere: freebsd-fs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Jaakko Heinonen List-Id: Filesystems List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Apr 2009 11:50:05 -0000 The following reply was made to PR kern/132068; it has been noted by GNATS. From: Jaakko Heinonen To: Edward Fisk <7ogcg7g02@sneakemail.com> Cc: bug-followup@FreeBSD.org, Weldon Godfrey 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