Module Name: src Committed By: pooka Date: Tue Feb 2 12:22:23 UTC 2016
Modified Files: src/distrib/sets/lists/comp: mi src/sys/rump/include/rump: Makefile src/sys/rump/librump/rumpvfs: rumpfs.c Added Files: src/sys/rump/include/rump: rumpfs.h Log Message: Add capability to attach external memory to files on rumpfs. This feature is useful e.g. for tight-memory systems where you don't need block storage, but still need to provide some data via files. To generate a diff of this commit: cvs rdiff -u -r1.2016 -r1.2017 src/distrib/sets/lists/comp/mi cvs rdiff -u -r1.9 -r1.10 src/sys/rump/include/rump/Makefile cvs rdiff -u -r0 -r1.1 src/sys/rump/include/rump/rumpfs.h cvs rdiff -u -r1.136 -r1.137 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/distrib/sets/lists/comp/mi diff -u src/distrib/sets/lists/comp/mi:1.2016 src/distrib/sets/lists/comp/mi:1.2017 --- src/distrib/sets/lists/comp/mi:1.2016 Sun Jan 31 23:14:34 2016 +++ src/distrib/sets/lists/comp/mi Tue Feb 2 12:22:23 2016 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.2016 2016/01/31 23:14:34 pooka Exp $ +# $NetBSD: mi,v 1.2017 2016/02/02 12:22:23 pooka Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. ./etc/mtree/set.comp comp-sys-root @@ -2666,6 +2666,7 @@ ./usr/include/rump/rumpdefs.h comp-c-include rump ./usr/include/rump/rumperr.h comp-c-include rump ./usr/include/rump/rumperrno2host.h comp-c-include rump +./usr/include/rump/rumpfs.h comp-c-include rump ./usr/include/rump/rumpkern_if_pub.h comp-c-include rump ./usr/include/rump/rumpnet_if_pub.h comp-c-include rump ./usr/include/rump/rumpuser.h comp-c-include rump Index: src/sys/rump/include/rump/Makefile diff -u src/sys/rump/include/rump/Makefile:1.9 src/sys/rump/include/rump/Makefile:1.10 --- src/sys/rump/include/rump/Makefile:1.9 Sun Jan 31 23:14:34 2016 +++ src/sys/rump/include/rump/Makefile Tue Feb 2 12:22:23 2016 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.9 2016/01/31 23:14:34 pooka Exp $ +# $NetBSD: Makefile,v 1.10 2016/02/02 12:22:23 pooka Exp $ .include <bsd.own.mk> @@ -8,6 +8,7 @@ INCSDIR= /usr/include/rump INCS= rump.h rump_namei.h rump_syscalls.h rump_syscalls_compat.h INCS+= rump_syscallshotgun.h INCS+= rumpdefs.h rumperr.h rumperrno2host.h rumpuser.h rumpvnode_if.h +INCS+= rumpfs.h INCS+= rumpkern_if_pub.h rumpvfs_if_pub.h rumpnet_if_pub.h .endif Index: src/sys/rump/librump/rumpvfs/rumpfs.c diff -u src/sys/rump/librump/rumpvfs/rumpfs.c:1.136 src/sys/rump/librump/rumpvfs/rumpfs.c:1.137 --- src/sys/rump/librump/rumpvfs/rumpfs.c:1.136 Tue Jan 26 23:12:18 2016 +++ src/sys/rump/librump/rumpvfs/rumpfs.c Tue Feb 2 12:22:23 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpfs.c,v 1.136 2016/01/26 23:12:18 pooka Exp $ */ +/* $NetBSD: rumpfs.c,v 1.137 2016/02/02 12:22:23 pooka Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Antti Kantee. All Rights Reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.136 2016/01/26 23:12:18 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.137 2016/02/02 12:22:23 pooka Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -58,6 +58,7 @@ __KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1 #include <rump-sys/kern.h> #include <rump-sys/vfs.h> +#include <rump/rumpfs.h> #include <rump/rumpuser.h> static int rump_vop_lookup(void *); @@ -84,6 +85,7 @@ static int rump_vop_bmap(void *); static int rump_vop_strategy(void *); static int rump_vop_advlock(void *); static int rump_vop_access(void *); +static int rump_vop_fcntl(void *); int (**fifo_vnodeop_p)(void *); const struct vnodeopv_entry_desc fifo_vnodeop_entries[] = { @@ -128,6 +130,7 @@ const struct vnodeopv_entry_desc rump_vn { &vop_bmap_desc, rump_vop_bmap }, { &vop_strategy_desc, rump_vop_strategy }, { &vop_advlock_desc, rump_vop_advlock }, + { &vop_fcntl_desc, rump_vop_fcntl }, { NULL, NULL } }; const struct vnodeopv_desc rump_vnodeop_opv_desc = @@ -209,6 +212,7 @@ struct rumpfs_node { #define RUMPNODE_DIR_ET 0x02 #define RUMPNODE_DIR_ETSUBS 0x04 #define RUMPNODE_ET_PHONE_HOST 0x10 +#define RUMPNODE_EXTSTORAGE 0x20 struct rumpfs_mount { struct vnode *rfsmp_rvp; @@ -931,7 +935,12 @@ rump_vop_setattr(void *v) copylen = MIN(rn->rn_dlen, newlen); memset(newdata, 0, newlen); memcpy(newdata, rn->rn_data, copylen); - rump_hyperfree(rn->rn_data, rn->rn_dlen); + + if ((rn->rn_flags & RUMPNODE_EXTSTORAGE) == 0) { + rump_hyperfree(rn->rn_data, rn->rn_dlen); + } else { + rn->rn_flags &= ~RUMPNODE_EXTSTORAGE; + } rn->rn_data = newdata; rn->rn_dlen = newlen; @@ -1456,7 +1465,11 @@ rump_vop_write(void *v) rn->rn_dlen = oldlen; uvm_vnp_setsize(vp, oldlen); } else { - rump_hyperfree(olddata, oldlen); + if ((rn->rn_flags & RUMPNODE_EXTSTORAGE) == 0) { + rump_hyperfree(olddata, oldlen); + } else { + rn->rn_flags &= ~RUMPNODE_EXTSTORAGE; + } } } @@ -1620,7 +1633,11 @@ rump_vop_reclaim(void *v) if (vp->v_type == VREG && (rn->rn_flags & RUMPNODE_ET_PHONE_HOST) == 0 && rn->rn_data) { - rump_hyperfree(rn->rn_data, rn->rn_dlen); + if ((rn->rn_flags & RUMPNODE_EXTSTORAGE) == 0) { + rump_hyperfree(rn->rn_data, rn->rn_dlen); + } else { + rn->rn_flags &= ~RUMPNODE_EXTSTORAGE; + } rn->rn_data = NULL; } @@ -1676,6 +1693,65 @@ rump_vop_advlock(void *v) return lf_advlock(ap, &rn->rn_lockf, vp->v_size); } +static int +rump_vop_fcntl(void *v) +{ + struct vop_fcntl_args /* { + struct vnode *a_vp; + u_int a_command; + void *a_data; + int a_fflag; + kauth_cred_t a_cred; + } */ *ap = v; + struct proc *p = curproc; + struct vnode *vp = ap->a_vp; + struct rumpfs_node *rn = vp->v_data; + u_int cmd = ap->a_command; + int fflag = ap->a_fflag; + struct rumpfs_extstorage *rfse = ap->a_data; + int error = 0; + + /* none of the current rumpfs fcntlops are defined for remotes */ + if (!RUMP_LOCALPROC_P(p)) + return EINVAL; + + switch (cmd) { + case RUMPFS_FCNTL_EXTSTORAGE_ADD: + break; + default: + return EINVAL; + } + + if ((fflag & FWRITE) == 0) + return EBADF; + + if (vp->v_type != VREG || (rn->rn_flags & RUMPNODE_ET_PHONE_HOST)) + return EINVAL; + + if (rfse->rfse_flags != 0) + return EINVAL; + + /* + * Ok, we are good to go. Process. + */ + + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + + KASSERT(cmd == RUMPFS_FCNTL_EXTSTORAGE_ADD); + if (rn->rn_data && (rn->rn_flags & RUMPNODE_EXTSTORAGE) == 0) { + rump_hyperfree(rn->rn_data, rn->rn_dlen); + } + + rn->rn_data = rfse->rfse_data; + rn->rn_dlen = rfse->rfse_dlen; + uvm_vnp_setsize(vp, rn->rn_dlen); + rn->rn_flags |= RUMPNODE_EXTSTORAGE; + + VOP_UNLOCK(vp); + + return error; +} + /* * Begin vfs-level stuff */ Added files: Index: src/sys/rump/include/rump/rumpfs.h diff -u /dev/null src/sys/rump/include/rump/rumpfs.h:1.1 --- /dev/null Tue Feb 2 12:22:23 2016 +++ src/sys/rump/include/rump/rumpfs.h Tue Feb 2 12:22:23 2016 @@ -0,0 +1,42 @@ +/* $NetBSD: rumpfs.h,v 1.1 2016/02/02 12:22:23 pooka Exp $ */ + +/* + * Copyright (c) 2016 Antti Kantee. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _RUMP_RUMPFS_H_ +#define _RUMP_RUMPFS_H_ + +#include <rump/rumpdefs.h> + +struct rumpfs_extstorage { + void *rfse_data; + size_t rfse_dlen; + int rfse_flags; +}; + +#define RUMPFS_FCNTL_EXTSTORAGE_ADD \ + RUMP__FCNR_FSPRIV('R', 1, struct rumpfs_extstorage) + +#endif /* _RUMP_RUMPFS_H_ */