lkml.org 
[lkml]   [2007]   [Nov]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 23/26] ocfs2: fix write() performance regression

    2.6.22-stable review patch. If anyone has any objections, please let us
    know.

    ------------------
    From: Mark Fasheh <mark.fasheh@oracle.com>

    ocfs2: fix write() performance regression

    patch 4e9563fd55ff4479f2b118d0757d121dd0cfc39c in mainline.

    On file systems which don't support sparse files, Ocfs2_map_page_blocks()
    was reading blocks on appending writes. This caused write performance to
    suffer dramatically. Fix this by detecting an appending write on a nonsparse
    fs and skipping the read.

    Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    fs/ocfs2/aops.c | 24 +++++++++++++++++++++++-
    1 file changed, 23 insertions(+), 1 deletion(-)

    --- a/fs/ocfs2/aops.c
    +++ b/fs/ocfs2/aops.c
    @@ -661,6 +661,27 @@ static void ocfs2_clear_page_regions(str
    }

    /*
    + * Nonsparse file systems fully allocate before we get to the write
    + * code. This prevents ocfs2_write() from tagging the write as an
    + * allocating one, which means ocfs2_map_page_blocks() might try to
    + * read-in the blocks at the tail of our file. Avoid reading them by
    + * testing i_size against each block offset.
    + */
    +static int ocfs2_should_read_blk(struct inode *inode, struct page *page,
    + unsigned int block_start)
    +{
    + u64 offset = page_offset(page) + block_start;
    +
    + if (ocfs2_sparse_alloc(OCFS2_SB(inode->i_sb)))
    + return 1;
    +
    + if (i_size_read(inode) > offset)
    + return 1;
    +
    + return 0;
    +}
    +
    +/*
    * Some of this taken from block_prepare_write(). We already have our
    * mapping by now though, and the entire write will be allocating or
    * it won't, so not much need to use BH_New.
    @@ -711,7 +732,8 @@ int ocfs2_map_page_blocks(struct page *p
    if (!buffer_uptodate(bh))
    set_buffer_uptodate(bh);
    } else if (!buffer_uptodate(bh) && !buffer_delay(bh) &&
    - (block_start < from || block_end > to)) {
    + ocfs2_should_read_blk(inode, page, block_start) &&
    + (block_start < from || block_end > to)) {
    ll_rw_block(READ, 1, &bh);
    *wait_bh++=bh;
    }
    --
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-11-19 19:33    [W:0.022 / U:29.532 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site