mm/filemap: add filemap_range_uptodate
[linux-2.6-microblaze.git] / mm / filemap.c
index 6ff2a3f..1eaafc9 100644 (file)
@@ -777,7 +777,6 @@ EXPORT_SYMBOL(file_write_and_wait_range);
  * replace_page_cache_page - replace a pagecache page with a new one
  * @old:       page to be replaced
  * @new:       page to replace with
- * @gfp_mask:  allocation mode
  *
  * This function replaces a page in the pagecache with a new one.  On
  * success it acquires the pagecache reference for the new page and
@@ -786,10 +785,8 @@ EXPORT_SYMBOL(file_write_and_wait_range);
  * caller must do that.
  *
  * The remove + add is atomic.  This function cannot fail.
- *
- * Return: %0
  */
-int replace_page_cache_page(struct page *old, struct page *new, gfp_t gfp_mask)
+void replace_page_cache_page(struct page *old, struct page *new)
 {
        struct address_space *mapping = old->mapping;
        void (*freepage)(struct page *) = mapping->a_ops->freepage;
@@ -824,8 +821,6 @@ int replace_page_cache_page(struct page *old, struct page *new, gfp_t gfp_mask)
        if (freepage)
                freepage(old);
        put_page(old);
-
-       return 0;
 }
 EXPORT_SYMBOL_GPL(replace_page_cache_page);
 
@@ -1348,61 +1343,26 @@ int wait_on_page_bit_killable(struct page *page, int bit_nr)
 }
 EXPORT_SYMBOL(wait_on_page_bit_killable);
 
-static int __wait_on_page_locked_async(struct page *page,
-                                      struct wait_page_queue *wait, bool set)
-{
-       struct wait_queue_head *q = page_waitqueue(page);
-       int ret = 0;
-
-       wait->page = page;
-       wait->bit_nr = PG_locked;
-
-       spin_lock_irq(&q->lock);
-       __add_wait_queue_entry_tail(q, &wait->wait);
-       SetPageWaiters(page);
-       if (set)
-               ret = !trylock_page(page);
-       else
-               ret = PageLocked(page);
-       /*
-        * If we were successful now, we know we're still on the
-        * waitqueue as we're still under the lock. This means it's
-        * safe to remove and return success, we know the callback
-        * isn't going to trigger.
-        */
-       if (!ret)
-               __remove_wait_queue(q, &wait->wait);
-       else
-               ret = -EIOCBQUEUED;
-       spin_unlock_irq(&q->lock);
-       return ret;
-}
-
-static int wait_on_page_locked_async(struct page *page,
-                                    struct wait_page_queue *wait)
-{
-       if (!PageLocked(page))
-               return 0;
-       return __wait_on_page_locked_async(compound_head(page), wait, false);
-}
-
 /**
  * put_and_wait_on_page_locked - Drop a reference and wait for it to be unlocked
  * @page: The page to wait for.
+ * @state: The sleep state (TASK_KILLABLE, TASK_UNINTERRUPTIBLE, etc).
  *
  * The caller should hold a reference on @page.  They expect the page to
  * become unlocked relatively soon, but do not wish to hold up migration
  * (for example) by holding the reference while waiting for the page to
  * come unlocked.  After this function returns, the caller should not
  * dereference @page.
+ *
+ * Return: 0 if the page was unlocked or -EINTR if interrupted by a signal.
  */
-void put_and_wait_on_page_locked(struct page *page)
+int put_and_wait_on_page_locked(struct page *page, int state)
 {
        wait_queue_head_t *q;
 
        page = compound_head(page);
        q = page_waitqueue(page);
-       wait_on_page_bit_common(q, page, PG_locked, TASK_UNINTERRUPTIBLE, DROP);
+       return wait_on_page_bit_common(q, page, PG_locked, state, DROP);
 }
 
 /**
@@ -1558,7 +1518,28 @@ EXPORT_SYMBOL_GPL(__lock_page_killable);
 
 int __lock_page_async(struct page *page, struct wait_page_queue *wait)
 {
-       return __wait_on_page_locked_async(page, wait, true);
+       struct wait_queue_head *q = page_waitqueue(page);
+       int ret = 0;
+
+       wait->page = page;
+       wait->bit_nr = PG_locked;
+
+       spin_lock_irq(&q->lock);
+       __add_wait_queue_entry_tail(q, &wait->wait);
+       SetPageWaiters(page);
+       ret = !trylock_page(page);
+       /*
+        * If we were successful now, we know we're still on the
+        * waitqueue as we're still under the lock. This means it's
+        * safe to remove and return success, we know the callback
+        * isn't going to trigger.
+        */
+       if (!ret)
+               __remove_wait_queue(q, &wait->wait);
+       else
+               ret = -EIOCBQUEUED;
+       spin_unlock_irq(&q->lock);
+       return ret;
 }
 
 /*
@@ -2173,192 +2154,199 @@ static void shrink_readahead_size_eio(struct file_ra_state *ra)
        ra->ra_pages /= 4;
 }
 
-static int lock_page_for_iocb(struct kiocb *iocb, struct page *page)
+/*
+ * filemap_get_read_batch - Get a batch of pages for read
+ *
+ * Get a batch of pages which represent a contiguous range of bytes
+ * in the file.  No tail pages will be returned.  If @index is in the
+ * middle of a THP, the entire THP will be returned.  The last page in
+ * the batch may have Readahead set or be not Uptodate so that the
+ * caller can take the appropriate action.
+ */
+static void filemap_get_read_batch(struct address_space *mapping,
+               pgoff_t index, pgoff_t max, struct pagevec *pvec)
 {
-       if (iocb->ki_flags & IOCB_WAITQ)
-               return lock_page_async(page, iocb->ki_waitq);
-       else if (iocb->ki_flags & IOCB_NOWAIT)
-               return trylock_page(page) ? 0 : -EAGAIN;
-       else
-               return lock_page_killable(page);
+       XA_STATE(xas, &mapping->i_pages, index);
+       struct page *head;
+
+       rcu_read_lock();
+       for (head = xas_load(&xas); head; head = xas_next(&xas)) {
+               if (xas_retry(&xas, head))
+                       continue;
+               if (xas.xa_index > max || xa_is_value(head))
+                       break;
+               if (!page_cache_get_speculative(head))
+                       goto retry;
+
+               /* Has the page moved or been split? */
+               if (unlikely(head != xas_reload(&xas)))
+                       goto put_page;
+
+               if (!pagevec_add(pvec, head))
+                       break;
+               if (!PageUptodate(head))
+                       break;
+               if (PageReadahead(head))
+                       break;
+               xas.xa_index = head->index + thp_nr_pages(head) - 1;
+               xas.xa_offset = (xas.xa_index >> xas.xa_shift) & XA_CHUNK_MASK;
+               continue;
+put_page:
+               put_page(head);
+retry:
+               xas_reset(&xas);
+       }
+       rcu_read_unlock();
 }
 
-static struct page *
-generic_file_buffered_read_readpage(struct kiocb *iocb,
-                                   struct file *filp,
-                                   struct address_space *mapping,
-                                   struct page *page)
+static int filemap_read_page(struct file *file, struct address_space *mapping,
+               struct page *page)
 {
-       struct file_ra_state *ra = &filp->f_ra;
        int error;
 
-       if (iocb->ki_flags & (IOCB_NOIO | IOCB_NOWAIT)) {
-               unlock_page(page);
-               put_page(page);
-               return ERR_PTR(-EAGAIN);
-       }
-
        /*
-        * A previous I/O error may have been due to temporary
-        * failures, eg. multipath errors.
-        * PG_error will be set again if readpage fails.
+        * A previous I/O error may have been due to temporary failures,
+        * eg. multipath errors.  PG_error will be set again if readpage
+        * fails.
         */
        ClearPageError(page);
        /* Start the actual read. The read will unlock the page. */
-       error = mapping->a_ops->readpage(filp, page);
-
-       if (unlikely(error)) {
-               put_page(page);
-               return error != AOP_TRUNCATED_PAGE ? ERR_PTR(error) : NULL;
-       }
+       error = mapping->a_ops->readpage(file, page);
+       if (error)
+               return error;
+       if (PageUptodate(page))
+               return 0;
 
+       error = lock_page_killable(page);
+       if (error)
+               return error;
        if (!PageUptodate(page)) {
-               error = lock_page_for_iocb(iocb, page);
-               if (unlikely(error)) {
-                       put_page(page);
-                       return ERR_PTR(error);
-               }
-               if (!PageUptodate(page)) {
-                       if (page->mapping == NULL) {
-                               /*
-                                * invalidate_mapping_pages got it
-                                */
-                               unlock_page(page);
-                               put_page(page);
-                               return NULL;
-                       }
-                       unlock_page(page);
-                       shrink_readahead_size_eio(ra);
-                       put_page(page);
-                       return ERR_PTR(-EIO);
+               if (page->mapping == NULL) {
+                       /* page truncated */
+                       error = AOP_TRUNCATED_PAGE;
+               } else {
+                       shrink_readahead_size_eio(&file->f_ra);
+                       error = -EIO;
                }
-               unlock_page(page);
        }
-
-       return page;
+       unlock_page(page);
+       return error;
 }
 
-static struct page *
-generic_file_buffered_read_pagenotuptodate(struct kiocb *iocb,
-                                          struct file *filp,
-                                          struct iov_iter *iter,
-                                          struct page *page,
-                                          loff_t pos, loff_t count)
+static bool filemap_range_uptodate(struct address_space *mapping,
+               loff_t pos, struct iov_iter *iter, struct page *page)
 {
-       struct address_space *mapping = filp->f_mapping;
-       struct inode *inode = mapping->host;
-       int error;
+       int count;
 
-       /*
-        * See comment in do_read_cache_page on why
-        * wait_on_page_locked is used to avoid unnecessarily
-        * serialisations and why it's safe.
-        */
-       if (iocb->ki_flags & IOCB_WAITQ) {
-               error = wait_on_page_locked_async(page,
-                                               iocb->ki_waitq);
-       } else {
-               error = wait_on_page_locked_killable(page);
-       }
-       if (unlikely(error)) {
-               put_page(page);
-               return ERR_PTR(error);
-       }
        if (PageUptodate(page))
-               return page;
-
-       if (inode->i_blkbits == PAGE_SHIFT ||
-                       !mapping->a_ops->is_partially_uptodate)
-               goto page_not_up_to_date;
+               return true;
        /* pipes can't handle partially uptodate pages */
-       if (unlikely(iov_iter_is_pipe(iter)))
-               goto page_not_up_to_date;
-       if (!trylock_page(page))
-               goto page_not_up_to_date;
-       /* Did it get truncated before we got the lock? */
-       if (!page->mapping)
-               goto page_not_up_to_date_locked;
-       if (!mapping->a_ops->is_partially_uptodate(page,
-                               pos & ~PAGE_MASK, count))
-               goto page_not_up_to_date_locked;
-       unlock_page(page);
-       return page;
+       if (iov_iter_is_pipe(iter))
+               return false;
+       if (!mapping->a_ops->is_partially_uptodate)
+               return false;
+       if (mapping->host->i_blkbits >= (PAGE_SHIFT + thp_order(page)))
+               return false;
 
-page_not_up_to_date:
-       /* Get exclusive access to the page ... */
-       error = lock_page_for_iocb(iocb, page);
-       if (unlikely(error)) {
-               put_page(page);
-               return ERR_PTR(error);
+       count = iter->count;
+       if (page_offset(page) > pos) {
+               count -= page_offset(page) - pos;
+               pos = 0;
+       } else {
+               pos -= page_offset(page);
        }
 
-page_not_up_to_date_locked:
-       /* Did it get truncated before we got the lock? */
-       if (!page->mapping) {
-               unlock_page(page);
-               put_page(page);
-               return NULL;
-       }
+       return mapping->a_ops->is_partially_uptodate(page, pos, count);
+}
 
-       /* Did somebody else fill it already? */
-       if (PageUptodate(page)) {
-               unlock_page(page);
-               return page;
+static int filemap_update_page(struct kiocb *iocb,
+               struct address_space *mapping, struct iov_iter *iter,
+               struct page *page)
+{
+       int error;
+
+       if (!trylock_page(page)) {
+               if (iocb->ki_flags & (IOCB_NOWAIT | IOCB_NOIO))
+                       return -EAGAIN;
+               if (!(iocb->ki_flags & IOCB_WAITQ)) {
+                       put_and_wait_on_page_locked(page, TASK_KILLABLE);
+                       return AOP_TRUNCATED_PAGE;
+               }
+               error = __lock_page_async(page, iocb->ki_waitq);
+               if (error)
+                       return error;
        }
 
-       return generic_file_buffered_read_readpage(iocb, filp, mapping, page);
+       if (!page->mapping)
+               goto truncated;
+
+       error = 0;
+       if (filemap_range_uptodate(mapping, iocb->ki_pos, iter, page))
+               goto unlock;
+
+       error = -EAGAIN;
+       if (iocb->ki_flags & (IOCB_NOIO | IOCB_NOWAIT | IOCB_WAITQ))
+               goto unlock;
+
+       error = filemap_read_page(iocb->ki_filp, mapping, page);
+       if (error == AOP_TRUNCATED_PAGE)
+               put_page(page);
+       return error;
+truncated:
+       unlock_page(page);
+       put_page(page);
+       return AOP_TRUNCATED_PAGE;
+unlock:
+       unlock_page(page);
+       return error;
 }
 
-static struct page *
-generic_file_buffered_read_no_cached_page(struct kiocb *iocb,
-                                         struct iov_iter *iter)
+static int filemap_create_page(struct file *file,
+               struct address_space *mapping, pgoff_t index,
+               struct pagevec *pvec)
 {
-       struct file *filp = iocb->ki_filp;
-       struct address_space *mapping = filp->f_mapping;
-       pgoff_t index = iocb->ki_pos >> PAGE_SHIFT;
        struct page *page;
        int error;
 
-       if (iocb->ki_flags & IOCB_NOIO)
-               return ERR_PTR(-EAGAIN);
-
-       /*
-        * Ok, it wasn't cached, so we need to create a new
-        * page..
-        */
        page = page_cache_alloc(mapping);
        if (!page)
-               return ERR_PTR(-ENOMEM);
+               return -ENOMEM;
 
        error = add_to_page_cache_lru(page, mapping, index,
-                                     mapping_gfp_constraint(mapping, GFP_KERNEL));
-       if (error) {
-               put_page(page);
-               return error != -EEXIST ? ERR_PTR(error) : NULL;
-       }
+                       mapping_gfp_constraint(mapping, GFP_KERNEL));
+       if (error == -EEXIST)
+               error = AOP_TRUNCATED_PAGE;
+       if (error)
+               goto error;
 
-       return generic_file_buffered_read_readpage(iocb, filp, mapping, page);
+       error = filemap_read_page(file, mapping, page);
+       if (error)
+               goto error;
+
+       pagevec_add(pvec, page);
+       return 0;
+error:
+       put_page(page);
+       return error;
 }
 
-static int generic_file_buffered_read_get_pages(struct kiocb *iocb,
-                                               struct iov_iter *iter,
-                                               struct page **pages,
-                                               unsigned int nr)
+static int filemap_get_pages(struct kiocb *iocb, struct iov_iter *iter,
+               struct pagevec *pvec)
 {
        struct file *filp = iocb->ki_filp;
        struct address_space *mapping = filp->f_mapping;
        struct file_ra_state *ra = &filp->f_ra;
        pgoff_t index = iocb->ki_pos >> PAGE_SHIFT;
-       pgoff_t last_index = (iocb->ki_pos + iter->count + PAGE_SIZE-1) >> PAGE_SHIFT;
-       int i, j, nr_got, err = 0;
+       pgoff_t last_index;
+       int err = 0;
 
-       nr = min_t(unsigned long, last_index - index, nr);
+       last_index = DIV_ROUND_UP(iocb->ki_pos + iter->count, PAGE_SIZE);
 find_page:
        if (fatal_signal_pending(current))
                return -EINTR;
 
-       nr_got = find_get_pages_contig(mapping, index, nr, pages);
-       if (nr_got)
+       filemap_get_read_batch(mapping, index, last_index, pvec);
+       if (pvec->nr)
                goto got_pages;
 
        if (iocb->ki_flags & IOCB_NOIO)
@@ -2366,58 +2354,50 @@ find_page:
 
        page_cache_sync_readahead(mapping, ra, filp, index, last_index - index);
 
-       nr_got = find_get_pages_contig(mapping, index, nr, pages);
-       if (nr_got)
-               goto got_pages;
-
-       pages[0] = generic_file_buffered_read_no_cached_page(iocb, iter);
-       err = PTR_ERR_OR_ZERO(pages[0]);
-       if (!IS_ERR_OR_NULL(pages[0]))
-               nr_got = 1;
+       filemap_get_read_batch(mapping, index, last_index, pvec);
+       if (!pagevec_count(pvec)) {
+               if (iocb->ki_flags & (IOCB_NOWAIT | IOCB_WAITQ))
+                       return -EAGAIN;
+               err = filemap_create_page(filp, mapping,
+                               iocb->ki_pos >> PAGE_SHIFT, pvec);
+               if (err == AOP_TRUNCATED_PAGE)
+                       goto find_page;
+               return err;
+       }
 got_pages:
-       for (i = 0; i < nr_got; i++) {
-               struct page *page = pages[i];
-               pgoff_t pg_index = index + i;
-               loff_t pg_pos = max(iocb->ki_pos,
-                                   (loff_t) pg_index << PAGE_SHIFT);
-               loff_t pg_count = iocb->ki_pos + iter->count - pg_pos;
+       {
+               struct page *page = pvec->pages[pvec->nr - 1];
+               pgoff_t pg_index = page->index;
 
                if (PageReadahead(page)) {
                        if (iocb->ki_flags & IOCB_NOIO) {
-                               for (j = i; j < nr_got; j++)
-                                       put_page(pages[j]);
-                               nr_got = i;
+                               put_page(page);
+                               pvec->nr--;
                                err = -EAGAIN;
-                               break;
+                               goto err;
                        }
                        page_cache_async_readahead(mapping, ra, filp, page,
                                        pg_index, last_index - pg_index);
                }
 
                if (!PageUptodate(page)) {
-                       if ((iocb->ki_flags & IOCB_NOWAIT) ||
-                           ((iocb->ki_flags & IOCB_WAITQ) && i)) {
-                               for (j = i; j < nr_got; j++)
-                                       put_page(pages[j]);
-                               nr_got = i;
-                               err = -EAGAIN;
-                               break;
-                       }
-
-                       page = generic_file_buffered_read_pagenotuptodate(iocb,
-                                       filp, iter, page, pg_pos, pg_count);
-                       if (IS_ERR_OR_NULL(page)) {
-                               for (j = i + 1; j < nr_got; j++)
-                                       put_page(pages[j]);
-                               nr_got = i;
-                               err = PTR_ERR_OR_ZERO(page);
-                               break;
+                       if ((iocb->ki_flags & IOCB_WAITQ) &&
+                           pagevec_count(pvec) > 1)
+                               iocb->ki_flags |= IOCB_NOWAIT;
+                       err = filemap_update_page(iocb, mapping, iter, page);
+                       if (err) {
+                               if (err < 0)
+                                       put_page(page);
+                               pvec->nr--;
                        }
                }
        }
 
-       if (likely(nr_got))
-               return nr_got;
+err:
+       if (likely(pvec->nr))
+               return 0;
+       if (err == AOP_TRUNCATED_PAGE)
+               goto find_page;
        if (err)
                return err;
        /*
@@ -2449,11 +2429,8 @@ ssize_t generic_file_buffered_read(struct kiocb *iocb,
        struct file_ra_state *ra = &filp->f_ra;
        struct address_space *mapping = filp->f_mapping;
        struct inode *inode = mapping->host;
-       struct page *pages_onstack[PAGEVEC_SIZE], **pages = NULL;
-       unsigned int nr_pages = min_t(unsigned int, 512,
-                       ((iocb->ki_pos + iter->count + PAGE_SIZE - 1) >> PAGE_SHIFT) -
-                       (iocb->ki_pos >> PAGE_SHIFT));
-       int i, pg_nr, error = 0;
+       struct pagevec pvec;
+       int i, error = 0;
        bool writably_mapped;
        loff_t isize, end_offset;
 
@@ -2463,14 +2440,7 @@ ssize_t generic_file_buffered_read(struct kiocb *iocb,
                return 0;
 
        iov_iter_truncate(iter, inode->i_sb->s_maxbytes);
-
-       if (nr_pages > ARRAY_SIZE(pages_onstack))
-               pages = kmalloc_array(nr_pages, sizeof(void *), GFP_KERNEL);
-
-       if (!pages) {
-               pages = pages_onstack;
-               nr_pages = min_t(unsigned int, nr_pages, ARRAY_SIZE(pages_onstack));
-       }
+       pagevec_init(&pvec);
 
        do {
                cond_resched();
@@ -2483,13 +2453,9 @@ ssize_t generic_file_buffered_read(struct kiocb *iocb,
                if ((iocb->ki_flags & IOCB_WAITQ) && written)
                        iocb->ki_flags |= IOCB_NOWAIT;
 
-               i = 0;
-               pg_nr = generic_file_buffered_read_get_pages(iocb, iter,
-                                                            pages, nr_pages);
-               if (pg_nr < 0) {
-                       error = pg_nr;
+               error = filemap_get_pages(iocb, iter, &pvec);
+               if (error < 0)
                        break;
-               }
 
                /*
                 * i_size must be checked after we know the pages are Uptodate.
@@ -2502,13 +2468,8 @@ ssize_t generic_file_buffered_read(struct kiocb *iocb,
                isize = i_size_read(inode);
                if (unlikely(iocb->ki_pos >= isize))
                        goto put_pages;
-
                end_offset = min_t(loff_t, isize, iocb->ki_pos + iter->count);
 
-               while ((iocb->ki_pos >> PAGE_SHIFT) + pg_nr >
-                      (end_offset + PAGE_SIZE - 1) >> PAGE_SHIFT)
-                       put_page(pages[--pg_nr]);
-
                /*
                 * Once we start copying data, we don't want to be touching any
                 * cachelines that might be contended:
@@ -2521,25 +2482,33 @@ ssize_t generic_file_buffered_read(struct kiocb *iocb,
                 */
                if (iocb->ki_pos >> PAGE_SHIFT !=
                    ra->prev_pos >> PAGE_SHIFT)
-                       mark_page_accessed(pages[0]);
-               for (i = 1; i < pg_nr; i++)
-                       mark_page_accessed(pages[i]);
+                       mark_page_accessed(pvec.pages[0]);
 
-               for (i = 0; i < pg_nr; i++) {
-                       unsigned int offset = iocb->ki_pos & ~PAGE_MASK;
-                       unsigned int bytes = min_t(loff_t, end_offset - iocb->ki_pos,
-                                                  PAGE_SIZE - offset);
-                       unsigned int copied;
+               for (i = 0; i < pagevec_count(&pvec); i++) {
+                       struct page *page = pvec.pages[i];
+                       size_t page_size = thp_size(page);
+                       size_t offset = iocb->ki_pos & (page_size - 1);
+                       size_t bytes = min_t(loff_t, end_offset - iocb->ki_pos,
+                                            page_size - offset);
+                       size_t copied;
 
+                       if (end_offset < page_offset(page))
+                               break;
+                       if (i > 0)
+                               mark_page_accessed(page);
                        /*
                         * If users can be writing to this page using arbitrary
                         * virtual addresses, take care about potential aliasing
                         * before reading the page on the kernel side.
                         */
-                       if (writably_mapped)
-                               flush_dcache_page(pages[i]);
+                       if (writably_mapped) {
+                               int j;
 
-                       copied = copy_page_to_iter(pages[i], offset, bytes, iter);
+                               for (j = 0; j < thp_nr_pages(page); j++)
+                                       flush_dcache_page(page + j);
+                       }
+
+                       copied = copy_page_to_iter(page, offset, bytes, iter);
 
                        written += copied;
                        iocb->ki_pos += copied;
@@ -2551,15 +2520,13 @@ ssize_t generic_file_buffered_read(struct kiocb *iocb,
                        }
                }
 put_pages:
-               for (i = 0; i < pg_nr; i++)
-                       put_page(pages[i]);
+               for (i = 0; i < pagevec_count(&pvec); i++)
+                       put_page(pvec.pages[i]);
+               pagevec_reinit(&pvec);
        } while (iov_iter_count(iter) && iocb->ki_pos < isize && !error);
 
        file_accessed(filp);
 
-       if (pages != pages_onstack)
-               kfree(pages);
-
        return written ? written : error;
 }
 EXPORT_SYMBOL_GPL(generic_file_buffered_read);
@@ -2620,7 +2587,8 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
                        iocb->ki_pos += retval;
                        count -= retval;
                }
-               iov_iter_revert(iter, count - iov_iter_count(iter));
+               if (retval != -EIOCBQUEUED)
+                       iov_iter_revert(iter, count - iov_iter_count(iter));
 
                /*
                 * Btrfs can have a short DIO read if we encounter
@@ -3431,7 +3399,8 @@ generic_file_direct_write(struct kiocb *iocb, struct iov_iter *from)
                }
                iocb->ki_pos = pos;
        }
-       iov_iter_revert(from, write_len - iov_iter_count(from));
+       if (written != -EIOCBQUEUED)
+               iov_iter_revert(from, write_len - iov_iter_count(from));
 out:
        return written;
 }