+ rbp = NULL;
+ if (!ISSEQREAD(vp, lblkno)) {
+ vp->v_ralen = 0;
+ vp->v_maxra = lblkno;
+ } else if ((ioblkno + 1) * size <= filesize && !alreadyincore &&
+ !(error = VOP_BMAP(vp, ioblkno, NULL, &blkno, &num_ra)) &&
+ blkno != -1) {
+ /*
+ * Reading sequentially, and the next block is not in the
+ * cache. We are going to try reading ahead.
+ */
+ if (num_ra) {
+ /*
+ * If our desired readahead block had been read
+ * in a previous readahead but is no longer in
+ * core, then we may be reading ahead too far
+ * or are not using our readahead very rapidly.
+ * In this case we scale back the window.
+ */
+ if (!alreadyincore && ioblkno <= vp->v_maxra)
+ vp->v_ralen = max(vp->v_ralen >> 1, 1);
+ /*
+ * There are more sequential blocks than our current
+ * window allows, scale up. Ideally we want to get
+ * in sync with the filesystem maxcontig value.
+ */
+ else if (num_ra > vp->v_ralen && lblkno != vp->v_lastr)
+ vp->v_ralen = vp->v_ralen ?
+ min(num_ra, vp->v_ralen << 1) : 1;
+
+ if (num_ra > vp->v_ralen)
+ num_ra = vp->v_ralen;
+ }
+
+ if (num_ra) /* case 2, 4 */
+ rbp = cluster_rbuild(vp, filesize,
+ bp, ioblkno, blkno, size, num_ra, flags);
+ else if (ioblkno == lblkno) {
+ bp->b_blkno = blkno;
+ /* Case 5: check how many blocks to read ahead */
+ ++ioblkno;
+ if ((ioblkno + 1) * size > filesize ||
+ incore(vp, ioblkno) || (error = VOP_BMAP(vp,
+ ioblkno, NULL, &blkno, &num_ra)) || blkno == -1)
+ goto skip_readahead;
+ /*
+ * Adjust readahead as above.
+ * Don't check alreadyincore, we know it is 0 from
+ * the previous conditional.
+ */
+ if (num_ra) {
+ if (ioblkno <= vp->v_maxra)
+ vp->v_ralen = max(vp->v_ralen >> 1, 1);
+ else if (num_ra > vp->v_ralen &&
+ lblkno != vp->v_lastr)
+ vp->v_ralen = vp->v_ralen ?
+ min(num_ra,vp->v_ralen<<1) : 1;
+ if (num_ra > vp->v_ralen)
+ num_ra = vp->v_ralen;
+ }
+ flags |= B_ASYNC;
+ if (num_ra)
+ rbp = cluster_rbuild(vp, filesize,
+ NULL, ioblkno, blkno, size, num_ra, flags);
+ else {
+ rbp = getblk(vp, ioblkno, size, 0, 0);
+ rbp->b_flags |= flags;
+ rbp->b_blkno = blkno;