Loading mm/filemap.c +9 −20 Original line number Original line Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -2402,6 +2402,7 @@ 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; if (file) shrink_readahead_size_eio(&file->f_ra); shrink_readahead_size_eio(&file->f_ra); return -EIO; return -EIO; } } Loading Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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) Loading @@ -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 Loading
mm/filemap.c +9 −20 Original line number Original line Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -2402,6 +2402,7 @@ 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; if (file) shrink_readahead_size_eio(&file->f_ra); shrink_readahead_size_eio(&file->f_ra); return -EIO; return -EIO; } } Loading Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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) Loading @@ -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