aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/kern/vfs_bio.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c
index 35d67d1b37bb..4c223a828c1b 100644
--- a/sys/kern/vfs_bio.c
+++ b/sys/kern/vfs_bio.c
@@ -2340,9 +2340,18 @@ brelse(struct buf *bp)
!(bp->b_flags & B_INVAL)) {
/*
* Failed write, redirty. All errors except ENXIO (which
- * means the device is gone) are expected to be potentially
- * transient - underlying media might work if tried again
- * after EIO, and memory might be available after an ENOMEM.
+ * means the device is gone) are treated as being
+ * transient.
+ *
+ * XXX Treating EIO as transient is not correct; the
+ * contract with the local storage device drivers is that
+ * they will only return EIO once the I/O is no longer
+ * retriable. Network I/O also respects this through the
+ * guarantees of TCP and/or the internal retries of NFS.
+ * ENOMEM might be transient, but we also have no way of
+ * knowing when its ok to retry/reschedule. In general,
+ * this entire case should be made obsolete through better
+ * error handling/recovery and resource scheduling.
*
* Do this also for buffers that failed with ENXIO, but have
* non-empty dependencies - the soft updates code might need