diff options
| author | Arnd Bergmann <arnd@arndb.de> | 2010-06-02 08:28:52 -0400 |
|---|---|---|
| committer | Arnd Bergmann <arnd@arndb.de> | 2010-10-05 09:01:04 -0400 |
| commit | 613655fa39ff6957754fa8ceb8559980920eb8ee (patch) | |
| tree | ad19600cb81207b24188683d7fc4ae88013339d1 /drivers/block/paride | |
| parent | 609146fdb319cebce93be550938ab852f7bade90 (diff) | |
drivers: 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.
These drivers do not seem to be under active
maintainance from my brief investigation. Apologies
to those maintainers that I have missed.
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>
Diffstat (limited to 'drivers/block/paride')
| -rw-r--r-- | drivers/block/paride/pg.c | 7 | ||||
| -rw-r--r-- | drivers/block/paride/pt.c | 19 |
2 files changed, 14 insertions, 12 deletions
diff --git a/drivers/block/paride/pg.c b/drivers/block/paride/pg.c index c397b3ddba9b..bed29cb9e6d9 100644 --- a/drivers/block/paride/pg.c +++ b/drivers/block/paride/pg.c | |||
| @@ -162,7 +162,7 @@ enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV, D_DLY}; | |||
| 162 | #include <linux/pg.h> | 162 | #include <linux/pg.h> |
| 163 | #include <linux/device.h> | 163 | #include <linux/device.h> |
| 164 | #include <linux/sched.h> /* current, TASK_* */ | 164 | #include <linux/sched.h> /* current, TASK_* */ |
| 165 | #include <linux/smp_lock.h> | 165 | #include <linux/mutex.h> |
| 166 | #include <linux/jiffies.h> | 166 | #include <linux/jiffies.h> |
| 167 | 167 | ||
| 168 | #include <asm/uaccess.h> | 168 | #include <asm/uaccess.h> |
| @@ -193,6 +193,7 @@ module_param_array(drive3, int, NULL, 0); | |||
| 193 | 193 | ||
| 194 | #define ATAPI_IDENTIFY 0x12 | 194 | #define ATAPI_IDENTIFY 0x12 |
| 195 | 195 | ||
| 196 | static DEFINE_MUTEX(pg_mutex); | ||
| 196 | static int pg_open(struct inode *inode, struct file *file); | 197 | static int pg_open(struct inode *inode, struct file *file); |
| 197 | static int pg_release(struct inode *inode, struct file *file); | 198 | static int pg_release(struct inode *inode, struct file *file); |
| 198 | static ssize_t pg_read(struct file *filp, char __user *buf, | 199 | static ssize_t pg_read(struct file *filp, char __user *buf, |
| @@ -518,7 +519,7 @@ static int pg_open(struct inode *inode, struct file *file) | |||
| 518 | struct pg *dev = &devices[unit]; | 519 | struct pg *dev = &devices[unit]; |
| 519 | int ret = 0; | 520 | int ret = 0; |
| 520 | 521 | ||
| 521 | lock_kernel(); | 522 | mutex_lock(&pg_mutex); |
| 522 | if ((unit >= PG_UNITS) || (!dev->present)) { | 523 | if ((unit >= PG_UNITS) || (!dev->present)) { |
| 523 | ret = -ENODEV; | 524 | ret = -ENODEV; |
| 524 | goto out; | 525 | goto out; |
| @@ -547,7 +548,7 @@ static int pg_open(struct inode *inode, struct file *file) | |||
| 547 | file->private_data = dev; | 548 | file->private_data = dev; |
| 548 | 549 | ||
| 549 | out: | 550 | out: |
| 550 | unlock_kernel(); | 551 | mutex_unlock(&pg_mutex); |
| 551 | return ret; | 552 | return ret; |
| 552 | } | 553 | } |
| 553 | 554 | ||
diff --git a/drivers/block/paride/pt.c b/drivers/block/paride/pt.c index bc5825fdeaab..e4dda282e0a6 100644 --- a/drivers/block/paride/pt.c +++ b/drivers/block/paride/pt.c | |||
| @@ -146,7 +146,7 @@ static int (*drives[4])[6] = {&drive0, &drive1, &drive2, &drive3}; | |||
| 146 | #include <linux/mtio.h> | 146 | #include <linux/mtio.h> |
| 147 | #include <linux/device.h> | 147 | #include <linux/device.h> |
| 148 | #include <linux/sched.h> /* current, TASK_*, schedule_timeout() */ | 148 | #include <linux/sched.h> /* current, TASK_*, schedule_timeout() */ |
| 149 | #include <linux/smp_lock.h> | 149 | #include <linux/mutex.h> |
| 150 | 150 | ||
| 151 | #include <asm/uaccess.h> | 151 | #include <asm/uaccess.h> |
| 152 | 152 | ||
| @@ -189,6 +189,7 @@ module_param_array(drive3, int, NULL, 0); | |||
| 189 | #define ATAPI_MODE_SENSE 0x1a | 189 | #define ATAPI_MODE_SENSE 0x1a |
| 190 | #define ATAPI_LOG_SENSE 0x4d | 190 | #define ATAPI_LOG_SENSE 0x4d |
| 191 | 191 | ||
| 192 | static DEFINE_MUTEX(pt_mutex); | ||
| 192 | static int pt_open(struct inode *inode, struct file *file); | 193 | static int pt_open(struct inode *inode, struct file *file); |
| 193 | static long pt_ioctl(struct file *file, unsigned int cmd, unsigned long arg); | 194 | static long pt_ioctl(struct file *file, unsigned int cmd, unsigned long arg); |
| 194 | static int pt_release(struct inode *inode, struct file *file); | 195 | static int pt_release(struct inode *inode, struct file *file); |
| @@ -650,9 +651,9 @@ static int pt_open(struct inode *inode, struct file *file) | |||
| 650 | struct pt_unit *tape = pt + unit; | 651 | struct pt_unit *tape = pt + unit; |
| 651 | int err; | 652 | int err; |
| 652 | 653 | ||
| 653 | lock_kernel(); | 654 | mutex_lock(&pt_mutex); |
| 654 | if (unit >= PT_UNITS || (!tape->present)) { | 655 | if (unit >= PT_UNITS || (!tape->present)) { |
| 655 | unlock_kernel(); | 656 | mutex_unlock(&pt_mutex); |
| 656 | return -ENODEV; | 657 | return -ENODEV; |
| 657 | } | 658 | } |
| 658 | 659 | ||
| @@ -681,12 +682,12 @@ static int pt_open(struct inode *inode, struct file *file) | |||
| 681 | } | 682 | } |
| 682 | 683 | ||
| 683 | file->private_data = tape; | 684 | file->private_data = tape; |
| 684 | unlock_kernel(); | 685 | mutex_unlock(&pt_mutex); |
| 685 | return 0; | 686 | return 0; |
| 686 | 687 | ||
| 687 | out: | 688 | out: |
| 688 | atomic_inc(&tape->available); | 689 | atomic_inc(&tape->available); |
| 689 | unlock_kernel(); | 690 | mutex_unlock(&pt_mutex); |
| 690 | return err; | 691 | return err; |
| 691 | } | 692 | } |
| 692 | 693 | ||
| @@ -704,15 +705,15 @@ static long pt_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
| 704 | switch (mtop.mt_op) { | 705 | switch (mtop.mt_op) { |
| 705 | 706 | ||
| 706 | case MTREW: | 707 | case MTREW: |
| 707 | lock_kernel(); | 708 | mutex_lock(&pt_mutex); |
| 708 | pt_rewind(tape); | 709 | pt_rewind(tape); |
| 709 | unlock_kernel(); | 710 | mutex_unlock(&pt_mutex); |
| 710 | return 0; | 711 | return 0; |
| 711 | 712 | ||
| 712 | case MTWEOF: | 713 | case MTWEOF: |
| 713 | lock_kernel(); | 714 | mutex_lock(&pt_mutex); |
| 714 | pt_write_fm(tape); | 715 | pt_write_fm(tape); |
| 715 | unlock_kernel(); | 716 | mutex_unlock(&pt_mutex); |
| 716 | return 0; | 717 | return 0; |
| 717 | 718 | ||
| 718 | default: | 719 | default: |
