Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1ce7dd26 authored by Luiz Fernando Capitulino's avatar Luiz Fernando Capitulino Committed by Greg Kroah-Hartman
Browse files

[PATCH] USB serial: Converts port semaphore to mutexes.



The usbserial's port semaphore used to synchronize serial_open()
and serial_close() are strict mutexes, convert them to the mutex
implementation.

Signed-off-by: default avatarLuiz Capitulino <lcapitulino@mandriva.com.br>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 14cd5f8e
Loading
Loading
Loading
Loading
+8 −8
Original line number Original line Diff line number Diff line
@@ -27,10 +27,10 @@
#include <linux/module.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/moduleparam.h>
#include <linux/spinlock.h>
#include <linux/spinlock.h>
#include <linux/mutex.h>
#include <linux/list.h>
#include <linux/list.h>
#include <linux/smp_lock.h>
#include <linux/smp_lock.h>
#include <asm/uaccess.h>
#include <asm/uaccess.h>
#include <asm/semaphore.h>
#include <linux/usb.h>
#include <linux/usb.h>
#include "usb-serial.h"
#include "usb-serial.h"
#include "pl2303.h"
#include "pl2303.h"
@@ -192,7 +192,7 @@ static int serial_open (struct tty_struct *tty, struct file * filp)
	if (!port)
	if (!port)
		return -ENODEV;
		return -ENODEV;


	if (down_interruptible(&port->sem))
	if (mutex_lock_interruptible(&port->mutex))
		return -ERESTARTSYS;
		return -ERESTARTSYS;
	 
	 
	++port->open_count;
	++port->open_count;
@@ -219,7 +219,7 @@ static int serial_open (struct tty_struct *tty, struct file * filp)
			goto bailout_module_put;
			goto bailout_module_put;
	}
	}


	up(&port->sem);
	mutex_unlock(&port->mutex);
	return 0;
	return 0;


bailout_module_put:
bailout_module_put:
@@ -227,7 +227,7 @@ bailout_module_put:
bailout_kref_put:
bailout_kref_put:
	kref_put(&serial->kref, destroy_serial);
	kref_put(&serial->kref, destroy_serial);
	port->open_count = 0;
	port->open_count = 0;
	up(&port->sem);
	mutex_unlock(&port->mutex);
	return retval;
	return retval;
}
}


@@ -240,10 +240,10 @@ static void serial_close(struct tty_struct *tty, struct file * filp)


	dbg("%s - port %d", __FUNCTION__, port->number);
	dbg("%s - port %d", __FUNCTION__, port->number);


	down(&port->sem);
	mutex_lock(&port->mutex);


	if (port->open_count == 0) {
	if (port->open_count == 0) {
		up(&port->sem);
		mutex_unlock(&port->mutex);
		return;
		return;
	}
	}


@@ -262,7 +262,7 @@ static void serial_close(struct tty_struct *tty, struct file * filp)
		module_put(port->serial->type->driver.owner);
		module_put(port->serial->type->driver.owner);
	}
	}


	up(&port->sem);
	mutex_unlock(&port->mutex);
	kref_put(&port->serial->kref, destroy_serial);
	kref_put(&port->serial->kref, destroy_serial);
}
}


@@ -783,7 +783,7 @@ int usb_serial_probe(struct usb_interface *interface,
		port->number = i + serial->minor;
		port->number = i + serial->minor;
		port->serial = serial;
		port->serial = serial;
		spin_lock_init(&port->lock);
		spin_lock_init(&port->lock);
		sema_init(&port->sem, 1);
		mutex_init(&port->mutex);
		INIT_WORK(&port->work, usb_serial_port_softint, port);
		INIT_WORK(&port->work, usb_serial_port_softint, port);
		serial->port[i] = port;
		serial->port[i] = port;
	}
	}
+3 −3
Original line number Original line Diff line number Diff line
@@ -16,7 +16,7 @@


#include <linux/config.h>
#include <linux/config.h>
#include <linux/kref.h>
#include <linux/kref.h>
#include <asm/semaphore.h>
#include <linux/mutex.h>


#define SERIAL_TTY_MAJOR	188	/* Nice legal number now */
#define SERIAL_TTY_MAJOR	188	/* Nice legal number now */
#define SERIAL_TTY_MINORS	255	/* loads of devices :) */
#define SERIAL_TTY_MINORS	255	/* loads of devices :) */
@@ -31,7 +31,7 @@
 * @serial: pointer back to the struct usb_serial owner of this port.
 * @serial: pointer back to the struct usb_serial owner of this port.
 * @tty: pointer to the corresponding tty for this port.
 * @tty: pointer to the corresponding tty for this port.
 * @lock: spinlock to grab when updating portions of this structure.
 * @lock: spinlock to grab when updating portions of this structure.
 * @sem: semaphore used to synchronize serial_open() and serial_close()
 * @mutex: mutex used to synchronize serial_open() and serial_close()
 *	access for this port.
 *	access for this port.
 * @number: the number of the port (the minor number).
 * @number: the number of the port (the minor number).
 * @interrupt_in_buffer: pointer to the interrupt in buffer for this port.
 * @interrupt_in_buffer: pointer to the interrupt in buffer for this port.
@@ -63,7 +63,7 @@ struct usb_serial_port {
	struct usb_serial *	serial;
	struct usb_serial *	serial;
	struct tty_struct *	tty;
	struct tty_struct *	tty;
	spinlock_t		lock;
	spinlock_t		lock;
	struct semaphore        sem;
	struct mutex            mutex;
	unsigned char		number;
	unsigned char		number;


	unsigned char *		interrupt_in_buffer;
	unsigned char *		interrupt_in_buffer;