| From 865943e8572497262dde59d86a8457b0e5b066d6 Mon Sep 17 00:00:00 2001 |
| From: Frank Mayhar <fmayhar@google.com> |
| Date: Tue, 29 Sep 2009 10:07:47 -0400 |
| Subject: [PATCH 46/85] ext4: Avoid updating the inode table bh twice in no journal mode |
| |
| (cherry picked from commit 830156c79b0a99ddf0f62496bcf4de640f9f52cd) |
| |
| This is a cleanup of commit 91ac6f4. Since ext4_mark_inode_dirty() |
| has already called ext4_mark_iloc_dirty(), which in turn calls |
| ext4_do_update_inode(), it's not necessary to have ext4_write_inode() |
| call ext4_do_update_inode() in no journal mode. Indeed, it would be |
| duplicated work. |
| |
| Reviewed-by: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com> |
| Signed-off-by: Frank Mayhar <fmayhar@google.com> |
| Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| fs/ext4/inode.c | 37 ++++++++++++++++--------------------- |
| 1 file changed, 16 insertions(+), 21 deletions(-) |
| |
| --- a/fs/ext4/inode.c |
| +++ b/fs/ext4/inode.c |
| @@ -4981,8 +4981,7 @@ static int ext4_inode_blocks_set(handle_ |
| */ |
| static int ext4_do_update_inode(handle_t *handle, |
| struct inode *inode, |
| - struct ext4_iloc *iloc, |
| - int do_sync) |
| + struct ext4_iloc *iloc) |
| { |
| struct ext4_inode *raw_inode = ext4_raw_inode(iloc); |
| struct ext4_inode_info *ei = EXT4_I(inode); |
| @@ -5083,22 +5082,10 @@ static int ext4_do_update_inode(handle_t |
| raw_inode->i_extra_isize = cpu_to_le16(ei->i_extra_isize); |
| } |
| |
| - /* |
| - * If we're not using a journal and we were called from |
| - * ext4_write_inode() to sync the inode (making do_sync true), |
| - * we can just use sync_dirty_buffer() directly to do our dirty |
| - * work. Testing s_journal here is a bit redundant but it's |
| - * worth it to avoid potential future trouble. |
| - */ |
| - if (EXT4_SB(inode->i_sb)->s_journal == NULL && do_sync) { |
| - BUFFER_TRACE(bh, "call sync_dirty_buffer"); |
| - sync_dirty_buffer(bh); |
| - } else { |
| - BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata"); |
| - rc = ext4_handle_dirty_metadata(handle, inode, bh); |
| - if (!err) |
| - err = rc; |
| - } |
| + BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata"); |
| + rc = ext4_handle_dirty_metadata(handle, inode, bh); |
| + if (!err) |
| + err = rc; |
| ei->i_state &= ~EXT4_STATE_NEW; |
| |
| out_brelse: |
| @@ -5166,8 +5153,16 @@ int ext4_write_inode(struct inode *inode |
| err = ext4_get_inode_loc(inode, &iloc); |
| if (err) |
| return err; |
| - err = ext4_do_update_inode(EXT4_NOJOURNAL_HANDLE, |
| - inode, &iloc, wait); |
| + if (wait) |
| + sync_dirty_buffer(iloc.bh); |
| + if (buffer_req(iloc.bh) && !buffer_uptodate(iloc.bh)) { |
| + ext4_error(inode->i_sb, __func__, |
| + "IO error syncing inode, " |
| + "inode=%lu, block=%llu", |
| + inode->i_ino, |
| + (unsigned long long)iloc.bh->b_blocknr); |
| + err = -EIO; |
| + } |
| } |
| return err; |
| } |
| @@ -5463,7 +5458,7 @@ int ext4_mark_iloc_dirty(handle_t *handl |
| get_bh(iloc->bh); |
| |
| /* ext4_do_update_inode() does jbd2_journal_dirty_metadata */ |
| - err = ext4_do_update_inode(handle, inode, iloc, 0); |
| + err = ext4_do_update_inode(handle, inode, iloc); |
| put_bh(iloc->bh); |
| return err; |
| } |