tty_ldisc.c (597473720f4dc69749542bfcfed4a927a43d935e) tty_ldisc.c (eec4844fae7c033a0c1fc1eb3b8517aeb8b6cc49)
1// SPDX-License-Identifier: GPL-2.0
2#include <linux/types.h>
3#include <linux/errno.h>
4#include <linux/kmod.h>
5#include <linux/sched.h>
6#include <linux/interrupt.h>
7#include <linux/tty.h>
8#include <linux/tty_driver.h>

--- 473 unchanged lines hidden (view full) ---

482 * @ld: discipline to close
483 *
484 * A helper close method. Also a convenient debugging and check
485 * point.
486 */
487
488static void tty_ldisc_close(struct tty_struct *tty, struct tty_ldisc *ld)
489{
1// SPDX-License-Identifier: GPL-2.0
2#include <linux/types.h>
3#include <linux/errno.h>
4#include <linux/kmod.h>
5#include <linux/sched.h>
6#include <linux/interrupt.h>
7#include <linux/tty.h>
8#include <linux/tty_driver.h>

--- 473 unchanged lines hidden (view full) ---

482 * @ld: discipline to close
483 *
484 * A helper close method. Also a convenient debugging and check
485 * point.
486 */
487
488static void tty_ldisc_close(struct tty_struct *tty, struct tty_ldisc *ld)
489{
490 lockdep_assert_held_exclusive(&tty->ldisc_sem);
490 lockdep_assert_held_write(&tty->ldisc_sem);
491 WARN_ON(!test_bit(TTY_LDISC_OPEN, &tty->flags));
492 clear_bit(TTY_LDISC_OPEN, &tty->flags);
493 if (ld->ops->close)
494 ld->ops->close(tty);
495 tty_ldisc_debug(tty, "%p: closed\n", ld);
496}
497
498/**

--- 5 unchanged lines hidden (view full) ---

504 * ldisc fails and we need something attached.
505 */
506
507static int tty_ldisc_failto(struct tty_struct *tty, int ld)
508{
509 struct tty_ldisc *disc = tty_ldisc_get(tty, ld);
510 int r;
511
491 WARN_ON(!test_bit(TTY_LDISC_OPEN, &tty->flags));
492 clear_bit(TTY_LDISC_OPEN, &tty->flags);
493 if (ld->ops->close)
494 ld->ops->close(tty);
495 tty_ldisc_debug(tty, "%p: closed\n", ld);
496}
497
498/**

--- 5 unchanged lines hidden (view full) ---

504 * ldisc fails and we need something attached.
505 */
506
507static int tty_ldisc_failto(struct tty_struct *tty, int ld)
508{
509 struct tty_ldisc *disc = tty_ldisc_get(tty, ld);
510 int r;
511
512 lockdep_assert_held_exclusive(&tty->ldisc_sem);
512 lockdep_assert_held_write(&tty->ldisc_sem);
513 if (IS_ERR(disc))
514 return PTR_ERR(disc);
515 tty->ldisc = disc;
516 tty_set_termios_ldisc(tty, ld);
517 if ((r = tty_ldisc_open(tty, disc)) < 0)
518 tty_ldisc_put(disc);
519 return r;
520}

--- 107 unchanged lines hidden (view full) ---

628/**
629 * tty_ldisc_kill - teardown ldisc
630 * @tty: tty being released
631 *
632 * Perform final close of the ldisc and reset tty->ldisc
633 */
634static void tty_ldisc_kill(struct tty_struct *tty)
635{
513 if (IS_ERR(disc))
514 return PTR_ERR(disc);
515 tty->ldisc = disc;
516 tty_set_termios_ldisc(tty, ld);
517 if ((r = tty_ldisc_open(tty, disc)) < 0)
518 tty_ldisc_put(disc);
519 return r;
520}

--- 107 unchanged lines hidden (view full) ---

628/**
629 * tty_ldisc_kill - teardown ldisc
630 * @tty: tty being released
631 *
632 * Perform final close of the ldisc and reset tty->ldisc
633 */
634static void tty_ldisc_kill(struct tty_struct *tty)
635{
636 lockdep_assert_held_exclusive(&tty->ldisc_sem);
636 lockdep_assert_held_write(&tty->ldisc_sem);
637 if (!tty->ldisc)
638 return;
639 /*
640 * Now kill off the ldisc
641 */
642 tty_ldisc_close(tty, tty->ldisc);
643 tty_ldisc_put(tty->ldisc);
644 /* Force an oops if we mess this up */

--- 31 unchanged lines hidden (view full) ---

676 * Returns 0 if successful, otherwise error code < 0
677 */
678
679int tty_ldisc_reinit(struct tty_struct *tty, int disc)
680{
681 struct tty_ldisc *ld;
682 int retval;
683
637 if (!tty->ldisc)
638 return;
639 /*
640 * Now kill off the ldisc
641 */
642 tty_ldisc_close(tty, tty->ldisc);
643 tty_ldisc_put(tty->ldisc);
644 /* Force an oops if we mess this up */

--- 31 unchanged lines hidden (view full) ---

676 * Returns 0 if successful, otherwise error code < 0
677 */
678
679int tty_ldisc_reinit(struct tty_struct *tty, int disc)
680{
681 struct tty_ldisc *ld;
682 int retval;
683
684 lockdep_assert_held_exclusive(&tty->ldisc_sem);
684 lockdep_assert_held_write(&tty->ldisc_sem);
685 ld = tty_ldisc_get(tty, disc);
686 if (IS_ERR(ld)) {
687 BUG_ON(disc == N_TTY);
688 return PTR_ERR(ld);
689 }
690
691 if (tty->ldisc) {
692 tty_ldisc_close(tty, tty->ldisc);

--- 157 unchanged lines hidden (view full) ---

850void tty_ldisc_deinit(struct tty_struct *tty)
851{
852 /* no ldisc_sem, tty is being destroyed */
853 if (tty->ldisc)
854 tty_ldisc_put(tty->ldisc);
855 tty->ldisc = NULL;
856}
857
685 ld = tty_ldisc_get(tty, disc);
686 if (IS_ERR(ld)) {
687 BUG_ON(disc == N_TTY);
688 return PTR_ERR(ld);
689 }
690
691 if (tty->ldisc) {
692 tty_ldisc_close(tty, tty->ldisc);

--- 157 unchanged lines hidden (view full) ---

850void tty_ldisc_deinit(struct tty_struct *tty)
851{
852 /* no ldisc_sem, tty is being destroyed */
853 if (tty->ldisc)
854 tty_ldisc_put(tty->ldisc);
855 tty->ldisc = NULL;
856}
857
858static int zero;
859static int one = 1;
860static struct ctl_table tty_table[] = {
861 {
862 .procname = "ldisc_autoload",
863 .data = &tty_ldisc_autoload,
864 .maxlen = sizeof(tty_ldisc_autoload),
865 .mode = 0644,
866 .proc_handler = proc_dointvec,
858static struct ctl_table tty_table[] = {
859 {
860 .procname = "ldisc_autoload",
861 .data = &tty_ldisc_autoload,
862 .maxlen = sizeof(tty_ldisc_autoload),
863 .mode = 0644,
864 .proc_handler = proc_dointvec,
867 .extra1 = &zero,
868 .extra2 = &one,
865 .extra1 = SYSCTL_ZERO,
866 .extra2 = SYSCTL_ONE,
869 },
870 { }
871};
872
873static struct ctl_table tty_dir_table[] = {
874 {
875 .procname = "tty",
876 .mode = 0555,

--- 18 unchanged lines hidden ---
867 },
868 { }
869};
870
871static struct ctl_table tty_dir_table[] = {
872 {
873 .procname = "tty",
874 .mode = 0555,

--- 18 unchanged lines hidden ---