• Jeff Layton's avatar
    mm: don't TestClearPageError in __filemap_fdatawait_range · 5e8fcc1a
    Jeff Layton authored
    The -EIO returned here can end up overriding whatever error is marked in
    the address space, and be returned at fsync time, even when there is a
    more appropriate error stored in the mapping.
    
    Read errors are also sometimes tracked on a per-page level using
    PG_error. Suppose we have a read error on a page, and then that page is
    subsequently dirtied by overwriting the whole page. Writeback doesn't
    clear PG_error, so we can then end up successfully writing back that
    page and still return -EIO on fsync.
    
    Worse yet, PG_error is cleared during a sync() syscall, but the -EIO
    return from that is silently discarded. Any subsystem that is relying on
    PG_error to report errors during fsync can easily lose writeback errors
    due to this. All you need is a stray sync() call to wait for writeback
    to complete and you've lost the error.
    
    Since the handling of the PG_error flag is somewhat inconsistent across
    subsystems, let's just rely on marking the address space when there are
    writeback errors. Change the TestClearPageError call to ClearPageError,
    and make __filemap_fdatawait_range a void return function.
    Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
    5e8fcc1a
filemap.c 80.2 KB