ext4: Fix ext4_should_writeback_data() for no-journal mode
authorCurt Wohlgemuth <curtw@google.com>
Sat, 13 Aug 2011 15:25:18 +0000 (11:25 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sat, 13 Aug 2011 15:25:18 +0000 (11:25 -0400)
commit441c850857148935babe000fc2ba1455fe54a6a9
treeaa0ef8ca32a49b2daf072f851938af3f2db35a90
parent322a8b034003c0d46d39af85bf24fee27b902f48
ext4: Fix ext4_should_writeback_data() for no-journal mode

ext4_should_writeback_data() had an incorrect sequence of
tests to determine if it should return 0 or 1: in
particular, even in no-journal mode, 0 was being returned
for a non-regular-file inode.

This meant that, in non-journal mode, we would use
ext4_journalled_aops for directories, symlinks, and other
non-regular files.  However, calling journalled aop
callbacks when there is no valid handle, can cause problems.

This would cause a kernel crash with Jan Kara's commit
2d859db3e4 ("ext4: fix data corruption in inodes with
journalled data"), because we now dereference 'handle' in
ext4_journalled_write_end().

I also added BUG_ONs to check for a valid handle in the
obviously journal-only aops callbacks.

I tested this running xfstests with a scratch device in
these modes:

   - no-journal
   - data=ordered
   - data=writeback
   - data=journal

All work fine; the data=journal run has many failures and a
crash in xfstests 074, but this is no different from a
vanilla kernel.

Signed-off-by: Curt Wohlgemuth <curtw@google.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Cc: stable@kernel.org
fs/ext4/ext4_jbd2.h
fs/ext4/inode.c