Module Name: src Committed By: pooka Date: Thu Apr 29 22:34:21 UTC 2010
Modified Files: src/lib/libp2k: p2k.c Log Message: If vfstype is MOUNT_RUMPFS, assume we don't actually want to mount a file system, but attach to the root in the fs namespace of a rump kernel. To generate a diff of this commit: cvs rdiff -u -r1.34 -r1.35 src/lib/libp2k/p2k.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libp2k/p2k.c diff -u src/lib/libp2k/p2k.c:1.34 src/lib/libp2k/p2k.c:1.35 --- src/lib/libp2k/p2k.c:1.34 Wed Apr 14 14:15:48 2010 +++ src/lib/libp2k/p2k.c Thu Apr 29 22:34:21 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: p2k.c,v 1.34 2010/04/14 14:15:48 pooka Exp $ */ +/* $NetBSD: p2k.c,v 1.35 2010/04/29 22:34:21 pooka Exp $ */ /* * Copyright (c) 2007, 2008, 2009 Antti Kantee. All Rights Reserved. @@ -62,6 +62,11 @@ #include <rump/p2k.h> #include <rump/ukfs.h> +/* NetBSD-5 compat */ +#ifndef MOUNT_RUMPFS +#define MOUNT_RUMPFS "rumpfs" +#endif + PUFFSOP_PROTOS(p2k) LIST_HEAD(p2k_vp_hash, p2k_node); @@ -71,6 +76,7 @@ struct puffs_usermount *p2m_pu; struct ukfs *p2m_ukfs; struct p2k_vp_hash p2m_vphash[NHASHBUCK]; + struct mount *p2m_mp; int p2m_nvnodes; int p2m_imtmpfsman; }; @@ -393,16 +399,40 @@ if (ukfs_init() == -1) goto out; - if (part != ukfs_part_na) - ukfs = ukfs_mount_disk(vfsname, devpath, part, - mountpath, mntflags, arg, alen); - else - ukfs = ukfs_mount(vfsname, devpath, mountpath, mntflags, - arg, alen); - if (ukfs == NULL) - goto out; - ukfs_setspecific(ukfs, p2m); - p2m->p2m_ukfs = ukfs; + + /* + * If we're mounting rumpfs, actually do no mount and redirect + * requests to rump fs namespace root. Strictly speaking, this + * is not correct, but considering rumpfs doesn't currently + * support VFS_MOUNT(), I don't think anyone will notice. + */ + if (strcmp(vfsname, MOUNT_RUMPFS) == 0) { + if ((rv = rump_pub_vfs_getmp("/", &p2m->p2m_mp)) != 0) { + errno = rv; + rv = -1; + goto out; + } + if ((rv = rump_pub_vfs_root(p2m->p2m_mp, + &p2m->p2m_rvp, 0)) != 0) { + errno = rv; + rv = -1; + goto out; + } + } else { + if (part != ukfs_part_na) + ukfs = ukfs_mount_disk(vfsname, devpath, part, + mountpath, mntflags, arg, alen); + else + ukfs = ukfs_mount(vfsname, devpath, mountpath, mntflags, + arg, alen); + if (ukfs == NULL) + goto out; + ukfs_setspecific(ukfs, p2m); + p2m->p2m_ukfs = ukfs; + p2m->p2m_mp = ukfs_getmp(ukfs); + p2m->p2m_rvp = ukfs_getrvp(ukfs); + } + p2m->p2m_pu = pu; /* @@ -415,7 +445,6 @@ */ p2m->p2m_imtmpfsman = strcmp(vfsname, MOUNT_TMPFS) == 0; - p2m->p2m_rvp = ukfs_getrvp(ukfs); p2n_root = getp2n(p2m, p2m->p2m_rvp, true, NULL); puffs_setfhsize(pu, 0, PUFFS_FHFLAG_PASSTHROUGH); puffs_setstacksize(pu, PUFFS_STACKSIZE_MIN); @@ -423,7 +452,7 @@ puffs_set_prepost(pu, makelwp, clearlwp); puffs_set_errnotify(pu, p2k_errcatcher); - puffs_setspecific(pu, ukfs); + puffs_setspecific(pu, p2m); rv = puffs_mount(pu, mountpath, mntflags, p2n_root); out: @@ -513,7 +542,8 @@ int p2k_fs_statvfs(struct puffs_usermount *pu, struct statvfs *sbp) { - struct mount *mp = ukfs_getmp(puffs_getspecific(pu)); + struct p2k_mount *p2m = puffs_getspecific(pu); + struct mount *mp = p2m->p2m_mp; return rump_pub_vfs_statvfs(mp, sbp); } @@ -522,16 +552,18 @@ int p2k_fs_unmount(struct puffs_usermount *pu, int flags) { - struct ukfs *fs = puffs_getspecific(pu); - struct p2k_mount *p2m = ukfs_getspecific(fs); + struct p2k_mount *p2m = puffs_getspecific(pu); + struct ukfs *fs = p2m->p2m_ukfs; int error = 0; rump_pub_lwp_release(rump_pub_lwp_curlwp()); /* ukfs & curlwp tricks */ rump_pub_vp_rele(p2m->p2m_rvp); - if (ukfs_release(fs, 0) != 0) { - ukfs_release(fs, UKFS_RELFLAG_FORCE); - error = 0; + if (fs) { + if (ukfs_release(fs, 0) != 0) { + ukfs_release(fs, UKFS_RELFLAG_FORCE); + error = 0; + } } p2m->p2m_ukfs = NULL; @@ -543,7 +575,8 @@ p2k_fs_sync(struct puffs_usermount *pu, int waitfor, const struct puffs_cred *pcr) { - struct mount *mp = ukfs_getmp(puffs_getspecific(pu)); + struct p2k_mount *p2m = puffs_getspecific(pu); + struct mount *mp = p2m->p2m_mp; struct kauth_cred *cred; int rv; @@ -559,8 +592,8 @@ p2k_fs_fhtonode(struct puffs_usermount *pu, void *fid, size_t fidsize, struct puffs_newinfo *pni) { - struct mount *mp = ukfs_getmp(puffs_getspecific(pu)); - struct p2k_mount *p2m = ukfs_getspecific(puffs_getspecific(pu)); + struct p2k_mount *p2m = puffs_getspecific(pu); + struct mount *mp = p2m->p2m_mp; struct p2k_node *p2n; struct vnode *vp; enum vtype vtype; @@ -602,7 +635,7 @@ p2k_node_lookup(struct puffs_usermount *pu, puffs_cookie_t opc, struct puffs_newinfo *pni, const struct puffs_cn *pcn) { - struct p2k_mount *p2m = ukfs_getspecific(puffs_getspecific(pu)); + struct p2k_mount *p2m = puffs_getspecific(pu); struct p2k_node *p2n_dir = opc, *p2n; struct componentname *cn; struct vnode *dvp = p2n_dir->p2n_vp, *vp; @@ -722,7 +755,7 @@ int (*symfn)(struct vnode *, struct vnode **, struct componentname *, struct vattr *, char *)) { - struct p2k_mount *p2m = ukfs_getspecific(puffs_getspecific(pu)); + struct p2k_mount *p2m = puffs_getspecific(pu); struct vnode *dvp = p2n_dir->p2n_vp; struct p2k_node *p2n; struct componentname *cn; @@ -1235,8 +1268,7 @@ int p2k_node_inactive(struct puffs_usermount *pu, puffs_cookie_t opc) { - struct ukfs *fs = puffs_getspecific(pu); - struct p2k_mount *p2m = ukfs_getspecific(fs); + struct p2k_mount *p2m = puffs_getspecific(pu); struct p2k_node *p2n = opc; struct vnode *vp = OPC2VP(opc); bool recycle = false;