From owner-p4-projects@FreeBSD.ORG Sun Jun 19 09:36:41 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 5F5201065673; Sun, 19 Jun 2011 09:36:41 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 012AB106566B for ; Sun, 19 Jun 2011 09:36:41 +0000 (UTC) (envelope-from ilya@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id E33568FC08 for ; Sun, 19 Jun 2011 09:36:40 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5J9aems070486 for ; Sun, 19 Jun 2011 09:36:40 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5J9aemB070483 for perforce@freebsd.org; Sun, 19 Jun 2011 09:36:40 GMT (envelope-from ilya@FreeBSD.org) Date: Sun, 19 Jun 2011 09:36:40 GMT Message-Id: <201106190936.p5J9aemB070483@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to ilya@FreeBSD.org using -f From: Ilya Putsikau To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 194958 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 19 Jun 2011 09:36:41 -0000 http://p4web.freebsd.org/@@194958?ac=10 Change 194958 by ilya@ilya_triton2011 on 2011/06/19 09:36:00 Remove parent vnode reference from fuse node Set parent_nid in fuse_vnode_get Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.c#4 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.h#6 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#17 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.c#4 (text+ko) ==== @@ -160,6 +160,11 @@ return err; } + if (dvp != NULL && vnode_vtype(*vpp) == VDIR) { + MPASS((cnp->cn_flags & ISDOTDOT) == 0); + MPASS(!(cnp->cn_namelen == 1 && cnp->cn_nameptr[0] == '.')); + VTOFUD(*vpp)->parent_nid = VTOI(dvp); + } if (cnp != NULL) { cache_enter(dvp, *vpp, cnp); } ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.h#6 (text+ko) ==== @@ -41,9 +41,6 @@ */ struct sx truncatelock; - struct vnode *c_vp; - /* XXXIP reference is very likely to be stale, it's not updated in rename() */ - struct vnode *parent; off_t filesize; off_t newfilesize; ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#17 (text+ko) ==== @@ -601,11 +601,10 @@ int err = 0; int lookup_err = 0; struct vnode *vp = NULL; - struct vnode *pdp = NULL; struct fuse_attr *fattr = NULL; struct fuse_dispatcher fdi; enum fuse_opcode op; - uint64_t nid, parent_nid; + uint64_t nid; struct fuse_access_param facp; uint64_t size = 0; @@ -638,15 +637,15 @@ } if (flags & ISDOTDOT) { - pdp = VTOFUD(dvp)->parent; - nid = VTOI(pdp); - parent_nid = VTOFUD(dvp)->parent_nid; + nid = VTOFUD(dvp)->parent_nid; + if (nid == 0) { + return ENOENT; + } fdisp_init(&fdi, 0); op = FUSE_GETATTR; goto calldaemon; } else if (cnp->cn_namelen == 1 && *(cnp->cn_nameptr) == '.') { nid = VTOI(dvp); - parent_nid = VTOFUD(dvp)->parent_nid; fdisp_init(&fdi, 0); op = FUSE_GETATTR; goto calldaemon; @@ -670,7 +669,6 @@ } nid = VTOI(dvp); - parent_nid = VTOI(dvp); fdisp_init(&fdi, cnp->cn_namelen + 1); op = FUSE_LOOKUP; @@ -867,8 +865,20 @@ } if (flags & ISDOTDOT) { - vref(pdp); - *vpp = pdp; + int ltype; + + ltype = VOP_ISLOCKED(dvp); + VOP_UNLOCK(dvp, 0); + err = fuse_vnode_get(vnode_mount(dvp), + nid, + NULL, + &vp, + cnp, + IFTOVT(fattr->mode), + 0); + vn_lock(dvp, ltype | LK_RETRY); + vref(vp); + *vpp = vp; } else if (nid == VTOI(dvp)) { vref(dvp); *vpp = dvp; @@ -884,7 +894,7 @@ goto out; } if (vnode_vtype(vp) == VDIR) { - VTOFUD(vp)->parent = dvp; + VTOFUD(vp)->parent_nid = VTOI(dvp); //SETPARENT(vp, dvp); } *vpp = vp;