summaryrefslogtreecommitdiffstats
path: root/sys/nfs
diff options
context:
space:
mode:
authordillon <dillon@FreeBSD.org>2001-02-28 04:13:11 +0000
committerdillon <dillon@FreeBSD.org>2001-02-28 04:13:11 +0000
commitf1c1ec2babf0f143df9be6d307aedca0505ea5e5 (patch)
tree456c8ff2f2660f28d4c071e5678b5032aee74fa6 /sys/nfs
parent2ab101b2392bc752f7731c63d3753c60e65c4432 (diff)
downloadFreeBSD-src-f1c1ec2babf0f143df9be6d307aedca0505ea5e5.zip
FreeBSD-src-f1c1ec2babf0f143df9be6d307aedca0505ea5e5.tar.gz
Fix lockup for loopback NFS mounts. The pipelined I/O limitations could be
hit on the client side and prevent the server side from retiring writes. Pipeline operations turned off for all READs (no big loss since reads are usually synchronous) and for NFS writes, and left on for the default bwrite(). (MFC expected prior to 4.3 freeze) Testing by: mjacob, dillon
Diffstat (limited to 'sys/nfs')
-rw-r--r--sys/nfs/nfs_vnops.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/nfs/nfs_vnops.c b/sys/nfs/nfs_vnops.c
index 37b977c..d889cf4 100644
--- a/sys/nfs/nfs_vnops.c
+++ b/sys/nfs/nfs_vnops.c
@@ -2869,6 +2869,9 @@ again:
* NOTE: we are not clearing B_DONE here, so we have
* to do it later on in this routine if we intend to
* initiate I/O on the bp.
+ *
+ * Note: to avoid loopback deadlocks, we do not
+ * assign b_runningbufspace.
*/
if (wcred == NULL)
wcred = bp->b_wcred;
@@ -3142,7 +3145,12 @@ nfs_writebp(bp, force, procp)
curproc->p_stats->p_ru.ru_oublock++;
splx(s);
+ /*
+ * Note: to avoid loopback deadlocks, we do not
+ * assign b_runningbufspace.
+ */
vfs_busy_pages(bp, 1);
+
if (force)
bp->b_flags |= B_WRITEINPROG;
BUF_KERNPROC(bp);
OpenPOWER on IntegriCloud