diff --git a/lustre/kernel_patches/patches/dynamic-locks-2.4.24.patch b/lustre/kernel_patches/patches/dynamic-locks-2.4.24.patch index b80f05777566fbb677b6ce842d2e22a7fd473f3b..d05bced14fe241afc8aaa7416e64c4fbf4c7dabb 100644 --- a/lustre/kernel_patches/patches/dynamic-locks-2.4.24.patch +++ b/lustre/kernel_patches/patches/dynamic-locks-2.4.24.patch @@ -6,15 +6,19 @@ Index: linux-2.4.24/include/linux/dynlocks.h =================================================================== --- linux-2.4.24.orig/include/linux/dynlocks.h 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.24/include/linux/dynlocks.h 2004-03-01 19:29:53.000000000 +0300 -@@ -0,0 +1,33 @@ ++++ linux-2.4.24/include/linux/dynlocks.h 2004-07-06 19:14:17.000000000 +0400 +@@ -0,0 +1,41 @@ +#ifndef _LINUX_DYNLOCKS_H +#define _LINUX_DYNLOCKS_H + +#include <linux/list.h> +#include <linux/wait.h> + ++#define DYNLOCK_MAGIC 0xd19a10c ++#define DYNLOCK_MAGIC2 0xd1956ee ++ +struct dynlock_member { ++ unsigned dl_magic; + struct list_head dl_list; + unsigned long dl_value; /* lock value */ + int dl_refcount; /* number of users */ @@ -29,7 +33,11 @@ Index: linux-2.4.24/include/linux/dynlocks.h + * - list of locks + * - lock to protect this list + */ ++ ++#define DYNLOCK_LIST_MAGIC 0x11ee91e6 ++ +struct dynlock { ++ unsigned dl_magic; + struct list_head dl_list; + spinlock_t dl_list_lock; +}; @@ -44,8 +52,8 @@ Index: linux-2.4.24/include/linux/dynlocks.h Index: linux-2.4.24/lib/dynlocks.c =================================================================== --- linux-2.4.24.orig/lib/dynlocks.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.24/lib/dynlocks.c 2004-03-01 19:29:53.000000000 +0300 -@@ -0,0 +1,152 @@ ++++ linux-2.4.24/lib/dynlocks.c 2004-07-06 19:14:40.000000000 +0400 +@@ -0,0 +1,173 @@ +/* + * Dynamic Locks + * @@ -70,6 +78,7 @@ Index: linux-2.4.24/lib/dynlocks.c +{ + spin_lock_init(&dl->dl_list_lock); + INIT_LIST_HEAD(&dl->dl_list); ++ dl->dl_magic = DYNLOCK_LIST_MAGIC; +} + +/* @@ -88,11 +97,18 @@ Index: linux-2.4.24/lib/dynlocks.c + struct dynlock_member *hl; + struct list_head *cur; + ++ BUG_ON(dl == NULL); ++ BUG_ON(dl->dl_magic != DYNLOCK_LIST_MAGIC); +repeat: + /* find requested lock in lockspace */ + spin_lock(&dl->dl_list_lock); ++ BUG_ON(dl->dl_list.next == NULL); ++ BUG_ON(dl->dl_list.prev == NULL); + list_for_each(cur, &dl->dl_list) { ++ BUG_ON(cur->next == NULL); ++ BUG_ON(cur->prev == NULL); + hl = list_entry(cur, struct dynlock_member, dl_list); ++ BUG_ON(hl->dl_magic != DYNLOCK_MAGIC); + if (hl->dl_value == value) { + /* lock is found */ + if (nhl) { @@ -125,6 +141,7 @@ Index: linux-2.4.24/lib/dynlocks.c + nhl->dl_value = value; + nhl->dl_readers = 0; + nhl->dl_writers = 0; ++ nhl->dl_magic = DYNLOCK_MAGIC; + init_waitqueue_head(&nhl->dl_wait); + + /* while lock is being allocated, someone else may allocate it @@ -157,6 +174,7 @@ Index: linux-2.4.24/lib/dynlocks.c + hl->dl_pid = current->pid; + spin_unlock(&dl->dl_list_lock); + ++ BUG_ON(hl->dl_magic != DYNLOCK_MAGIC); + return hl; +} + @@ -173,22 +191,33 @@ Index: linux-2.4.24/lib/dynlocks.c + struct dynlock_member *hl = lock; + int wakeup = 0; + ++ BUG_ON(dl == NULL); ++ BUG_ON(hl == NULL); ++ BUG_ON(dl->dl_magic != DYNLOCK_LIST_MAGIC); ++ BUG_ON(hl->dl_magic != DYNLOCK_MAGIC); ++ BUG_ON(current->pid != hl->dl_pid); ++ + spin_lock(&dl->dl_list_lock); + if (hl->dl_writers) { ++ BUG_ON(hl->dl_readers > 0 || hl->dl_readers < 0); + hl->dl_writers--; + if (hl->dl_writers == 0) + wakeup = 1; -+ } else { ++ } else if (hl->dl_readers) { + hl->dl_readers--; + if (hl->dl_readers == 0) + wakeup = 1; ++ } else { ++ BUG_ON(1); + } + if (wakeup) { + hl->dl_pid = 0; + wake_up(&hl->dl_wait); + } -+ if (--(hl->dl_refcount) == 0) ++ if (--(hl->dl_refcount) == 0) { ++ hl->dl_magic = DYNLOCK_MAGIC2; + list_del(&hl->dl_list); ++ } + spin_unlock(&dl->dl_list_lock); + if (hl->dl_refcount == 0) + kfree(hl); @@ -200,8 +229,8 @@ Index: linux-2.4.24/lib/dynlocks.c + Index: linux-2.4.24/lib/Makefile =================================================================== ---- linux-2.4.24.orig/lib/Makefile 2004-02-02 21:52:31.000000000 +0300 -+++ linux-2.4.24/lib/Makefile 2004-03-01 19:30:25.000000000 +0300 +--- linux-2.4.24.orig/lib/Makefile 2004-06-24 09:06:32.000000000 +0400 ++++ linux-2.4.24/lib/Makefile 2004-07-06 19:14:17.000000000 +0400 @@ -9,10 +9,10 @@ L_TARGET := lib.a