mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-28 05:12:49 +00:00
filemap: Use filemap_read_folio() in do_read_cache_folio()
By passing ->read_folio to filemap_read_folio(), we can use filemap_read_folio() in do_read_cache_folio(). Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
This commit is contained in:
parent
1dfa24a4bf
commit
290e1a3204
1 changed files with 9 additions and 20 deletions
29
mm/filemap.c
29
mm/filemap.c
|
@ -2381,7 +2381,7 @@ static void filemap_get_read_batch(struct address_space *mapping,
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int filemap_read_folio(struct file *file, struct address_space *mapping,
|
static int filemap_read_folio(struct file *file, filler_t filler,
|
||||||
struct folio *folio)
|
struct folio *folio)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
@ -2393,7 +2393,7 @@ static int filemap_read_folio(struct file *file, struct address_space *mapping,
|
||||||
*/
|
*/
|
||||||
folio_clear_error(folio);
|
folio_clear_error(folio);
|
||||||
/* Start the actual read. The read will unlock the page. */
|
/* Start the actual read. The read will unlock the page. */
|
||||||
error = mapping->a_ops->read_folio(file, folio);
|
error = filler(file, folio);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
@ -2402,7 +2402,8 @@ static int filemap_read_folio(struct file *file, struct address_space *mapping,
|
||||||
return error;
|
return error;
|
||||||
if (folio_test_uptodate(folio))
|
if (folio_test_uptodate(folio))
|
||||||
return 0;
|
return 0;
|
||||||
shrink_readahead_size_eio(&file->f_ra);
|
if (file)
|
||||||
|
shrink_readahead_size_eio(&file->f_ra);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2475,7 +2476,8 @@ static int filemap_update_page(struct kiocb *iocb,
|
||||||
if (iocb->ki_flags & (IOCB_NOIO | IOCB_NOWAIT | IOCB_WAITQ))
|
if (iocb->ki_flags & (IOCB_NOIO | IOCB_NOWAIT | IOCB_WAITQ))
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
error = filemap_read_folio(iocb->ki_filp, mapping, folio);
|
error = filemap_read_folio(iocb->ki_filp, mapping->a_ops->read_folio,
|
||||||
|
folio);
|
||||||
goto unlock_mapping;
|
goto unlock_mapping;
|
||||||
unlock:
|
unlock:
|
||||||
folio_unlock(folio);
|
folio_unlock(folio);
|
||||||
|
@ -2518,7 +2520,7 @@ static int filemap_create_folio(struct file *file,
|
||||||
if (error)
|
if (error)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
error = filemap_read_folio(file, mapping, folio);
|
error = filemap_read_folio(file, mapping->a_ops->read_folio, folio);
|
||||||
if (error)
|
if (error)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
@ -3202,7 +3204,7 @@ vm_fault_t filemap_fault(struct vm_fault *vmf)
|
||||||
* and we need to check for errors.
|
* and we need to check for errors.
|
||||||
*/
|
*/
|
||||||
fpin = maybe_unlock_mmap_for_io(vmf, fpin);
|
fpin = maybe_unlock_mmap_for_io(vmf, fpin);
|
||||||
error = filemap_read_folio(file, mapping, folio);
|
error = filemap_read_folio(file, mapping->a_ops->read_folio, folio);
|
||||||
if (fpin)
|
if (fpin)
|
||||||
goto out_retry;
|
goto out_retry;
|
||||||
folio_put(folio);
|
folio_put(folio);
|
||||||
|
@ -3515,15 +3517,8 @@ static struct folio *do_read_cache_folio(struct address_space *mapping,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* A previous I/O error may have been due to temporary
|
|
||||||
* failures.
|
|
||||||
* Clear page error before actual read, PG_error will be
|
|
||||||
* set again if read page fails.
|
|
||||||
*/
|
|
||||||
folio_clear_error(folio);
|
|
||||||
filler:
|
filler:
|
||||||
err = filler(file, folio);
|
err = filemap_read_folio(file, filler, folio);
|
||||||
if (err) {
|
if (err) {
|
||||||
folio_put(folio);
|
folio_put(folio);
|
||||||
if (err == AOP_TRUNCATED_PAGE)
|
if (err == AOP_TRUNCATED_PAGE)
|
||||||
|
@ -3531,12 +3526,6 @@ static struct folio *do_read_cache_folio(struct address_space *mapping,
|
||||||
return ERR_PTR(err);
|
return ERR_PTR(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
folio_wait_locked(folio);
|
|
||||||
if (!folio_test_uptodate(folio)) {
|
|
||||||
folio_put(folio);
|
|
||||||
return ERR_PTR(-EIO);
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
folio_mark_accessed(folio);
|
folio_mark_accessed(folio);
|
||||||
return folio;
|
return folio;
|
||||||
|
|
Loading…
Reference in a new issue