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>