lkml.org 
[lkml]   [2009]   [Dec]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[46/90] ext4: Avoid updating the inode table bh twice in no journal mode
    2.6.31-stable review patch.  If anyone has any objections, please let us know.

    ------------------
    (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;
    }



    \
     
     \ /
      Last update: 2009-12-11 05:43    [W:0.022 / U:35.228 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site