diff options
author | Theodore Ts'o <tytso@mit.edu> | 2015-10-15 17:29:05 +0300 |
---|---|---|
committer | Ben Hutchings <ben@decadent.org.uk> | 2017-06-05 23:13:45 +0300 |
commit | ec7d1dbf6dda4f536dbafa966fb111b653948f07 (patch) | |
tree | c21179d76b935b41c8edc05ed2053667e1038029 /fs/hugetlbfs | |
parent | f213db429b883a2d5403de0b1ce92fb7d7ee979e (diff) | |
download | linux-ec7d1dbf6dda4f536dbafa966fb111b653948f07.tar.xz |
ext4: use private version of page_zero_new_buffers() for data=journal mode
commit b90197b655185a11640cce3a0a0bc5d8291b8ad2 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
998ef75ddb 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: Theodore Ts'o <tytso@mit.edu>
Reviewed-by: Jan Kara <jack@suse.com>
[bwh: Backported to 3.2: adjust context, indentation]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Diffstat (limited to 'fs/hugetlbfs')
0 files changed, 0 insertions, 0 deletions