TTY: introduce deinit helpers for proper ldisc shutdown
authorJiri Slaby <jslaby@suse.cz>
Wed, 23 Mar 2011 09:48:35 +0000 (10:48 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 19 Apr 2011 21:43:01 +0000 (14:43 -0700)
Introduce deinitialize_tty_struct which should be called after
initialize_tty_struct and before successfull tty_ldisc_setup.

It calls tty_ldisc_deinit which is opposite of tty_ldisc_init. It only
puts a reference to ldisc and assigns NULL to tty->ldisc.

It will be used to shut down ldisc when tty_release cannot be called
yet.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Julian Anastasov <ja@ssi.bg>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/tty/tty_io.c
drivers/tty/tty_ldisc.c
include/linux/tty.h

index 026bf2f6f5f282f87ad9201fa5cf3d698e8a1ea4..f5dd23520fe3fb17581cc9b4bedfa38bf0184c5f 100644 (file)
@@ -2886,6 +2886,20 @@ void initialize_tty_struct(struct tty_struct *tty,
        tty->dev = tty_get_device(tty);
 }
 
+/**
+ *     deinitialize_tty_struct
+ *     @tty: tty to deinitialize
+ *
+ *     This subroutine deinitializes a tty structure that has been newly
+ *     allocated but tty_release cannot be called on that yet.
+ *
+ *     Locking: none - tty in question must not be exposed at this point
+ */
+void deinitialize_tty_struct(struct tty_struct *tty)
+{
+       tty_ldisc_deinit(tty);
+}
+
 /**
  *     tty_put_char    -       write one character to a tty
  *     @tty: tty
index e19e136471165dd163509750bddd6382ce70bcd2..5d01d32e2cf072fa26699fd7a7b19e77c7ff4f39 100644 (file)
@@ -956,6 +956,19 @@ void tty_ldisc_init(struct tty_struct *tty)
        tty_ldisc_assign(tty, ld);
 }
 
+/**
+ *     tty_ldisc_init          -       ldisc cleanup for new tty
+ *     @tty: tty that was allocated recently
+ *
+ *     The tty structure must not becompletely set up (tty_ldisc_setup) when
+ *      this call is made.
+ */
+void tty_ldisc_deinit(struct tty_struct *tty)
+{
+       put_ldisc(tty->ldisc);
+       tty_ldisc_assign(tty, NULL);
+}
+
 void tty_ldisc_begin(void)
 {
        /* Setup the default TTY line discipline. */
index 9f469c700550e79dc7fc3949e34c94096c2078ff..4db4ca79f8953fc59ebaa198fbb72b131b131ffc 100644 (file)
@@ -472,6 +472,7 @@ extern int tty_add_file(struct tty_struct *tty, struct file *file);
 extern void free_tty_struct(struct tty_struct *tty);
 extern void initialize_tty_struct(struct tty_struct *tty,
                struct tty_driver *driver, int idx);
+extern void deinitialize_tty_struct(struct tty_struct *tty);
 extern struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx,
                                                                int first_ok);
 extern int tty_release(struct inode *inode, struct file *filp);
@@ -525,6 +526,7 @@ extern int tty_set_ldisc(struct tty_struct *tty, int ldisc);
 extern int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty);
 extern void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty);
 extern void tty_ldisc_init(struct tty_struct *tty);
+extern void tty_ldisc_deinit(struct tty_struct *tty);
 extern void tty_ldisc_begin(void);
 /* This last one is just for the tty layer internals and shouldn't be used elsewhere */
 extern void tty_ldisc_enable(struct tty_struct *tty);