Index: sys/fs/fuse/fuse_vnops.c =================================================================== --- sys/fs/fuse/fuse_vnops.c (revision 239202) +++ sys/fs/fuse/fuse_vnops.c (working copy) @@ -659,9 +659,6 @@ fuse_vnop_link(struct vop_link_args *ap) fuse_invalidate_attr(tdvp); fuse_invalidate_attr(vp); - if (err == 0) { - VTOFUD(vp)->nlookup++; - } out: fdisp_destroy(&fdi); return err; Index: sys/fs/fuse/fuse_ipc.c =================================================================== --- sys/fs/fuse/fuse_ipc.c (revision 239202) +++ sys/fs/fuse/fuse_ipc.c (working copy) @@ -72,6 +72,8 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include #include #include @@ -124,6 +126,27 @@ SYSCTL_INT(_vfs_fuse, OID_AUTO, iov_credit, CTLFLA MALLOC_DEFINE(M_FUSEMSG, "fuse_msgbuf", "fuse message buffer"); static uma_zone_t ticket_zone; +static void +fuse_block_sigs(sigset_t *oldset) +{ + sigset_t newset; + + SIGFILLSET(newset); + SIGDELSET(newset, SIGKILL); + if (kern_sigprocmask(curthread, SIG_BLOCK, &newset, oldset, 0)) + panic("%s: Invalid operation for kern_sigprocmask()", + __func__); +} + +static void +fuse_restore_sigs(sigset_t *oldset) +{ + + if (kern_sigprocmask(curthread, SIG_SETMASK, oldset, NULL, 0)) + panic("%s: Invalid operation for kern_sigprocmask()", + __func__); +} + void fiov_init(struct fuse_iov *fiov, size_t size) { @@ -289,6 +312,7 @@ fticket_refresh(struct fuse_ticket *ftick) static int fticket_wait_answer(struct fuse_ticket *ftick) { + sigset_t tset; int err = 0; struct fuse_data *data; @@ -305,8 +329,10 @@ fticket_wait_answer(struct fuse_ticket *ftick) fticket_set_answered(ftick); goto out; } + fuse_block_sigs(&tset); err = msleep(ftick, &ftick->tk_aw_mtx, PCATCH, "fu_ans", data->daemon_timeout * hz); + fuse_restore_sigs(&tset); if (err == EAGAIN) { /* same as EWOULDBLOCK */ #ifdef XXXIP /* die conditionally */ if (!fdata_get_dead(data)) {