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