lkml.org 
[lkml]   [2007]   [Jul]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] [DLM] keep dlm from panicing when traversing rsb list in debugfs
    Date
    From: Josef Bacik <jwhiter@redhat.com>

    This problem was originally reported against GFS6.1, but the same issue exists
    in upstream DLM. This patch keeps the rsb iterator assigning under the rsbtbl
    list lock. Each time we process an rsb we grab a reference to it to make sure
    it is not freed out from underneath us, and then put it when we get the next rsb
    in the list or move onto another list.

    Signed-off-by: Josef Bacik <jwhiter@redhat.com>
    Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>

    diff --git a/fs/dlm/debug_fs.c b/fs/dlm/debug_fs.c
    index 61ba670..9e27a16 100644
    --- a/fs/dlm/debug_fs.c
    +++ b/fs/dlm/debug_fs.c
    @@ -17,6 +17,7 @@
    #include <linux/debugfs.h>

    #include "dlm_internal.h"
    +#include "lock.h"

    #define DLM_DEBUG_BUF_LEN 4096
    static char debug_buf[DLM_DEBUG_BUF_LEN];
    @@ -166,6 +167,9 @@ static int rsb_iter_next(struct rsb_iter *ri)
    read_lock(&ls->ls_rsbtbl[i].lock);
    if (!list_empty(&ls->ls_rsbtbl[i].list)) {
    ri->next = ls->ls_rsbtbl[i].list.next;
    + ri->rsb = list_entry(ri->next, struct dlm_rsb,
    + res_hashchain);
    + dlm_hold_rsb(ri->rsb);
    read_unlock(&ls->ls_rsbtbl[i].lock);
    break;
    }
    @@ -176,6 +180,7 @@ static int rsb_iter_next(struct rsb_iter *ri)
    if (ri->entry >= ls->ls_rsbtbl_size)
    return 1;
    } else {
    + struct dlm_rsb *old = ri->rsb;
    i = ri->entry;
    read_lock(&ls->ls_rsbtbl[i].lock);
    ri->next = ri->next->next;
    @@ -184,11 +189,13 @@ static int rsb_iter_next(struct rsb_iter *ri)
    ri->next = NULL;
    ri->entry++;
    read_unlock(&ls->ls_rsbtbl[i].lock);
    + dlm_put_rsb(old);
    goto top;
    }
    + ri->rsb = list_entry(ri->next, struct dlm_rsb, res_hashchain);
    read_unlock(&ls->ls_rsbtbl[i].lock);
    + dlm_put_rsb(old);
    }
    - ri->rsb = list_entry(ri->next, struct dlm_rsb, res_hashchain);

    return 0;
    }
    --
    1.5.1.2
    -
    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-07-09 18:29    [W:0.026 / U:30.888 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site