.. | .. |
---|
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 | |
---|