PERFORCE change 196334 for review
Ilya Putsikau
ilya at FreeBSD.org
Mon Jul 18 07:43:18 UTC 2011
http://p4web.freebsd.org/@@196334?ac=10
Change 196334 by ilya at ilya_triton2011 on 2011/07/18 07:42:48
Add fuse_vnode_setparent
Increase minimal message size to 160 bytes (macfuse)
Locking fixes
Affected files ...
.. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_device.c#11 edit
.. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.c#11 edit
.. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.h#12 edit
.. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.c#18 edit
.. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.h#18 edit
.. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#40 edit
Differences ...
==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_device.c#11 (text+ko) ====
@@ -140,6 +140,7 @@
goto out;
}
dev->si_drv1 = NULL;
+ fuse_lck_mtx_unlock(data->aw_mtx);
FUSE_UNLOCK();
fdata_destroy(data);
==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.c#11 (text+ko) ====
@@ -138,11 +138,13 @@
{
struct fuse_ticket *ftick;
- debug_printf("data=%p\n", data);
+ ftick = malloc(sizeof(*ftick), M_FUSEMSG, M_WAITOK | M_ZERO);
- ftick = malloc(sizeof(*ftick), M_FUSEMSG, M_WAITOK | M_ZERO);
+ debug_printf("ftick=%p data=%p\n", ftick, data);
+ mtx_lock(&data->ticket_mtx);
ftick->tk_unique = data->ticketer++;
+ mtx_unlock(&data->ticket_mtx);
ftick->tk_data = data;
fiov_init(&ftick->tk_ms_fiov, sizeof(struct fuse_in_header));
@@ -183,6 +185,12 @@
{
debug_printf("ftick=%p\n", ftick);
+ KASSERT(ftick->tk_ms_link.stqe_next == NULL,
+ ("FUSE: destroying ticket still on message list %p", ftick));
+ KASSERT(ftick->tk_aw_link.tqe_next == NULL &&
+ ftick->tk_aw_link.tqe_prev == NULL,
+ ("FUSE: destroying ticket still on answer delivery list %p", ftick));
+
fiov_teardown(&ftick->tk_ms_fiov);
mtx_destroy(&ftick->tk_aw_mtx);
@@ -225,13 +233,13 @@
}
out:
- fuse_lck_mtx_unlock(ftick->tk_aw_mtx);
-
if (!(err || fticket_answered(ftick))) {
debug_printf("FUSE: requester was woken up but still no answer");
err = ENXIO;
}
+ fuse_lck_mtx_unlock(ftick->tk_aw_mtx);
+
return err;
}
==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.h#12 (text+ko) ====
@@ -25,7 +25,7 @@
(spc2) = (char *)(fiov)->base + (sizeof(*(spc1))); \
} while (0)
-#define FU_AT_LEAST(siz) max((siz), 128)
+#define FU_AT_LEAST(siz) max((siz), 160)
struct fuse_ticket;
struct fuse_data;
@@ -79,6 +79,7 @@
fticket_answered(struct fuse_ticket *ftick)
{
DEBUGX(FUSE_DEBUG_IPC, "-> ftick=%p\n", ftick);
+ mtx_assert(&ftick->tk_aw_mtx, MA_OWNED);
return (ftick->tk_flag & FT_ANSW);
}
@@ -87,6 +88,7 @@
fticket_set_answered(struct fuse_ticket *ftick)
{
DEBUGX(FUSE_DEBUG_IPC, "-> ftick=%p\n", ftick);
+ mtx_assert(&ftick->tk_aw_mtx, MA_OWNED);
ftick->tk_flag |= FT_ANSW;
}
@@ -190,6 +192,7 @@
fuse_ms_push(struct fuse_ticket *ftick)
{
DEBUGX(FUSE_DEBUG_IPC, "-> ftick=%p\n", ftick);
+ mtx_assert(&ftick->tk_data->ms_mtx, MA_OWNED);
STAILQ_INSERT_TAIL(&ftick->tk_data->ms_head, ftick, tk_ms_link);
}
@@ -200,9 +203,13 @@
struct fuse_ticket *ftick = NULL;
DEBUGX(FUSE_DEBUG_IPC, "-> data=%p\n", data);
+ mtx_assert(&data->ms_mtx, MA_OWNED);
if ((ftick = STAILQ_FIRST(&data->ms_head))) {
STAILQ_REMOVE_HEAD(&data->ms_head, tk_ms_link);
+#ifdef INVARIANTS
+ ftick->tk_ms_link.stqe_next = NULL;
+#endif
}
return ftick;
@@ -213,6 +220,7 @@
fuse_aw_push(struct fuse_ticket *ftick)
{
DEBUGX(FUSE_DEBUG_IPC, "-> ftick=%p\n", ftick);
+ mtx_assert(&ftick->tk_data->aw_mtx, MA_OWNED);
TAILQ_INSERT_TAIL(&ftick->tk_data->aw_head, ftick, tk_aw_link);
}
@@ -222,6 +230,10 @@
{
DEBUGX(FUSE_DEBUG_IPC, "-> ftick=%p\n", ftick);
TAILQ_REMOVE(&ftick->tk_data->aw_head, ftick, tk_aw_link);
+#ifdef INVARIANTS
+ ftick->tk_aw_link.tqe_next = NULL;
+ ftick->tk_aw_link.tqe_prev = NULL;
+#endif
}
static __inline__
@@ -231,6 +243,7 @@
struct fuse_ticket *ftick = NULL;
DEBUGX(FUSE_DEBUG_IPC, "-> data=%p\n", data);
+ mtx_assert(&ftick->tk_data->aw_mtx, MA_OWNED);
if ((ftick = TAILQ_FIRST(&data->aw_head))) {
fuse_aw_remove(ftick);
==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.c#18 (text+ko) ====
@@ -186,7 +186,7 @@
if (dvp != NULL && vnode_vtype(*vpp) == VDIR) {
MPASS((cnp->cn_flags & ISDOTDOT) == 0);
MPASS(!(cnp->cn_namelen == 1 && cnp->cn_nameptr[0] == '.'));
- VTOFUD(*vpp)->parent_nid = VTOI(dvp);
+ fuse_vnode_setparent(*vpp, dvp);
}
if (dvp != NULL && cnp != NULL && (cnp->cn_flags & MAKEENTRY) != 0) {
ASSERT_VOP_LOCKED(*vpp, "fuse_vnode_get");
==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.h#18 (text+ko) ====
@@ -70,6 +70,15 @@
return (fuse_mmap_enable && fuse_data_cache_enable);
}
+static __inline void
+fuse_vnode_setparent(struct vnode *vp, struct vnode *dvp)
+{
+ if (vp->v_type == VDIR) {
+ MPASS(dvp->v_type == VDIR);
+ VTOFUD(vp)->parent_nid = VTOI(dvp);
+ }
+}
+
int fuse_isvalid_attr(struct vnode *vp);
void fuse_vnode_destroy(struct vnode *vp);
==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#40 (text+ko) ====
@@ -935,8 +935,7 @@
goto out;
}
if (vnode_vtype(vp) == VDIR) {
- VTOFUD(vp)->parent_nid = VTOI(dvp);
- //SETPARENT(vp, dvp);
+ fuse_vnode_setparent(vp, dvp);
}
*vpp = vp;
}
@@ -1455,6 +1454,7 @@
}
if (tvp != NULL && tvp != fvp) {
+ fuse_vnode_setparent(tvp, tdvp);
cache_purge(tvp);
}
More information about the p4-projects
mailing list