From 0b47a171a13f041f4dadf5ab8f55d46c634e3dd0 Mon Sep 17 00:00:00 2001 From: Derrick Brashear Date: Fri, 9 Feb 2007 01:30:31 +0000 Subject: [PATCH] STABLE14-tasklist-export-check-20070208 work around tasklist lock export harder (cherry picked from commit 00c5dbfd048e31a653de0e1cf37d45d539e0c755) --- acinclude.m4 | 4 ++++ src/afs/LINUX/osi_module.c | 6 +++--- src/afs/LINUX/osi_probe.c | 2 ++ src/afs/afs_osi.c | 11 ++++++++++- src/cf/linux-test4.m4 | 14 ++++++++++++++ 5 files changed, 33 insertions(+), 4 deletions(-) diff --git a/acinclude.m4 b/acinclude.m4 index 40d0e3207..5ebd73085 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -626,6 +626,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_EXIT_STATE LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_TGID LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_TODO + LINUX_EXPORTS_TASKLIST_LOCK LINUX_GET_SB_HAS_STRUCT_VFSMOUNT LINUX_STATFS_TAKES_DENTRY LINUX_FREEZER_H_EXISTS @@ -840,6 +841,9 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) if test "x$ac_cv_linux_fs_struct_fop_has_flock" = "xyes" ; then AC_DEFINE(STRUCT_FILE_OPERATIONS_HAS_FLOCK, 1, [define if your struct file_operations has flock]) fi + if test "x$ac_cv_linux_exports_tasklist_lock" = "xyes" ; then + AC_DEFINE(EXPORTED_TASKLIST_LOCK, 1, [define if tasklist_lock exported]) + fi : fi esac diff --git a/src/afs/LINUX/osi_module.c b/src/afs/LINUX/osi_module.c index 5103fa810..28376d64a 100644 --- a/src/afs/LINUX/osi_module.c +++ b/src/afs/LINUX/osi_module.c @@ -423,7 +423,7 @@ get_page_offset(void) struct task_struct *p, *q; /* search backward thru the circular list */ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) +#if defined(EXPORTED_TASKLIST_LOCK) read_lock(&tasklist_lock); #endif /* search backward thru the circular list */ @@ -433,14 +433,14 @@ get_page_offset(void) for (p = current; p; p = p->prev_task) { #endif if (p->pid == 1) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) +#if defined(EXPORTED_TASKLIST_LOCK) read_unlock(&tasklist_lock); #endif return p->addr_limit.seg; } } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) +#if defined(EXPORTED_TASKLIST_LOCK) read_unlock(&tasklist_lock); #endif return 0; diff --git a/src/afs/LINUX/osi_probe.c b/src/afs/LINUX/osi_probe.c index c2d3ce4a1..f83767cb9 100644 --- a/src/afs/LINUX/osi_probe.c +++ b/src/afs/LINUX/osi_probe.c @@ -247,7 +247,9 @@ extern asmlinkage long sys_exit (int) __attribute__((weak)); extern asmlinkage long sys_open (const char *, int, int) __attribute__((weak)); #endif extern asmlinkage long sys_ioctl(unsigned int, unsigned int, unsigned long) __attribute__((weak)); +#if defined(EXPORTED_TASKLIST_LOCK) extern rwlock_t tasklist_lock __attribute__((weak)); +#endif /* Structures used to control probing. We put all the details of which diff --git a/src/afs/afs_osi.c b/src/afs/afs_osi.c index 4fb288d22..a409f0f0d 100644 --- a/src/afs/afs_osi.c +++ b/src/afs/afs_osi.c @@ -811,13 +811,18 @@ void afs_osi_TraverseProcTable() { #if !defined(LINUX_KEYRING_SUPPORT) - extern rwlock_t tasklist_lock __attribute__((weak)); struct task_struct *p; +#ifdef EXPORTED_TASKLIST_LOCK + extern rwlock_t tasklist_lock __attribute__((weak)); + if (&tasklist_lock) read_lock(&tasklist_lock); +#endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) +#ifdef EXPORTED_TASKLIST_LOCK else +#endif rcu_read_lock(); #endif @@ -844,10 +849,14 @@ afs_osi_TraverseProcTable() afs_GCPAGs_perproc_func(p); } #endif +#ifdef EXPORTED_TASKLIST_LOCK if (&tasklist_lock) read_unlock(&tasklist_lock); +#endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) +#ifdef EXPORTED_TASKLIST_LOCK else +#endif rcu_read_unlock(); #endif #endif diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4 index 0fd4e3ce4..3862c48b9 100644 --- a/src/cf/linux-test4.m4 +++ b/src/cf/linux-test4.m4 @@ -1,3 +1,17 @@ +AC_DEFUN([LINUX_EXPORTS_TASKLIST_LOCK], [ + AC_MSG_CHECKING([for exported tasklist_lock]) + AC_CACHE_VAL([ac_cv_linux_exports_tasklist_lock], [ + AC_TRY_KBUILD( +[ +#include ], +[ +extern rwlock_t tasklist_lock __attribute__((weak)); +], + ac_cv_linux_exports_tasklist_lock=yes, + ac_cv_linux_exports_tasklist_lock=no)]) + AC_MSG_RESULT($ac_cv_linux_exports_tasklist_lock)]) + + AC_DEFUN([LINUX_CONFIG_H_EXISTS], [ AC_MSG_CHECKING([for linux/config.h existance]) AC_CACHE_VAL([ac_cv_linux_config_h_exists], [ -- 2.39.5