• Eric Sandeen's avatar
    ext4: implement writeback livelock avoidance using page tagging · 5b41d924
    Eric Sandeen authored
    This is analogous to Jan Kara's commit,
    f446daae
    mm: implement writeback livelock avoidance using page tagging
    
    but since we forked write_cache_pages, we need to reimplement
    it there (and in ext4_da_writepages, since range_cyclic handling
    was moved to there)
    
    If you start a large buffered IO to a file, and then set
    fsync after it, you'll find that fsync does not complete
    until the other IO stops.
    
    If you continue re-dirtying the file (say, putting dd
    with conv=notrunc in a loop), when fsync finally completes
    (after all IO is done), it reports via tracing that
    it has written many more pages than the file contains;
    in other words it has synced and re-synced pages in
    the file multiple times.
    
    This then leads to problems with our writeback_index
    update, since it advances it by pages written, and
    essentially sets writeback_index off the end of the
    file...
    
    With the following patch, we only sync as much as was
    dirty at the time of the sync.
    Signed-off-by: default avatarEric Sandeen <sandeen@redhat.com>
    Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
    5b41d924
inode.c 172 KB