| .. | .. |
|---|
| 2211 | 2211 | |
|---|
| 2212 | 2212 | if (unlikely(*ppos >= inode->i_sb->s_maxbytes)) |
|---|
| 2213 | 2213 | return 0; |
|---|
| 2214 | + if (unlikely(!iov_iter_count(iter))) |
|---|
| 2215 | + return 0; |
|---|
| 2216 | + |
|---|
| 2214 | 2217 | iov_iter_truncate(iter, inode->i_sb->s_maxbytes); |
|---|
| 2215 | 2218 | |
|---|
| 2216 | 2219 | index = *ppos >> PAGE_SHIFT; |
|---|
| .. | .. |
|---|
| 2661 | 2664 | ra->start = max_t(long, 0, vmf->pgoff - ra->ra_pages / 2); |
|---|
| 2662 | 2665 | ra->size = ra->ra_pages; |
|---|
| 2663 | 2666 | 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); |
|---|
| 2664 | 2669 | ractl._index = ra->start; |
|---|
| 2665 | 2670 | do_page_cache_ra(&ractl, ra->size, ra->async_size); |
|---|
| 2666 | 2671 | return fpin; |
|---|
| .. | .. |
|---|
| 2736 | 2741 | |
|---|
| 2737 | 2742 | if (vmf->flags & FAULT_FLAG_SPECULATIVE) { |
|---|
| 2738 | 2743 | page = find_get_page(mapping, offset); |
|---|
| 2739 | | - if (unlikely(!page) || unlikely(PageReadahead(page))) |
|---|
| 2744 | + if (unlikely(!page)) |
|---|
| 2740 | 2745 | return VM_FAULT_RETRY; |
|---|
| 2741 | 2746 | |
|---|
| 2747 | + if (unlikely(PageReadahead(page))) |
|---|
| 2748 | + goto page_put; |
|---|
| 2749 | + |
|---|
| 2742 | 2750 | if (!trylock_page(page)) |
|---|
| 2743 | | - return VM_FAULT_RETRY; |
|---|
| 2751 | + goto page_put; |
|---|
| 2744 | 2752 | |
|---|
| 2745 | 2753 | if (unlikely(compound_head(page)->mapping != mapping)) |
|---|
| 2746 | 2754 | goto page_unlock; |
|---|
| .. | .. |
|---|
| 2772 | 2780 | return VM_FAULT_LOCKED; |
|---|
| 2773 | 2781 | page_unlock: |
|---|
| 2774 | 2782 | unlock_page(page); |
|---|
| 2783 | +page_put: |
|---|
| 2784 | + put_page(page); |
|---|
| 2775 | 2785 | return VM_FAULT_RETRY; |
|---|
| 2776 | 2786 | } |
|---|
| 2777 | 2787 | |
|---|