lkml.org 
[lkml]   [2020]   [Jul]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.7 098/112] gfs2: fix trans slab error when withdraw occurs inside log_flush
    Date
    From: Bob Peterson <rpeterso@redhat.com>

    commit 58e08e8d83ab03a1ca25d53420bd0b87f2dfe458 upstream.

    Log flush operations (gfs2_log_flush()) can target a specific transaction.
    But if the function encounters errors (e.g. io errors) and withdraws,
    the transaction was only freed it if was queued to one of the ail lists.
    If the withdraw occurred before the transaction was queued to the ail1
    list, function ail_drain never freed it. The result was:

    BUG gfs2_trans: Objects remaining in gfs2_trans on __kmem_cache_shutdown()

    This patch makes log_flush() add the targeted transaction to the ail1
    list so that function ail_drain() will find and free it properly.

    Cc: stable@vger.kernel.org # v5.7+
    Signed-off-by: Bob Peterson <rpeterso@redhat.com>
    Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/gfs2/log.c | 10 ++++++++++
    1 file changed, 10 insertions(+)

    --- a/fs/gfs2/log.c
    +++ b/fs/gfs2/log.c
    @@ -987,6 +987,16 @@ void gfs2_log_flush(struct gfs2_sbd *sdp

    out:
    if (gfs2_withdrawn(sdp)) {
    + /**
    + * If the tr_list is empty, we're withdrawing during a log
    + * flush that targets a transaction, but the transaction was
    + * never queued onto any of the ail lists. Here we add it to
    + * ail1 just so that ail_drain() will find and free it.
    + */
    + spin_lock(&sdp->sd_ail_lock);
    + if (tr && list_empty(&tr->tr_list))
    + list_add(&tr->tr_list, &sdp->sd_ail1_list);
    + spin_unlock(&sdp->sd_ail_lock);
    ail_drain(sdp); /* frees all transactions */
    tr = NULL;
    }

    \
     
     \ /
      Last update: 2020-07-07 17:27    [W:4.160 / U:0.220 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site