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