lkml.org 
[lkml]   [2021]   [Mar]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.11 749/775] gfs2: fix glock confusion in function signal_our_withdraw
    Date
    From: Bob Peterson <rpeterso@redhat.com>

    commit f5f02fde9f52b2d769c1c2ddfd3d9c4a1fe739a7 upstream.

    If go_free is defined, function signal_our_withdraw is supposed to
    synchronize on the GLF_FREEING flag of the inode glock, but it
    accidentally does that on the live glock. Fix that and disambiguate
    the glock variables.

    Fixes: 601ef0d52e96 ("gfs2: Force withdraw to replay journals and wait for it to finish")
    Cc: stable@vger.kernel.org # v5.7+
    Signed-off-by: Bob Peterson <rpeterso@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/gfs2/util.c | 16 +++++++++-------
    1 file changed, 9 insertions(+), 7 deletions(-)

    --- a/fs/gfs2/util.c
    +++ b/fs/gfs2/util.c
    @@ -93,9 +93,10 @@ out_unlock:

    static void signal_our_withdraw(struct gfs2_sbd *sdp)
    {
    - struct gfs2_glock *gl = sdp->sd_live_gh.gh_gl;
    + struct gfs2_glock *live_gl = sdp->sd_live_gh.gh_gl;
    struct inode *inode = sdp->sd_jdesc->jd_inode;
    struct gfs2_inode *ip = GFS2_I(inode);
    + struct gfs2_glock *i_gl = ip->i_gl;
    u64 no_formal_ino = ip->i_no_formal_ino;
    int ret = 0;
    int tries;
    @@ -141,7 +142,8 @@ static void signal_our_withdraw(struct g
    atomic_set(&sdp->sd_freeze_state, SFS_FROZEN);
    thaw_super(sdp->sd_vfs);
    } else {
    - wait_on_bit(&gl->gl_flags, GLF_DEMOTE, TASK_UNINTERRUPTIBLE);
    + wait_on_bit(&i_gl->gl_flags, GLF_DEMOTE,
    + TASK_UNINTERRUPTIBLE);
    }

    /*
    @@ -161,15 +163,15 @@ static void signal_our_withdraw(struct g
    * on other nodes to be successful, otherwise we remain the owner of
    * the glock as far as dlm is concerned.
    */
    - if (gl->gl_ops->go_free) {
    - set_bit(GLF_FREEING, &gl->gl_flags);
    - wait_on_bit(&gl->gl_flags, GLF_FREEING, TASK_UNINTERRUPTIBLE);
    + if (i_gl->gl_ops->go_free) {
    + set_bit(GLF_FREEING, &i_gl->gl_flags);
    + wait_on_bit(&i_gl->gl_flags, GLF_FREEING, TASK_UNINTERRUPTIBLE);
    }

    /*
    * Dequeue the "live" glock, but keep a reference so it's never freed.
    */
    - gfs2_glock_hold(gl);
    + gfs2_glock_hold(live_gl);
    gfs2_glock_dq_wait(&sdp->sd_live_gh);
    /*
    * We enqueue the "live" glock in EX so that all other nodes
    @@ -208,7 +210,7 @@ static void signal_our_withdraw(struct g
    gfs2_glock_nq(&sdp->sd_live_gh);
    }

    - gfs2_glock_queue_put(gl); /* drop the extra reference we acquired */
    + gfs2_glock_queue_put(live_gl); /* drop extra reference we acquired */
    clear_bit(SDF_WITHDRAW_RECOVERY, &sdp->sd_flags);

    /*

    \
     
     \ /
      Last update: 2021-03-02 14:40    [W:4.029 / U:0.372 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site