From owner-p4-projects@FreeBSD.ORG Sun Jun 19 09:39:59 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id A66671065773; Sun, 19 Jun 2011 09:39:59 +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 A87301065673 for ; Sun, 19 Jun 2011 09:39:58 +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 967798FC21 for ; Sun, 19 Jun 2011 09:39:58 +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 p5J9dwLj070618 for ; Sun, 19 Jun 2011 09:39:58 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5J9dwcN070615 for perforce@freebsd.org; Sun, 19 Jun 2011 09:39:58 GMT (envelope-from ilya@FreeBSD.org) Date: Sun, 19 Jun 2011 09:39:58 GMT Message-Id: <201106190939.p5J9dwcN070615@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 194963 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:39:59 -0000 http://p4web.freebsd.org/@@194963?ac=10 Change 194963 by ilya@ilya_triton2011 on 2011/06/19 09:39:49 Release and unlock vnodes in rename, check cross fs rename. Don't check if target directory is not under the source directory, patching fuse sould be easier. Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#20 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#20 (text+ko) ==== @@ -1442,18 +1442,38 @@ panic("fuse_vnop_rename(): called on a dead file system"); } + if (fvp->v_mount != tdvp->v_mount || + (tvp && fvp->v_mount != tvp->v_mount)) { + DEBUG("cross-device rename: %s -> %s\n", + fcnp->cn_nameptr, (tcnp != NULL ? tcnp->cn_nameptr : "(NULL)")); + err = EXDEV; + goto out; + } + cache_purge(fvp); + /* + * FUSE library is expected to check if target directory is not + * under the source directory in the file system tree. + * Linux performs this check at VFS level. + */ err = fuse_internal_rename(fdvp, fcnp, tdvp, tcnp); - if (tvp != NULLVP) { - if (tvp != fvp) { - cache_purge(tvp); - } - if (err == 0) { - vrecycle(tvp, tcnp->cn_thread); - } + if (tvp != NULL && tvp != fvp) { + cache_purge(tvp); + } + +out: + if (tdvp == tvp) { + vrele(tdvp); + } else { + vput(tdvp); + } + if (tvp != NULL) { + vput(tvp); } + vrele(fdvp); + vrele(fvp); return err; }