kernel - Fix clustered read bug
authorMatthew Dillon <dillon@apollo.backplane.com>
Tue, 20 Mar 2012 00:11:09 +0000 (17:11 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Tue, 20 Mar 2012 00:11:09 +0000 (17:11 -0700)
* cluster_read() was improperly reducing the 'maxra' variable when
  handling the read-ahead mark, creating a degenerate situation which
  would cause only the first few burst reads from a file to cluster,
  and the remainder to read-ahead but not cluster.

sys/kern/vfs_cluster.c

index cfdfc10..6fd3cae 100644 (file)
@@ -217,7 +217,14 @@ cluster_readx(struct vnode *vp, off_t filesize, off_t loffset,
                 */
                if (i >= maxra)
                        return 0;
-               maxra -= i;
+
+               /*
+                * Calculate where to start the read-ahead and how much
+                * to do.  Generally speaking we want to read-ahead by
+                * (maxra) when we've found a read-ahead mark.  We do
+                * not want to reduce maxra here as it will cause
+                * successive read-ahead I/O's to be smaller and smaller.
+                */
                loffset += i * blksize;
                reqbp = bp = NULL;
        } else {
@@ -504,9 +511,11 @@ cluster_rbuild(struct vnode *vp, off_t filesize, off_t loffset, off_t doffset,
                        }
 
                        /*
-                        * Set a read-ahead mark as appropriate
+                        * Set a read-ahead mark as appropriate.  Always
+                        * set the read-ahead mark at (run - 1).  It is
+                        * unclear why we were also setting it at i == 1.
                         */
-                       if (i == 1 || i == (run - 1))
+                       if (/*i == 1 ||*/ i == (run - 1))
                                cluster_setram(tbp);
 
                        /*