Module Name:    src
Committed By:   pooka
Date:           Sun Oct 11 18:12:51 UTC 2009

Modified Files:
        src/sys/rump/librump/rumpvfs: rumpfs.c

Log Message:
Include host offset in regular etfs read/write operations (I can't
imagine it being particularly useful, but let's call file this
under POLA).


To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 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.26 src/sys/rump/librump/rumpvfs/rumpfs.c:1.27
--- src/sys/rump/librump/rumpvfs/rumpfs.c:1.26	Sun Oct 11 17:54:22 2009
+++ src/sys/rump/librump/rumpvfs/rumpfs.c	Sun Oct 11 18:12:51 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpfs.c,v 1.26 2009/10/11 17:54:22 pooka Exp $	*/
+/*	$NetBSD: rumpfs.c,v 1.27 2009/10/11 18:12:51 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007 Antti Kantee.  All Rights Reserved.
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.26 2009/10/11 17:54:22 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.27 2009/10/11 18:12:51 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -129,6 +129,7 @@
 			char *hostpath;		/* VREG */
 			int readfd;
 			int writefd;
+			uint64_t offset;
 		} reg;
 		LIST_HEAD(, rumpfs_dent) dir;	/* VDIR */
 	} rn_u;
@@ -136,9 +137,10 @@
 #define rn_hostpath	rn_u.reg.hostpath
 #define rn_readfd	rn_u.reg.readfd
 #define rn_writefd	rn_u.reg.writefd
+#define rn_offset	rn_u.reg.offset
 #define rn_dir		rn_u.dir
 
-static struct rumpfs_node *makeprivate(enum vtype, dev_t, off_t, const char *);
+static struct rumpfs_node *makeprivate(enum vtype, dev_t, off_t);
 
 /*
  * Extra Terrestrial stuff.  We map a given key (pathname) to a file on
@@ -206,7 +208,7 @@
 	enum rump_etfs_type ftype, uint64_t begin, uint64_t size)
 {
 	struct etfs *et;
-	struct rumpfs_node *rn_dummy;
+	struct rumpfs_node *rn_dummy, *rn;
 	uint64_t fsize;
 	dev_t rdev = NODEV;
 	devminor_t dmin;
@@ -234,7 +236,14 @@
 	et = kmem_alloc(sizeof(*et), KM_SLEEP);
 	strcpy(et->et_key, key);
 	et->et_keylen = strlen(et->et_key);
-	et->et_rn = makeprivate(ettype_to_vtype(ftype), rdev, size, hostpath);
+	et->et_rn = rn = makeprivate(ettype_to_vtype(ftype), rdev, size);
+	if (ftype == RUMP_ETFS_REG) {
+		size_t len = strlen(hostpath)+1;
+
+		rn->rn_hostpath = malloc(len, M_TEMP, M_WAITOK | M_ZERO);
+		memcpy(rn->rn_hostpath, hostpath, len);
+		rn->rn_offset = begin;
+	}
 
 	mutex_enter(&etfs_lock);
 	if (etfs_find(key, &rn_dummy)) {
@@ -306,7 +315,7 @@
 static kmutex_t reclock;
 
 static struct rumpfs_node *
-makeprivate(enum vtype vt, dev_t rdev, off_t size, const char *hostpath)
+makeprivate(enum vtype vt, dev_t rdev, off_t size)
 {
 	struct rumpfs_node *rn;
 	struct vattr *va;
@@ -321,8 +330,6 @@
 	case VREG:
 		rn->rn_readfd = -1;
 		rn->rn_writefd = -1;
-		rn->rn_hostpath = malloc(strlen(hostpath)+1, M_TEMP, M_WAITOK);
-		strcpy(rn->rn_hostpath, hostpath);
 		break;
 	default:
 		break;
@@ -509,7 +516,7 @@
 	struct rumpfs_dent *rdent;
 	int rv = 0;
 
-	rn = makeprivate(VDIR, NODEV, DEV_BSIZE, NULL);
+	rn = makeprivate(VDIR, NODEV, DEV_BSIZE);
 	mutex_enter(&reclock);
 	rv = makevnode(rn, vpp);
 	mutex_exit(&reclock);
@@ -545,7 +552,7 @@
 	struct rumpfs_dent *rdent;
 	int rv;
 
-	rn = makeprivate(va->va_type, va->va_rdev, DEV_BSIZE, NULL);
+	rn = makeprivate(va->va_type, va->va_rdev, DEV_BSIZE);
 	mutex_enter(&reclock);
 	rv = makevnode(rn, vpp);
 	mutex_exit(&reclock);
@@ -586,7 +593,7 @@
 		rv = EOPNOTSUPP;
 		goto out;
 	}
-	rn = makeprivate(VSOCK, NODEV, DEV_BSIZE, NULL);
+	rn = makeprivate(VSOCK, NODEV, DEV_BSIZE);
 	mutex_enter(&reclock);
 	rv = makevnode(rn, vpp);
 	mutex_exit(&reclock);
@@ -655,7 +662,8 @@
 
 	bufsize = uio->uio_resid;
 	buf = kmem_alloc(bufsize, KM_SLEEP);
-	if (rumpuser_read(rn->rn_readfd, buf, bufsize, &error) == -1)
+	if (rumpuser_pread(rn->rn_readfd, buf, bufsize,
+	    uio->uio_offset + rn->rn_offset, &error) == -1)
 		goto out;
 	error = uiomove(buf, bufsize, uio);
 
@@ -686,7 +694,8 @@
 	if (error)
 		goto out;
 	KASSERT(uio->uio_resid == 0);
-	rumpuser_write(rn->rn_writefd, buf, bufsize, &error);
+	rumpuser_pwrite(rn->rn_writefd, buf, bufsize,
+	    uio->uio_offset + rn->rn_offset, &error);
 
  out:
 	kmem_free(buf, bufsize);
@@ -779,7 +788,7 @@
 	TAILQ_INIT(&rump_mnt.mnt_vnodelist);
 
 	vfs_opv_init(rump_opv_descs);
-	rn = makeprivate(VDIR, NODEV, DEV_BSIZE, NULL);
+	rn = makeprivate(VDIR, NODEV, DEV_BSIZE);
 	mutex_enter(&reclock);
 	rv = makevnode(rn, &rootvnode);
 	mutex_exit(&reclock);

Reply via email to