mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 13:14:07 +08:00
TTY: n_gsm, use kref from tty_port
After commit "TTY: move tty buffers to tty_port", the tty buffers are not freed in some drivers. This is because tty_port_destructor is not called whenever a tty_port is freed. This was an assumption I counted with but was unfortunately untrue. So fix the drivers to fulfil this assumption. Here it is enough to switch to refcounting in tty_port. Signed-off-by: Jiri Slaby <jslaby@suse.cz> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
e70c67713c
commit
9a8e62bc68
@ -134,7 +134,6 @@ struct gsm_dlci {
|
||||
#define DLCI_OPENING 1 /* Sending SABM not seen UA */
|
||||
#define DLCI_OPEN 2 /* SABM/UA complete */
|
||||
#define DLCI_CLOSING 3 /* Sending DISC not seen UA/DM */
|
||||
struct kref ref; /* freed from port or mux close */
|
||||
struct mutex mutex;
|
||||
|
||||
/* Link layer */
|
||||
@ -1635,7 +1634,6 @@ static struct gsm_dlci *gsm_dlci_alloc(struct gsm_mux *gsm, int addr)
|
||||
if (dlci == NULL)
|
||||
return NULL;
|
||||
spin_lock_init(&dlci->lock);
|
||||
kref_init(&dlci->ref);
|
||||
mutex_init(&dlci->mutex);
|
||||
dlci->fifo = &dlci->_fifo;
|
||||
if (kfifo_alloc(&dlci->_fifo, 4096, GFP_KERNEL) < 0) {
|
||||
@ -1669,9 +1667,9 @@ static struct gsm_dlci *gsm_dlci_alloc(struct gsm_mux *gsm, int addr)
|
||||
*
|
||||
* Can sleep.
|
||||
*/
|
||||
static void gsm_dlci_free(struct kref *ref)
|
||||
static void gsm_dlci_free(struct tty_port *port)
|
||||
{
|
||||
struct gsm_dlci *dlci = container_of(ref, struct gsm_dlci, ref);
|
||||
struct gsm_dlci *dlci = container_of(port, struct gsm_dlci, port);
|
||||
|
||||
del_timer_sync(&dlci->t1);
|
||||
dlci->gsm->dlci[dlci->addr] = NULL;
|
||||
@ -1683,12 +1681,12 @@ static void gsm_dlci_free(struct kref *ref)
|
||||
|
||||
static inline void dlci_get(struct gsm_dlci *dlci)
|
||||
{
|
||||
kref_get(&dlci->ref);
|
||||
tty_port_get(&dlci->port);
|
||||
}
|
||||
|
||||
static inline void dlci_put(struct gsm_dlci *dlci)
|
||||
{
|
||||
kref_put(&dlci->ref, gsm_dlci_free);
|
||||
tty_port_put(&dlci->port);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2874,6 +2872,7 @@ static void gsm_dtr_rts(struct tty_port *port, int onoff)
|
||||
static const struct tty_port_operations gsm_port_ops = {
|
||||
.carrier_raised = gsm_carrier_raised,
|
||||
.dtr_rts = gsm_dtr_rts,
|
||||
.destruct = gsm_dlci_free,
|
||||
};
|
||||
|
||||
static int gsmtty_install(struct tty_driver *driver, struct tty_struct *tty)
|
||||
|
Loading…
Reference in New Issue
Block a user