mirror of https://gitee.com/openkylin/linux.git
USB: auerswald: Convert stats_sem in a mutex
The semaphore cp->mutex is used as mutex, convert it to the mutex API Signed-off-by: Matthias Kaehlcke <matthias@kaehlcke.net> Cc: Wolfgang Mües <wolfgang@iksw-muees.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
92983c2121
commit
b994d7f70a
|
@ -31,6 +31,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/wait.h>
|
#include <linux/wait.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
/*-------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------*/
|
||||||
/* Debug support */
|
/* Debug support */
|
||||||
|
@ -232,7 +233,7 @@ typedef struct auerscon
|
||||||
/* USB device context */
|
/* USB device context */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
struct semaphore mutex; /* protection in user context */
|
struct mutex mutex; /* protection in user context */
|
||||||
char name[20]; /* name of the /dev/usb entry */
|
char name[20]; /* name of the /dev/usb entry */
|
||||||
unsigned int dtindex; /* index in the device table */
|
unsigned int dtindex; /* index in the device table */
|
||||||
struct usb_device * usbdev; /* USB device handle */
|
struct usb_device * usbdev; /* USB device handle */
|
||||||
|
@ -1376,7 +1377,7 @@ static int auerchar_open (struct inode *inode, struct file *file)
|
||||||
if (cp == NULL) {
|
if (cp == NULL) {
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
if (down_interruptible (&cp->mutex)) {
|
if (mutex_lock_interruptible(&cp->mutex)) {
|
||||||
return -ERESTARTSYS;
|
return -ERESTARTSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1405,7 +1406,7 @@ static int auerchar_open (struct inode *inode, struct file *file)
|
||||||
cp->open_count++;
|
cp->open_count++;
|
||||||
ccp->auerdev = cp;
|
ccp->auerdev = cp;
|
||||||
dbg("open %s as /dev/%s", cp->dev_desc, cp->name);
|
dbg("open %s as /dev/%s", cp->dev_desc, cp->name);
|
||||||
up (&cp->mutex);
|
mutex_unlock(&cp->mutex);
|
||||||
|
|
||||||
/* file IO stuff */
|
/* file IO stuff */
|
||||||
file->f_pos = 0;
|
file->f_pos = 0;
|
||||||
|
@ -1413,7 +1414,7 @@ static int auerchar_open (struct inode *inode, struct file *file)
|
||||||
return nonseekable_open(inode, file);
|
return nonseekable_open(inode, file);
|
||||||
|
|
||||||
/* Error exit */
|
/* Error exit */
|
||||||
ofail: up (&cp->mutex);
|
ofail: mutex_unlock(&cp->mutex);
|
||||||
auerchar_delete (ccp);
|
auerchar_delete (ccp);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1440,14 +1441,14 @@ static int auerchar_ioctl (struct inode *inode, struct file *file, unsigned int
|
||||||
up (&ccp->mutex);
|
up (&ccp->mutex);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
if (down_interruptible (&cp->mutex)) {
|
if (mutex_lock_interruptible(&cp->mutex)) {
|
||||||
up(&ccp->mutex);
|
up(&ccp->mutex);
|
||||||
return -ERESTARTSYS;
|
return -ERESTARTSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for removal */
|
/* Check for removal */
|
||||||
if (!cp->usbdev) {
|
if (!cp->usbdev) {
|
||||||
up(&cp->mutex);
|
mutex_unlock(&cp->mutex);
|
||||||
up(&ccp->mutex);
|
up(&ccp->mutex);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
@ -1550,7 +1551,7 @@ static int auerchar_ioctl (struct inode *inode, struct file *file, unsigned int
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* release the mutexes */
|
/* release the mutexes */
|
||||||
up(&cp->mutex);
|
mutex_unlock(&cp->mutex);
|
||||||
up(&ccp->mutex);
|
up(&ccp->mutex);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1721,12 +1722,12 @@ static ssize_t auerchar_write (struct file *file, const char __user *buf, size_t
|
||||||
up (&ccp->mutex);
|
up (&ccp->mutex);
|
||||||
return -ERESTARTSYS;
|
return -ERESTARTSYS;
|
||||||
}
|
}
|
||||||
if (down_interruptible (&cp->mutex)) {
|
if (mutex_lock_interruptible(&cp->mutex)) {
|
||||||
up (&ccp->mutex);
|
up (&ccp->mutex);
|
||||||
return -ERESTARTSYS;
|
return -ERESTARTSYS;
|
||||||
}
|
}
|
||||||
if (!cp->usbdev) {
|
if (!cp->usbdev) {
|
||||||
up (&cp->mutex);
|
mutex_unlock(&cp->mutex);
|
||||||
up (&ccp->mutex);
|
up (&ccp->mutex);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
@ -1750,7 +1751,7 @@ static ssize_t auerchar_write (struct file *file, const char __user *buf, size_t
|
||||||
|
|
||||||
/* are there any buffers left? */
|
/* are there any buffers left? */
|
||||||
if (!bp) {
|
if (!bp) {
|
||||||
up (&cp->mutex);
|
mutex_unlock(&cp->mutex);
|
||||||
up (&ccp->mutex);
|
up (&ccp->mutex);
|
||||||
|
|
||||||
/* NONBLOCK: don't wait */
|
/* NONBLOCK: don't wait */
|
||||||
|
@ -1783,7 +1784,7 @@ static ssize_t auerchar_write (struct file *file, const char __user *buf, size_t
|
||||||
auerbuf_releasebuf (bp);
|
auerbuf_releasebuf (bp);
|
||||||
/* Wake up all processes waiting for a buffer */
|
/* Wake up all processes waiting for a buffer */
|
||||||
wake_up (&cp->bufferwait);
|
wake_up (&cp->bufferwait);
|
||||||
up (&cp->mutex);
|
mutex_unlock(&cp->mutex);
|
||||||
up (&ccp->mutex);
|
up (&ccp->mutex);
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
|
@ -1803,7 +1804,7 @@ static ssize_t auerchar_write (struct file *file, const char __user *buf, size_t
|
||||||
auerchar_ctrlwrite_complete, bp);
|
auerchar_ctrlwrite_complete, bp);
|
||||||
/* up we go */
|
/* up we go */
|
||||||
ret = auerchain_submit_urb (&cp->controlchain, bp->urbp);
|
ret = auerchain_submit_urb (&cp->controlchain, bp->urbp);
|
||||||
up (&cp->mutex);
|
mutex_unlock(&cp->mutex);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dbg ("auerchar_write: nonzero result of auerchain_submit_urb %d", ret);
|
dbg ("auerchar_write: nonzero result of auerchain_submit_urb %d", ret);
|
||||||
auerbuf_releasebuf (bp);
|
auerbuf_releasebuf (bp);
|
||||||
|
@ -1830,16 +1831,16 @@ static int auerchar_release (struct inode *inode, struct file *file)
|
||||||
down(&ccp->mutex);
|
down(&ccp->mutex);
|
||||||
cp = ccp->auerdev;
|
cp = ccp->auerdev;
|
||||||
if (cp) {
|
if (cp) {
|
||||||
down(&cp->mutex);
|
mutex_lock(&cp->mutex);
|
||||||
/* remove an open service */
|
/* remove an open service */
|
||||||
auerswald_removeservice (cp, &ccp->scontext);
|
auerswald_removeservice (cp, &ccp->scontext);
|
||||||
/* detach from device */
|
/* detach from device */
|
||||||
if ((--cp->open_count <= 0) && (cp->usbdev == NULL)) {
|
if ((--cp->open_count <= 0) && (cp->usbdev == NULL)) {
|
||||||
/* usb device waits for removal */
|
/* usb device waits for removal */
|
||||||
up (&cp->mutex);
|
mutex_unlock(&cp->mutex);
|
||||||
auerswald_delete (cp);
|
auerswald_delete (cp);
|
||||||
} else {
|
} else {
|
||||||
up (&cp->mutex);
|
mutex_unlock(&cp->mutex);
|
||||||
}
|
}
|
||||||
cp = NULL;
|
cp = NULL;
|
||||||
ccp->auerdev = NULL;
|
ccp->auerdev = NULL;
|
||||||
|
@ -1917,7 +1918,7 @@ static int auerswald_probe (struct usb_interface *intf,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize device descriptor */
|
/* Initialize device descriptor */
|
||||||
init_MUTEX (&cp->mutex);
|
mutex_init(&cp->mutex);
|
||||||
cp->usbdev = usbdev;
|
cp->usbdev = usbdev;
|
||||||
auerchain_init (&cp->controlchain);
|
auerchain_init (&cp->controlchain);
|
||||||
auerbuf_init (&cp->bufctl);
|
auerbuf_init (&cp->bufctl);
|
||||||
|
@ -2042,7 +2043,7 @@ static void auerswald_disconnect (struct usb_interface *intf)
|
||||||
/* give back our USB minor number */
|
/* give back our USB minor number */
|
||||||
usb_deregister_dev(intf, &auerswald_class);
|
usb_deregister_dev(intf, &auerswald_class);
|
||||||
|
|
||||||
down (&cp->mutex);
|
mutex_lock(&cp->mutex);
|
||||||
info ("device /dev/%s now disconnecting", cp->name);
|
info ("device /dev/%s now disconnecting", cp->name);
|
||||||
|
|
||||||
/* Stop the interrupt endpoint */
|
/* Stop the interrupt endpoint */
|
||||||
|
@ -2057,16 +2058,18 @@ static void auerswald_disconnect (struct usb_interface *intf)
|
||||||
|
|
||||||
if (cp->open_count == 0) {
|
if (cp->open_count == 0) {
|
||||||
/* nobody is using this device. So we can clean up now */
|
/* nobody is using this device. So we can clean up now */
|
||||||
up (&cp->mutex);/* up() is possible here because no other task
|
mutex_unlock(&cp->mutex);
|
||||||
|
/* mutex_unlock() is possible here because no other task
|
||||||
can open the device (see above). I don't want
|
can open the device (see above). I don't want
|
||||||
to kfree() a locked mutex. */
|
to kfree() a locked mutex. */
|
||||||
|
|
||||||
auerswald_delete (cp);
|
auerswald_delete (cp);
|
||||||
} else {
|
} else {
|
||||||
/* device is used. Remove the pointer to the
|
/* device is used. Remove the pointer to the
|
||||||
usb device (it's not valid any more). The last
|
usb device (it's not valid any more). The last
|
||||||
release() will do the clean up */
|
release() will do the clean up */
|
||||||
cp->usbdev = NULL;
|
cp->usbdev = NULL;
|
||||||
up (&cp->mutex);
|
mutex_unlock(&cp->mutex);
|
||||||
/* Terminate waiting writers */
|
/* Terminate waiting writers */
|
||||||
wake_up (&cp->bufferwait);
|
wake_up (&cp->bufferwait);
|
||||||
/* Inform all waiting readers */
|
/* Inform all waiting readers */
|
||||||
|
|
Loading…
Reference in New Issue