Module Name: src Committed By: manu Date: Fri Oct 31 15:20:08 UTC 2014
Modified Files: src/lib/libperfuse: ops.c Log Message: Avoid deadlocks on write errors On write errors, we failed to dequeue some operations, leading to rare but unpleasant deadlocks To generate a diff of this commit: cvs rdiff -u -r1.78 -r1.79 src/lib/libperfuse/ops.c 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/ops.c diff -u src/lib/libperfuse/ops.c:1.78 src/lib/libperfuse/ops.c:1.79 --- src/lib/libperfuse/ops.c:1.78 Fri Oct 31 15:12:15 2014 +++ src/lib/libperfuse/ops.c Fri Oct 31 15:20:08 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: ops.c,v 1.78 2014/10/31 15:12:15 manu Exp $ */ +/* $NetBSD: ops.c,v 1.79 2014/10/31 15:20:08 manu Exp $ */ /*- * Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved. @@ -3299,6 +3299,7 @@ perfuse_node_write2(struct puffs_usermou if (*resid != 0) error = EFBIG; +out: #ifdef PERFUSE_DEBUG if (perfuse_diagflags & PDF_RESIZE) { if (offset > (off_t)vap->va_size) @@ -3315,16 +3316,6 @@ perfuse_node_write2(struct puffs_usermou if (offset > (off_t)vap->va_size) vap->va_size = offset; - if (inresize) { -#ifdef PERFUSE_DEBUG - if (!(pnd->pnd_flags & PND_INRESIZE)) - DERRX(EX_SOFTWARE, "file write grow without resize"); -#endif - pnd->pnd_flags &= ~PND_INRESIZE; - (void)dequeue_requests(opc, PCQ_RESIZE, DEQUEUE_ALL); - } - - /* * Statistics */ @@ -3344,7 +3335,15 @@ perfuse_node_write2(struct puffs_usermou __func__, (void*)opc, perfuse_node_path(ps, opc)); #endif -out: + if (inresize) { +#ifdef PERFUSE_DEBUG + if (!(pnd->pnd_flags & PND_INRESIZE)) + DERRX(EX_SOFTWARE, "file write grow without resize"); +#endif + pnd->pnd_flags &= ~PND_INRESIZE; + (void)dequeue_requests(opc, PCQ_RESIZE, DEQUEUE_ALL); + } + /* * VOP_PUTPAGE causes FAF write where kernel does not * check operation result. At least warn if it failed.