Module Name:    src
Committed By:   manu
Date:           Fri Feb  3 15:54:15 UTC 2012

Modified Files:
        src/lib/libperfuse: perfuse.c
        src/usr.sbin/perfused: msg.c perfused.c perfused.h

Log Message:
Make sure perfused exit when the filesystem crashed, so that unmount
is done. Failure to do so caused deadlocks, with operation that
held a lock on the root vnode and got stuck in perfused forever.

Approved by releng.


To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.25 src/lib/libperfuse/perfuse.c
cvs rdiff -u -r1.18 -r1.19 src/usr.sbin/perfused/msg.c
cvs rdiff -u -r1.20 -r1.21 src/usr.sbin/perfused/perfused.c
cvs rdiff -u -r1.8 -r1.9 src/usr.sbin/perfused/perfused.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libperfuse/perfuse.c
diff -u src/lib/libperfuse/perfuse.c:1.24 src/lib/libperfuse/perfuse.c:1.25
--- src/lib/libperfuse/perfuse.c:1.24	Wed Dec 28 17:33:53 2011
+++ src/lib/libperfuse/perfuse.c	Fri Feb  3 15:54:15 2012
@@ -1,4 +1,4 @@
-/*  $NetBSD: perfuse.c,v 1.24 2011/12/28 17:33:53 manu Exp $ */
+/*  $NetBSD: perfuse.c,v 1.25 2012/02/03 15:54:15 manu Exp $ */
 
 /*-
  *  Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved.
@@ -242,6 +242,7 @@ perfuse_open(path, flags, mode)
 		/* NOTREACHED */
 		break;
 	case 0:
+		(void)close(sv[0]);
 		(void)execve(argv[0], argv, environ);
 #ifdef PERFUSE_DEBUG
 		DWARN("%s:%d: execve failed", __func__, __LINE__);
@@ -253,6 +254,7 @@ perfuse_open(path, flags, mode)
 		break;
 	}
 	
+	(void)close(sv[1]);
 	return sv[0];
 }
 

Index: src/usr.sbin/perfused/msg.c
diff -u src/usr.sbin/perfused/msg.c:1.18 src/usr.sbin/perfused/msg.c:1.19
--- src/usr.sbin/perfused/msg.c:1.18	Mon Jan 30 22:49:03 2012
+++ src/usr.sbin/perfused/msg.c	Fri Feb  3 15:54:15 2012
@@ -1,4 +1,4 @@
-/*  $NetBSD: msg.c,v 1.18 2012/01/30 22:49:03 christos Exp $ */
+/*  $NetBSD: msg.c,v 1.19 2012/02/03 15:54:15 manu Exp $ */
 
 /*-
  *  Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
@@ -488,14 +488,13 @@ perfused_readframe(struct puffs_usermoun
 
 	switch (readen = recv(fd, data, len, MSG_NOSIGNAL|MSG_PEEK)) {
 	case 0:
-		DWARNX("%s: recv retunred 0", __func__);
-		return ECONNRESET;
+		perfused_panic();
 		/* NOTREACHED */
 		break;
 	case -1:
 		if (errno == EAGAIN)
 			return 0;
-		DWARN("%s: recv retunred -1", __func__);
+		DWARN("%s: recv returned -1", __func__);
 		return errno;
 		/* NOTREACHED */
 		break;
@@ -535,14 +534,15 @@ perfused_readframe(struct puffs_usermoun
 
 	switch (readen = recv(fd, data, len, MSG_NOSIGNAL)) {
 	case 0:
-		DWARNX("%s: recv retunred 0", __func__);
-		return ECONNRESET;
+		DWARNX("%s: recv returned 0", __func__);
+		perfused_panic();
+		
 		/* NOTREACHED */
 		break;
 	case -1:
 		if (errno == EAGAIN)
 			return 0;
-		DWARN("%s: recv retunred -1", __func__);
+		DWARN("%s: recv returned -1", __func__);
 		return errno;
 		/* NOTREACHED */
 		break;
@@ -574,18 +574,25 @@ perfused_writeframe(struct puffs_usermou
 
 	switch (written = send(fd, data, len, MSG_NOSIGNAL)) {
 	case 0:
-		DWARNX("%s: send retunred 0", __func__);
+#ifdef PERFUSE_DEBUG
+		DERRX(EX_SOFTWARE, "%s: send returned 0", __func__);
+#else
 		return ECONNRESET;
+#endif
 		/* NOTREACHED */
 		break;
 	case -1:
-		DWARN("%s: send retunred -1, errno = %d", __func__, errno);
+		DWARN("%s: send returned -1, errno = %d", __func__, errno);
 		switch(errno) {
 		case EAGAIN:
 		case ENOBUFS:
 		case EMSGSIZE:
 			return 0;
 			break;
+		case EPIPE:
+			perfused_panic();
+			/* NOTREACHED */
+			break;
 		default:
 			return errno;
 			break;

Index: src/usr.sbin/perfused/perfused.c
diff -u src/usr.sbin/perfused/perfused.c:1.20 src/usr.sbin/perfused/perfused.c:1.21
--- src/usr.sbin/perfused/perfused.c:1.20	Mon Jan 30 22:49:03 2012
+++ src/usr.sbin/perfused/perfused.c	Fri Feb  3 15:54:15 2012
@@ -1,4 +1,4 @@
-/*  $NetBSD: perfused.c,v 1.20 2012/01/30 22:49:03 christos Exp $ */
+/*  $NetBSD: perfused.c,v 1.21 2012/02/03 15:54:15 manu Exp $ */
 
 /*-
  *  Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
@@ -481,3 +481,13 @@ main(int argc, char **argv)
 	/* NOTREACHED */
 	return 0;
 }
+
+void
+perfused_panic(void)
+{
+	DWARNX("filesystem crashed");
+	exit(EX_OK);
+
+	/* NOTREACHED */
+	return;
+}

Index: src/usr.sbin/perfused/perfused.h
diff -u src/usr.sbin/perfused/perfused.h:1.8 src/usr.sbin/perfused/perfused.h:1.9
--- src/usr.sbin/perfused/perfused.h:1.8	Mon Jan 30 22:49:03 2012
+++ src/usr.sbin/perfused/perfused.h	Fri Feb  3 15:54:15 2012
@@ -1,4 +1,4 @@
-/*  $NetBSD: perfused.h,v 1.8 2012/01/30 22:49:03 christos Exp $ */
+/*  $NetBSD: perfused.h,v 1.9 2012/02/03 15:54:15 manu Exp $ */
 
 /*-
  *  Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
@@ -66,6 +66,8 @@ perfuse_msg_t *perfused_new_pb(struct pu
 int perfused_xchg_pb(struct puffs_usermount *, perfuse_msg_t *, size_t, 
     enum perfuse_xchg_pb_reply);
 
+void perfused_panic(void);
+
 __END_DECLS
 
 #endif /* _PERFUSED_H_ */

Reply via email to