diff options
author | Eric Sandeen <sandeen@redhat.com> | 2009-11-15 15:30:52 -0500 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2009-11-15 15:30:52 -0500 |
commit | 86ebfd08a1930ccedb8eac0aeb1ed4b8b6a41dbc (patch) | |
tree | b74b72e956bb19df9983f83481b3bc2a633dda81 /fs/ext4/xattr.c | |
parent | 30c6e07a92ea4cb87160d32ffa9bce172576ae4c (diff) |
ext4: journal all modifications in ext4_xattr_set_handle
ext4_xattr_set_handle() was zeroing out an inode outside
of journaling constraints; this is one of the accesses that
was causing the crc errors in journal replay as seen in
kernel.org bugzilla #14354.
Reviewed-by: Andreas Dilger <adilger@sun.com>
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Cc: stable@kernel.org
Diffstat (limited to 'fs/ext4/xattr.c')
-rw-r--r-- | fs/ext4/xattr.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c index fed5b01d7a8d..025701926f9a 100644 --- a/fs/ext4/xattr.c +++ b/fs/ext4/xattr.c | |||
@@ -988,6 +988,10 @@ ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index, | |||
988 | if (error) | 988 | if (error) |
989 | goto cleanup; | 989 | goto cleanup; |
990 | 990 | ||
991 | error = ext4_journal_get_write_access(handle, is.iloc.bh); | ||
992 | if (error) | ||
993 | goto cleanup; | ||
994 | |||
991 | if (EXT4_I(inode)->i_state & EXT4_STATE_NEW) { | 995 | if (EXT4_I(inode)->i_state & EXT4_STATE_NEW) { |
992 | struct ext4_inode *raw_inode = ext4_raw_inode(&is.iloc); | 996 | struct ext4_inode *raw_inode = ext4_raw_inode(&is.iloc); |
993 | memset(raw_inode, 0, EXT4_SB(inode->i_sb)->s_inode_size); | 997 | memset(raw_inode, 0, EXT4_SB(inode->i_sb)->s_inode_size); |
@@ -1013,9 +1017,6 @@ ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index, | |||
1013 | if (flags & XATTR_CREATE) | 1017 | if (flags & XATTR_CREATE) |
1014 | goto cleanup; | 1018 | goto cleanup; |
1015 | } | 1019 | } |
1016 | error = ext4_journal_get_write_access(handle, is.iloc.bh); | ||
1017 | if (error) | ||
1018 | goto cleanup; | ||
1019 | if (!value) { | 1020 | if (!value) { |
1020 | if (!is.s.not_found) | 1021 | if (!is.s.not_found) |
1021 | error = ext4_xattr_ibody_set(handle, inode, &i, &is); | 1022 | error = ext4_xattr_ibody_set(handle, inode, &i, &is); |