}
 
 static bool filemap_range_uptodate(struct address_space *mapping,
-               loff_t pos, struct iov_iter *iter, struct folio *folio)
+               loff_t pos, size_t count, struct folio *folio,
+               bool need_uptodate)
 {
-       int count;
-
        if (folio_test_uptodate(folio))
                return true;
        /* pipes can't handle partially uptodate pages */
-       if (iov_iter_is_pipe(iter))
+       if (need_uptodate)
                return false;
        if (!mapping->a_ops->is_partially_uptodate)
                return false;
        if (mapping->host->i_blkbits >= folio_shift(folio))
                return false;
 
-       count = iter->count;
        if (folio_pos(folio) > pos) {
                count -= folio_pos(folio) - pos;
                pos = 0;
 }
 
 static int filemap_update_page(struct kiocb *iocb,
-               struct address_space *mapping, struct iov_iter *iter,
-               struct folio *folio)
+               struct address_space *mapping, size_t count,
+               struct folio *folio, bool need_uptodate)
 {
        int error;
 
                goto unlock;
 
        error = 0;
-       if (filemap_range_uptodate(mapping, iocb->ki_pos, iter, folio))
+       if (filemap_range_uptodate(mapping, iocb->ki_pos, count, folio,
+                                  need_uptodate))
                goto unlock;
 
        error = -EAGAIN;
        return 0;
 }
 
-static int filemap_get_pages(struct kiocb *iocb, struct iov_iter *iter,
-               struct folio_batch *fbatch)
+static int filemap_get_pages(struct kiocb *iocb, size_t count,
+               struct folio_batch *fbatch, bool need_uptodate)
 {
        struct file *filp = iocb->ki_filp;
        struct address_space *mapping = filp->f_mapping;
        int err = 0;
 
        /* "last_index" is the index of the page beyond the end of the read */
-       last_index = DIV_ROUND_UP(iocb->ki_pos + iter->count, PAGE_SIZE);
+       last_index = DIV_ROUND_UP(iocb->ki_pos + count, PAGE_SIZE);
 retry:
        if (fatal_signal_pending(current))
                return -EINTR;
                if ((iocb->ki_flags & IOCB_WAITQ) &&
                    folio_batch_count(fbatch) > 1)
                        iocb->ki_flags |= IOCB_NOWAIT;
-               err = filemap_update_page(iocb, mapping, iter, folio);
+               err = filemap_update_page(iocb, mapping, count, folio,
+                                         need_uptodate);
                if (err)
                        goto err;
        }
                if (unlikely(iocb->ki_pos >= i_size_read(inode)))
                        break;
 
-               error = filemap_get_pages(iocb, iter, &fbatch);
+               error = filemap_get_pages(iocb, iter->count, &fbatch,
+                                         iov_iter_is_pipe(iter));
                if (error < 0)
                        break;