PERFORCE change 166546 for review
Tatsiana Severyna
tatsianka at FreeBSD.org
Sat Jul 25 11:00:10 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=166546
Change 166546 by tatsianka at tatsianka_zonder on 2009/07/25 10:59:42
Lock vfs and vnodes in puffsop_flush.
Unconditionally use vop_stdgetpages/vop_stdputpages.
Mark puffs mpsafe.
Return EINVAL if vop_pathconf is not implemented.
Do not wait for reply in vop_inactive to prevent deadlock.
Fix long standing cc stack alignment bug in lubpuffs.
Initialize fi.flags before calling fuse.create in librefuse.
Reduce debug.
Affected files ...
.. //depot/projects/soc2009/tatsianka_puffs/libpuffs/callcontext.c#4 edit
.. //depot/projects/soc2009/tatsianka_puffs/libpuffs/dispatcher.c#3 edit
.. //depot/projects/soc2009/tatsianka_puffs/librefuse/Makefile#2 edit
.. //depot/projects/soc2009/tatsianka_puffs/librefuse/refuse.c#2 edit
.. //depot/projects/soc2009/tatsianka_puffs/librefuse/refuse_opt.c#2 edit
.. //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_msgif.c#6 edit
.. //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_node.c#8 edit
.. //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_vfsops.c#7 edit
.. //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_vnops.c#8 edit
Differences ...
==== //depot/projects/soc2009/tatsianka_puffs/libpuffs/callcontext.c#4 (text+ko) ====
@@ -180,16 +180,25 @@
struct puffs_cc *volatile pcc;
void *sp;
size_t stacksize = 1<<pu->pu_cc_stackshift;
+ size_t stackalign;
long psize = sysconf(_SC_PAGESIZE);
if (puffs_fakecc)
return &fakecc;
/* XXX_TS MAP_ALIGNED(pu->pu_cc_stackshift) */
- sp = mmap(NULL, stacksize, PROT_READ|PROT_WRITE,
+ sp = mmap(NULL, stacksize * 2, PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, -1, 0);
if (sp == MAP_FAILED)
return NULL;
+ stackalign = ((uintptr_t)sp) & (stacksize-1);
+ if (stackalign != 0) {
+ munmap(sp, stacksize - stackalign);
+ sp = (uint8_t *)sp + stacksize - stackalign;
+ munmap((uint8_t *)sp + stacksize, stackalign);
+ } else {
+ munmap((uint8_t *)sp + stacksize, stacksize);
+ }
pcc = sp;
memset(pcc, 0, sizeof(struct puffs_cc));
@@ -247,7 +256,7 @@
* swapcontext(). However, it gets lost. So reinit it.
*/
st = &pcc->pcc_uc.uc_stack;
- st->ss_sp = pcc;
+ st->ss_sp = (void *)pcc;
st->ss_size = stacksize;
st->ss_flags = 0;
==== //depot/projects/soc2009/tatsianka_puffs/libpuffs/dispatcher.c#3 (text+ko) ====
@@ -69,12 +69,6 @@
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);
@@ -798,7 +792,7 @@
{
struct puffs_vnmsg_pathconf *auxt = auxbuf;
if (pops->puffs_node_pathconf == NULL) {
- error = 0;
+ error = EINVAL;
break;
}
==== //depot/projects/soc2009/tatsianka_puffs/librefuse/Makefile#2 (text+ko) ====
@@ -7,11 +7,12 @@
MOUNT= /usr/src/sbin/mount
.PATH: ${MOUNT}
+CFLAGS+= -DMULTITHREADED_REFUSE
CFLAGS+= ${FUSE_OPT_DEBUG_FLAGS}
CFLAGS+= -g -I${.CURDIR}/../libpuffs -I${.CURDIR}/../putter -I${.CURDIR}/../puffs -I${MOUNT}
SRCS= refuse.c refuse_opt.c
MAN= refuse.3
-#WARNS= 4
+WARNS= 2
#SHLIB_MAJOR= 1
.include <bsd.lib.mk>
==== //depot/projects/soc2009/tatsianka_puffs/librefuse/refuse.c#2 (text+ko) ====
@@ -611,6 +611,9 @@
set_fuse_context_uid_gid(pcn->pcn_cred);
+ if (fuse->op.getattr == NULL) {
+ return ENOSYS;
+ }
ret = fuse->op.getattr(path, &st);
if (ret != 0) {
@@ -770,6 +773,8 @@
created = 0;
if (fuse->op.create) {
+ bzero(&fi, sizeof(fi));
+ fi.flags = O_CREAT | O_EXCL | O_WRONLY;
ret = fuse->op.create(path, mode | S_IFREG, &fi);
if (ret == 0)
created = 1;
==== //depot/projects/soc2009/tatsianka_puffs/librefuse/refuse_opt.c#2 (text+ko) ====
@@ -141,6 +141,8 @@
args->argv = a;
args->allocated = na;
}
+
+ return 0;
}
void
==== //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_msgif.c#6 (text+ko) ====
@@ -788,16 +788,19 @@
puffsop_flush(struct puffs_mount *pmp, struct puffs_flush *pf)
{
struct vnode *vp;
- int rv;
+ int rv, vfslocked;
if (pf->pf_req.preq_pth.pth_framelen != sizeof(struct puffs_flush)) {
rv = EINVAL;
goto out;
}
+ vfslocked = VFS_LOCK_GIANT(PMPTOMP(pmp));
+
/* XXX: slurry */
if (pf->pf_op == PUFFS_INVAL_NAMECACHE_ALL) {
cache_purgevfs(PMPTOMP(pmp));
+ VFS_UNLOCK_GIANT(vfslocked);
rv = 0;
goto out;
}
@@ -810,9 +813,12 @@
* userspace waiting for us to complete ==> deadlock. Another
* reason we need to eventually bump locking to userspace, as we
* will need to lock the node if we wish to do flushes.
+ *
+ * XXX_TS: Lock vnode, there is no locks held while in userspace
*/
- rv = puffs_cookie2vnode(pmp, pf->pf_cookie, 0, 0, &vp);
+ rv = puffs_cookie2vnode(pmp, pf->pf_cookie, LK_EXCLUSIVE, 0, &vp);
if (rv) {
+ VFS_UNLOCK_GIANT(vfslocked);
if (rv == PUFFS_NOSUCHCOOKIE)
rv = ENOENT;
goto out;
@@ -855,7 +861,9 @@
rv = EINVAL;
}
+ VOP_UNLOCK(vp, 0);
vrele(vp);
+ VFS_UNLOCK_GIANT(vfslocked);
out:
puffs_msg_sendresp(pmp, &pf->pf_req, rv);
==== //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_node.c#8 (text+ko) ====
@@ -465,7 +465,6 @@
mtx_assert(&pn->pn_mtx, MA_OWNED);
pn->pn_refcount++;
- DPRINTF(("puffs_referencenode: pn_refcount=%d pn_vp=%p\n", pn->pn_refcount, pn->pn_vp));
}
/*
@@ -487,7 +486,6 @@
knlist_destroy(&pn->pn_sel.si_note);
uma_zfree(puffs_pnpool, pn);
} else {
- DPRINTF(("puffs_releasenode: pn_refcount=%d pn_vp=%p\n", pn->pn_refcount, pn->pn_vp));
mtx_unlock(&pn->pn_mtx);
}
}
@@ -527,7 +525,6 @@
mtx_lock(&pn->pn_mtx);
puffs_referencenode(pn);
mtx_unlock(&pn->pn_mtx);
- DPRINTF(("puffs_unlockvnode: unlocking vnode %p; vrefcnt=%d\n", vp, vrefcnt(vp)));
vref(vp);
if (ltype)
*ltype = VOP_ISLOCKED(vp);
==== //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_vfsops.c#7 (text+ko) ====
@@ -198,6 +198,7 @@
MNT_ILOCK(mp);
mp->mnt_flag &= ~MNT_LOCAL; /* we don't really know, so ... */
+ mp->mnt_kern_flag |= MNTK_MPSAFE;
MNT_IUNLOCK(mp);
pmp->pmp_status = PUFFSTAT_MOUNTING;
==== //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_vnops.c#8 (text+ko) ====
@@ -199,29 +199,21 @@
isdot = cnp->cn_namelen == 1 && *cnp->cn_nameptr == '.';
- 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
*/
if (PUFFS_USE_NAMECACHE(pmp)) {
- DPRINTF(("puffs_lookup: use name cache\n"));
error = cache_lookup(dvp, ap->a_vpp, cnp);
if (error == -1) {
- DPRINTF(("puffs_lookup: cache_lookup(%s): vp=%p\n", cnp->cn_nameptr, *ap->a_vpp));
return 0;
}
if (error == ENOENT) {
- DPRINTF(("puffs_lookup: cache_lookup(%s): negative\n", cnp->cn_nameptr));
return error;
}
- DPRINTF(("puffs_lookup: cache_lookup(%s): failed\n", cnp->cn_nameptr));
}
if (isdot) {
- DPRINTF(("puffs_lookup: isdot: %.*s\n", (int) cnp->cn_namelen, cnp->cn_nameptr));
vp = ap->a_dvp;
vref(vp);
*ap->a_vpp = vp;
@@ -232,10 +224,6 @@
puffs_makecn(&lookup_msg->pvnr_cn, &lookup_msg->pvnr_cn_cred,
cnp, PUFFS_USE_FULLPNBUF(pmp));
- if (cnp->cn_flags & ISDOTDOT) {
- DPRINTF(("puffs_lookup: ISDOTDOT\n"));
- }
-
puffs_msg_setinfo(park_lookup, PUFFSOP_VN,
PUFFS_VN_LOOKUP, VPTOPNC(dvp));
@@ -324,7 +312,6 @@
out:
PUFFS_MSG_RELEASE(lookup);
- DPRINTF(("puffs_lookup: returning %d %p\n", error, *ap->a_vpp));
return error;
}
@@ -340,9 +327,6 @@
int dltype;
int error;
- DPRINTF(("puffs_create: dvp %p, cnp: %s\n",
- dvp, ap->a_cnp->cn_nameptr));
-
PUFFS_MSG_ALLOC(vn, create);
puffs_makecn(&create_msg->pvnr_cn, &create_msg->pvnr_cn_cred,
cnp, PUFFS_USE_FULLPNBUF(pmp));
@@ -376,7 +360,6 @@
out:
PUFFS_MSG_RELEASE(create);
- DPRINTF(("puffs_create: return %d\n", error));
return error;
}
@@ -421,7 +404,6 @@
out:
PUFFS_MSG_RELEASE(mknod);
- DPRINTF(("puff_mknod: returning %d\n", error));
return error;
}
@@ -436,8 +418,6 @@
int ltype;
int error;
- DPRINTF(("puffs_open: vp %p, mode 0x%x\n", vp, mode));
-
if (vp->v_type == VREG && mode & FWRITE && !EXISTSOP(pmp, WRITE))
return EROFS;
@@ -461,7 +441,6 @@
/* calls VOP_GETATTR */
vnode_create_vobject(vp, 0, ap->a_td);
}
- DPRINTF(("puffs_open: returning %d\n", error));
return error;
}
@@ -540,7 +519,6 @@
int ltype;
int error = 0;
- DPRINTF(("puffs_getattr: vp %p\n", vp));
vap = ap->a_vap;
PUFFS_MSG_ALLOC(vn, getattr);
@@ -703,20 +681,23 @@
struct vnode *vp = ap->a_vp;
struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount);
struct puffs_node *pnode;
- int error;
pnode = vp->v_data;
if (doinact(pmp, pnode->pn_stat & PNODE_DOINACT)) {
+ /*
+ * do not wait for reply from userspace, otherwise it may
+ * deadlock.
+ */
PUFFS_MSG_ALLOC(vn, inactive);
+ puffs_msg_setfaf(park_inactive);
puffs_msg_setinfo(park_inactive, PUFFSOP_VN,
PUFFS_VN_INACTIVE, VPTOPNC(vp));
- PUFFS_MSG_ENQUEUEWAIT2(pmp, park_inactive, vp->v_data,
- NULL, error);
+ puffs_msg_enqueue(pmp, park_inactive);
PUFFS_MSG_RELEASE(inactive);
}
- DPRINTF(("puffs_vnop_inactive: vp=%p; lock_class=%p\n", vp, LOCK_CLASS(&vp->v_lock.lock_object)));
+ DPRINTF(("puffs_vnop_inactive: vp=%p\n", vp));
pnode->pn_stat &= ~PNODE_DOINACT;
/*
@@ -1038,8 +1019,6 @@
int dltype;
int error;
- DPRINTF(("puffs_vnop_mkdir: %.*s\n", (int) cnp->cn_namelen, cnp->cn_nameptr));
-
PUFFS_MSG_ALLOC(vn, mkdir);
puffs_makecn(&mkdir_msg->pvnr_cn, &mkdir_msg->pvnr_cn_cred,
cnp, PUFFS_USE_FULLPNBUF(pmp));
@@ -1631,6 +1610,9 @@
int ltype;
int error;
+ if (!EXISTSOP(pmp, PATHCONF))
+ return EINVAL;
+
PUFFS_MSG_ALLOC(vn, pathconf);
pathconf_msg->pvnr_name = ap->a_name;
puffs_msg_setinfo(park_pathconf, PUFFSOP_VN,
@@ -1869,28 +1851,6 @@
#endif
static int
-puffs_vnop_getpages(struct vop_getpages_args *ap)
-{
- struct vnode *vp = ap->a_vp;
- struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount);
-
- if (!PUFFS_USE_PAGECACHE(pmp))
- return EOPNOTSUPP;
- return vop_stdgetpages(ap);
-}
-
-static int
-puffs_vnop_putpages(struct vop_putpages_args *ap)
-{
- struct vnode *vp = ap->a_vp;
- struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount);
-
- if (!PUFFS_USE_PAGECACHE(pmp))
- return EOPNOTSUPP;
- return vop_stdputpages(ap);
-}
-
-static int
puffs_fifo_close(struct vop_close_args *ap)
{
puffs_updatenode(VPTOPP(ap->a_vp), PUFFS_UPDATEATIME | PUFFS_UPDATEMTIME, 0);
@@ -1931,8 +1891,8 @@
.vop_vptofh = puffs_vnop_vptofh,
.vop_strategy = VOP_PANIC,
.vop_bmap = VOP_EOPNOTSUPP,
- .vop_getpages = puffs_vnop_getpages,
- .vop_putpages = puffs_vnop_putpages,
+ .vop_getpages = vop_stdgetpages,
+ .vop_putpages = vop_stdputpages,
};
/*
More information about the p4-projects
mailing list