• Theodore Ts'o's avatar
    ext4: use private version of page_zero_new_buffers() for data=journal mode · ec7d1dbf
    Theodore Ts'o authored
    commit b90197b6 upstream.
    
    If there is a error while copying data from userspace into the page
    cache during a write(2) system call, in data=journal mode, in
    ext4_journalled_write_end() were using page_zero_new_buffers() from
    fs/buffer.c.  Unfortunately, this sets the buffer dirty flag, which is
    no good if journalling is enabled.  This is a long-standing bug that
    goes back for years and years in ext3, but a combination of (a)
    data=journal not being very common, (b) in many case it only results
    in a warning message. and (c) only very rarely causes the kernel hang,
    means that we only really noticed this as a problem when commit
    998ef75d caused this failure to happen frequently enough to cause
    generic/208 to fail when run in data=journal mode.
    
    The fix is to have our own version of this function that doesn't call
    mark_dirty_buffer(), since we will end up calling
    ext4_handle_dirty_metadata() on the buffer head(s) in questions very
    shortly afterwards in ext4_journalled_write_end().
    
    Thanks to Dave Hansen and Linus Torvalds for helping to identify the
    root cause of the problem.
    Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    Reviewed-by: default avatarJan Kara <jack@suse.com>
    [bwh: Backported to 3.2: adjust context, indentation]
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    ec7d1dbf
inode.c 142 KB