MMC: sdio, use kref from tty_port
authorJiri Slaby <jslaby@suse.cz>
Thu, 15 Nov 2012 08:49:52 +0000 (09:49 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 16 Nov 2012 01:20:57 +0000 (17:20 -0800)
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>
drivers/mmc/card/sdio_uart.c

index 369f7ba1d216e169e62bb982a988f3b473db69d7..bd57a11acc7949e7237be40a442c865c418c61a1 100644 (file)
@@ -66,7 +66,6 @@ struct uart_icount {
 
 struct sdio_uart_port {
        struct tty_port         port;
-       struct kref             kref;
        unsigned int            index;
        struct sdio_func        *func;
        struct mutex            func_lock;
@@ -92,7 +91,6 @@ static int sdio_uart_add_port(struct sdio_uart_port *port)
 {
        int index, ret = -EBUSY;
 
-       kref_init(&port->kref);
        mutex_init(&port->func_lock);
        spin_lock_init(&port->write_lock);
        if (kfifo_alloc(&port->xmit_fifo, FIFO_SIZE, GFP_KERNEL))
@@ -122,23 +120,15 @@ static struct sdio_uart_port *sdio_uart_port_get(unsigned index)
        spin_lock(&sdio_uart_table_lock);
        port = sdio_uart_table[index];
        if (port)
-               kref_get(&port->kref);
+               tty_port_get(&port->port);
        spin_unlock(&sdio_uart_table_lock);
 
        return port;
 }
 
-static void sdio_uart_port_destroy(struct kref *kref)
-{
-       struct sdio_uart_port *port =
-               container_of(kref, struct sdio_uart_port, kref);
-       kfifo_free(&port->xmit_fifo);
-       kfree(port);
-}
-
 static void sdio_uart_port_put(struct sdio_uart_port *port)
 {
-       kref_put(&port->kref, sdio_uart_port_destroy);
+       tty_port_put(&port->port);
 }
 
 static void sdio_uart_port_remove(struct sdio_uart_port *port)
@@ -736,6 +726,14 @@ static void sdio_uart_shutdown(struct tty_port *tport)
        sdio_uart_release_func(port);
 }
 
+static void sdio_uart_port_destroy(struct tty_port *tport)
+{
+       struct sdio_uart_port *port =
+               container_of(tport, struct sdio_uart_port, port);
+       kfifo_free(&port->xmit_fifo);
+       kfree(port);
+}
+
 /**
  *     sdio_uart_install       -       install method
  *     @driver: the driver in use (sdio_uart in our case)
@@ -1044,6 +1042,7 @@ static const struct tty_port_operations sdio_uart_port_ops = {
        .carrier_raised = uart_carrier_raised,
        .shutdown = sdio_uart_shutdown,
        .activate = sdio_uart_activate,
+       .destruct = sdio_uart_port_destroy,
 };
 
 static const struct tty_operations sdio_uart_ops = {