diff options
author | Arnd Bergmann <arnd@arndb.de> | 2010-06-02 08:28:52 -0400 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2010-09-15 15:00:48 -0400 |
commit | 609146fdb319cebce93be550938ab852f7bade90 (patch) | |
tree | 9cac0f94d17294c2a58ec1d39f86e5d7e5bb1c82 /drivers/char/ipmi/ipmi_watchdog.c | |
parent | d851b6e04ee978b0c1b187bee682592aa72f22ea (diff) |
ipmi: autoconvert trivial BKL users to private mutex
All these files use the big kernel lock in a trivial
way to serialize their private file operations,
typically resulting from an earlier semi-automatic
pushdown from VFS.
None of these drivers appears to want to lock against
other code, and they all use the BKL as the top-level
lock in their file operations, meaning that there
is no lock-order inversion problem.
Consequently, we can remove the BKL completely,
replacing it with a per-file mutex in every case.
Using a scripted approach means we can avoid
typos.
file=$1
name=$2
if grep -q lock_kernel ${file} ; then
if grep -q 'include.*linux.mutex.h' ${file} ; then
sed -i '/include.*<linux\/smp_lock.h>/d' ${file}
else
sed -i 's/include.*<linux\/smp_lock.h>.*$/include <linux\/mutex.h>/g' ${file}
fi
sed -i ${file} \
-e "/^#include.*linux.mutex.h/,$ {
1,/^\(static\|int\|long\)/ {
/^\(static\|int\|long\)/istatic DEFINE_MUTEX(${name}_mutex);
} }" \
-e "s/\(un\)*lock_kernel\>[ ]*()/mutex_\1lock(\&${name}_mutex)/g" \
-e '/[ ]*cycle_kernel_lock();/d'
else
sed -i -e '/include.*\<smp_lock.h\>/d' ${file} \
-e '/cycle_kernel_lock()/d'
fi
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Corey Minyard <cminyard@mvista.com>
Cc: openipmi-developer@lists.sourceforge.net
Diffstat (limited to 'drivers/char/ipmi/ipmi_watchdog.c')
-rw-r--r-- | drivers/char/ipmi/ipmi_watchdog.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_watchdog.c index 654d566ca57c..ed10b741962d 100644 --- a/drivers/char/ipmi/ipmi_watchdog.c +++ b/drivers/char/ipmi/ipmi_watchdog.c | |||
@@ -35,7 +35,7 @@ | |||
35 | #include <linux/moduleparam.h> | 35 | #include <linux/moduleparam.h> |
36 | #include <linux/ipmi.h> | 36 | #include <linux/ipmi.h> |
37 | #include <linux/ipmi_smi.h> | 37 | #include <linux/ipmi_smi.h> |
38 | #include <linux/smp_lock.h> | 38 | #include <linux/mutex.h> |
39 | #include <linux/watchdog.h> | 39 | #include <linux/watchdog.h> |
40 | #include <linux/miscdevice.h> | 40 | #include <linux/miscdevice.h> |
41 | #include <linux/init.h> | 41 | #include <linux/init.h> |
@@ -149,6 +149,7 @@ | |||
149 | #define WDIOC_GET_PRETIMEOUT _IOW(WATCHDOG_IOCTL_BASE, 22, int) | 149 | #define WDIOC_GET_PRETIMEOUT _IOW(WATCHDOG_IOCTL_BASE, 22, int) |
150 | #endif | 150 | #endif |
151 | 151 | ||
152 | static DEFINE_MUTEX(ipmi_watchdog_mutex); | ||
152 | static int nowayout = WATCHDOG_NOWAYOUT; | 153 | static int nowayout = WATCHDOG_NOWAYOUT; |
153 | 154 | ||
154 | static ipmi_user_t watchdog_user; | 155 | static ipmi_user_t watchdog_user; |
@@ -748,9 +749,9 @@ static long ipmi_unlocked_ioctl(struct file *file, | |||
748 | { | 749 | { |
749 | int ret; | 750 | int ret; |
750 | 751 | ||
751 | lock_kernel(); | 752 | mutex_lock(&ipmi_watchdog_mutex); |
752 | ret = ipmi_ioctl(file, cmd, arg); | 753 | ret = ipmi_ioctl(file, cmd, arg); |
753 | unlock_kernel(); | 754 | mutex_unlock(&ipmi_watchdog_mutex); |
754 | 755 | ||
755 | return ret; | 756 | return ret; |
756 | } | 757 | } |
@@ -844,7 +845,6 @@ static int ipmi_open(struct inode *ino, struct file *filep) | |||
844 | if (test_and_set_bit(0, &ipmi_wdog_open)) | 845 | if (test_and_set_bit(0, &ipmi_wdog_open)) |
845 | return -EBUSY; | 846 | return -EBUSY; |
846 | 847 | ||
847 | cycle_kernel_lock(); | ||
848 | 848 | ||
849 | /* | 849 | /* |
850 | * Don't start the timer now, let it start on the | 850 | * Don't start the timer now, let it start on the |