From owner-p4-projects@FreeBSD.ORG Sun Jun 14 18:25:06 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id EDB6F106566C; Sun, 14 Jun 2009 18:25:05 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A68D51065674 for ; Sun, 14 Jun 2009 18:25:05 +0000 (UTC) (envelope-from tatsianka@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 929B68FC15 for ; Sun, 14 Jun 2009 18:25:05 +0000 (UTC) (envelope-from tatsianka@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n5EIP5WN058005 for ; Sun, 14 Jun 2009 18:25:05 GMT (envelope-from tatsianka@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n5EIP5pG058003 for perforce@freebsd.org; Sun, 14 Jun 2009 18:25:05 GMT (envelope-from tatsianka@FreeBSD.org) Date: Sun, 14 Jun 2009 18:25:05 GMT Message-Id: <200906141825.n5EIP5pG058003@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to tatsianka@FreeBSD.org using -f From: Tatsiana Severyna To: Perforce Change Reviews Cc: Subject: PERFORCE change 164364 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 14 Jun 2009 18:25:07 -0000 http://perforce.freebsd.org/chv.cgi?CH=164364 Change 164364 by tatsianka@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 ==== //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 /* 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 ==== //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 - -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 #include #include +#include +#include #include #include @@ -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 ==== //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) <<<