Skip to content

Commit 2682d27

Browse files
Arjan van de Vengregkh
authored andcommitted
[PATCH] USB: convert the semaphores in the sisusb driver to mutexes
From: Arjan van de Ven <[email protected]> Convert the semaphores-used-as-mutex to mutexes in the sisusb video driver; this required manual checking due to the "return as locked" stuff in this driver, but the ->lock semaphore is still used as mutex in the end. Signed-off-by: Arjan van de Ven <[email protected]> Cc: Thomas Winischhofer <winischhofer.net> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 7327413 commit 2682d27

File tree

3 files changed

+107
-105
lines changed

3 files changed

+107
-105
lines changed

drivers/usb/misc/sisusbvga/sisusb.c

Lines changed: 39 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
*/
3838

3939
#include <linux/config.h>
40+
#include <linux/mutex.h>
4041
#include <linux/module.h>
4142
#include <linux/kernel.h>
4243
#include <linux/signal.h>
@@ -102,7 +103,7 @@ MODULE_PARM_DESC(last, "Number of last console to take over (1 - MAX_NR_CONSOLES
102103

103104
static struct usb_driver sisusb_driver;
104105

105-
DECLARE_MUTEX(disconnect_sem);
106+
DEFINE_MUTEX(disconnect_mutex);
106107

107108
static void
108109
sisusb_free_buffers(struct sisusb_usb_data *sisusb)
@@ -2552,48 +2553,48 @@ sisusb_open(struct inode *inode, struct file *file)
25522553
struct usb_interface *interface;
25532554
int subminor = iminor(inode);
25542555

2555-
down(&disconnect_sem);
2556+
mutex_lock(&disconnect_mutex);
25562557

25572558
if (!(interface = usb_find_interface(&sisusb_driver, subminor))) {
25582559
printk(KERN_ERR "sisusb[%d]: Failed to find interface\n",
25592560
subminor);
2560-
up(&disconnect_sem);
2561+
mutex_unlock(&disconnect_mutex);
25612562
return -ENODEV;
25622563
}
25632564

25642565
if (!(sisusb = usb_get_intfdata(interface))) {
2565-
up(&disconnect_sem);
2566+
mutex_unlock(&disconnect_mutex);
25662567
return -ENODEV;
25672568
}
25682569

2569-
down(&sisusb->lock);
2570+
mutex_lock(&sisusb->lock);
25702571

25712572
if (!sisusb->present || !sisusb->ready) {
2572-
up(&sisusb->lock);
2573-
up(&disconnect_sem);
2573+
mutex_unlock(&sisusb->lock);
2574+
mutex_unlock(&disconnect_mutex);
25742575
return -ENODEV;
25752576
}
25762577

25772578
if (sisusb->isopen) {
2578-
up(&sisusb->lock);
2579-
up(&disconnect_sem);
2579+
mutex_unlock(&sisusb->lock);
2580+
mutex_unlock(&disconnect_mutex);
25802581
return -EBUSY;
25812582
}
25822583

25832584
if (!sisusb->devinit) {
25842585
if (sisusb->sisusb_dev->speed == USB_SPEED_HIGH) {
25852586
if (sisusb_init_gfxdevice(sisusb, 0)) {
2586-
up(&sisusb->lock);
2587-
up(&disconnect_sem);
2587+
mutex_unlock(&sisusb->lock);
2588+
mutex_unlock(&disconnect_mutex);
25882589
printk(KERN_ERR
25892590
"sisusbvga[%d]: Failed to initialize "
25902591
"device\n",
25912592
sisusb->minor);
25922593
return -EIO;
25932594
}
25942595
} else {
2595-
up(&sisusb->lock);
2596-
up(&disconnect_sem);
2596+
mutex_unlock(&sisusb->lock);
2597+
mutex_unlock(&disconnect_mutex);
25972598
printk(KERN_ERR
25982599
"sisusbvga[%d]: Device not attached to "
25992600
"USB 2.0 hub\n",
@@ -2609,9 +2610,9 @@ sisusb_open(struct inode *inode, struct file *file)
26092610

26102611
file->private_data = sisusb;
26112612

2612-
up(&sisusb->lock);
2613+
mutex_unlock(&sisusb->lock);
26132614

2614-
up(&disconnect_sem);
2615+
mutex_unlock(&disconnect_mutex);
26152616

26162617
return 0;
26172618
}
@@ -2642,14 +2643,14 @@ sisusb_release(struct inode *inode, struct file *file)
26422643
struct sisusb_usb_data *sisusb;
26432644
int myminor;
26442645

2645-
down(&disconnect_sem);
2646+
mutex_lock(&disconnect_mutex);
26462647

26472648
if (!(sisusb = (struct sisusb_usb_data *)file->private_data)) {
2648-
up(&disconnect_sem);
2649+
mutex_unlock(&disconnect_mutex);
26492650
return -ENODEV;
26502651
}
26512652

2652-
down(&sisusb->lock);
2653+
mutex_lock(&sisusb->lock);
26532654

26542655
if (sisusb->present) {
26552656
/* Wait for all URBs to finish if device still present */
@@ -2662,12 +2663,12 @@ sisusb_release(struct inode *inode, struct file *file)
26622663
sisusb->isopen = 0;
26632664
file->private_data = NULL;
26642665

2665-
up(&sisusb->lock);
2666+
mutex_unlock(&sisusb->lock);
26662667

26672668
/* decrement the usage count on our device */
26682669
kref_put(&sisusb->kref, sisusb_delete);
26692670

2670-
up(&disconnect_sem);
2671+
mutex_unlock(&disconnect_mutex);
26712672

26722673
return 0;
26732674
}
@@ -2685,11 +2686,11 @@ sisusb_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
26852686
if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
26862687
return -ENODEV;
26872688

2688-
down(&sisusb->lock);
2689+
mutex_lock(&sisusb->lock);
26892690

26902691
/* Sanity check */
26912692
if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2692-
up(&sisusb->lock);
2693+
mutex_unlock(&sisusb->lock);
26932694
return -ENODEV;
26942695
}
26952696

@@ -2784,7 +2785,7 @@ sisusb_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
27842785
(*ppos) <= SISUSB_PCI_PSEUDO_PCIBASE + 0x5c) {
27852786

27862787
if (count != 4) {
2787-
up(&sisusb->lock);
2788+
mutex_unlock(&sisusb->lock);
27882789
return -EINVAL;
27892790
}
27902791

@@ -2808,7 +2809,7 @@ sisusb_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
28082809

28092810
(*ppos) += bytes_read;
28102811

2811-
up(&sisusb->lock);
2812+
mutex_unlock(&sisusb->lock);
28122813

28132814
return errno ? errno : bytes_read;
28142815
}
@@ -2827,11 +2828,11 @@ sisusb_write(struct file *file, const char __user *buffer, size_t count,
28272828
if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
28282829
return -ENODEV;
28292830

2830-
down(&sisusb->lock);
2831+
mutex_lock(&sisusb->lock);
28312832

28322833
/* Sanity check */
28332834
if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2834-
up(&sisusb->lock);
2835+
mutex_unlock(&sisusb->lock);
28352836
return -ENODEV;
28362837
}
28372838

@@ -2930,7 +2931,7 @@ sisusb_write(struct file *file, const char __user *buffer, size_t count,
29302931
(*ppos) <= SISUSB_PCI_PSEUDO_PCIBASE + SISUSB_PCI_PCONFSIZE) {
29312932

29322933
if (count != 4) {
2933-
up(&sisusb->lock);
2934+
mutex_unlock(&sisusb->lock);
29342935
return -EINVAL;
29352936
}
29362937

@@ -2956,7 +2957,7 @@ sisusb_write(struct file *file, const char __user *buffer, size_t count,
29562957

29572958
(*ppos) += bytes_written;
29582959

2959-
up(&sisusb->lock);
2960+
mutex_unlock(&sisusb->lock);
29602961

29612962
return errno ? errno : bytes_written;
29622963
}
@@ -2970,11 +2971,11 @@ sisusb_lseek(struct file *file, loff_t offset, int orig)
29702971
if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
29712972
return -ENODEV;
29722973

2973-
down(&sisusb->lock);
2974+
mutex_lock(&sisusb->lock);
29742975

29752976
/* Sanity check */
29762977
if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2977-
up(&sisusb->lock);
2978+
mutex_unlock(&sisusb->lock);
29782979
return -ENODEV;
29792980
}
29802981

@@ -2994,7 +2995,7 @@ sisusb_lseek(struct file *file, loff_t offset, int orig)
29942995
ret = -EINVAL;
29952996
}
29962997

2997-
up(&sisusb->lock);
2998+
mutex_unlock(&sisusb->lock);
29982999
return ret;
29993000
}
30003001

@@ -3136,7 +3137,7 @@ sisusb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
31363137
if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
31373138
return -ENODEV;
31383139

3139-
down(&sisusb->lock);
3140+
mutex_lock(&sisusb->lock);
31403141

31413142
/* Sanity check */
31423143
if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
@@ -3193,7 +3194,7 @@ sisusb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
31933194
}
31943195

31953196
err_out:
3196-
up(&sisusb->lock);
3197+
mutex_unlock(&sisusb->lock);
31973198
return retval;
31983199
}
31993200

@@ -3258,7 +3259,7 @@ static int sisusb_probe(struct usb_interface *intf,
32583259
}
32593260
kref_init(&sisusb->kref);
32603261

3261-
init_MUTEX(&(sisusb->lock));
3262+
mutex_init(&(sisusb->lock));
32623263

32633264
/* Register device */
32643265
if ((retval = usb_register_dev(intf, &usb_sisusb_class))) {
@@ -3429,9 +3430,9 @@ static void sisusb_disconnect(struct usb_interface *intf)
34293430
* protect all other routines from the disconnect
34303431
* case, not the other way round.
34313432
*/
3432-
down(&disconnect_sem);
3433+
mutex_lock(&disconnect_mutex);
34333434

3434-
down(&sisusb->lock);
3435+
mutex_lock(&sisusb->lock);
34353436

34363437
/* Wait for all URBs to complete and kill them in case (MUST do) */
34373438
if (!sisusb_wait_all_out_complete(sisusb))
@@ -3462,12 +3463,12 @@ static void sisusb_disconnect(struct usb_interface *intf)
34623463
sisusb->present = 0;
34633464
sisusb->ready = 0;
34643465

3465-
up(&sisusb->lock);
3466+
mutex_unlock(&sisusb->lock);
34663467

34673468
/* decrement our usage count */
34683469
kref_put(&sisusb->kref, sisusb_delete);
34693470

3470-
up(&disconnect_sem);
3471+
mutex_unlock(&disconnect_mutex);
34713472

34723473
printk(KERN_INFO "sisusbvga[%d]: Disconnected\n", minor);
34733474
}

drivers/usb/misc/sisusbvga/sisusb.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
#define SISUSB_NEW_CONFIG_COMPAT
4242
#endif
4343

44+
#include <linux/mutex.h>
45+
4446
/* For older kernels, support for text consoles is by default
4547
* off. To ensable text console support, change the following:
4648
*/
@@ -60,11 +62,9 @@
6062
#define INCL_SISUSB_CON 1
6163
#endif
6264

63-
#ifdef INCL_SISUSB_CON
6465
#include <linux/console.h>
6566
#include <linux/vt_kern.h>
6667
#include "sisusb_struct.h"
67-
#endif
6868

6969
/* USB related */
7070

@@ -116,7 +116,7 @@ struct sisusb_usb_data {
116116
struct usb_interface *interface;
117117
struct kref kref;
118118
wait_queue_head_t wait_q; /* for syncind and timeouts */
119-
struct semaphore lock; /* general race avoidance */
119+
struct mutex lock; /* general race avoidance */
120120
unsigned int ifnum; /* interface number of the USB device */
121121
int minor; /* minor (for logging clarity) */
122122
int isopen; /* !=0 if open */

0 commit comments

Comments
 (0)