Commit ffb959bb authored by Jeff Layton's avatar Jeff Layton

mm: remove optimizations based on i_size in mapping writeback waits

Marcelo added this i_size based optimization with a patch in 2004
(commitid is from the linux-history tree):

    commit 765dad09
    Author: Marcelo Tosatti <marcelo.tosatti@cyclades.com>
    Date:   Tue Sep 7 17:51:17 2004 -0700

	small wait_on_page_writeback_range() optimization

	filemap_fdatawait() calls wait_on_page_writeback_range() with -1
	as "end" parameter.  This is not needed since we know the EOF
	from the inode.  Use that instead.

There may be races here, particularly with clustered or network
filesystems. It also seems like a bit of a layering violation since
we're operating on an address_space here, not an inode.

Finally, it's also questionable whether this optimization really helps
on workloads that we care about. Should we be optimizing for writeback
vs. truncate races in a codepath where we expect to wait anyway? It
doesn't seem worth the risk.

Remove this optimization from the filemap_fdatawait codepaths. This
means that filemap_fdatawait becomes a trivial wrapper around
filemap_fdatawait_range.
Reviewed-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
parent 3b49c9a1
...@@ -2538,10 +2538,15 @@ extern int invalidate_inode_pages2_range(struct address_space *mapping, ...@@ -2538,10 +2538,15 @@ extern int invalidate_inode_pages2_range(struct address_space *mapping,
extern int write_inode_now(struct inode *, int); extern int write_inode_now(struct inode *, int);
extern int filemap_fdatawrite(struct address_space *); extern int filemap_fdatawrite(struct address_space *);
extern int filemap_flush(struct address_space *); extern int filemap_flush(struct address_space *);
extern int filemap_fdatawait(struct address_space *);
extern int filemap_fdatawait_keep_errors(struct address_space *mapping); extern int filemap_fdatawait_keep_errors(struct address_space *mapping);
extern int filemap_fdatawait_range(struct address_space *, loff_t lstart, extern int filemap_fdatawait_range(struct address_space *, loff_t lstart,
loff_t lend); loff_t lend);
static inline int filemap_fdatawait(struct address_space *mapping)
{
return filemap_fdatawait_range(mapping, 0, LLONG_MAX);
}
extern bool filemap_range_has_page(struct address_space *, loff_t lstart, extern bool filemap_range_has_page(struct address_space *, loff_t lstart,
loff_t lend); loff_t lend);
extern int __must_check file_fdatawait_range(struct file *file, loff_t lstart, extern int __must_check file_fdatawait_range(struct file *file, loff_t lstart,
......
...@@ -512,39 +512,11 @@ EXPORT_SYMBOL(file_fdatawait_range); ...@@ -512,39 +512,11 @@ EXPORT_SYMBOL(file_fdatawait_range);
*/ */
int filemap_fdatawait_keep_errors(struct address_space *mapping) int filemap_fdatawait_keep_errors(struct address_space *mapping)
{ {
loff_t i_size = i_size_read(mapping->host); __filemap_fdatawait_range(mapping, 0, LLONG_MAX);
if (i_size == 0)
return 0;
__filemap_fdatawait_range(mapping, 0, i_size - 1);
return filemap_check_and_keep_errors(mapping); return filemap_check_and_keep_errors(mapping);
} }
EXPORT_SYMBOL(filemap_fdatawait_keep_errors); EXPORT_SYMBOL(filemap_fdatawait_keep_errors);
/**
* filemap_fdatawait - wait for all under-writeback pages to complete
* @mapping: address space structure to wait for
*
* Walk the list of under-writeback pages of the given address space
* and wait for all of them. Check error status of the address space
* and return it.
*
* Since the error status of the address space is cleared by this function,
* callers are responsible for checking the return value and handling and/or
* reporting the error.
*/
int filemap_fdatawait(struct address_space *mapping)
{
loff_t i_size = i_size_read(mapping->host);
if (i_size == 0)
return 0;
return filemap_fdatawait_range(mapping, 0, i_size - 1);
}
EXPORT_SYMBOL(filemap_fdatawait);
static bool mapping_needs_writeback(struct address_space *mapping) static bool mapping_needs_writeback(struct address_space *mapping)
{ {
return (!dax_mapping(mapping) && mapping->nrpages) || return (!dax_mapping(mapping) && mapping->nrpages) ||
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment