Module Name: src
Committed By: pooka
Date: Tue Sep 7 17:16:19 UTC 2010
Modified Files:
src/lib/libp2k: p2k.c
src/lib/libukfs: ukfs.c
Log Message:
Migrate from rump private interfaces to syscalls.
To generate a diff of this commit:
cvs rdiff -u -r1.42 -r1.43 src/lib/libp2k/p2k.c
cvs rdiff -u -r1.53 -r1.54 src/lib/libukfs/ukfs.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libp2k/p2k.c
diff -u src/lib/libp2k/p2k.c:1.42 src/lib/libp2k/p2k.c:1.43
--- src/lib/libp2k/p2k.c:1.42 Wed Sep 1 19:40:35 2010
+++ src/lib/libp2k/p2k.c Tue Sep 7 17:16:19 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: p2k.c,v 1.42 2010/09/01 19:40:35 pooka Exp $ */
+/* $NetBSD: p2k.c,v 1.43 2010/09/07 17:16:19 pooka Exp $ */
/*
* Copyright (c) 2007, 2008, 2009 Antti Kantee. All Rights Reserved.
@@ -420,12 +420,6 @@
rv = -1;
goto out;
}
- if ((rv = rump_pub_vfs_root(p2m->p2m_mp,
- &p2m->p2m_rvp, 0)) != 0) {
- errno = rv;
- rv = -1;
- goto out;
- }
} else {
if (part != ukfs_part_na)
ukfs = ukfs_mount_disk(vfsname, devpath, part,
@@ -438,7 +432,11 @@
ukfs_setspecific(ukfs, p2m);
p2m->p2m_ukfs = ukfs;
p2m->p2m_mp = ukfs_getmp(ukfs);
- p2m->p2m_rvp = ukfs_getrvp(ukfs);
+ }
+ if ((rv = rump_pub_vfs_root(p2m->p2m_mp, &p2m->p2m_rvp, 0)) != 0) {
+ errno = rv;
+ rv = -1;
+ goto out;
}
p2m->p2m_pu = pu;
Index: src/lib/libukfs/ukfs.c
diff -u src/lib/libukfs/ukfs.c:1.53 src/lib/libukfs/ukfs.c:1.54
--- src/lib/libukfs/ukfs.c:1.53 Wed Sep 1 19:40:34 2010
+++ src/lib/libukfs/ukfs.c Tue Sep 7 17:16:18 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: ukfs.c,v 1.53 2010/09/01 19:40:34 pooka Exp $ */
+/* $NetBSD: ukfs.c,v 1.54 2010/09/07 17:16:18 pooka Exp $ */
/*
* Copyright (c) 2007, 2008, 2009 Antti Kantee. All Rights Reserved.
@@ -69,15 +69,18 @@
#define UKFS_MODE_DEFAULT 0555
struct ukfs {
+ pthread_spinlock_t ukfs_spin;
+
struct mount *ukfs_mp;
- struct vnode *ukfs_rvp;
+ struct lwp *ukfs_lwp;
void *ukfs_specific;
- pthread_spinlock_t ukfs_spin;
- struct vnode *ukfs_cdir;
int ukfs_devfd;
+
char *ukfs_devpath;
char *ukfs_mountpath;
+ char *ukfs_cwd;
+
struct ukfs_part *ukfs_part;
};
@@ -91,17 +94,6 @@
return ukfs->ukfs_mp;
}
-struct vnode *
-ukfs_getrvp(struct ukfs *ukfs)
-{
- struct vnode *rvp;
-
- rvp = ukfs->ukfs_rvp;
- rump_pub_vp_incref(rvp);
-
- return rvp;
-}
-
void
ukfs_setspecific(struct ukfs *ukfs, void *priv)
{
@@ -123,32 +115,45 @@
#define pthread_spin_destroy(a)
#endif
-static void
-precall(struct ukfs *ukfs)
+static int
+precall(struct ukfs *ukfs, struct lwp **curlwp)
{
- struct vnode *rvp, *cvp;
+ /* save previous. ensure start from pristine context */
+ *curlwp = rump_pub_lwproc_curlwp();
+ if (*curlwp)
+ rump_pub_lwproc_switch(ukfs->ukfs_lwp);
rump_pub_lwproc_newproc();
- rvp = ukfs_getrvp(ukfs);
- pthread_spin_lock(&ukfs->ukfs_spin);
- cvp = ukfs->ukfs_cdir;
- pthread_spin_unlock(&ukfs->ukfs_spin);
- rump_pub_rcvp_set(rvp, cvp); /* takes refs */
- rump_pub_vp_rele(rvp);
+
+ if (rump_sys_chroot(ukfs->ukfs_mountpath) == -1)
+ return errno;
+ if (rump_sys_chdir(ukfs->ukfs_cwd) == -1)
+ return errno;
+
+ return 0;
}
static void
-postcall(struct ukfs *ukfs)
+postcall(struct lwp *curlwp)
{
- struct vnode *rvp;
-
- rvp = ukfs_getrvp(ukfs);
- rump_pub_rcvp_set(NULL, rvp);
- rump_pub_vp_rele(rvp);
rump_pub_lwproc_releaselwp();
+ if (curlwp)
+ rump_pub_lwproc_switch(curlwp);
}
+#define PRECALL() \
+struct lwp *ukfs_curlwp; \
+do { \
+ int ukfs_rv; \
+ if ((ukfs_rv = precall(ukfs, &ukfs_curlwp)) != 0) { \
+ errno = ukfs_rv; \
+ return -1; \
+ } \
+} while (/*CONSTCOND*/0)
+
+#define POSTCALL() postcall(ukfs_curlwp);
+
struct ukfs_part {
pthread_spinlock_t part_lck;
int part_refcount;
@@ -516,6 +521,7 @@
const char *mountpath, int mntflags, void *arg, size_t alen)
{
struct ukfs *fs = NULL;
+ struct lwp *curlwp;
int rv = 0, devfd = -1;
int mounted = 0;
int regged = 0;
@@ -603,26 +609,25 @@
if (rv) {
goto out;
}
- rv = rump_pub_vfs_root(fs->ukfs_mp, &fs->ukfs_rvp, 0);
- if (rv) {
- goto out;
- }
if (regged) {
fs->ukfs_devpath = strdup(devpath);
}
fs->ukfs_mountpath = strdup(mountpath);
- fs->ukfs_cdir = ukfs_getrvp(fs);
pthread_spin_init(&fs->ukfs_spin, PTHREAD_PROCESS_SHARED);
fs->ukfs_devfd = devfd;
fs->ukfs_part = part;
assert(rv == 0);
+ curlwp = rump_pub_lwproc_curlwp();
+ rump_pub_lwproc_newlwp(0);
+ fs->ukfs_lwp = rump_pub_lwproc_curlwp();
+ fs->ukfs_cwd = strdup("/");
+ rump_pub_lwproc_switch(curlwp);
+
out:
if (rv) {
if (fs) {
- if (fs->ukfs_rvp)
- rump_pub_vp_rele(fs->ukfs_rvp);
free(fs);
fs = NULL;
}
@@ -663,27 +668,28 @@
int
ukfs_release(struct ukfs *fs, int flags)
{
+ struct lwp *curlwp = rump_pub_lwproc_curlwp();
+
+ /* get root lwp */
+ rump_pub_lwproc_switch(fs->ukfs_lwp);
+ rump_pub_lwproc_newproc();
if ((flags & UKFS_RELFLAG_NOUNMOUNT) == 0) {
int rv, mntflag, error;
- ukfs_chdir(fs, "/");
mntflag = 0;
if (flags & UKFS_RELFLAG_FORCE)
mntflag = MNT_FORCE;
- rump_pub_lwproc_newproc();
- rump_pub_vp_rele(fs->ukfs_rvp);
- fs->ukfs_rvp = NULL;
+
rv = rump_sys_unmount(fs->ukfs_mountpath, mntflag);
if (rv == -1) {
error = errno;
- rump_pub_vfs_root(fs->ukfs_mp, &fs->ukfs_rvp, 0);
rump_pub_lwproc_releaselwp();
- ukfs_chdir(fs, fs->ukfs_mountpath);
+ if (curlwp)
+ rump_pub_lwproc_switch(curlwp);
errno = error;
return -1;
}
- rump_pub_lwproc_releaselwp();
}
if (fs->ukfs_devpath) {
@@ -691,6 +697,12 @@
free(fs->ukfs_devpath);
}
free(fs->ukfs_mountpath);
+ free(fs->ukfs_cwd);
+
+ /* release this routine's lwp and ukfs base lwp */
+ rump_pub_lwproc_releaselwp();
+ rump_pub_lwproc_switch(fs->ukfs_lwp);
+ rump_pub_lwproc_releaselwp();
pthread_spin_destroy(&fs->ukfs_spin);
if (fs->ukfs_devfd != -1) {
@@ -700,6 +712,9 @@
ukfs_part_release(fs->ukfs_part);
free(fs);
+ if (curlwp)
+ rump_pub_lwproc_switch(curlwp);
+
return 0;
}
@@ -722,9 +737,9 @@
#define STDCALL(ukfs, thecall) \
int rv = 0; \
\
- precall(ukfs); \
+ PRECALL(); \
rv = thecall; \
- postcall(ukfs); \
+ POSTCALL(); \
return rv;
int
@@ -733,10 +748,10 @@
struct vnode *vp;
int rv;
- precall(ukfs);
+ PRECALL();
rv = rump_pub_namei(RUMP_NAMEI_LOOKUP, RUMP_NAMEI_LOCKLEAF, dirname,
NULL, &vp, NULL);
- postcall(ukfs);
+ POSTCALL();
if (rv == 0) {
RUMP_VOP_UNLOCK(vp);
@@ -794,17 +809,18 @@
struct vnode *vp;
int rv;
- precall(ukfs);
+ PRECALL();
rv = rump_pub_namei(RUMP_NAMEI_LOOKUP, RUMP_NAMEI_LOCKLEAF, dirname,
NULL, &vp, NULL);
- postcall(ukfs);
if (rv) {
+ POSTCALL();
errno = rv;
return -1;
}
rv = getmydents(vp, off, buf, bufsize);
rump_pub_vp_rele(vp);
+ POSTCALL();
return rv;
}
@@ -823,9 +839,9 @@
{
int fd;
- precall(ukfs);
+ PRECALL();
fd = rump_sys_open(filename, flags, 0);
- postcall(ukfs);
+ POSTCALL();
if (fd == -1)
return -1;
@@ -839,7 +855,7 @@
int fd;
ssize_t xfer = -1; /* XXXgcc */
- precall(ukfs);
+ PRECALL();
fd = rump_sys_open(filename, RUMP_O_RDONLY, 0);
if (fd == -1)
goto out;
@@ -848,7 +864,7 @@
rump_sys_close(fd);
out:
- postcall(ukfs);
+ POSTCALL();
if (fd == -1) {
return -1;
}
@@ -870,7 +886,7 @@
int fd;
ssize_t xfer = -1; /* XXXgcc */
- precall(ukfs);
+ PRECALL();
fd = rump_sys_open(filename, RUMP_O_WRONLY, 0);
if (fd == -1)
goto out;
@@ -883,7 +899,7 @@
rump_sys_close(fd);
out:
- postcall(ukfs);
+ POSTCALL();
if (fd == -1) {
return -1;
}
@@ -918,13 +934,13 @@
{
int fd;
- precall(ukfs);
+ PRECALL();
fd = rump_sys_open(filename, RUMP_O_WRONLY | RUMP_O_CREAT, mode);
if (fd == -1)
return -1;
rump_sys_close(fd);
- postcall(ukfs);
+ POSTCALL();
return 0;
}
@@ -983,9 +999,9 @@
{
ssize_t rv;
- precall(ukfs);
+ PRECALL();
rv = rump_sys_readlink(filename, linkbuf, buflen);
- postcall(ukfs);
+ POSTCALL();
return rv;
}
@@ -999,24 +1015,27 @@
int
ukfs_chdir(struct ukfs *ukfs, const char *path)
{
- struct vnode *newvp, *oldvp;
+ char *newpath, *oldpath;
int rv;
- precall(ukfs);
+ PRECALL();
rv = rump_sys_chdir(path);
if (rv == -1)
goto out;
- newvp = rump_pub_cdir_get();
+ newpath = malloc(MAXPATHLEN);
+ if (rump_sys___getcwd(newpath, MAXPATHLEN) == -1) {
+ goto out;
+ }
+
pthread_spin_lock(&ukfs->ukfs_spin);
- oldvp = ukfs->ukfs_cdir;
- ukfs->ukfs_cdir = newvp;
+ oldpath = ukfs->ukfs_cwd;
+ ukfs->ukfs_cwd = newpath;
pthread_spin_unlock(&ukfs->ukfs_spin);
- if (oldvp)
- rump_pub_vp_rele(oldvp);
+ free(oldpath);
out:
- postcall(ukfs);
+ POSTCALL();
return rv;
}
@@ -1025,9 +1044,9 @@
{
int rv;
- precall(ukfs);
+ PRECALL();
rv = rump_sys_stat(filename, file_stat);
- postcall(ukfs);
+ POSTCALL();
return rv;
}
@@ -1037,9 +1056,9 @@
{
int rv;
- precall(ukfs);
+ PRECALL();
rv = rump_sys_lstat(filename, file_stat);
- postcall(ukfs);
+ POSTCALL();
return rv;
}