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:
matthias@kaehlcke.net 2008-02-18 20:45:34 +01:00 committed by Greg Kroah-Hartman
parent 92983c2121
commit b994d7f70a
1 changed files with 24 additions and 21 deletions

View File

@ -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 */