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.