Module Name: src Committed By: pooka Date: Thu Nov 11 16:01:59 UTC 2010
Modified Files: src/sys/rump/librump/rumpvfs: rumpfs.c Log Message: support vfs_mount/unmount To generate a diff of this commit: cvs rdiff -u -r1.68 -r1.69 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.68 src/sys/rump/librump/rumpvfs/rumpfs.c:1.69 --- src/sys/rump/librump/rumpvfs/rumpfs.c:1.68 Thu Nov 11 15:05:54 2010 +++ src/sys/rump/librump/rumpvfs/rumpfs.c Thu Nov 11 16:01:59 2010 @@ -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 */ }; +static int +rumpfs_mountfs(struct mount *mp) +{ + struct rumpfs_mount *rfsmp; + struct rumpfs_node *rn; + int error; + + 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_mount(struct mount *mp, const char *mntpath, void *arg, size_t *alen) { + int error; - return EOPNOTSUPP; + 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); } int -rumpfs_unmount(struct mount *mp, int flags) +rumpfs_unmount(struct mount *mp, int mntflags) { + struct rumpfs_mount *rfsmp = mp->mnt_data; + int flags = 0, error; - /* if going for it, just lie about it */ - if (panicstr) - return 0; + if (panicstr || mntflags & MNT_FORCE) + flags |= FORCECLOSE; - return EOPNOTSUPP; /* ;) */ + 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);