CVSROOT:        /cvs/cluster
Module name:    cluster
Branch:         RHEL45
Changes by:     [EMAIL PROTECTED]       2007-08-06 18:28:25

Modified files:
        dlm-kernel/src : proc.c 

Log message:
        Fixes bz #240356 (cat /proc/cluster/dlm_locks crashes system)

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/dlm-kernel/src/proc.c.diff?cvsroot=cluster&only_with_tag=RHEL45&r1=1.12.2.1&r2=1.12.2.1.4.1

--- cluster/dlm-kernel/src/Attic/proc.c 2006/02/15 18:43:28     1.12.2.1
+++ cluster/dlm-kernel/src/Attic/proc.c 2007/08/06 18:28:25     1.12.2.1.4.1
@@ -18,6 +18,7 @@
 #include <linux/module.h>
 
 #include "dlm_internal.h"
+#include "rsb.h"
 #include "lockspace.h"
 
 #if defined(DLM_DEBUG)
@@ -102,6 +103,9 @@
                        read_lock(&di->ls->ls_rsbtbl[i].lock);
                        if (!list_empty(&di->ls->ls_rsbtbl[i].list)) {
                                di->next = di->ls->ls_rsbtbl[i].list.next;
+                               di->rsb = list_entry(di->next, struct dlm_rsb,
+                                                       res_hashchain);
+                               hold_rsb(di->rsb);
                                read_unlock(&di->ls->ls_rsbtbl[i].lock);
                                break;
                        }
@@ -112,6 +116,7 @@
                if (di->entry >= di->ls->ls_rsbtbl_size)
                        return NULL;    /* End of hash list */
        } else {                /* Find the next entry in the list */
+               struct dlm_rsb *old = di->rsb;
                i = di->entry;
                read_lock(&di->ls->ls_rsbtbl[i].lock);
                di->next = di->next->next;
@@ -120,11 +125,14 @@
                        di->next = NULL;
                        di->entry++;
                        read_unlock(&di->ls->ls_rsbtbl[i].lock);
+                       release_rsb(old);
                        return next_rsb(di);    /* do the top half of this 
conditional */
                }
+               di->rsb = list_entry(di->next, struct dlm_rsb, res_hashchain);
+               hold_rsb(di->rsb);
                read_unlock(&di->ls->ls_rsbtbl[i].lock);
+               release_rsb(old);
        }
-       di->rsb = list_entry(di->next, struct dlm_rsb, res_hashchain);
 
        return di;
 }

Reply via email to