From owner-p4-projects@FreeBSD.ORG Mon Jul 18 07:43:17 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D0C5D1065675; Mon, 18 Jul 2011 07:43:17 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 932971065672 for ; Mon, 18 Jul 2011 07:43:17 +0000 (UTC) (envelope-from ilya@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 7FD208FC0A for ; Mon, 18 Jul 2011 07:43:17 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p6I7hHkW035330 for ; Mon, 18 Jul 2011 07:43:17 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p6I7hHnm035327 for perforce@freebsd.org; Mon, 18 Jul 2011 07:43:17 GMT (envelope-from ilya@FreeBSD.org) Date: Mon, 18 Jul 2011 07:43:17 GMT Message-Id: <201107180743.p6I7hHnm035327@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to ilya@FreeBSD.org using -f From: Ilya Putsikau To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 196334 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Jul 2011 07:43:18 -0000 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); }