]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
s390/3270: fix view reference counting
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 2 May 2016 11:49:28 +0000 (13:49 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 4 May 2016 14:29:51 +0000 (16:29 +0200)
The tty3270_close function set tty->driver_data to NULL after the
open count dropped to zero but tty3270_cleanup still needs the
pointer to the tty3270 view to drop the reference count.

Move the clearing of tty->driver_data to tty3270_cleanup and
drop the unnecessary tty_port_tty_set calls in tty3270_install.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/char/tty3270.c

index 345f392b50b2cc1928009fc2abdba92b4851fec7..e8afa07f082e3fe95e0300e48b91f4d2277dd551 100644 (file)
@@ -924,10 +924,8 @@ static int tty3270_install(struct tty_driver *driver, struct tty_struct *tty)
                tty->winsize.ws_row = tp->view.rows - 2;
                tty->winsize.ws_col = tp->view.cols;
                tp->port.low_latency = 0;
-               /* why to reassign? */
-               tty_port_tty_set(&tp->port, tty);
                tp->inattr = TF_INPUT;
-               return tty_port_install(&tp->port, driver, tty);
+               goto port_install;
        }
        if (tty3270_max_index < tty->index + 1)
                tty3270_max_index = tty->index + 1;
@@ -953,7 +951,6 @@ static int tty3270_install(struct tty_driver *driver, struct tty_struct *tty)
                return rc;
        }
 
-       tty_port_tty_set(&tp->port, tty);
        tp->port.low_latency = 0;
        tty->winsize.ws_row = tp->view.rows - 2;
        tty->winsize.ws_col = tp->view.cols;
@@ -975,6 +972,7 @@ static int tty3270_install(struct tty_driver *driver, struct tty_struct *tty)
 
        raw3270_activate_view(&tp->view);
 
+port_install:
        rc = tty_port_install(&tp->port, driver, tty);
        if (rc) {
                raw3270_put_view(&tp->view);
@@ -1011,18 +1009,18 @@ tty3270_close(struct tty_struct *tty, struct file * filp)
 
        if (tty->count > 1)
                return;
-       if (tp) {
-               tty->driver_data = NULL;
+       if (tp)
                tty_port_tty_set(&tp->port, NULL);
-       }
 }
 
 static void tty3270_cleanup(struct tty_struct *tty)
 {
        struct tty3270 *tp = tty->driver_data;
 
-       if (tp)
+       if (tp) {
+               tty->driver_data = NULL;
                raw3270_put_view(&tp->view);
+       }
 }
 
 /*