• Theodore Ts'o's avatar
    ext4: don't leave PageWriteback set after memory failure · a54aa761
    Theodore Ts'o authored
    In ext4_bio_write_page(), if the memory allocation for the struct
    ext4_io_page fails, it returns with the page's PageWriteback flag set.
    This will end up causing the page not to skip writeback in
    WB_SYNC_NONE mode, and in WB_SYNC_ALL mode (i.e., on a sync, fsync, or
    umount) the writeback daemon will get stuck forever on the
    wait_on_page_writeback() function in write_cache_pages_da().
    
    Or, if journalling is enabled and the file gets deleted, it the
    journal thread can get stuck in journal_finish_inode_data_buffers()
    call to filemap_fdatawait().
    
    Another place where things can get hung up is in
    truncate_inode_pages(), called out of ext4_evict_inode().
    
    Fix this by not setting PageWriteback until after we have successfully
    allocated the struct ext4_io_page.
    Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
    a54aa761
page-io.c 10.7 KB