Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 18 Jul 2011 07:43:17 GMT
From:      Ilya Putsikau <ilya@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 196334 for review
Message-ID:  <201107180743.p6I7hHnm035327@skunkworks.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@196334?ac=10

Change 196334 by ilya@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);
     }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201107180743.p6I7hHnm035327>