lkml.org 
[lkml]   [2020]   [Jun]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.4 10/14] gfs2: Even more gfs2_find_jhead fixes
    Date
    From: Andreas Gruenbacher <agruenba@redhat.com>

    [ Upstream commit 20be493b787cd581c9fffad7fcd6bfbe6af1050c ]

    Fix several issues in the previous gfs2_find_jhead fix:
    * When updating @blocks_submitted, @block refers to the first block block not
    submitted yet, not the last block submitted, so fix an off-by-one error.
    * We want to ensure that @blocks_submitted is far enough ahead of @blocks_read
    to guarantee that there is in-flight I/O. Otherwise, we'll eventually end up
    waiting for pages that haven't been submitted, yet.
    * It's much easier to compare the number of blocks added with the number of
    blocks submitted to limit the maximum bio size.
    * Even with bio chaining, we can keep adding blocks until we reach the maximum
    bio size, as long as we stop at a page boundary. This simplifies the logic.

    Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
    Reviewed-by: Bob Peterson <rpeterso@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/gfs2/lops.c | 15 +++++----------
    1 file changed, 5 insertions(+), 10 deletions(-)

    diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c
    index 8303b44a5068..d2ed4dc4434c 100644
    --- a/fs/gfs2/lops.c
    +++ b/fs/gfs2/lops.c
    @@ -504,12 +504,12 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head,
    unsigned int bsize = sdp->sd_sb.sb_bsize, off;
    unsigned int bsize_shift = sdp->sd_sb.sb_bsize_shift;
    unsigned int shift = PAGE_SHIFT - bsize_shift;
    - unsigned int max_bio_size = 2 * 1024 * 1024;
    + unsigned int max_blocks = 2 * 1024 * 1024 >> bsize_shift;
    struct gfs2_journal_extent *je;
    int sz, ret = 0;
    struct bio *bio = NULL;
    struct page *page = NULL;
    - bool bio_chained = false, done = false;
    + bool done = false;
    errseq_t since;

    memset(head, 0, sizeof(*head));
    @@ -532,10 +532,7 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head,
    off = 0;
    }

    - if (!bio || (bio_chained && !off) ||
    - bio->bi_iter.bi_size >= max_bio_size) {
    - /* start new bio */
    - } else {
    + if (bio && (off || block < blocks_submitted + max_blocks)) {
    sector_t sector = dblock << sdp->sd_fsb2bb_shift;

    if (bio_end_sector(bio) == sector) {
    @@ -548,19 +545,17 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head,
    (PAGE_SIZE - off) >> bsize_shift;

    bio = gfs2_chain_bio(bio, blocks);
    - bio_chained = true;
    goto add_block_to_new_bio;
    }
    }

    if (bio) {
    - blocks_submitted = block + 1;
    + blocks_submitted = block;
    submit_bio(bio);
    }

    bio = gfs2_log_alloc_bio(sdp, dblock, gfs2_end_log_read);
    bio->bi_opf = REQ_OP_READ;
    - bio_chained = false;
    add_block_to_new_bio:
    sz = bio_add_page(bio, page, bsize, off);
    BUG_ON(sz != bsize);
    @@ -568,7 +563,7 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head,
    off += bsize;
    if (off == PAGE_SIZE)
    page = NULL;
    - if (blocks_submitted < 2 * max_bio_size >> bsize_shift) {
    + if (blocks_submitted <= blocks_read + max_blocks) {
    /* Keep at least one bio in flight */
    continue;
    }
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-05 14:29    [W:2.109 / U:0.284 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site