Module Name:    src
Committed By:   pooka
Date:           Wed Jul 22 20:46:34 UTC 2009

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

Log Message:
Since rump rootfs now supports creating directories, mount ukfs
mounts at the requested mountpoint instead of as the rump kernel
rootfs.  While doing so, generally convert everything to use system
calls instead of handcrafter rump interfaces (e.g. rump_sys_mount()
instead of rump_mnt_mount()).  This avoids a lot of unnecessary
fuss.

Change UKFS_DEFAULTMP from / to /ukfs and bump ukfs version.


To generate a diff of this commit:
cvs rdiff -u -r1.29 -r1.30 src/lib/libukfs/ukfs.c
cvs rdiff -u -r1.8 -r1.9 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.29 src/lib/libukfs/ukfs.c:1.30
--- src/lib/libukfs/ukfs.c:1.29	Tue Jul 21 00:19:57 2009
+++ src/lib/libukfs/ukfs.c	Wed Jul 22 20:46:34 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: ukfs.c,v 1.29 2009/07/21 00:19:57 pooka Exp $	*/
+/*	$NetBSD: ukfs.c,v 1.30 2009/07/22 20:46:34 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007, 2008  Antti Kantee.  All Rights Reserved.
@@ -73,8 +73,13 @@
 	pid_t ukfs_nextpid;
 	struct vnode *ukfs_cdir;
 	int ukfs_devfd;
+	char *ukfs_devpath;
+	char *ukfs_mountpath;
 };
 
+static int builddirs(const char *, mode_t,
+    int (*mkdirfn)(struct ukfs *, const char *, mode_t), struct ukfs *);
+
 struct mount *
 ukfs_getmp(struct ukfs *ukfs)
 {
@@ -159,21 +164,21 @@
 	return 0;
 }
 
+static int
+rumpmkdir(struct ukfs *dummy, const char *path, mode_t mode)
+{
+
+	return rump_sys_mkdir(path, mode);
+}
+
 struct ukfs *
 ukfs_mount(const char *vfsname, const char *devpath, const char *mountpath,
 	int mntflags, void *arg, size_t alen)
 {
 	struct stat sb;
 	struct ukfs *fs = NULL;
-	struct vfsops *vfsops;
-	struct mount *mp = NULL;
 	int rv = 0, devfd = -1, rdonly;
-
-	vfsops = rump_vfs_getopsbyname(vfsname);
-	if (vfsops == NULL) {
-		rv = ENODEV;
-		goto out;
-	}
+	int mounted = 0;
 
 	/*
 	 * Try open and lock the device.  if we can't open it, assume
@@ -224,62 +229,79 @@
 		goto out;
 	}
 	memset(fs, 0, sizeof(struct ukfs));
-	mp = rump_mnt_init(vfsops, mntflags);
+
+	/* create our mountpoint.  this is never removed. */
+	if (builddirs(mountpath, 0777, rumpmkdir, NULL) == -1) {
+		if (errno != EEXIST) {
+			rv = errno;
+			goto out;
+		}
+	}
 
 	rump_fakeblk_register(devpath);
-	rv = rump_mnt_mount(mp, mountpath, arg, &alen);
-	rump_fakeblk_deregister(devpath);
+	rv = rump_sys_mount(vfsname, mountpath, mntflags, arg, alen);
 	if (rv) {
 		goto out;
 	}
-	rv = rump_vfs_root(mp, &fs->ukfs_rvp, 0);
+	mounted = 1;
+	rv = rump_vfs_getmp(mountpath, &fs->ukfs_mp);
+	if (rv) {
+		goto out;
+	}
+	rv = rump_vfs_root(fs->ukfs_mp, &fs->ukfs_rvp, 0);
 	if (rv) {
 		goto out;
 	}
-	fs->ukfs_cdir = ukfs_getrvp(fs);
 
-	fs->ukfs_mp = mp;
+	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;
 	assert(rv == 0);
 
  out:
 	if (rv) {
-		if (mp)
-			rump_mnt_destroy(mp);
-		if (fs)
+		if (fs) {
+			if (fs->ukfs_rvp)
+				rump_vp_rele(fs->ukfs_rvp);
 			free(fs);
-		errno = rv;
-		fs = NULL;
+			fs = NULL;
+		}
+		if (mounted)
+			rump_sys_unmount(mountpath, MNT_FORCE);
 		if (devfd != -1) {
 			flock(devfd, LOCK_UN);
 			close(devfd);
 		}
+		errno = rv;
 	}
 
 	return fs;
 }
 
-void
+int
 ukfs_release(struct ukfs *fs, int flags)
 {
-	int rv;
 
 	if ((flags & UKFS_RELFLAG_NOUNMOUNT) == 0) {
-		kauth_cred_t cred;
+		int rv, mntflag;
 
-		rump_vp_rele(fs->ukfs_cdir);
-		rump_vp_rele(fs->ukfs_rvp);
-		cred = rump_cred_suserget();
-		rv = rump_vfs_sync(fs->ukfs_mp, 1, cred);
-		rump_cred_suserput(cred);
-		rump_vp_recycle_nokidding(ukfs_getrvp(fs));
-		rv |= rump_vfs_unmount(fs->ukfs_mp, 0);
-		assert(rv == 0);
+		ukfs_chdir(fs, "/");
+		mntflag = 0;
+		if (flags & UKFS_RELFLAG_FORCE)
+			mntflag = MNT_FORCE;
+		rv = rump_sys_unmount(fs->ukfs_mountpath, mntflag);
+		if (rv) {
+			ukfs_chdir(fs, fs->ukfs_mountpath);
+			errno = rv;
+			return -1;
+		}
 	}
 
-	rump_vfs_syncwait(fs->ukfs_mp);
-	rump_mnt_destroy(fs->ukfs_mp);
+	rump_fakeblk_deregister(fs->ukfs_devpath);
+	free(fs->ukfs_devpath);
+	free(fs->ukfs_mountpath);
 
 	pthread_spin_destroy(&fs->ukfs_spin);
 	if (fs->ukfs_devfd != -1) {
@@ -287,6 +309,8 @@
 		close(fs->ukfs_devfd);
 	}
 	free(fs);
+
+	return 0;
 }
 
 #define STDCALL(ukfs, thecall)						\
@@ -606,6 +630,7 @@
 {
 
 #ifdef __NetBSD__
+	/*LINTED*/
 	return __NetBSD_Version__ < VERS_TIMECHANGE
 	    && rump_getversion() >= VERS_TIMECHANGE;
 #else
@@ -884,8 +909,9 @@
 /*
  * Utilities
  */
-int
-ukfs_util_builddirs(struct ukfs *ukfs, const char *pathname, mode_t mode)
+static int
+builddirs(const char *pathname, mode_t mode,
+	int (*mkdirfn)(struct ukfs *, const char *, mode_t), struct ukfs *fs)
 {
 	char *f1, *f2;
 	int rv;
@@ -911,7 +937,7 @@
 		else
 			*f2 = '\0';
 
-		rv = ukfs_mkdir(ukfs, f1, mode & ~mask); 
+		rv = mkdirfn(fs, f1, mode & ~mask); 
 		if (errno == EEXIST)
 			rv = 0;
 
@@ -925,3 +951,10 @@
 
 	return rv;
 }
+
+int
+ukfs_util_builddirs(struct ukfs *ukfs, const char *pathname, mode_t mode)
+{
+
+	return builddirs(pathname, mode, ukfs_mkdir, ukfs);
+}

Index: src/lib/libukfs/ukfs.h
diff -u src/lib/libukfs/ukfs.h:1.8 src/lib/libukfs/ukfs.h:1.9
--- src/lib/libukfs/ukfs.h:1.8	Sun Apr 26 22:23:01 2009
+++ src/lib/libukfs/ukfs.h	Wed Jul 22 20:46:34 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: ukfs.h,v 1.8 2009/04/26 22:23:01 pooka Exp $	*/
+/*	$NetBSD: ukfs.h,v 1.9 2009/07/22 20:46:34 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007, 2008  Antti Kantee.  All Rights Reserved.
@@ -43,11 +43,12 @@
 struct ukfs;
 struct ukfs_dircookie;
 
-#define UKFS_DEFAULTMP "/"
+#define UKFS_DEFAULTMP "/ukfs"
 
 #define UKFS_RELFLAG_NOUNMOUNT	0x01
+#define UKFS_RELFLAG_FORCE	0x02
 
-#define UKFS_VERSION	001 /* sector 001 */
+#define UKFS_VERSION	002 /* secret ukfs 002 */
 #define	ukfs_init()	_ukfs_init(UKFS_VERSION)
 
 __BEGIN_DECLS
@@ -55,7 +56,7 @@
 int		_ukfs_init(int);
 struct ukfs	*ukfs_mount(const char *, const char *, const char *,
 			  int, void *, size_t);
-void		ukfs_release(struct ukfs *, int);
+int		ukfs_release(struct ukfs *, int);
 
 int		ukfs_opendir(struct ukfs *, const char *,
 			     struct ukfs_dircookie **);

Reply via email to