diff options
author | 2017-07-06 07:02:23 -0400 | |
---|---|---|
committer | 2017-07-06 07:02:23 -0400 | |
commit | cbeaf9510a8631e9bb0077a95fd8b0db0b3be200 (patch) | |
tree | 4c69537c66c0057e30d7ef7dd2a46f4bdb2f54db /mm/filemap.c | |
parent | jbd2: don't clear and reset errors after waiting on writeback (diff) | |
download | linux-cbeaf9510a8631e9bb0077a95fd8b0db0b3be200.tar.gz linux-cbeaf9510a8631e9bb0077a95fd8b0db0b3be200.tar.bz2 linux-cbeaf9510a8631e9bb0077a95fd8b0db0b3be200.zip |
mm: clear AS_EIO/AS_ENOSPC when writeback initiation fails
filemap_write_and_wait{_range} will return an error if writeback
initiation fails, but won't clear errors in the address_space. This is
particularly problematic on DAX, as filemap_fdatawrite* is
effectively synchronous there. Ensure that we clear the AS_EIO/AS_ENOSPC
flags when filemap_fdatawrite* returns an error.
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Diffstat (limited to 'mm/filemap.c')
-rw-r--r-- | mm/filemap.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index e5711b2728f4..49bc9720fb00 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -515,6 +515,9 @@ int filemap_write_and_wait(struct address_space *mapping) int err2 = filemap_fdatawait(mapping); if (!err) err = err2; + } else { + /* Clear any previously stored errors */ + filemap_check_errors(mapping); } } else { err = filemap_check_errors(mapping); @@ -549,6 +552,9 @@ int filemap_write_and_wait_range(struct address_space *mapping, lstart, lend); if (!err) err = err2; + } else { + /* Clear any previously stored errors */ + filemap_check_errors(mapping); } } else { err = filemap_check_errors(mapping); |