Module Name: src Committed By: pooka Date: Thu Nov 11 17:33:22 UTC 2010
Modified Files: src/sys/rump/librump/rumpvfs: rumpfs.c Log Message: +VOP_RENAME To generate a diff of this commit: cvs rdiff -u -r1.71 -r1.72 src/sys/rump/librump/rumpvfs/rumpfs.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/rump/librump/rumpvfs/rumpfs.c diff -u src/sys/rump/librump/rumpvfs/rumpfs.c:1.71 src/sys/rump/librump/rumpvfs/rumpfs.c:1.72 --- src/sys/rump/librump/rumpvfs/rumpfs.c:1.71 Thu Nov 11 17:26:01 2010 +++ src/sys/rump/librump/rumpvfs/rumpfs.c Thu Nov 11 17:33:22 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpfs.c,v 1.71 2010/11/11 17:26:01 pooka Exp $ */ +/* $NetBSD: rumpfs.c,v 1.72 2010/11/11 17:33:22 pooka Exp $ */ /* * Copyright (c) 2009, 2010 Antti Kantee. All Rights Reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.71 2010/11/11 17:26:01 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.72 2010/11/11 17:33:22 pooka Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -64,6 +64,7 @@ static int rump_vop_getattr(void *); static int rump_vop_mkdir(void *); static int rump_vop_rmdir(void *); +static int rump_vop_remove(void *); static int rump_vop_mknod(void *); static int rump_vop_create(void *); static int rump_vop_inactive(void *); @@ -96,6 +97,7 @@ { &vop_getattr_desc, rump_vop_getattr }, { &vop_mkdir_desc, rump_vop_mkdir }, { &vop_rmdir_desc, rump_vop_rmdir }, + { &vop_remove_desc, rump_vop_remove }, { &vop_mknod_desc, rump_vop_mknod }, { &vop_create_desc, rump_vop_create }, { &vop_symlink_desc, rump_vop_symlink }, @@ -116,7 +118,6 @@ { &vop_islocked_desc, genfs_islocked }, { &vop_inactive_desc, rump_vop_inactive }, { &vop_reclaim_desc, rump_vop_reclaim }, - { &vop_remove_desc, genfs_eopnotsupp }, { &vop_link_desc, genfs_eopnotsupp }, { &vop_pathconf_desc, rump_vop_pathconf }, { &vop_bmap_desc, rump_vop_bmap }, @@ -630,7 +631,7 @@ return 0; } - /* we handle only some "non-special" cases */ + /* we don't do rename */ if (!(((cnp->cn_flags & ISLASTCN) == 0) || (cnp->cn_nameiop != RENAME))) return EOPNOTSUPP; @@ -816,6 +817,38 @@ } static int +rump_vop_remove(void *v) +{ + struct vop_rmdir_args /* { + struct vnode *a_dvp; + struct vnode *a_vp; + struct componentname *a_cnp; + }; */ *ap = v; + struct vnode *dvp = ap->a_dvp; + struct vnode *vp = ap->a_vp; + struct componentname *cnp = ap->a_cnp; + struct rumpfs_node *rnd = dvp->v_data; + struct rumpfs_node *rn = vp->v_data; + int rv = 0; + + if (rn->rn_flags & RUMPNODE_ET_PHONE_HOST) + return EOPNOTSUPP; + + if (vp->v_type == VREG) { + rump_hyperfree(rn->rn_data, rn->rn_dlen); + } + + freedir(rnd, cnp); + rn->rn_flags |= RUMPNODE_CANRECLAIM; + + PNBUF_PUT(cnp->cn_pnbuf); + vput(dvp); + vput(vp); + + return rv; +} + +static int rump_vop_mknod(void *v) { struct vop_mknod_args /* {