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_ */