Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/rump/librump/rumpvfs support vfs_mount/unmount
details: https://anonhg.NetBSD.org/src/rev/e773bf4d3671
branches: trunk
changeset: 758626:e773bf4d3671
user: pooka <pooka%NetBSD.org@localhost>
date: Thu Nov 11 16:01:59 2010 +0000
description:
support vfs_mount/unmount
diffstat:
sys/rump/librump/rumpvfs/rumpfs.c | 92 +++++++++++++++++++++++++-------------
1 files changed, 60 insertions(+), 32 deletions(-)
diffs (185 lines):
diff -r 1aa8ce12a9cc -r e773bf4d3671 sys/rump/librump/rumpvfs/rumpfs.c
--- a/sys/rump/librump/rumpvfs/rumpfs.c Thu Nov 11 15:59:27 2010 +0000
+++ b/sys/rump/librump/rumpvfs/rumpfs.c Thu Nov 11 16:01:59 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: rumpfs.c,v 1.68 2010/11/11 15:05:54 pooka Exp $ */
+/* $NetBSD: rumpfs.c,v 1.69 2010/11/11 16:01:59 pooka Exp $ */
/*
* Copyright (c) 2009 Antti Kantee. All Rights Reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.68 2010/11/11 15:05:54 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.69 2010/11/11 16:01:59 pooka Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -98,6 +98,7 @@
{ &vop_read_desc, rump_vop_read },
{ &vop_write_desc, rump_vop_write },
{ &vop_open_desc, rump_vop_open },
+ { &vop_close_desc, genfs_nullop },
{ &vop_seek_desc, genfs_seek },
{ &vop_getpages_desc, genfs_getpages },
{ &vop_putpages_desc, genfs_putpages },
@@ -183,6 +184,7 @@
#define RUMPNODE_CANRECLAIM 0x01
#define RUMPNODE_DIR_ET 0x02
#define RUMPNODE_DIR_ETSUBS 0x04
+#define RUMPNODE_ET_PHONE_HOST 0x10
struct rumpfs_mount {
struct vnode *rfsmp_rvp;
@@ -339,6 +341,8 @@
et->et_removing = false;
et->et_blkmin = dmin;
+ rn->rn_flags |= RUMPNODE_ET_PHONE_HOST;
+
if (ftype == RUMP_ETFS_REG || REGDIR(ftype) || et->et_blkmin != -1) {
size_t len = strlen(hostpath)+1;
@@ -947,7 +951,7 @@
int mode = ap->a_mode;
int error = EINVAL;
- if (vp->v_type != VREG || rn->rn_hostpath == NULL)
+ if (vp->v_type != VREG || (rn->rn_flags & RUMPNODE_ET_PHONE_HOST) == 0)
return 0;
if (mode & FREAD) {
@@ -1126,7 +1130,7 @@
struct rumpfs_node *rn = vp->v_data;
int error;
- if (vp->v_type == VREG) {
+ if (rn->rn_flags & RUMPNODE_ET_PHONE_HOST && vp->v_type == VREG) {
if (rn->rn_readfd != -1) {
rumpuser_close(rn->rn_readfd, &error);
rn->rn_readfd = -1;
@@ -1137,7 +1141,7 @@
}
}
*ap->a_recycle = (rn->rn_flags & RUMPNODE_CANRECLAIM) ? true : false;
-
+
VOP_UNLOCK(vp);
return 0;
}
@@ -1222,22 +1226,62 @@
/* vfs_list */
};
-int
-rumpfs_mount(struct mount *mp, const char *mntpath, void *arg, size_t *alen)
+static int
+rumpfs_mountfs(struct mount *mp)
{
+ struct rumpfs_mount *rfsmp;
+ struct rumpfs_node *rn;
+ int error;
- return EOPNOTSUPP;
+ rfsmp = kmem_alloc(sizeof(*rfsmp), KM_SLEEP);
+
+ rn = makeprivate(VDIR, NODEV, DEV_BSIZE);
+ rn->rn_parent = rn;
+ if ((error = makevnode(mp, rn, &rfsmp->rfsmp_rvp)) != 0)
+ return error;
+
+ rfsmp->rfsmp_rvp->v_vflag |= VV_ROOT;
+ VOP_UNLOCK(rfsmp->rfsmp_rvp);
+
+ mp->mnt_data = rfsmp;
+ mp->mnt_stat.f_namemax = MAXNAMLEN;
+ mp->mnt_stat.f_iosize = 512;
+ mp->mnt_flag |= MNT_LOCAL;
+ mp->mnt_iflag |= IMNT_MPSAFE;
+ vfs_getnewfsid(mp);
+
+ return 0;
}
int
-rumpfs_unmount(struct mount *mp, int flags)
+rumpfs_mount(struct mount *mp, const char *mntpath, void *arg, size_t *alen)
{
+ int error;
+
+ error = set_statvfs_info(mntpath, UIO_USERSPACE, "rumpfs", UIO_SYSSPACE,
+ mp->mnt_op->vfs_name, mp, curlwp);
+ if (error)
+ return error;
+
+ return rumpfs_mountfs(mp);
+}
- /* if going for it, just lie about it */
- if (panicstr)
- return 0;
+int
+rumpfs_unmount(struct mount *mp, int mntflags)
+{
+ struct rumpfs_mount *rfsmp = mp->mnt_data;
+ int flags = 0, error;
- return EOPNOTSUPP; /* ;) */
+ if (panicstr || mntflags & MNT_FORCE)
+ flags |= FORCECLOSE;
+
+ if ((error = vflush(mp, rfsmp->rfsmp_rvp, flags)) != 0)
+ return error;
+ vgone(rfsmp->rfsmp_rvp); /* XXX */
+
+ kmem_free(rfsmp, sizeof(*rfsmp));
+
+ return 0;
}
int
@@ -1280,8 +1324,6 @@
rumpfs_mountroot()
{
struct mount *mp;
- struct rumpfs_mount *rfsmp;
- struct rumpfs_node *rn;
int error;
if ((error = vfs_rootmountalloc(MOUNT_RUMPFS, "rootdev", &mp)) != 0) {
@@ -1289,31 +1331,17 @@
return error;
}
- rfsmp = kmem_alloc(sizeof(*rfsmp), KM_SLEEP);
-
- rn = makeprivate(VDIR, NODEV, DEV_BSIZE);
- rn->rn_parent = rn;
- error = makevnode(mp, rn, &rfsmp->rfsmp_rvp);
- if (error)
- panic("could not create root vnode: %d", error);
- rfsmp->rfsmp_rvp->v_vflag |= VV_ROOT;
- VOP_UNLOCK(rfsmp->rfsmp_rvp);
+ if ((error = rumpfs_mountfs(mp)) != 0)
+ panic("mounting rootfs failed: %d", error);
mutex_enter(&mountlist_lock);
CIRCLEQ_INSERT_TAIL(&mountlist, mp, mnt_list);
mutex_exit(&mountlist_lock);
- mp->mnt_data = rfsmp;
- mp->mnt_stat.f_namemax = MAXNAMLEN;
- mp->mnt_stat.f_iosize = 512;
- mp->mnt_flag |= MNT_LOCAL;
- mp->mnt_iflag |= IMNT_MPSAFE;
- vfs_getnewfsid(mp);
-
error = set_statvfs_info("/", UIO_SYSSPACE, "rumpfs", UIO_SYSSPACE,
mp->mnt_op->vfs_name, mp, curlwp);
if (error)
- panic("set statvfsinfo for rootfs failed");
+ panic("set_statvfs_info failed for rootfs: %d", error);
vfs_unbusy(mp, false, NULL);
Home |
Main Index |
Thread Index |
Old Index