PERFORCE change 164364 for review

Tatsiana Severyna tatsianka at FreeBSD.org
Sun Jun 14 18:25:07 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=164364

Change 164364 by tatsianka at tatsianka_zonder on 2009/06/14 18:24:24

	Push vnode locking down to puffs_getvnode and puffs_makeroot
	Change puffs_cookie2vnode to use vnode lock flag
	Change state PUFFSTAT_MOUNTING -> PUFFSTAT_RUNNING in puffs_vfsop_root (as there is no vfs_start)
	kqueue fixes
	Fix freeze during unmounting
	Don't forget to insert putter instance into list
	Use nmount in libpuffs
	Add extra debugging

Affected files ...

.. //depot/projects/soc2009/tatsianka_puffs/libpuffs/Makefile#2 edit
.. //depot/projects/soc2009/tatsianka_puffs/libpuffs/callcontext.c#2 edit
.. //depot/projects/soc2009/tatsianka_puffs/libpuffs/dispatcher.c#2 edit
.. //depot/projects/soc2009/tatsianka_puffs/libpuffs/framebuf.c#2 edit
.. //depot/projects/soc2009/tatsianka_puffs/libpuffs/puffs.c#2 edit
.. //depot/projects/soc2009/tatsianka_puffs/libpuffs/puffs.h#2 edit
.. //depot/projects/soc2009/tatsianka_puffs/pnullfs/Makefile#2 edit
.. //depot/projects/soc2009/tatsianka_puffs/puffs/Makefile#3 edit
.. //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_msgif.c#3 edit
.. //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_node.c#3 edit
.. //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_subr.c#3 edit
.. //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_sys.h#3 edit
.. //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_vfsops.c#3 edit
.. //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_vnops.c#3 edit
.. //depot/projects/soc2009/tatsianka_puffs/putter/Makefile#3 edit
.. //depot/projects/soc2009/tatsianka_puffs/putter/putter.c#2 edit

Differences ...

==== //depot/projects/soc2009/tatsianka_puffs/libpuffs/Makefile#2 (text+ko) ====

@@ -7,7 +7,7 @@
 		puffs_framebuf.3 puffs_node.3 puffs_ops.3 puffs_path.3	\
 		puffs_suspend.3
 INCS=		puffs.h puffsdump.h
-CFLAGS+=	-I${.CURDIR}/../puffs -I${.CURDIR}/../putter -I${.CURDIR} -I/usr/src/sbin/mount
-SHLIB_MAJOR=	0
+CFLAGS+=	-g -I${.CURDIR}/../puffs -I${.CURDIR}/../putter -I${.CURDIR} -I/usr/src/sbin/mount
+#SHLIB_MAJOR=	0
 
 .include <bsd.lib.mk>

==== //depot/projects/soc2009/tatsianka_puffs/libpuffs/callcontext.c#2 (text+ko) ====

@@ -47,7 +47,7 @@
 
 #include "puffs_priv.h"
 
-#if 0
+#if 1
 #define DPRINTF(x) printf x
 #else
 #define DPRINTF(x)
@@ -311,6 +311,7 @@
 {
 	struct puffs_cc *pcc;
 
+	printf("puffs__cc_exit\n");
 	while ((pcc = LIST_FIRST(&pu->pu_ccmagazin)) != NULL) {
 		LIST_REMOVE(pcc, pcc_rope);
 		cc_free(pcc);

==== //depot/projects/soc2009/tatsianka_puffs/libpuffs/dispatcher.c#2 (text+ko) ====

@@ -69,6 +69,12 @@
 	struct puffs_cc *pcc = puffs_cc_getcc(pu);
 	struct puffs_req *preq;
 
+	/* XXX_TS */
+	if (!pcc->pcc_pu) {
+		printf("XXX puffs__ml_dispatch: pcc->pcc_pu == NULL\n");
+		pcc->pcc_pu = pu;
+	}
+
 	pcc->pcc_pb = pb;
 	pcc->pcc_flags |= PCC_MLCONT;
 	dispatch(pcc);

==== //depot/projects/soc2009/tatsianka_puffs/libpuffs/framebuf.c#2 (text+ko) ====

@@ -1062,6 +1062,7 @@
 {
 	struct puffs_fctrl_io *fio;
 
+	printf("puffs__framev_exit\n");
 	while ((fio = LIST_FIRST(&pu->pu_ios)) != NULL)
 		removefio(pu, fio, ENXIO);
 	free(pu->pu_evs);

==== //depot/projects/soc2009/tatsianka_puffs/libpuffs/puffs.c#2 (text+ko) ====

@@ -461,6 +461,7 @@
 puffs_mount(struct puffs_usermount *pu, const char *dir, int mntflags,
 	puffs_cookie_t cookie)
 {
+	struct iovec iov[6];
 	char rp[MAXPATHLEN];
 	ssize_t n;
 	int rv, fd, sverrno;
@@ -545,16 +546,25 @@
 			    "what you want?", fd);
 
 		pu->pu_kargp->pa_fd = pu->pu_fd = fd;
-#ifdef XXX_TS
-		if ((rv = mount(MOUNT_PUFFS, rp, mntflags,
-		    pu->pu_kargp, sizeof(struct puffs_kargs))) == -1)
-			goto out;
-#endif
-		if ((rv = mount(MOUNT_PUFFS, rp, mntflags,
-		    pu->pu_kargp)) == -1)
+		iov[0].iov_base = strdup("fstype");
+		iov[0].iov_len = sizeof("fstype");
+		iov[1].iov_base = strdup("puffs");
+		iov[1].iov_len = strlen(iov[1].iov_base) + 1;
+		iov[2].iov_base = strdup("fspath");
+		iov[2].iov_len = sizeof("fspath");
+		iov[3].iov_base = rp;
+		iov[3].iov_len = strlen(rp) + 1;
+		iov[4].iov_base = strdup("puffs_args");
+		iov[4].iov_len = sizeof("puffs_args");
+		iov[5].iov_base = pu->pu_kargp;
+		iov[5].iov_len = sizeof(struct puffs_kargs);
+
+		if ((rv = nmount(iov, 6, mntflags)) == -1)
 			goto out;
 	}
 
+	printf("%s: mount %d\n", __func__, rv);
+
 	PU_SETSTATE(pu, PUFFS_STATE_RUNNING);
 
  out:
@@ -573,6 +583,7 @@
 	}
 
 	errno = sverrno;
+	printf("%s: mount return %d\n", __func__, rv);
 	return rv;
 }
 
@@ -667,6 +678,7 @@
 {
 	struct puffs_node *pn;
 
+	printf("puffs_exit: enter\n");
 	force = 1; /* currently */
 
 	if (pu->pu_fd)
@@ -681,6 +693,7 @@
 	if (pu->pu_state & PU_HASKQ)
 		close(pu->pu_kq);
 	free(pu);
+	printf("puffs_exit: done\n");
 
 	return 0; /* always succesful for now, WILL CHANGE */
 }
@@ -701,6 +714,7 @@
 	int ndone;
 
 	while (puffs_getstate(pu) != PUFFS_STATE_UNMOUNTED) {
+		printf("puffs__theloop: iteration\n");
 		/*
 		 * Schedule existing requests.
 		 */
@@ -779,6 +793,7 @@
 		ndone = kevent(pu->pu_kq, pu->pu_evs, nchanges,
 		    pu->pu_evs, 2*pu->pu_nfds, pu->pu_ml_timep);
 
+		printf("puffs__theloop: kevent: %d; errno=%d\n", ndone, errno);
 		if (ndone == -1) {
 			if (errno != EINTR)
 				break;
@@ -806,6 +821,7 @@
 			fio = (void *)curev->udata;
 			pfctrl = fio->fctrl;
 			if (curev->flags & EV_ERROR) {
+				printf("puffs__theloop: EV_ERROR\n");
 				assert(curev->filter == EVFILT_WRITE);
 				fio->stat &= ~FIO_WR;
 
@@ -818,11 +834,13 @@
 
 			what = 0;
 			if (curev->filter == EVFILT_READ) {
+				printf("puffs__theloop: EVFILT_READ\n");
 				puffs__framev_input(pu, pfctrl, fio);
 				what |= PUFFS_FBIO_READ;
 			}
 
 			else if (curev->filter == EVFILT_WRITE) {
+				printf("puffs__theloop: EVFILT_WRITE\n");
 				puffs__framev_output(pu, pfctrl, fio);
 				what |= PUFFS_FBIO_WRITE;
 			}
@@ -840,6 +858,8 @@
 		}
 	}
 
+	printf("puffs__theloop: done\n");
+
 	if (puffs__cc_restoremain(pu) == -1)
 		warn("cannot restore main context.  impending doom");
 }

==== //depot/projects/soc2009/tatsianka_puffs/libpuffs/puffs.h#2 (text+ko) ====

@@ -48,7 +48,7 @@
 #include <string.h>
 
 /* XXX_TS paths.h, sys/mount.h in NetBSD */
-#define	_PATH_PUFFS	"/dev/puffs"
+#define	_PATH_PUFFS	"/dev/putter"
 #define	MOUNT_PUFFS	"puffs"		/* Pass-to-Userspace filesystem */
 
 /* forwards */

==== //depot/projects/soc2009/tatsianka_puffs/pnullfs/Makefile#2 (text+ko) ====

@@ -10,7 +10,7 @@
 MOUNT=	/usr/src/sbin/mount
 .PATH:  ${MOUNT}
 
-CFLAGS+= -I${.CURDIR}/../libpuffs -I${.CURDIR}/../puffs -I${.CURDIR}/../putter -I${MOUNT}
+CFLAGS+= -g -I${.CURDIR}/../libpuffs -I${.CURDIR}/../puffs -I${.CURDIR}/../putter -I${MOUNT}
 LDFLAGS+= -L${.OBJDIR}/../libpuffs
 
 .include <bsd.prog.mk>

==== //depot/projects/soc2009/tatsianka_puffs/puffs/Makefile#3 (text+ko) ====

@@ -5,7 +5,6 @@
 KMOD=	puffs
 SRCS=	vnode_if.h puffs_msgif.c puffs_msgif.h puffs_node.c puffs_subr.c \
 	puffs_sys.h puffs_vfsops.c puffs_vnops.c
+DEBUG_FLAGS= -DPUFFSDEBUG -g -I${.CURDIR} -I${.CURDIR}/../putter
 
 .include <bsd.kmod.mk>
-
-CFLAGS+=	-I${.CURDIR} -I${.CURDIR}/../putter

==== //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_msgif.c#3 (text+ko) ====

@@ -90,7 +90,7 @@
 #endif
 
 static int
-makepark(void *mem, int size, int flags)
+makepark(void *mem, int size, void *arg, int flags)
 {
 	struct puffs_msgpark *park = mem;
 
@@ -101,10 +101,12 @@
 }
 
 static void
-nukepark(void *mem, int size)
+nukepark(void *mem, int size, void *arg)
 {
 	struct puffs_msgpark *park = mem;
 
+	DPRINTF(("puffs_msgpark_alloc\n"));
+
 	cv_destroy(&park->park_cv);
 	mtx_destroy(&park->park_mtx);
 }
@@ -114,7 +116,7 @@
 {
 
 	parkpc = uma_zcreate("puffprkl", sizeof(struct puffs_msgpark),
-	    NULL, NULL, makepark, nukepark, UMA_ALIGN_PTR, UMA_ZONE_ZINIT);
+	    makepark, nukepark, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_ZINIT);
 }
 
 void
@@ -187,10 +189,10 @@
 parkdump(struct puffs_msgpark *park)
 {
 
-	DPRINTF(("park %p, preq %p, id %" PRIu64 "\n"
+	DPRINTF(("park %p, preq %p, id %ju\n"
 	    "\tcopy %zu, max %zu - done: %p/%p\n"
 	    "\tflags 0x%08x, refcount %d, cv/mtx: %p/%p\n",
-	    park, park->park_preq, park->park_preq->preq_id,
+	    park, park->park_preq, (intmax_t)park->park_preq->preq_id,
 	    park->park_copylen, park->park_maxlen,
 	    park->park_done, park->park_donearg,
 	    park->park_flags, park->park_refcount,
@@ -329,6 +331,7 @@
 	struct thread *td = curthread;
 	struct puffs_req *preq;
 
+	DPRINTF(("puffs_msg_enqueue: park=%p\n", park));
 	preq = park->park_preq;
 	preq->preq_buflen = park->park_maxlen;
 	KASSERT(preq->preq_id == 0
@@ -395,8 +398,8 @@
 	cv_broadcast(&pmp->pmp_msg_waiter_cv);
 	putter_notify(pmp->pmp_pi);
 
-	DPRINTF(("touser: req %" PRIu64 ", preq: %p, park: %p, "
-	    "c/t: 0x%x/0x%x, f: 0x%x\n", preq->preq_id, preq, park,
+	DPRINTF(("touser: req %ju, preq: %p, park: %p, "
+	    "c/t: 0x%x/0x%x, f: 0x%x\n", (intmax_t) preq->preq_id, preq, park,
 	    preq->preq_opclass, preq->preq_optype, park->park_flags));
 }
 
@@ -407,6 +410,8 @@
 	int error = 0;
 	int rv;
 
+	DPRINTF(("puffs_msg_wait\n"));
+
 	mtx_lock(&pmp->pmp_lock);
 	puffs_mp_reference(pmp);
 	mtx_unlock(&pmp->pmp_lock);
@@ -423,6 +428,7 @@
 	if (__predict_false((park->park_flags & PARKFLAG_DONE)
 	    || (park->park_flags & PARKFLAG_HASERROR))) {
 		rv = park->park_preq->preq_rv;
+		DPRINTF(("puffs_msg_wait: park has error: %d; park=%p\n", rv, park));
 		mtx_unlock(&park->park_mtx);
 		goto skipwait;
 	}
@@ -480,6 +486,8 @@
 	puffs_mp_release(pmp);
 	mtx_unlock(&pmp->pmp_lock);
 
+	DPRINTF(("puffs_msg_wait; result=%d\n", rv));
+
 	return rv;
 }
 
@@ -547,6 +555,7 @@
 	struct puffs_req *preq;
 	int error;
 
+	DTRACE();
 	error = 0;
 	mtx_lock(&pmp->pmp_lock);
 	puffs_mp_reference(pmp);
@@ -685,6 +694,7 @@
 
 	mtx_lock(&pmp->pmp_lock);
 	rv = pmp->pmp_msg_touser_count;
+	DPRINTF(("puffs_msgif_waitcount: rv=%d\n", rv));
 	mtx_unlock(&pmp->pmp_lock);
 
 	return rv;
@@ -701,6 +711,7 @@
 	struct puffs_msgpark *park;
 	int wgone;
 
+	DTRACE();
 	mtx_lock(&pmp->pmp_lock);
 
 	/* Locate waiter */
@@ -709,8 +720,8 @@
 			break;
 	}
 	if (park == NULL) {
-		DPRINTF(("puffsop_msg: no request: %" PRIu64 "\n",
-		    preq->preq_id));
+		DPRINTF(("puffsop_msg: no request: %ju\n",
+		    (intmax_t) preq->preq_id));
 		mtx_unlock(&pmp->pmp_lock);
 		return; /* XXX send error */
 	}
@@ -719,8 +730,8 @@
 	puffs_msgpark_reference(park);
 	if (pth->pth_framelen > park->park_maxlen) {
 		DPRINTF(("puffsop_msg: invalid buffer length: "
-		    "%" PRIu64 " (req %" PRIu64 ", \n", pth->pth_framelen,
-		    preq->preq_id));
+		    "%ju (req %ju, \n", (intmax_t) pth->pth_framelen,
+		    (intmax_t) preq->preq_id));
 		park->park_preq->preq_rv = EPROTO;
 		cv_signal(&park->park_cv);
 		puffs_msgpark_release1(park, 2);
@@ -930,8 +941,6 @@
 	 * wait for syncer_mutex.  Otherwise the mointpoint can be
 	 * wiped out while we wait. XXX Should be done earlier
 	 */
-	/* XXX_TS */
-	vfs_ref(mp);
 	mtx_lock(&Giant);       /* dounmount() */
 	(void)dounmount(mp, MNT_FORCE, curthread);
 	mtx_unlock(&Giant);     /* dounmount() */

==== //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_node.c#3 (text+ko) ====

@@ -79,7 +79,7 @@
  */
 int
 puffs_getvnode(struct mount *mp, puffs_cookie_t ck, enum vtype type,
-	off_t vsize, dev_t rdev, struct vnode **vpp)
+	off_t vsize, dev_t rdev, int lkflag, struct vnode **vpp)
 {
 	struct puffs_mount *pmp;
 	struct puffs_newcookie *pnc;
@@ -88,6 +88,8 @@
 	struct puffs_node_hashlist *plist;
 	int error;
 
+	DTRACE();
+
 	pmp = MPTOPUFFSMP(mp);
 
 	error = EPROTO;
@@ -105,21 +107,33 @@
 #endif
 	KASSERT(vsize != ((voff_t)-1), ("VSIZENOTSET is not supported"));
 
+	pnode = uma_zalloc(puffs_pnpool, M_WAITOK);
+	/* XXX */
+	memset(pnode, 0, sizeof(struct puffs_node));
+
 	error = getnewvnode("puffs", mp, &puffs_vnodeops, &vp);
-	if (error)
+	DPRINTF(("puffs_getvnode: getnewvnode => %d; vp=%p mp=%p\n", error, vp, mp));
+	if (error) {
+		uma_zfree(puffs_pnpool, pnode);
+		goto bad;
+	}
+	vn_lock(vp, lkflag | LK_RETRY);
+	error = insmntque(vp, mp);
+	if (error) {
+		vp = NULL;
+		uma_zfree(puffs_pnpool, pnode);
 		goto bad;
-	vp->v_vnlock = NULL;
-	vp->v_type = type;
+	}
 
-#ifdef XXX_TS /* mystirious stuff */
 	/*
 	 * Creation should not fail after this point.  Or if it does,
 	 * care must be taken so that VOP_INACTIVE() isn't called.
 	 */
 
 	/* default size */
-	uvm_vnp_setsize(vp, 0);
+	vnode_pager_setsize(vp, vsize);
 
+#ifdef XXX_TS /* mystirious stuff */
 	/* dances based on vnode type. almost ufs_vinit(), but not quite */
 	switch (type) {
 	case VCHR:
@@ -150,10 +164,6 @@
 	}
 #endif
 
-	pnode = uma_zalloc(puffs_pnpool, M_WAITOK);
-	/* XXX */
-	memset(pnode, 0, sizeof(struct puffs_node));
-
 	pnode->pn_cookie = ck;
 	pnode->pn_refcount = 1;
 
@@ -219,6 +229,8 @@
 	struct vnode *vp;
 	int error;
 
+	DTRACE();
+
 	/* userspace probably has this as a NULL op */
 	if (ck == NULL) {
 		error = EOPNOTSUPP;
@@ -252,12 +264,11 @@
 	LIST_INSERT_HEAD(&pmp->pmp_newcookie, pnc, pnc_entries);
 	mtx_unlock(&pmp->pmp_lock);
 
-	error = puffs_getvnode(dvp->v_mount, ck, type, 0, rdev, &vp);
+	error = puffs_getvnode(dvp->v_mount, ck, type, 0, rdev, LK_EXCLUSIVE, &vp);
 	if (error)
 		return error;
 
 	vp->v_type = type;
-	vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
 	*vpp = vp;
 
 	if ((cnp->cn_flags & MAKEENTRY) && PUFFS_USE_NAMECACHE(pmp))
@@ -317,11 +328,12 @@
  * Make sure root vnode exists and reference it.  Does NOT lock.
  */
 static int
-puffs_makeroot(struct puffs_mount *pmp)
+puffs_makeroot(struct puffs_mount *pmp, int lkflag)
 {
 	struct vnode *vp;
 	int rv;
 
+	printf("puffs_makeroot\n");
 	/*
 	 * pmp_lock must be held if vref()'ing or vrele()'ing the
 	 * root vnode.  the latter is controlled by puffs_inactive().
@@ -334,17 +346,22 @@
 	if (vp) {
 		VI_LOCK(vp);
 		mtx_unlock(&pmp->pmp_lock);
-		if (vget(vp, LK_INTERLOCK, curthread) == 0)
-			return 0;
-	} else
+		DPRINTF(("puffs_makeroot: vnode found: vp=%p mp=%p refcnt=%d\n", vp, vp->v_mount, vrefcnt(vp)));
+		vholdl(vp);
+		vget(vp, lkflag | LK_INTERLOCK | LK_RETRY, curthread);
+		vdrop(vp);
+
+		return 0;
+	} else {
 		mtx_unlock(&pmp->pmp_lock);
+	}
 
 	/*
 	 * So, didn't have the magic root vnode available.
 	 * No matter, grab another and stuff it with the cookie.
 	 */
 	if ((rv = puffs_getvnode(pmp->pmp_mp, pmp->pmp_root_cookie,
-	    pmp->pmp_root_vtype, pmp->pmp_root_vsize, pmp->pmp_root_rdev, &vp)))
+	    pmp->pmp_root_vtype, pmp->pmp_root_vsize, pmp->pmp_root_rdev, lkflag, &vp)))
 		return rv;
 
 	/*
@@ -375,24 +392,24 @@
  * vnode lock, e.g. file server issued putpages.
  */
 int
-puffs_cookie2vnode(struct puffs_mount *pmp, puffs_cookie_t ck, int lock,
+puffs_cookie2vnode(struct puffs_mount *pmp, puffs_cookie_t ck, int lkflag,
 	int willcreate, struct vnode **vpp)
 {
 	struct puffs_node *pnode;
 	struct puffs_newcookie *pnc;
 	struct vnode *vp;
-	int vgetflags, rv;
+	int rv;
+
+	DPRINTF(("puffs_cookie2vnode lkflag=%x\n", lkflag));
 
 	/*
 	 * Handle root in a special manner, since we want to make sure
 	 * pmp_root is properly set.
 	 */
 	if (ck == pmp->pmp_root_cookie) {
-		if ((rv = puffs_makeroot(pmp)))
+		DPRINTF(("puffs_cookie2vnode make root lkflag=%x\n", lkflag));
+		if ((rv = puffs_makeroot(pmp, lkflag)))
 			return rv;
-		if (lock)
-			vn_lock(pmp->pmp_root, LK_EXCLUSIVE | LK_RETRY);
-
 		*vpp = pmp->pmp_root;
 		return 0;
 	}
@@ -413,11 +430,10 @@
 	VI_LOCK(vp);
 	mtx_unlock(&pmp->pmp_lock);
 
-	vgetflags = LK_INTERLOCK;
-	if (lock)
-		vgetflags |= LK_EXCLUSIVE | LK_RETRY;
-	if ((rv = vget(vp, vgetflags, curthread)))
-		return rv;
+	DPRINTF(("puffs_cookie2vnode vget vp=%p lkflag=%x lock=%x\n", vp, lkflag, lkflag & LK_TYPE_MASK));
+	vholdl(vp);
+	vget(vp, lkflag | LK_INTERLOCK | LK_RETRY, curthread);
+	vdrop(vp);
 
 	*vpp = vp;
 	return 0;

==== //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_subr.c#3 (text+ko) ====

@@ -52,7 +52,7 @@
 MALLOC_DEFINE(M_PUFFS, "puffs", "PUFFS");
 
 #ifdef PUFFSDEBUG
-int puffsdebug;
+int puffsdebug = 2;
 #endif
 
 void

==== //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_sys.h#3 (text+ko) ====

@@ -57,9 +57,11 @@
 
 #ifdef PUFFSDEBUG
 extern int puffsdebug; /* puffs_subr.c */
+#define DTRACE() if (puffsdebug > 0) printf("%s\n", __func__)
 #define DPRINTF(x) if (puffsdebug > 0) printf x
 #define DPRINTF_VERBOSE(x) if (puffsdebug > 1) printf x
 #else
+#define DTRACE()
 #define DPRINTF(x)
 #define DPRINTF_VERBOSE(x)
 #endif
@@ -200,7 +202,7 @@
 
 void	puffs_flushvnode(struct vnode *vp);
 int	puffs_getvnode(struct mount *, puffs_cookie_t, enum vtype,
-		       off_t, dev_t, struct vnode **);
+		       off_t, dev_t, int, struct vnode **);
 int	puffs_newnode(struct mount *, struct vnode *, struct vnode **,
 		      puffs_cookie_t, struct componentname *,
 		      enum vtype, dev_t);

==== //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_vfsops.c#3 (text+ko) ====

@@ -74,7 +74,7 @@
 };
 
 static const char *puffs_opts[] = { 
-	"from", "puffs_args", NULL
+	"puffs_args", NULL
 };
 
 static int
@@ -88,11 +88,12 @@
 	int error = 0, i;
 	pid_t mntpid = curthread->td_proc->p_pid;
 
+	DTRACE();
 
 	if (vfs_filteropt(mp->mnt_optnew, puffs_opts))
 		return EINVAL;
 
-	error = vfs_copyopt(mp->mnt_optnew, "nfs_args", &_args_data, sizeof(_args_data));
+	error = vfs_copyopt(mp->mnt_optnew, "puffs_args", &_args_data, sizeof(_args_data));
 	if (error)
 		return EINVAL;
 
@@ -120,12 +121,13 @@
 		goto out;
 	}
 
+	/* XXX_TS inc pa_fhsize */
 	/* use dummy value for passthrough */
 	if (args->pa_fhflags & PUFFS_FHFLAG_PASSTHROUGH)
-		args->pa_fhsize = sizeof(struct fid);
+		args->pa_fhsize = MAXFIDSZ;
 
 	/* sanitize file handle length */
-	if (PUFFS_TOFHSIZE(args->pa_fhsize) > MAXFIDSZ) {
+	if (PUFFS_TOFHSIZE(args->pa_fhsize) > /* MAXFIDSZ */ sizeof(struct fid)) {
 		printf("puffs_mount: handle size %zu too large\n",
 		    args->pa_fhsize);
 		error = EINVAL;
@@ -217,6 +219,7 @@
 	if ((pmp->pmp_pi
 	    = putter_attach(mntpid, args->pa_fd, pmp, &puffs_putter)) == NULL) {
 		error = ENOENT;
+		DPRINTF(("puffs_vfsop_mount: putter_attach attach error\n"));
 		goto out;
 	}
 
@@ -238,6 +241,8 @@
 
 	mp->mnt_data = pmp;
 
+	DPRINTF(("puffs mount from: %s\n", args->pa_mntfromname));
+
 	vfs_getnewfsid(mp);
 	vfs_mountedfrom(mp, args->pa_mntfromname);
 
@@ -247,10 +252,6 @@
 	if (error && pmp)
 		free(pmp, M_PUFFS);
 	
-	/* XXX FreeBSD lacks vfs_start */
-	if (error == 0)
-		pmp->pmp_status = PUFFSTAT_RUNNING;
-
 	return error;
 }
 
@@ -261,6 +262,7 @@
 	struct puffs_mount *pmp;
 	int error, force;
 
+	DTRACE();
 	error = 0;
 	force = mntflags & MNT_FORCE;
 	pmp = MPTOPUFFSMP(mp);
@@ -353,8 +355,19 @@
 	struct puffs_mount *pmp = MPTOPUFFSMP(mp);
 	int rv;
 
-	rv = puffs_cookie2vnode(pmp, pmp->pmp_root_cookie, 1, 1, vpp);
+
+	DTRACE();
+	rv = puffs_cookie2vnode(pmp, pmp->pmp_root_cookie, flags, 1, vpp);
 	KASSERT(rv != PUFFS_NOSUCHCOOKIE, ("rv != PUFFS_NOSUCHCOOKIE"));
+
+	/* XXX_TS FreeBSD lacks vfs_start */
+	if (rv == 0) {
+		mtx_lock(&pmp->pmp_lock);
+		if (pmp->pmp_status == PUFFSTAT_MOUNTING)
+			pmp->pmp_status = PUFFSTAT_RUNNING;
+		mtx_unlock(&pmp->pmp_lock);
+	}
+
 	return rv;
 }
 
@@ -365,6 +378,7 @@
 	struct puffs_mount *pmp;
 	int error = 0;
 
+	DTRACE();
 	pmp = MPTOPUFFSMP(mp);
 
 	/*
@@ -373,6 +387,7 @@
 	 * requesting statvfs from userspace would mean a deadlock.
 	 * Compensate.
 	 */
+	DPRINTF(("puffs_vfsop_statfs: mounting\n"));
 	if (pmp->pmp_status == PUFFSTAT_MOUNTING)
 		return EINPROGRESS;
 
@@ -413,6 +428,7 @@
 	struct puffs_mount *pmp = MPTOPUFFSMP(mp);
 	int error, rv;
 
+	DTRACE();
 	error = vfs_stdsync(mp, waitfor);
 
 	/* sync fs */
@@ -440,6 +456,7 @@
 	size_t argsize, fhlen;
 	int error;
 
+	DTRACE();
 	if (pmp->pmp_args.pa_fhsize == 0)
 		return EOPNOTSUPP;
 
@@ -470,16 +487,15 @@
 	if (error)
 		goto out;
 
-	error = puffs_cookie2vnode(pmp, fhtonode_msg->pvfsr_fhcookie, 1,1,&vp);
+	error = puffs_cookie2vnode(pmp, fhtonode_msg->pvfsr_fhcookie, LK_EXCLUSIVE, 1, &vp);
 	DPRINTF(("puffs_fhtovp: got cookie %p, existing vnode %p\n",
 	    fhtonode_msg->pvfsr_fhcookie, vp));
 	if (error == PUFFS_NOSUCHCOOKIE) {
 		error = puffs_getvnode(mp, fhtonode_msg->pvfsr_fhcookie,
 		    fhtonode_msg->pvfsr_vtype, fhtonode_msg->pvfsr_size,
-		    fhtonode_msg->pvfsr_rdev, &vp);
+		    fhtonode_msg->pvfsr_rdev, LK_EXCLUSIVE, &vp);
 		if (error)
 			goto out;
-		vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
 	} else if (error) {
 		goto out;
 	}
@@ -497,6 +513,7 @@
 	/* some checks depend on this */
 	KASSERT(VNOVAL == VSIZENOTSET, ("VNOVAL == VSIZENOTSET"));
 
+	DTRACE();
 	puffs_pnpool = uma_zcreate("puffpnpl", sizeof(struct puffs_node),
 	    NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_ZINIT);
 	puffs_msgif_init();
@@ -508,6 +525,7 @@
 puffs_vfsop_uninit(struct vfsconf *vfsp)
 {
 
+	DTRACE();
 	puffs_msgif_destroy();
 	uma_zdestroy(puffs_pnpool);
 

==== //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_vnops.c#3 (text+ko) ====

@@ -42,6 +42,8 @@
 #include <sys/vnode.h>
 #include <sys/proc.h>
 #include <sys/systm.h>
+#include <sys/bio.h>
+#include <sys/buf.h>
 
 #include <vm/vm.h>
 #include <vm/vm_object.h>
@@ -118,6 +120,7 @@
 	size_t argsize, fhlen;
 	int error;
 
+	DTRACE();
 	if (pmp->pmp_args.pa_fhsize == 0)
 		return EOPNOTSUPP;
 
@@ -138,7 +141,7 @@
 	else
 		fhlen = PUFFS_TOFHSIZE(pmp->pmp_args.pa_fhsize);
 
-	if (fhlen > MAXFIDSZ) {
+	if (fhlen > /* MAXFIDSZ */ sizeof(struct fid)) {
 		puffs_senderr(pmp, PUFFS_ERR_VPTOFH, E2BIG,
 		    "file handle too big", VPTOPNC(vp));
 		error = EPROTO;
@@ -183,8 +186,8 @@
 
 	isdot = cnp->cn_namelen == 1 && *cnp->cn_nameptr == '.';
 
-	DPRINTF(("puffs_lookup: \"%s\", parent vnode %p, op: %x\n",
-	    cnp->cn_nameptr, dvp, cnp->cn_nameiop));
+	DPRINTF(("puffs_lookup: \"%s\", parent vnode %p, op: %jx\n",
+	    cnp->cn_nameptr, dvp, (intmax_t) cnp->cn_nameiop));
 
 	/*
 	 * Check if someone fed it into the cache
@@ -259,17 +262,16 @@
 		goto out;
 	}
 
-	error = puffs_cookie2vnode(pmp, lookup_msg->pvnr_newnode, 1, 1, &vp);
+	error = puffs_cookie2vnode(pmp, lookup_msg->pvnr_newnode, LK_EXCLUSIVE, 1, &vp);
 	if (error == PUFFS_NOSUCHCOOKIE) {
 		error = puffs_getvnode(dvp->v_mount,
 		    lookup_msg->pvnr_newnode, lookup_msg->pvnr_vtype,
-		    lookup_msg->pvnr_size, lookup_msg->pvnr_rdev, &vp);
+		    lookup_msg->pvnr_size, lookup_msg->pvnr_rdev, LK_EXCLUSIVE, &vp);
 		if (error) {
 			puffs_abortbutton(pmp, PUFFS_ABORT_LOOKUP, VPTOPNC(dvp),
 			    lookup_msg->pvnr_newnode, ap->a_cnp);
 			goto out;
 		}
-		vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
 	} else if (error) {
 		puffs_abortbutton(pmp, PUFFS_ABORT_LOOKUP, VPTOPNC(dvp),
 		    lookup_msg->pvnr_newnode, ap->a_cnp);
@@ -469,6 +471,7 @@
 	struct puffs_node *pn;
 	int error = 0;
 
+	DTRACE();
 	vap = ap->a_vap;
 
 	PUFFS_MSG_ALLOC(vn, getattr);
@@ -632,6 +635,7 @@
 	struct puffs_node *pnode;
 	int error;
 
+	DTRACE();
 	pnode = vp->v_data;
 
 	if (doinact(pmp, pnode->pn_stat & PNODE_DOINACT)) {
@@ -681,6 +685,7 @@
 	struct vnode *vp = ap->a_vp;
 	struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount);
 
+	DTRACE();
 	/*
 	 * first things first: check if someone is trying to reclaim the
 	 * root vnode.  do not allow that to travel to userspace.
@@ -1596,7 +1601,6 @@
 static int
 puffs_vnop_strategy(struct vop_strategy_args *ap)
 {
-#ifdef XXX_TS
 	PUFFS_MSG_VARS(vn, rw);
 	struct vnode *vp = ap->a_vp;
 	struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount);
@@ -1606,6 +1610,7 @@
 	size_t tomove, moved;
 	int error, dofaf, dobiodone;
 
+	DTRACE();
 	pmp = MPTOPUFFSMP(vp->v_mount);
 	bp = ap->a_bp;
 	error = 0;
@@ -1614,8 +1619,8 @@
 	park_rw = NULL; /* explicit */
 	dobiodone = 1;
 
-	if ((BUF_ISREAD(bp) && !EXISTSOP(pmp, READ))
-	    || (BUF_ISWRITE(bp) && !EXISTSOP(pmp, WRITE)))
+	if ((bp->b_iocmd == BIO_READ && !EXISTSOP(pmp, READ))
+	    || (bp->b_iocmd == BIO_WRITE && !EXISTSOP(pmp, WRITE)))
 		ERROUT(EOPNOTSUPP);
 
 #ifdef DIAGNOSTIC
@@ -1630,13 +1635,15 @@
 	 * Also, do FAF in case we're suspending.
 	 * See puffs_vfsops.c:pageflush()
 	 */
-	if (BUF_ISWRITE(bp)) {
+	if (bp->b_iocmd == BIO_WRITE) {
+#ifdef XXX_TS
 		mtx_lock(&vp->v_interlock);
 		if (vp->v_iflag & VI_XLOCK)
 			dofaf = 1;
 		if (pn->pn_stat & PNODE_SUSPEND)
 			dofaf = 1;
 		mtx_unlock(&vp->v_interlock);
+#endif
 	}
 
 #ifdef DIAGNOSTIC
@@ -1654,16 +1661,20 @@
 	RWARGS(rw_msg, 0, tomove, bp->b_blkno << DEV_BSHIFT, FSCRED);
 
 	/* 2x2 cases: read/write, faf/nofaf */
-	if (BUF_ISREAD(bp)) {
+	if (bp->b_iocmd == BIO_READ) {
 		puffs_msg_setinfo(park_rw, PUFFSOP_VN,
 		    PUFFS_VN_READ, VPTOPNC(vp));
 		puffs_msg_setdelta(park_rw, tomove);
+#ifdef XXX_TS
 		if (BIOASYNC(bp)) {
 			puffs_msg_setcall(park_rw,
 			    puffs_parkdone_asyncbioread, bp);
 			puffs_msg_enqueue(pmp, park_rw);
 			dobiodone = 0;
 		} else {
+#else
+		if (1) {
+#endif
 			PUFFS_MSG_ENQUEUEWAIT2(pmp, park_rw, vp->v_data,
 			    NULL, error);
 			error = checkerr(pmp, error, __func__);
@@ -1688,6 +1699,7 @@
 		 * make pages read-only before we write them if we want
 		 * write caching info
 		 */
+#ifdef XXX_TS
 		if (PUFFS_WCACHEINFO(pmp)) {
 			struct uvm_object *uobj = &vp->v_uobj;
 			int npages = (bp->b_bcount + PAGE_SIZE-1) >> PAGE_SHIFT;
@@ -1706,6 +1718,7 @@
 				mtx_unlock(&uobj->vmobjlock);
 			}
 		}
+#endif
 
 		(void)memcpy(&rw_msg->pvnr_data, bp->b_data, tomove);
 		if (dofaf) {
@@ -1761,12 +1774,9 @@
 		bp->b_error = error;
 
 	if (error || dobiodone)
-		biodone(bp);
+		bdone(bp);
 
 	return error;
-#else
-	return ENOTSUP;
-#endif
 }
 
 #ifdef XXX_TS /* not supported */
@@ -1807,7 +1817,17 @@
 int	puffs_vnop_mmap(void *);
 #endif
 
+#if 1
+struct vop_vector puffs_vnodeops = {
+	.vop_default =			&default_vnodeops,
+	.vop_inactive =			puffs_vnop_inactive,
+	.vop_reclaim =			puffs_vnop_reclaim,
+};
+
+struct vop_vector __puffs_vnodeops = {
+#else
 struct vop_vector puffs_vnodeops = {
+#endif
 	.vop_default =			&default_vnodeops,
 	.vop_lookup =			vfs_cache_lookup,
 	.vop_cachedlookup =		puffs_vnop_lookup,

==== //depot/projects/soc2009/tatsianka_puffs/putter/Makefile#3 (text+ko) ====

@@ -2,7 +2,6 @@
 
 KMOD=	putter
 SRCS=	putter.c putter.h putter_sys.h
-
-CFLAGS+= -I${.CURDIR}
+DEBUG_FLAGS= -DPUTTERDEBUG -g -I${.CURDIR}
 
 .include <bsd.kmod.mk>

==== //depot/projects/soc2009/tatsianka_puffs/putter/putter.c#2 (text+ko) ====

@@ -93,7 +93,7 @@
 #endif
 
 #ifdef PUTTERDEBUG
-int putterdebug = 0;
+int putterdebug = 1;
 #define DPRINTF(x) if (putterdebug > 0) printf x
 #define DPRINTF_VERBOSE(x) if (putterdebug > 1) printf x
 #else
@@ -115,6 +115,7 @@
 	size_t origres, moved;
 	int error;
 

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list