ext3: fix broken handling of EXT3_STATE_NEW
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 29 Mar 2010 21:30:19 +0000 (14:30 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 29 Mar 2010 21:30:19 +0000 (14:30 -0700)
commitde329820e920cd9cfbc2127cad26a37026260cce
treec392dbee75854e1f0b950f9d16dcf03214c63e80
parentad4ba059005f18ec9e274966c16d99fc5ce8b2cd
ext3: fix broken handling of EXT3_STATE_NEW

In commit 9df93939b735 ("ext3: Use bitops to read/modify
EXT3_I(inode)->i_state") ext3 changed its internal 'i_state' variable to
use bitops for its state handling.  However, unline the same ext4
change, it didn't actually change the name of the field when it changed
the semantics of it.

As a result, an old use of 'i_state' remained in fs/ext3/ialloc.c that
initialized the field to EXT3_STATE_NEW.  And that does not work
_at_all_ when we're now working with individually named bits rather than
values that get masked.  So the code tried to mark the state to be new,
but in actual fact set the field to EXT3_STATE_JDATA.  Which makes no
sense at all, and screws up all the code that checks whether the inode
was newly allocated.

In particular, it made the xattr code unhappy, and caused various random
behavior, like apparently

https://bugzilla.redhat.com/show_bug.cgi?id=577911

So fix the initialization, and rename the field to match ext4 so that we
don't have this happen again.

Cc: James Morris <jmorris@namei.org>
Cc: Stephen Smalley <sds@tycho.nsa.gov>
Cc: Daniel J Walsh <dwalsh@redhat.com>
Cc: Eric Paris <eparis@redhat.com>
Cc: Jan Kara <jack@suse.cz>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/ext3/ialloc.c
fs/ext3/inode.c
include/linux/ext3_fs.h
include/linux/ext3_fs_i.h