mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
Linux 2.6.39 compat, mutex owner
Prior to Linux 2.6.39 when CONFIG_DEBUG_MUTEXES was defined the kernel stored a thread_info pointer as the mutex owner. From this you could get the pointer of the current task_struct to compare with get_current(). As of Linux 2.6.39 this behavior has changed and now the mutex stores a pointer to the task_struct. This commit detects the type of pointer stored in the mutex and adjusts the mutex_owner() and mutex_owned() functions to perform the correct comparision.
This commit is contained in:
@@ -48,6 +48,7 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
|
||||
SPL_AC_MONOTONIC_CLOCK
|
||||
SPL_AC_INODE_I_MUTEX
|
||||
SPL_AC_MUTEX_OWNER
|
||||
SPL_AC_MUTEX_OWNER_TASK_STRUCT
|
||||
SPL_AC_MUTEX_LOCK_NESTED
|
||||
SPL_AC_3ARGS_ON_EACH_CPU
|
||||
SPL_AC_KALLSYMS_LOOKUP_NAME
|
||||
@@ -1128,6 +1129,32 @@ AC_DEFUN([SPL_AC_MUTEX_OWNER], [
|
||||
])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # 2.6.39 API change,
|
||||
dnl # Owner type change. A Linux mutex prior to 2.6.39 would store
|
||||
dnl # the owner as a thread_info pointer when CONFIG_DEBUG_MUTEXES
|
||||
dnl # was defined. As of 2.6.39 this was changed to a task_struct
|
||||
dnl # pointer which frankly makes a lot more sense.
|
||||
dnl #
|
||||
AC_DEFUN([SPL_AC_MUTEX_OWNER_TASK_STRUCT], [
|
||||
AC_MSG_CHECKING([whether struct mutex owner is a task_struct])
|
||||
tmp_flags="$EXTRA_KCFLAGS"
|
||||
EXTRA_KCFLAGS="-Werror"
|
||||
SPL_LINUX_TRY_COMPILE([
|
||||
#include <linux/mutex.h>
|
||||
],[
|
||||
struct mutex mtx __attribute__ ((unused));
|
||||
mtx.owner = current;
|
||||
],[
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_MUTEX_OWNER_TASK_STRUCT, 1,
|
||||
[struct mutex owner is a task_struct])
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
EXTRA_KCFLAGS="$tmp_flags"
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # 2.6.18 API change,
|
||||
dnl # First introduced 'mutex_lock_nested()' in include/linux/mutex.h,
|
||||
|
||||
Reference in New Issue
Block a user