+ }
+do_io:
+ /*
+ * This is the "unusual" path. We come here during
+ * startup or after an lseek. We invalidate the
+ * ahead window and get some I/O underway for the new
+ * current window.
+ */
+ if (!first_access) {
+ /* Heuristic: there is a high probability
+ * that around ra->average number of
+ * pages shall be accessed in the next
+ * current window.
+ */
+ average = ra->average;
+ if (ra->currnt_wnd_hit > average)
+ average = (ra->currnt_wnd_hit + ra->average + 1) / 2;
+
+ ra->next_size = min(average , (unsigned long)max);
+ }
+ ra->start = offset;
+ ra->size = ra->next_size;
+ ra->ahead_start = 0; /* Invalidate these */
+ ra->ahead_size = 0;
+ actual = do_page_cache_readahead(mapping, filp, offset,
+ ra->size);
+ if(!first_access) {
+ /*
+ * do not adjust the readahead window size the first
+ * time, the ahead window might get closed if all
+ * the pages are already in the cache.
+ */
+ check_ra_success(ra, ra->size, actual, orig_next_size);
+ }
+ } else {
+ /*
+ * This read request is within the current window. It may be
+ * time to submit I/O for the ahead window while the
+ * application is about to step into the ahead window.
+ */
+ if (ra->ahead_start == 0) {
+ /*
+ * If the average io-size is more than maximum
+ * readahead size of the file the io pattern is
+ * sequential. Hence bring in the readahead window
+ * immediately.
+ * If the average io-size is less than maximum
+ * readahead size of the file the io pattern is
+ * random. Hence don't bother to readahead.
+ */
+ average = ra->average;
+ if (ra->currnt_wnd_hit > average)
+ average = (ra->currnt_wnd_hit + ra->average + 1) / 2;
+
+ if (average > max) {
+ ra->ahead_start = ra->start + ra->size;
+ ra->ahead_size = ra->next_size;
+ actual = do_page_cache_readahead(mapping, filp,
+ ra->ahead_start, ra->ahead_size);
+ check_ra_success(ra, ra->ahead_size,
+ actual, orig_next_size);
+ }
+ }