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