| From d965736b8cb42ae51ba9c3f13488035a98d025c6 Mon Sep 17 00:00:00 2001 |
| From: Eric Sandeen <sandeen@redhat.com> |
| Date: Mon, 16 Nov 2009 16:27:30 -0600 |
| Subject: ext3: journal all modifications in ext3_xattr_set_handle |
| |
| From: Eric Sandeen <sandeen@redhat.com> |
| |
| commit d965736b8cb42ae51ba9c3f13488035a98d025c6 upstream. |
| |
| ext3_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. |
| |
| Although ext3 doesn't have the crc issue, modifications |
| out of journal control are a Bad Thing. |
| |
| Signed-off-by: Eric Sandeen <sandeen@redhat.com> |
| Signed-off-by: Jan Kara <jack@suse.cz> |
| Cc: maximilian attems <max@stro.at> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| fs/ext3/xattr.c | 7 ++++--- |
| 1 file changed, 4 insertions(+), 3 deletions(-) |
| |
| --- a/fs/ext3/xattr.c |
| +++ b/fs/ext3/xattr.c |
| @@ -960,6 +960,10 @@ ext3_xattr_set_handle(handle_t *handle, |
| if (error) |
| goto cleanup; |
| |
| + error = ext3_journal_get_write_access(handle, is.iloc.bh); |
| + if (error) |
| + goto cleanup; |
| + |
| if (EXT3_I(inode)->i_state & EXT3_STATE_NEW) { |
| struct ext3_inode *raw_inode = ext3_raw_inode(&is.iloc); |
| memset(raw_inode, 0, EXT3_SB(inode->i_sb)->s_inode_size); |
| @@ -985,9 +989,6 @@ ext3_xattr_set_handle(handle_t *handle, |
| if (flags & XATTR_CREATE) |
| goto cleanup; |
| } |
| - error = ext3_journal_get_write_access(handle, is.iloc.bh); |
| - if (error) |
| - goto cleanup; |
| if (!value) { |
| if (!is.s.not_found) |
| error = ext3_xattr_ibody_set(handle, inode, &i, &is); |