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 /* {