If nobody has seen the writeback error yet, then filemap_sample_wb_err() always return 0. Even if there is no new writeback error between filemap_sample_wb_err() and filemap_check_wb_err(), filemap_check_wb_err() will return the old error. Fix this by using file->f_mapping->wb_err as the old error. Fixes: ce368536dd61 ("nfs: nfs_file_write() should check for writeback errors") Signed-off-by: ChenXiaoSong <chenxiaosong2@xxxxxxxxxx> --- fs/nfs/file.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 83d63bce9596..8763f89c176a 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c @@ -635,7 +635,7 @@ ssize_t nfs_file_write(struct kiocb *iocb, struct iov_iter *from) nfs_clear_invalid_mapping(file->f_mapping); - since = filemap_sample_wb_err(file->f_mapping); + since = file->f_mapping->wb_err; nfs_start_io_write(inode); result = generic_write_checks(iocb, from); if (result > 0) { @@ -669,7 +669,7 @@ ssize_t nfs_file_write(struct kiocb *iocb, struct iov_iter *from) goto out; /* Return error values */ - error = filemap_check_wb_err(file->f_mapping, since); + error = errseq_check(&file->f_mapping->wb_err, since); if (nfs_need_check_write(file, inode, error)) { int err = nfs_wb_all(inode); if (err < 0) -- 2.31.1