hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/mm/filemap.c
....@@ -2211,6 +2211,9 @@
22112211
22122212 if (unlikely(*ppos >= inode->i_sb->s_maxbytes))
22132213 return 0;
2214
+ if (unlikely(!iov_iter_count(iter)))
2215
+ return 0;
2216
+
22142217 iov_iter_truncate(iter, inode->i_sb->s_maxbytes);
22152218
22162219 index = *ppos >> PAGE_SHIFT;
....@@ -2661,6 +2664,8 @@
26612664 ra->start = max_t(long, 0, vmf->pgoff - ra->ra_pages / 2);
26622665 ra->size = ra->ra_pages;
26632666 ra->async_size = ra->ra_pages / 4;
2667
+ trace_android_vh_tune_mmap_readaround(ra->ra_pages, vmf->pgoff,
2668
+ &ra->start, &ra->size, &ra->async_size);
26642669 ractl._index = ra->start;
26652670 do_page_cache_ra(&ractl, ra->size, ra->async_size);
26662671 return fpin;
....@@ -2736,11 +2741,14 @@
27362741
27372742 if (vmf->flags & FAULT_FLAG_SPECULATIVE) {
27382743 page = find_get_page(mapping, offset);
2739
- if (unlikely(!page) || unlikely(PageReadahead(page)))
2744
+ if (unlikely(!page))
27402745 return VM_FAULT_RETRY;
27412746
2747
+ if (unlikely(PageReadahead(page)))
2748
+ goto page_put;
2749
+
27422750 if (!trylock_page(page))
2743
- return VM_FAULT_RETRY;
2751
+ goto page_put;
27442752
27452753 if (unlikely(compound_head(page)->mapping != mapping))
27462754 goto page_unlock;
....@@ -2772,6 +2780,8 @@
27722780 return VM_FAULT_LOCKED;
27732781 page_unlock:
27742782 unlock_page(page);
2783
+page_put:
2784
+ put_page(page);
27752785 return VM_FAULT_RETRY;
27762786 }
27772787