Commit 9a8e62bc authored by Jiri Slaby's avatar Jiri Slaby Committed by Greg Kroah-Hartman

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: default avatarJiri Slaby <jslaby@suse.cz>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e70c6771
...@@ -134,7 +134,6 @@ struct gsm_dlci { ...@@ -134,7 +134,6 @@ struct gsm_dlci {
#define DLCI_OPENING 1 /* Sending SABM not seen UA */ #define DLCI_OPENING 1 /* Sending SABM not seen UA */
#define DLCI_OPEN 2 /* SABM/UA complete */ #define DLCI_OPEN 2 /* SABM/UA complete */
#define DLCI_CLOSING 3 /* Sending DISC not seen UA/DM */ #define DLCI_CLOSING 3 /* Sending DISC not seen UA/DM */
struct kref ref; /* freed from port or mux close */
struct mutex mutex; struct mutex mutex;
/* Link layer */ /* Link layer */
...@@ -1635,7 +1634,6 @@ static struct gsm_dlci *gsm_dlci_alloc(struct gsm_mux *gsm, int addr) ...@@ -1635,7 +1634,6 @@ static struct gsm_dlci *gsm_dlci_alloc(struct gsm_mux *gsm, int addr)
if (dlci == NULL) if (dlci == NULL)
return NULL; return NULL;
spin_lock_init(&dlci->lock); spin_lock_init(&dlci->lock);
kref_init(&dlci->ref);
mutex_init(&dlci->mutex); mutex_init(&dlci->mutex);
dlci->fifo = &dlci->_fifo; dlci->fifo = &dlci->_fifo;
if (kfifo_alloc(&dlci->_fifo, 4096, GFP_KERNEL) < 0) { 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) ...@@ -1669,9 +1667,9 @@ static struct gsm_dlci *gsm_dlci_alloc(struct gsm_mux *gsm, int addr)
* *
* Can sleep. * 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); del_timer_sync(&dlci->t1);
dlci->gsm->dlci[dlci->addr] = NULL; dlci->gsm->dlci[dlci->addr] = NULL;
...@@ -1683,12 +1681,12 @@ static void gsm_dlci_free(struct kref *ref) ...@@ -1683,12 +1681,12 @@ static void gsm_dlci_free(struct kref *ref)
static inline void dlci_get(struct gsm_dlci *dlci) 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) 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) ...@@ -2874,6 +2872,7 @@ static void gsm_dtr_rts(struct tty_port *port, int onoff)
static const struct tty_port_operations gsm_port_ops = { static const struct tty_port_operations gsm_port_ops = {
.carrier_raised = gsm_carrier_raised, .carrier_raised = gsm_carrier_raised,
.dtr_rts = gsm_dtr_rts, .dtr_rts = gsm_dtr_rts,
.destruct = gsm_dlci_free,
}; };
static int gsmtty_install(struct tty_driver *driver, struct tty_struct *tty) static int gsmtty_install(struct tty_driver *driver, struct tty_struct *tty)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment