|
@@ -386,6 +386,7 @@ ondemand_readahead(struct address_space *mapping,
|
|
|
{
|
|
|
struct backing_dev_info *bdi = inode_to_bdi(mapping->host);
|
|
|
unsigned long max_pages = ra->ra_pages;
|
|
|
+ unsigned long add_pages;
|
|
|
pgoff_t prev_offset;
|
|
|
|
|
|
/*
|
|
@@ -475,10 +476,17 @@ readit:
|
|
|
* Will this read hit the readahead marker made by itself?
|
|
|
* If so, trigger the readahead marker hit now, and merge
|
|
|
* the resulted next readahead window into the current one.
|
|
|
+ * Take care of maximum IO pages as above.
|
|
|
*/
|
|
|
if (offset == ra->start && ra->size == ra->async_size) {
|
|
|
- ra->async_size = get_next_ra_size(ra, max_pages);
|
|
|
- ra->size += ra->async_size;
|
|
|
+ add_pages = get_next_ra_size(ra, max_pages);
|
|
|
+ if (ra->size + add_pages <= max_pages) {
|
|
|
+ ra->async_size = add_pages;
|
|
|
+ ra->size += add_pages;
|
|
|
+ } else {
|
|
|
+ ra->size = max_pages;
|
|
|
+ ra->async_size = max_pages >> 1;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return ra_submit(ra, mapping, filp);
|