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

Reply via email to