|
@@ -339,33 +339,25 @@ ondemand_readahead(struct address_space *mapping,
|
|
unsigned long req_size)
|
|
unsigned long req_size)
|
|
{
|
|
{
|
|
unsigned long max = max_sane_readahead(ra->ra_pages);
|
|
unsigned long max = max_sane_readahead(ra->ra_pages);
|
|
- pgoff_t prev_offset;
|
|
|
|
- int sequential;
|
|
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * start of file
|
|
|
|
+ */
|
|
|
|
+ if (!offset)
|
|
|
|
+ goto initial_readahead;
|
|
|
|
|
|
/*
|
|
/*
|
|
* It's the expected callback offset, assume sequential access.
|
|
* It's the expected callback offset, assume sequential access.
|
|
* Ramp up sizes, and push forward the readahead window.
|
|
* Ramp up sizes, and push forward the readahead window.
|
|
*/
|
|
*/
|
|
- if (offset && (offset == (ra->start + ra->size - ra->async_size) ||
|
|
|
|
- offset == (ra->start + ra->size))) {
|
|
|
|
|
|
+ if ((offset == (ra->start + ra->size - ra->async_size) ||
|
|
|
|
+ offset == (ra->start + ra->size))) {
|
|
ra->start += ra->size;
|
|
ra->start += ra->size;
|
|
ra->size = get_next_ra_size(ra, max);
|
|
ra->size = get_next_ra_size(ra, max);
|
|
ra->async_size = ra->size;
|
|
ra->async_size = ra->size;
|
|
goto readit;
|
|
goto readit;
|
|
}
|
|
}
|
|
|
|
|
|
- prev_offset = ra->prev_pos >> PAGE_CACHE_SHIFT;
|
|
|
|
- sequential = offset - prev_offset <= 1UL || req_size > max;
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Standalone, small read.
|
|
|
|
- * Read as is, and do not pollute the readahead state.
|
|
|
|
- */
|
|
|
|
- if (!hit_readahead_marker && !sequential) {
|
|
|
|
- return __do_page_cache_readahead(mapping, filp,
|
|
|
|
- offset, req_size, 0);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* Hit a marked page without valid readahead state.
|
|
* Hit a marked page without valid readahead state.
|
|
* E.g. interleaved reads.
|
|
* E.g. interleaved reads.
|
|
@@ -391,12 +383,24 @@ ondemand_readahead(struct address_space *mapping,
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
- * It may be one of
|
|
|
|
- * - first read on start of file
|
|
|
|
- * - sequential cache miss
|
|
|
|
- * - oversize random read
|
|
|
|
- * Start readahead for it.
|
|
|
|
|
|
+ * oversize read
|
|
*/
|
|
*/
|
|
|
|
+ if (req_size > max)
|
|
|
|
+ goto initial_readahead;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * sequential cache miss
|
|
|
|
+ */
|
|
|
|
+ if (offset - (ra->prev_pos >> PAGE_CACHE_SHIFT) <= 1UL)
|
|
|
|
+ goto initial_readahead;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * standalone, small random read
|
|
|
|
+ * Read as is, and do not pollute the readahead state.
|
|
|
|
+ */
|
|
|
|
+ return __do_page_cache_readahead(mapping, filp, offset, req_size, 0);
|
|
|
|
+
|
|
|
|
+initial_readahead:
|
|
ra->start = offset;
|
|
ra->start = offset;
|
|
ra->size = get_init_ra_size(req_size, max);
|
|
ra->size = get_init_ra_size(req_size, max);
|
|
ra->async_size = ra->size > req_size ? ra->size - req_size : ra->size;
|
|
ra->async_size = ra->size > req_size ? ra->size - req_size : ra->size;
|