svn commit: r239930 - projects/fuse/sys/fs/fuse

Attilio Rao attilio at FreeBSD.org
Fri Aug 31 00:11:31 UTC 2012


Author: attilio
Date: Fri Aug 31 00:11:30 2012
New Revision: 239930
URL: http://svn.freebsd.org/changeset/base/239930

Log:
  Mimic Linux behaviour and disable signals delivery for fuse libs user
  while waiting for deamon notifications.
  Otherwise the fuse libs user gets interrupted by spourious signals
  sent by the deamon.
  
  In collaboration with:	pho
  Tested by:	Gustau Perez i Querol

Modified:
  projects/fuse/sys/fs/fuse/fuse_ipc.c

Modified: projects/fuse/sys/fs/fuse/fuse_ipc.c
==============================================================================
--- projects/fuse/sys/fs/fuse/fuse_ipc.c	Thu Aug 30 23:54:49 2012	(r239929)
+++ projects/fuse/sys/fs/fuse/fuse_ipc.c	Fri Aug 31 00:11:30 2012	(r239930)
@@ -72,6 +72,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/proc.h>
 #include <sys/mount.h>
 #include <sys/vnode.h>
+#include <sys/signalvar.h>
+#include <sys/syscallsubr.h>
 #include <sys/sysctl.h>
 #include <vm/uma.h>
 
@@ -124,6 +126,27 @@ SYSCTL_INT(_vfs_fuse, OID_AUTO, iov_cred
 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 *ftic
 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 *
 		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)) {


More information about the svn-src-projects mailing list