Module Name:    src
Committed By:   pooka
Date:           Wed Jul 22 20:49:29 UTC 2009

Modified Files:
        src/lib/libp2k: p2k.c

Log Message:
* catch up with the ukfs changes
* leave mounted fs reference counting totally up to le coq grande
  and simply force an unmount if the kernel has decided the mountpoint
  is not busy


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/lib/libp2k/p2k.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.14 src/lib/libp2k/p2k.c:1.15
--- src/lib/libp2k/p2k.c:1.14	Fri May 22 10:53:59 2009
+++ src/lib/libp2k/p2k.c	Wed Jul 22 20:49:28 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: p2k.c,v 1.14 2009/05/22 10:53:59 pooka Exp $	*/
+/*	$NetBSD: p2k.c,v 1.15 2009/07/22 20:49:28 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007 Antti Kantee.  All Rights Reserved.
@@ -121,13 +121,7 @@
 {
 
 	/*
-	 * XXX: because of the vnode reference counting lossage, we
-	 * can't clear the curlwp if we unmounted succesfully.
-	 * Therefore, don't do it to avoid a diagnostic panic.
-	 * So this currently leaks a process structure in that case,
-	 * but since p2k is rarely used multiple times in a single
-	 * process, it's more like a feature than a bug (yea, I'm
-	 * good at lying to myself).
+	 * XXX: For unmount we release this already in the operation.
 	 */
 	if (__predict_false(puffs_getstate(pu) != PUFFS_STATE_UNMOUNTED))
 		rump_clear_curlwp();
@@ -251,17 +245,18 @@
 	puffs_set_prepost(pu, makelwp, clearlwp);
 	puffs_set_errnotify(pu, p2k_errcatcher);
 
-	puffs_setspecific(pu, ukfs_getmp(ukfs));
+	puffs_setspecific(pu, ukfs);
 	if ((rv = puffs_mount(pu, mountpath, mntflags, rvp))== -1)
 		goto out;
 	rv = puffs_mainloop(pu);
 	puffs_exit(pu, 1);
 	pu = NULL;
+	ukfs = NULL;
 
  out:
 	sverrno = errno;
 	if (ukfs)
-		ukfs_release(ukfs, UKFS_RELFLAG_NOUNMOUNT);
+		ukfs_release(ukfs, UKFS_RELFLAG_FORCE);
 	if (pu)
 		puffs_cancel(pu, sverrno);
 	if (rv) {
@@ -281,52 +276,28 @@
 int
 p2k_fs_statvfs(struct puffs_usermount *pu, struct statvfs *sbp)
 {
-	struct mount *mp = puffs_getspecific(pu);
+	struct mount *mp = ukfs_getmp(puffs_getspecific(pu));
 
 	return rump_vfs_statvfs(mp, sbp);
 }
 
+/*ARGSUSED*/
 int
 p2k_fs_unmount(struct puffs_usermount *pu, int flags)
 {
-	struct mount *mp = puffs_getspecific(pu);
-	struct puffs_node *pn_root = puffs_getroot(pu);
-	struct vnode *rvp = pn_root->pn_data, *rvp2;
-	int rv;
+	struct ukfs *fs = puffs_getspecific(pu);
 
-	/*
-	 * We recycle the root node already here (god knows how
-	 * many references it has due to lookup).  This is good
-	 * because VFS_UNMOUNT would do it anyway.  But it is
-	 * very bad if VFS_UNMOUNT fails for a reason or another
-	 * (puffs guards against busy fs, but there might be other
-	 * reasons).
-	 *
-	 * Theoretically we're going south, sinking fast & dying
-	 * out here because the old vnode will be freed and we are
-	 * unlikely to get a vnode at the same address.  But try
-	 * anyway.
-	 *
-	 * XXX: reallyfixmesomeday.  either introduce VFS_ROOT to
-	 * puffs (blah) or check the cookie in every routine
-	 * against the root cookie, which might change (blah2).
-	 */
-	rump_vp_recycle_nokidding(rvp);
-	rv = rump_vfs_unmount(mp, flags);
-	if (rv) {
-		int rv2;
+	rump_clear_curlwp(); /* XXX: ukfs uses curlwp */
+	ukfs_release(fs, UKFS_RELFLAG_FORCE);
 
-		rv2 = rump_vfs_root(mp, &rvp2, 0);
-		assert(rv2 == 0 && rvp == rvp2);
-	}
-	return rv;
+	return 0;
 }
 
 int
 p2k_fs_sync(struct puffs_usermount *pu, int waitfor,
 	const struct puffs_cred *pcr)
 {
-	struct mount *mp = puffs_getspecific(pu);
+	struct mount *mp = ukfs_getmp(puffs_getspecific(pu));
 	kauth_cred_t cred;
 	int rv;
 
@@ -342,7 +313,7 @@
 p2k_fs_fhtonode(struct puffs_usermount *pu, void *fid, size_t fidsize,
 	struct puffs_newinfo *pni)
 {
-	struct mount *mp = puffs_getspecific(pu);
+	struct mount *mp = ukfs_getmp(puffs_getspecific(pu));
 	struct vnode *vp;
 	enum vtype vtype;
 	voff_t vsize;
@@ -410,6 +381,7 @@
 needcompat(void)
 {
 
+	/*LINTED*/
 	return __NetBSD_Version__ < VERS_TIMECHANGE
 	    && rump_getversion() >= VERS_TIMECHANGE;
 }

Reply via email to