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);