]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - mm/readahead.c
scsi: target: cxgbit: Fix cxgbit_fw4_ack()
[mirror_ubuntu-bionic-kernel.git] / mm / readahead.c
index c4ca702392333288448cc7ae4ba6b410ddb93fef..59aa0d06f25468c7578b132dba69f20e81525f87 100644 (file)
@@ -380,6 +380,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;
 
        /*
@@ -469,10 +470,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);