Module Name: src
Committed By: pooka
Date: Thu Nov 11 14:46:55 UTC 2010
Modified Files:
src/sys/rump/librump/rumpvfs: rumpfs.c
Log Message:
Support non-hostbacked regular files, at least just a little bit.
To generate a diff of this commit:
cvs rdiff -u -r1.66 -r1.67 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.66 src/sys/rump/librump/rumpvfs/rumpfs.c:1.67
--- src/sys/rump/librump/rumpvfs/rumpfs.c:1.66 Mon Nov 8 11:01:45 2010
+++ src/sys/rump/librump/rumpvfs/rumpfs.c Thu Nov 11 14:46:55 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: rumpfs.c,v 1.66 2010/11/08 11:01:45 pooka Exp $ */
+/* $NetBSD: rumpfs.c,v 1.67 2010/11/11 14:46:55 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.66 2010/11/08 11:01:45 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.67 2010/11/11 14:46:55 pooka Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -98,7 +98,8 @@
{ &vop_write_desc, rump_vop_write },
{ &vop_open_desc, rump_vop_open },
{ &vop_seek_desc, genfs_seek },
- { &vop_putpages_desc, genfs_null_putpages },
+ { &vop_getpages_desc, genfs_getpages },
+ { &vop_putpages_desc, genfs_putpages },
{ &vop_whiteout_desc, rump_vop_whiteout },
{ &vop_fsync_desc, rump_vop_success },
{ &vop_lock_desc, genfs_lock },
@@ -507,10 +508,6 @@
} else {
vpops = rump_vnodeop_p;
}
- if (vpops != rump_specop_p && va->va_type != VDIR
- && !(va->va_type == VREG && rn->rn_hostpath != NULL)
- && va->va_type != VSOCK && va->va_type != VLNK)
- return EOPNOTSUPP;
rv = getnewvnode(VT_RUMP, mp, vpops, &vp);
if (rv)
@@ -826,13 +823,11 @@
struct componentname *cnp = ap->a_cnp;
struct vattr *va = ap->a_vap;
struct rumpfs_node *rnd = dvp->v_data, *rn;
+ off_t newsize;
int rv;
- if (va->va_type != VSOCK) {
- rv = EOPNOTSUPP;
- goto out;
- }
- rn = makeprivate(VSOCK, NODEV, DEV_BSIZE);
+ newsize = va->va_type == VSOCK ? DEV_BSIZE : 0;
+ rn = makeprivate(va->va_type, NODEV, newsize);
rv = makevnode(dvp->v_mount, rn, vpp);
if (rv)
goto out;
@@ -940,7 +935,7 @@
int mode = ap->a_mode;
int error = EINVAL;
- if (vp->v_type != VREG)
+ if (vp->v_type != VREG || rn->rn_hostpath == NULL)
return 0;
if (mode & FREAD) {
@@ -1047,6 +1042,9 @@
ssize_t n;
int error = 0;
+ if (rn->rn_readfd == -1)
+ return EOPNOTSUPP;
+
bufsize = uio->uio_resid;
buf = kmem_alloc(bufsize, KM_SLEEP);
if ((n = rumpuser_pread(rn->rn_readfd, buf, bufsize,
@@ -1077,6 +1075,9 @@
ssize_t n;
int error = 0;
+ if (rn->rn_writefd == -1)
+ return EOPNOTSUPP;
+
bufsize = uio->uio_resid;
buf = kmem_alloc(bufsize, KM_SLEEP);
error = uiomove(buf, bufsize, uio);