Module Name:    src
Committed By:   pooka
Date:           Sun Apr 26 22:23:02 UTC 2009

Modified Files:
        src/lib/libukfs: ukfs.c ukfs.h

Log Message:
Provide a stateful mode for readdir/read/write.  Using them gives
a measurable boost to some fs-utils commands.


To generate a diff of this commit:
cvs rdiff -u -r1.23 -r1.24 src/lib/libukfs/ukfs.c
cvs rdiff -u -r1.7 -r1.8 src/lib/libukfs/ukfs.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libukfs/ukfs.c
diff -u src/lib/libukfs/ukfs.c:1.23 src/lib/libukfs/ukfs.c:1.24
--- src/lib/libukfs/ukfs.c:1.23	Mon Apr  6 03:27:39 2009
+++ src/lib/libukfs/ukfs.c	Sun Apr 26 22:23:01 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: ukfs.c,v 1.23 2009/04/06 03:27:39 pooka Exp $	*/
+/*	$NetBSD: ukfs.c,v 1.24 2009/04/26 22:23:01 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007, 2008  Antti Kantee.  All Rights Reserved.
@@ -298,22 +298,36 @@
 	return rv;
 
 int
-ukfs_getdents(struct ukfs *ukfs, const char *dirname, off_t *off,
-	uint8_t *buf, size_t bufsize)
+ukfs_opendir(struct ukfs *ukfs, const char *dirname, struct ukfs_dircookie **c)
 {
-	struct uio *uio;
 	struct vnode *vp;
-	size_t resid;
-	kauth_cred_t cred;
-	int rv, eofflag;
+	int rv;
 
 	precall(ukfs);
 	rv = rump_namei(RUMP_NAMEI_LOOKUP, RUMP_NAMEI_LOCKLEAF, dirname,
 	    NULL, &vp, NULL);
 	postcall(ukfs);
-	if (rv)
-		goto out;
-		
+
+	if (rv == 0) {
+		RUMP_VOP_UNLOCK(vp, 0);
+	} else {
+		errno = rv;
+		rv = -1;
+	}
+
+	/*LINTED*/
+	*c = (struct ukfs_dircookie *)vp;
+	return rv;
+}
+
+static int
+getmydents(struct vnode *vp, off_t *off, uint8_t *buf, size_t bufsize)
+{
+	struct uio *uio;
+	size_t resid;
+	int rv, eofflag;
+	kauth_cred_t cred;
+	
 	uio = rump_uio_setup(buf, bufsize, *off, RUMPUIO_READ);
 	cred = rump_cred_suserget();
 	rv = RUMP_VOP_READDIR(vp, uio, cred, &eofflag, NULL, NULL);
@@ -321,9 +335,7 @@
 	RUMP_VOP_UNLOCK(vp, 0);
 	*off = rump_uio_getoff(uio);
 	resid = rump_uio_free(uio);
-	rump_vp_rele(vp);
 
- out:
 	if (rv) {
 		errno = rv;
 		return -1;
@@ -333,6 +345,63 @@
 	return bufsize - resid;
 }
 
+/*ARGSUSED*/
+int
+ukfs_getdents_cookie(struct ukfs *ukfs, struct ukfs_dircookie *c, off_t *off,
+	uint8_t *buf, size_t bufsize)
+{
+	/*LINTED*/
+	struct vnode *vp = (struct vnode *)c;
+
+	RUMP_VOP_LOCK(vp, RUMP_LK_SHARED);
+	return getmydents(vp, off, buf, bufsize);
+}
+
+int
+ukfs_getdents(struct ukfs *ukfs, const char *dirname, off_t *off,
+	uint8_t *buf, size_t bufsize)
+{
+	struct vnode *vp;
+	int rv;
+
+	precall(ukfs);
+	rv = rump_namei(RUMP_NAMEI_LOOKUP, RUMP_NAMEI_LOCKLEAF, dirname,
+	    NULL, &vp, NULL);
+	postcall(ukfs);
+	if (rv) {
+		errno = rv;
+		return -1;
+	}
+
+	rv = getmydents(vp, off, buf, bufsize);
+	rump_vp_rele(vp);
+	return rv;
+}
+
+/*ARGSUSED*/
+int
+ukfs_closedir(struct ukfs *ukfs, struct ukfs_dircookie *c)
+{
+
+	/*LINTED*/
+	rump_vp_rele((struct vnode *)c);
+	return 0;
+}
+
+int
+ukfs_open(struct ukfs *ukfs, const char *filename, int flags)
+{
+	int fd;
+
+	precall(ukfs);
+	fd = rump_sys_open(filename, flags, 0);
+	postcall(ukfs);
+	if (fd == -1)
+		return -1;
+
+	return fd;
+}
+
 ssize_t
 ukfs_read(struct ukfs *ukfs, const char *filename, off_t off,
 	uint8_t *buf, size_t bufsize)
@@ -356,6 +425,14 @@
 	return xfer;
 }
 
+/*ARGSUSED*/
+ssize_t
+ukfs_read_fd(struct ukfs *ukfs, int fd, off_t off, uint8_t *buf, size_t buflen)
+{
+
+	return rump_sys_pread(fd, buf, buflen, 0, off);
+}
+
 ssize_t
 ukfs_write(struct ukfs *ukfs, const char *filename, off_t off,
 	uint8_t *buf, size_t bufsize)
@@ -383,6 +460,29 @@
 	return xfer;
 }
 
+/*ARGSUSED*/
+ssize_t
+ukfs_write_fd(struct ukfs *ukfs, int fd, off_t off, uint8_t *buf, size_t buflen,
+	int dosync)
+{
+	ssize_t xfer;
+
+	xfer = rump_sys_pwrite(fd, buf, buflen, 0, off);
+	if (xfer > 0 && dosync)
+		rump_sys_fsync(fd);
+
+	return xfer;
+}
+
+/*ARGSUSED*/
+int
+ukfs_close(struct ukfs *ukfs, int fd)
+{
+
+	rump_sys_close(fd);
+	return 0;
+}
+
 int
 ukfs_create(struct ukfs *ukfs, const char *filename, mode_t mode)
 {

Index: src/lib/libukfs/ukfs.h
diff -u src/lib/libukfs/ukfs.h:1.7 src/lib/libukfs/ukfs.h:1.8
--- src/lib/libukfs/ukfs.h:1.7	Tue Oct  7 23:16:59 2008
+++ src/lib/libukfs/ukfs.h	Sun Apr 26 22:23:01 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: ukfs.h,v 1.7 2008/10/07 23:16:59 pooka Exp $	*/
+/*	$NetBSD: ukfs.h,v 1.8 2009/04/26 22:23:01 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007, 2008  Antti Kantee.  All Rights Reserved.
@@ -41,6 +41,7 @@
 struct timeval;
 
 struct ukfs;
+struct ukfs_dircookie;
 
 #define UKFS_DEFAULTMP "/"
 
@@ -56,12 +57,23 @@
 			  int, void *, size_t);
 void		ukfs_release(struct ukfs *, int);
 
+int		ukfs_opendir(struct ukfs *, const char *,
+			     struct ukfs_dircookie **);
 int		ukfs_getdents(struct ukfs *, const char *, off_t *,
 			      uint8_t *, size_t);
+int		ukfs_getdents_cookie(struct ukfs *, struct ukfs_dircookie *,
+				     off_t *, uint8_t *, size_t);
+int		ukfs_closedir(struct ukfs *, struct ukfs_dircookie *);
+
+int		ukfs_open(struct ukfs *, const char *, int);
 ssize_t		ukfs_read(struct ukfs *, const char *, off_t,
 			      uint8_t *, size_t);
+ssize_t		ukfs_read_fd(struct ukfs *, int, off_t, uint8_t *, size_t);
 ssize_t		ukfs_write(struct ukfs *, const char *, off_t,
 			       uint8_t *, size_t);
+ssize_t		ukfs_write_fd(struct ukfs *, int, off_t, uint8_t *, size_t,int);
+int		ukfs_close(struct ukfs *, int);
+
 ssize_t		ukfs_readlink(struct ukfs *, const char *, char *, size_t);
 
 int		ukfs_create(struct ukfs *, const char *, mode_t);

Reply via email to