drivers/tty/serial: extern function which for release resource, need check pointer...
authorChen Gang <gang.chen@asianux.com>
Thu, 27 Dec 2012 07:51:31 +0000 (15:51 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 16 Jan 2013 07:00:44 +0000 (23:00 -0800)
  for extern function uart_remove_one_port:
    need check pointer whether be NULL, before the main work.
    just like what the other extern function uart_add_one_port has done.
    uart_add_one_port and uart_remove_one_port are pair

  information:
    for the callers (such as drivers/tty/serial/jsm: jsm_tty.c, jsm_driver.c)
    they realy assume that:
      they still can call uart_remove_one_port, after uart_add_one_port failed
    we (as an extern function), have to understand it (just like kfree).

Signed-off-by: Chen Gang <gang.chen@asianux.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/serial_core.c

index b5c4e64..ca98a3f 100644 (file)
@@ -2643,6 +2643,7 @@ int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
 {
        struct uart_state *state = drv->state + uport->line;
        struct tty_port *port = &state->port;
+       int ret = 0;
 
        BUG_ON(in_interrupt());
 
@@ -2657,6 +2658,11 @@ int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
         * succeeding while we shut down the port.
         */
        mutex_lock(&port->mutex);
+       if (!state->uart_port) {
+               mutex_unlock(&port->mutex);
+               ret = -EINVAL;
+               goto out;
+       }
        uport->flags |= UPF_DEAD;
        mutex_unlock(&port->mutex);
 
@@ -2680,9 +2686,10 @@ int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
        uport->type = PORT_UNKNOWN;
 
        state->uart_port = NULL;
+out:
        mutex_unlock(&port_mutex);
 
-       return 0;
+       return ret;
 }
 
 /*