tty_ldisc.c 21.1 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0
2 3
#include <linux/types.h>
#include <linux/errno.h>
4
#include <linux/kmod.h>
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#include <linux/sched.h>
#include <linux/interrupt.h>
#include <linux/tty.h>
#include <linux/tty_driver.h>
#include <linux/file.h>
#include <linux/mm.h>
#include <linux/string.h>
#include <linux/slab.h>
#include <linux/poll.h>
#include <linux/proc_fs.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/wait.h>
#include <linux/bitops.h>
#include <linux/seq_file.h>
#include <linux/uaccess.h>
21
#include <linux/ratelimit.h>
22

23 24 25
#undef LDISC_DEBUG_HANGUP

#ifdef LDISC_DEBUG_HANGUP
26
#define tty_ldisc_debug(tty, f, args...)	tty_debug(tty, f, ##args)
27 28 29 30
#else
#define tty_ldisc_debug(tty, f, args...)
#endif

31 32 33 34 35 36 37
/* lockdep nested classes for tty->ldisc_sem */
enum {
	LDISC_SEM_NORMAL,
	LDISC_SEM_OTHER,
};


38 39 40 41 42 43
/*
 *	This guards the refcounted line discipline lists. The lock
 *	must be taken with irqs off because there are hangup path
 *	callers who will do ldisc lookups and cannot sleep.
 */

44
static DEFINE_RAW_SPINLOCK(tty_ldiscs_lock);
45 46 47 48 49 50 51 52 53 54 55 56 57
/* Line disc dispatch table */
static struct tty_ldisc_ops *tty_ldiscs[NR_LDISCS];

/**
 *	tty_register_ldisc	-	install a line discipline
 *	@disc: ldisc number
 *	@new_ldisc: pointer to the ldisc object
 *
 *	Installs a new line discipline into the kernel. The discipline
 *	is set up as unreferenced and then made available to the kernel
 *	from this point onwards.
 *
 *	Locking:
58
 *		takes tty_ldiscs_lock to guard against ldisc races
59 60 61 62 63 64 65 66 67 68
 */

int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc)
{
	unsigned long flags;
	int ret = 0;

	if (disc < N_TTY || disc >= NR_LDISCS)
		return -EINVAL;

69
	raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
70 71 72
	tty_ldiscs[disc] = new_ldisc;
	new_ldisc->num = disc;
	new_ldisc->refcount = 0;
73
	raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
74 75 76 77 78 79 80 81 82 83 84 85 86 87

	return ret;
}
EXPORT_SYMBOL(tty_register_ldisc);

/**
 *	tty_unregister_ldisc	-	unload a line discipline
 *	@disc: ldisc number
 *	@new_ldisc: pointer to the ldisc object
 *
 *	Remove a line discipline from the kernel providing it is not
 *	currently in use.
 *
 *	Locking:
88
 *		takes tty_ldiscs_lock to guard against ldisc races
89 90 91 92 93 94 95 96 97 98
 */

int tty_unregister_ldisc(int disc)
{
	unsigned long flags;
	int ret = 0;

	if (disc < N_TTY || disc >= NR_LDISCS)
		return -EINVAL;

99
	raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
100 101 102 103
	if (tty_ldiscs[disc]->refcount)
		ret = -EBUSY;
	else
		tty_ldiscs[disc] = NULL;
104
	raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
105 106 107 108 109

	return ret;
}
EXPORT_SYMBOL(tty_unregister_ldisc);

110 111 112 113 114
static struct tty_ldisc_ops *get_ldops(int disc)
{
	unsigned long flags;
	struct tty_ldisc_ops *ldops, *ret;

115
	raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
116 117 118 119 120 121 122 123 124
	ret = ERR_PTR(-EINVAL);
	ldops = tty_ldiscs[disc];
	if (ldops) {
		ret = ERR_PTR(-EAGAIN);
		if (try_module_get(ldops->owner)) {
			ldops->refcount++;
			ret = ldops;
		}
	}
125
	raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
126 127 128 129 130 131 132
	return ret;
}

static void put_ldops(struct tty_ldisc_ops *ldops)
{
	unsigned long flags;

133
	raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
134 135
	ldops->refcount--;
	module_put(ldops->owner);
136
	raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
137
}
138 139 140 141 142 143

/**
 *	tty_ldisc_get		-	take a reference to an ldisc
 *	@disc: ldisc number
 *
 *	Takes a reference to a line discipline. Deals with refcounts and
144 145 146 147 148 149 150 151 152 153
 *	module locking counts.
 *
 *	Returns: -EINVAL if the discipline index is not [N_TTY..NR_LDISCS] or
 *			 if the discipline is not registered
 *		 -EAGAIN if request_module() failed to load or register the
 *			 the discipline
 *		 -ENOMEM if allocation failure
 *
 *		 Otherwise, returns a pointer to the discipline and bumps the
 *		 ref count
154 155
 *
 *	Locking:
156
 *		takes tty_ldiscs_lock to guard against ldisc races
157 158
 */

159 160 161 162 163 164 165
#if defined(CONFIG_LDISC_AUTOLOAD)
	#define INITIAL_AUTOLOAD_STATE	1
#else
	#define INITIAL_AUTOLOAD_STATE	0
#endif
static int tty_ldisc_autoload = INITIAL_AUTOLOAD_STATE;

166
static struct tty_ldisc *tty_ldisc_get(struct tty_struct *tty, int disc)
167
{
A
Alan Cox 已提交
168
	struct tty_ldisc *ld;
169
	struct tty_ldisc_ops *ldops;
170 171

	if (disc < N_TTY || disc >= NR_LDISCS)
A
Alan Cox 已提交
172
		return ERR_PTR(-EINVAL);
173 174 175 176 177 178 179

	/*
	 * Get the ldisc ops - we may need to request them to be loaded
	 * dynamically and try again.
	 */
	ldops = get_ldops(disc);
	if (IS_ERR(ldops)) {
180 181
		if (!capable(CAP_SYS_MODULE) && !tty_ldisc_autoload)
			return ERR_PTR(-EPERM);
182
		request_module("tty-ldisc-%d", disc);
183 184 185 186 187
		ldops = get_ldops(disc);
		if (IS_ERR(ldops))
			return ERR_CAST(ldops);
	}

188 189 190 191 192
	/*
	 * There is no way to handle allocation failure of only 16 bytes.
	 * Let's simplify error handling and save more memory.
	 */
	ld = kmalloc(sizeof(struct tty_ldisc), GFP_KERNEL | __GFP_NOFAIL);
193
	ld->ops = ldops;
194
	ld->tty = tty;
195

A
Alan Cox 已提交
196
	return ld;
197 198
}

199 200 201 202 203
/**
 *	tty_ldisc_put		-	release the ldisc
 *
 *	Complement of tty_ldisc_get().
 */
204
static void tty_ldisc_put(struct tty_ldisc *ld)
205 206 207 208
{
	if (WARN_ON_ONCE(!ld))
		return;

209
	put_ldops(ld->ops);
210 211 212
	kfree(ld);
}

A
Alan Cox 已提交
213
static void *tty_ldiscs_seq_start(struct seq_file *m, loff_t *pos)
214 215 216 217
{
	return (*pos < NR_LDISCS) ? pos : NULL;
}

A
Alan Cox 已提交
218
static void *tty_ldiscs_seq_next(struct seq_file *m, void *v, loff_t *pos)
219 220 221 222 223 224 225 226 227 228 229 230
{
	(*pos)++;
	return (*pos < NR_LDISCS) ? pos : NULL;
}

static void tty_ldiscs_seq_stop(struct seq_file *m, void *v)
{
}

static int tty_ldiscs_seq_show(struct seq_file *m, void *v)
{
	int i = *(loff_t *)v;
231
	struct tty_ldisc_ops *ldops;
A
Alan Cox 已提交
232

233 234
	ldops = get_ldops(i);
	if (IS_ERR(ldops))
235
		return 0;
236 237
	seq_printf(m, "%-10s %2d\n", ldops->name ? ldops->name : "???", i);
	put_ldops(ldops);
238 239 240
	return 0;
}

241
const struct seq_operations tty_ldiscs_seq_ops = {
242 243 244 245 246 247 248 249 250 251 252 253 254 255
	.start	= tty_ldiscs_seq_start,
	.next	= tty_ldiscs_seq_next,
	.stop	= tty_ldiscs_seq_stop,
	.show	= tty_ldiscs_seq_show,
};

/**
 *	tty_ldisc_ref_wait	-	wait for the tty ldisc
 *	@tty: tty device
 *
 *	Dereference the line discipline for the terminal and take a
 *	reference to it. If the line discipline is in flux then
 *	wait patiently until it changes.
 *
256 257 258
 *	Returns: NULL if the tty has been hungup and not re-opened with
 *		 a new file descriptor, otherwise valid ldisc reference
 *
259 260 261 262 263
 *	Note: Must not be called from an IRQ/timer context. The caller
 *	must also be careful not to hold other locks that will deadlock
 *	against a discipline change, such as an existing ldisc reference
 *	(which we check for)
 *
264 265
 *	Note: a file_operations routine (read/poll/write) should use this
 *	function to wait for any ldisc lifetime events to finish.
266 267 268 269
 */

struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty)
{
270 271
	struct tty_ldisc *ld;

272
	ldsem_down_read(&tty->ldisc_sem, MAX_SCHEDULE_TIMEOUT);
273 274
	ld = tty->ldisc;
	if (!ld)
P
Peter Hurley 已提交
275
		ldsem_up_read(&tty->ldisc_sem);
276
	return ld;
277 278 279 280 281 282 283 284 285 286 287 288 289 290
}
EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait);

/**
 *	tty_ldisc_ref		-	get the tty ldisc
 *	@tty: tty device
 *
 *	Dereference the line discipline for the terminal and take a
 *	reference to it. If the line discipline is in flux then
 *	return NULL. Can be called from IRQ and timer functions.
 */

struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty)
{
291 292 293 294 295 296 297 298
	struct tty_ldisc *ld = NULL;

	if (ldsem_down_read_trylock(&tty->ldisc_sem)) {
		ld = tty->ldisc;
		if (!ld)
			ldsem_up_read(&tty->ldisc_sem);
	}
	return ld;
299 300 301 302 303 304 305 306 307 308 309 310 311
}
EXPORT_SYMBOL_GPL(tty_ldisc_ref);

/**
 *	tty_ldisc_deref		-	free a tty ldisc reference
 *	@ld: reference to free up
 *
 *	Undoes the effect of tty_ldisc_ref or tty_ldisc_ref_wait. May
 *	be called in IRQ context.
 */

void tty_ldisc_deref(struct tty_ldisc *ld)
{
312
	ldsem_up_read(&ld->tty->ldisc_sem);
313 314 315
}
EXPORT_SYMBOL_GPL(tty_ldisc_deref);

316

317
static inline int
318
__tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout)
319 320 321 322
{
	return ldsem_down_write(&tty->ldisc_sem, timeout);
}

323
static inline int
324
__tty_ldisc_lock_nested(struct tty_struct *tty, unsigned long timeout)
325 326 327 328 329
{
	return ldsem_down_write_nested(&tty->ldisc_sem,
				       LDISC_SEM_OTHER, timeout);
}

330
static inline void __tty_ldisc_unlock(struct tty_struct *tty)
331
{
332
	ldsem_up_write(&tty->ldisc_sem);
333 334
}

335
int tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout)
P
Peter Hurley 已提交
336 337 338
{
	int ret;

339 340 341 342 343
	/* Kindly asking blocked readers to release the read side */
	set_bit(TTY_LDISC_CHANGING, &tty->flags);
	wake_up_interruptible_all(&tty->read_wait);
	wake_up_interruptible_all(&tty->write_wait);

P
Peter Hurley 已提交
344 345 346 347 348 349 350
	ret = __tty_ldisc_lock(tty, timeout);
	if (!ret)
		return -EBUSY;
	set_bit(TTY_LDISC_HALTED, &tty->flags);
	return 0;
}

351
void tty_ldisc_unlock(struct tty_struct *tty)
P
Peter Hurley 已提交
352 353
{
	clear_bit(TTY_LDISC_HALTED, &tty->flags);
354 355
	/* Can be cleared here - ldisc_unlock will wake up writers firstly */
	clear_bit(TTY_LDISC_CHANGING, &tty->flags);
P
Peter Hurley 已提交
356 357 358
	__tty_ldisc_unlock(tty);
}

359
static int
360 361 362 363 364 365
tty_ldisc_lock_pair_timeout(struct tty_struct *tty, struct tty_struct *tty2,
			    unsigned long timeout)
{
	int ret;

	if (tty < tty2) {
366
		ret = __tty_ldisc_lock(tty, timeout);
367
		if (ret) {
368
			ret = __tty_ldisc_lock_nested(tty2, timeout);
369
			if (!ret)
370
				__tty_ldisc_unlock(tty);
371 372 373 374 375
		}
	} else {
		/* if this is possible, it has lots of implications */
		WARN_ON_ONCE(tty == tty2);
		if (tty2 && tty != tty2) {
376
			ret = __tty_ldisc_lock(tty2, timeout);
377
			if (ret) {
378
				ret = __tty_ldisc_lock_nested(tty, timeout);
379
				if (!ret)
380
					__tty_ldisc_unlock(tty2);
381 382
			}
		} else
383
			ret = __tty_ldisc_lock(tty, timeout);
384 385 386 387 388 389 390 391 392 393 394
	}

	if (!ret)
		return -EBUSY;

	set_bit(TTY_LDISC_HALTED, &tty->flags);
	if (tty2)
		set_bit(TTY_LDISC_HALTED, &tty2->flags);
	return 0;
}

395
static void tty_ldisc_lock_pair(struct tty_struct *tty, struct tty_struct *tty2)
396 397 398 399
{
	tty_ldisc_lock_pair_timeout(tty, tty2, MAX_SCHEDULE_TIMEOUT);
}

400 401
static void tty_ldisc_unlock_pair(struct tty_struct *tty,
				  struct tty_struct *tty2)
402
{
403
	__tty_ldisc_unlock(tty);
404
	if (tty2)
405
		__tty_ldisc_unlock(tty2);
406 407
}

A
Alan Cox 已提交
408 409 410 411
/**
 *	tty_ldisc_flush	-	flush line discipline queue
 *	@tty: tty
 *
412 413
 *	Flush the line discipline queue (if any) and the tty flip buffers
 *	for this tty.
A
Alan Cox 已提交
414 415 416 417 418
 */

void tty_ldisc_flush(struct tty_struct *tty)
{
	struct tty_ldisc *ld = tty_ldisc_ref(tty);
419 420 421

	tty_buffer_flush(tty, ld);
	if (ld)
A
Alan Cox 已提交
422 423 424 425
		tty_ldisc_deref(ld);
}
EXPORT_SYMBOL_GPL(tty_ldisc_flush);

426 427 428
/**
 *	tty_set_termios_ldisc		-	set ldisc field
 *	@tty: tty structure
429
 *	@disc: line discipline number
430 431 432 433 434
 *
 *	This is probably overkill for real world processors but
 *	they are not on hot paths so a little discipline won't do
 *	any harm.
 *
435 436 437 438
 *	The line discipline-related tty_struct fields are reset to
 *	prevent the ldisc driver from re-using stale information for
 *	the new ldisc instance.
 *
439
 *	Locking: takes termios_rwsem
440 441
 */

442
static void tty_set_termios_ldisc(struct tty_struct *tty, int disc)
443
{
444
	down_write(&tty->termios_rwsem);
445
	tty->termios.c_line = disc;
446
	up_write(&tty->termios_rwsem);
447 448 449

	tty->disc_data = NULL;
	tty->receive_room = 0;
450 451
}

A
Alan Cox 已提交
452 453 454 455 456 457 458
/**
 *	tty_ldisc_open		-	open a line discipline
 *	@tty: tty we are opening the ldisc on
 *	@ld: discipline to open
 *
 *	A helper opening method. Also a convenient debugging and check
 *	point.
459 460
 *
 *	Locking: always called with BTM already held.
A
Alan Cox 已提交
461 462 463 464 465
 */

static int tty_ldisc_open(struct tty_struct *tty, struct tty_ldisc *ld)
{
	WARN_ON(test_and_set_bit(TTY_LDISC_OPEN, &tty->flags));
466 467
	if (ld->ops->open) {
		int ret;
468
                /* BTM here locks versus a hangup event */
469
		ret = ld->ops->open(tty);
J
Jiri Slaby 已提交
470 471
		if (ret)
			clear_bit(TTY_LDISC_OPEN, &tty->flags);
472

P
Peter Hurley 已提交
473
		tty_ldisc_debug(tty, "%p: opened\n", ld);
474 475
		return ret;
	}
A
Alan Cox 已提交
476 477 478 479 480 481 482 483 484 485 486 487 488 489
	return 0;
}

/**
 *	tty_ldisc_close		-	close a line discipline
 *	@tty: tty we are opening the ldisc on
 *	@ld: discipline to close
 *
 *	A helper close method. Also a convenient debugging and check
 *	point.
 */

static void tty_ldisc_close(struct tty_struct *tty, struct tty_ldisc *ld)
{
490
	lockdep_assert_held_exclusive(&tty->ldisc_sem);
A
Alan Cox 已提交
491 492 493 494
	WARN_ON(!test_bit(TTY_LDISC_OPEN, &tty->flags));
	clear_bit(TTY_LDISC_OPEN, &tty->flags);
	if (ld->ops->close)
		ld->ops->close(tty);
P
Peter Hurley 已提交
495
	tty_ldisc_debug(tty, "%p: closed\n", ld);
A
Alan Cox 已提交
496
}
497

498 499 500 501 502 503 504 505 506 507 508 509 510 511
/**
 *	tty_ldisc_failto	-	helper for ldisc failback
 *	@tty: tty to open the ldisc on
 *	@ld: ldisc we are trying to fail back to
 *
 *	Helper to try and recover a tty when switching back to the old
 *	ldisc fails and we need something attached.
 */

static int tty_ldisc_failto(struct tty_struct *tty, int ld)
{
	struct tty_ldisc *disc = tty_ldisc_get(tty, ld);
	int r;

512
	lockdep_assert_held_exclusive(&tty->ldisc_sem);
513 514 515 516 517 518 519 520 521
	if (IS_ERR(disc))
		return PTR_ERR(disc);
	tty->ldisc = disc;
	tty_set_termios_ldisc(tty, ld);
	if ((r = tty_ldisc_open(tty, disc)) < 0)
		tty_ldisc_put(disc);
	return r;
}

522 523 524 525 526 527 528 529 530 531 532 533
/**
 *	tty_ldisc_restore	-	helper for tty ldisc change
 *	@tty: tty to recover
 *	@old: previous ldisc
 *
 *	Restore the previous line discipline or N_TTY when a line discipline
 *	change fails due to an open error
 */

static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old)
{
	/* There is an outstanding reference here so this is safe */
534 535 536 537
	if (tty_ldisc_failto(tty, old->ops->num) < 0) {
		const char *name = tty_name(tty);

		pr_warn("Falling back ldisc for %s.\n", name);
538 539 540 541 542
		/* The traditional behaviour is to fall back to N_TTY, we
		   want to avoid falling back to N_NULL unless we have no
		   choice to avoid the risk of breaking anything */
		if (tty_ldisc_failto(tty, N_TTY) < 0 &&
		    tty_ldisc_failto(tty, N_NULL) < 0)
543
			panic("Couldn't open N_NULL ldisc for %s.", name);
544 545 546
	}
}

547 548 549 550 551 552
/**
 *	tty_set_ldisc		-	set line discipline
 *	@tty: the terminal to set
 *	@ldisc: the line discipline
 *
 *	Set the discipline of a tty line. Must be called from a process
A
Alan Cox 已提交
553 554 555
 *	context. The ldisc change logic has to protect itself against any
 *	overlapping ldisc change (including on the other end of pty pairs),
 *	the close of one side of a tty/pty pair, and eventually hangup.
556 557
 */

558
int tty_set_ldisc(struct tty_struct *tty, int disc)
559
{
560 561 562 563 564 565
	int retval;
	struct tty_ldisc *old_ldisc, *new_ldisc;

	new_ldisc = tty_ldisc_get(tty, disc);
	if (IS_ERR(new_ldisc))
		return PTR_ERR(new_ldisc);
566

567
	tty_lock(tty);
P
Peter Hurley 已提交
568
	retval = tty_ldisc_lock(tty, 5 * HZ);
569 570
	if (retval)
		goto err;
571

P
Peter Hurley 已提交
572 573 574 575 576
	if (!tty->ldisc) {
		retval = -EIO;
		goto out;
	}

577
	/* Check the no-op case */
578
	if (tty->ldisc->ops->num == disc)
579
		goto out;
A
Alan Cox 已提交
580

581 582 583 584
	if (test_bit(TTY_HUPPED, &tty->flags)) {
		/* We were raced by hangup */
		retval = -EIO;
		goto out;
585 586
	}

587 588 589 590 591 592 593 594 595 596
	old_ldisc = tty->ldisc;

	/* Shutdown the old discipline. */
	tty_ldisc_close(tty, old_ldisc);

	/* Now set up the new line discipline. */
	tty->ldisc = new_ldisc;
	tty_set_termios_ldisc(tty, disc);

	retval = tty_ldisc_open(tty, new_ldisc);
597
	if (retval < 0) {
A
Alan Cox 已提交
598
		/* Back to the old one or N_TTY if we can't */
599 600
		tty_ldisc_put(new_ldisc);
		tty_ldisc_restore(tty, old_ldisc);
601
	}
A
Alan Cox 已提交
602

603
	if (tty->ldisc->ops->num != old_ldisc->ops->num && tty->ops->set_ldisc) {
604
		down_read(&tty->termios_rwsem);
605
		tty->ops->set_ldisc(tty);
606 607
		up_read(&tty->termios_rwsem);
	}
608

609 610 611 612 613 614
	/* At this point we hold a reference to the new ldisc and a
	   reference to the old ldisc, or we hold two references to
	   the old ldisc (if it was restored as part of error cleanup
	   above). In either case, releasing a single reference from
	   the old ldisc is correct. */
	new_ldisc = old_ldisc;
615
out:
P
Peter Hurley 已提交
616
	tty_ldisc_unlock(tty);
617

A
Alan Cox 已提交
618
	/* Restart the work queue in case no characters kick it off. Safe if
619
	   already running */
620
	tty_buffer_restart_work(tty->port);
621
err:
622
	tty_ldisc_put(new_ldisc);	/* drop the extra reference */
A
Alan Cox 已提交
623
	tty_unlock(tty);
624 625
	return retval;
}
626
EXPORT_SYMBOL_GPL(tty_set_ldisc);
627

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

A
Alan Cox 已提交
648 649 650 651 652 653 654 655 656
/**
 *	tty_reset_termios	-	reset terminal state
 *	@tty: tty to reset
 *
 *	Restore a terminal to the driver default state.
 */

static void tty_reset_termios(struct tty_struct *tty)
{
657
	down_write(&tty->termios_rwsem);
658 659 660
	tty->termios = tty->driver->init_termios;
	tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios);
	tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios);
661
	up_write(&tty->termios_rwsem);
A
Alan Cox 已提交
662 663 664 665 666 667
}


/**
 *	tty_ldisc_reinit	-	reinitialise the tty ldisc
 *	@tty: tty to reinit
668
 *	@disc: line discipline to reinitialize
A
Alan Cox 已提交
669
 *
670
 *	Completely reinitialize the line discipline state, by closing the
671 672 673 674
 *	current instance, if there is one, and opening a new instance. If
 *	an error occurs opening the new non-N_TTY instance, the instance
 *	is dropped and tty->ldisc reset to NULL. The caller can then retry
 *	with N_TTY instead.
675 676
 *
 *	Returns 0 if successful, otherwise error code < 0
A
Alan Cox 已提交
677 678
 */

679
int tty_ldisc_reinit(struct tty_struct *tty, int disc)
A
Alan Cox 已提交
680
{
681 682
	struct tty_ldisc *ld;
	int retval;
683

684
	lockdep_assert_held_exclusive(&tty->ldisc_sem);
685
	ld = tty_ldisc_get(tty, disc);
686 687
	if (IS_ERR(ld)) {
		BUG_ON(disc == N_TTY);
688
		return PTR_ERR(ld);
689
	}
A
Alan Cox 已提交
690

691 692 693 694 695 696
	if (tty->ldisc) {
		tty_ldisc_close(tty, tty->ldisc);
		tty_ldisc_put(tty->ldisc);
	}

	/* switch the line discipline */
697
	tty->ldisc = ld;
698
	tty_set_termios_ldisc(tty, disc);
699 700
	retval = tty_ldisc_open(tty, tty->ldisc);
	if (retval) {
701 702
		tty_ldisc_put(tty->ldisc);
		tty->ldisc = NULL;
703 704
	}
	return retval;
A
Alan Cox 已提交
705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721
}

/**
 *	tty_ldisc_hangup		-	hangup ldisc reset
 *	@tty: tty being hung up
 *
 *	Some tty devices reset their termios when they receive a hangup
 *	event. In that situation we must also switch back to N_TTY properly
 *	before we reset the termios data.
 *
 *	Locking: We can take the ldisc mutex as the rest of the code is
 *	careful to allow for this.
 *
 *	In the pty pair case this occurs in the close() path of the
 *	tty itself so we must be careful about locking rules.
 */

722
void tty_ldisc_hangup(struct tty_struct *tty, bool reinit)
A
Alan Cox 已提交
723 724 725
{
	struct tty_ldisc *ld;

P
Peter Hurley 已提交
726
	tty_ldisc_debug(tty, "%p: hangup\n", tty->ldisc);
727

A
Alan Cox 已提交
728 729 730 731 732 733 734 735 736 737 738 739
	ld = tty_ldisc_ref(tty);
	if (ld != NULL) {
		if (ld->ops->flush_buffer)
			ld->ops->flush_buffer(tty);
		tty_driver_flush_buffer(tty);
		if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
		    ld->ops->write_wakeup)
			ld->ops->write_wakeup(tty);
		if (ld->ops->hangup)
			ld->ops->hangup(tty);
		tty_ldisc_deref(ld);
	}
740

741 742
	wake_up_interruptible_poll(&tty->write_wait, EPOLLOUT);
	wake_up_interruptible_poll(&tty->read_wait, EPOLLIN);
743

A
Alan Cox 已提交
744 745
	/*
	 * Shutdown the current line discipline, and reset it to
A
Alan Cox 已提交
746 747 748
	 * N_TTY if need be.
	 *
	 * Avoid racing set_ldisc or tty_ldisc_release
A
Alan Cox 已提交
749
	 */
P
Peter Hurley 已提交
750
	tty_ldisc_lock(tty, MAX_SCHEDULE_TIMEOUT);
A
Arnd Bergmann 已提交
751

752 753
	if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
		tty_reset_termios(tty);
754

755 756
	if (tty->ldisc) {
		if (reinit) {
757 758 759
			if (tty_ldisc_reinit(tty, tty->termios.c_line) < 0 &&
			    tty_ldisc_reinit(tty, N_TTY) < 0)
				WARN_ON(tty_ldisc_reinit(tty, N_NULL) < 0);
760 761
		} else
			tty_ldisc_kill(tty);
A
Alan Cox 已提交
762
	}
P
Peter Hurley 已提交
763
	tty_ldisc_unlock(tty);
A
Alan Cox 已提交
764
}
765 766 767 768 769 770 771

/**
 *	tty_ldisc_setup			-	open line discipline
 *	@tty: tty being shut down
 *	@o_tty: pair tty for pty/tty pairs
 *
 *	Called during the initial open of a tty/pty pair in order to set up the
A
Alan Cox 已提交
772 773
 *	line disciplines and bind them to the tty. This has no locking issues
 *	as the device isn't yet active.
774 775 776 777
 */

int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty)
{
778
	int retval = tty_ldisc_open(tty, tty->ldisc);
A
Alan Cox 已提交
779 780 781 782
	if (retval)
		return retval;

	if (o_tty) {
783 784 785 786
		/*
		 * Called without o_tty->ldisc_sem held, as o_tty has been
		 * just allocated and no one has a reference to it.
		 */
A
Alan Cox 已提交
787
		retval = tty_ldisc_open(o_tty, o_tty->ldisc);
788
		if (retval) {
789
			tty_ldisc_close(tty, tty->ldisc);
790 791 792 793 794
			return retval;
		}
	}
	return 0;
}
A
Alan Cox 已提交
795

796 797
/**
 *	tty_ldisc_release		-	release line discipline
798
 *	@tty: tty being shut down (or one end of pty pair)
799
 *
800
 *	Called during the final close of a tty or a pty pair in order to shut
801
 *	down the line discpline layer. On exit, each tty's ldisc is NULL.
802 803
 */

804
void tty_ldisc_release(struct tty_struct *tty)
805
{
806 807
	struct tty_struct *o_tty = tty->link;

808
	/*
809 810
	 * Shutdown this line discipline. As this is the final close,
	 * it does not race with the set_ldisc code path.
811 812
	 */

813
	tty_ldisc_lock_pair(tty, o_tty);
A
Alan Cox 已提交
814
	tty_ldisc_kill(tty);
A
Alan Cox 已提交
815
	if (o_tty)
A
Alan Cox 已提交
816
		tty_ldisc_kill(o_tty);
817 818
	tty_ldisc_unlock_pair(tty, o_tty);

819 820
	/* And the memory resources remaining (buffers, termios) will be
	   disposed of when the kref hits zero */
821

822
	tty_ldisc_debug(tty, "released\n");
823
}
824
EXPORT_SYMBOL_GPL(tty_ldisc_release);
825 826 827 828 829 830 831 832 833

/**
 *	tty_ldisc_init		-	ldisc setup for new tty
 *	@tty: tty being allocated
 *
 *	Set up the line discipline objects for a newly allocated tty. Note that
 *	the tty structure is not completely set up when this call is made.
 */

834
int tty_ldisc_init(struct tty_struct *tty)
835
{
836
	struct tty_ldisc *ld = tty_ldisc_get(tty, N_TTY);
A
Alan Cox 已提交
837
	if (IS_ERR(ld))
838
		return PTR_ERR(ld);
839
	tty->ldisc = ld;
840
	return 0;
841 842
}

843
/**
844
 *	tty_ldisc_deinit	-	ldisc cleanup for new tty
845 846 847 848 849 850 851
 *	@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)
{
852
	/* no ldisc_sem, tty is being destroyed */
853 854
	if (tty->ldisc)
		tty_ldisc_put(tty->ldisc);
855
	tty->ldisc = NULL;
856
}
857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894

static int zero;
static int one = 1;
static struct ctl_table tty_table[] = {
	{
		.procname	= "ldisc_autoload",
		.data		= &tty_ldisc_autoload,
		.maxlen		= sizeof(tty_ldisc_autoload),
		.mode		= 0644,
		.proc_handler	= proc_dointvec,
		.extra1		= &zero,
		.extra2		= &one,
	},
	{ }
};

static struct ctl_table tty_dir_table[] = {
	{
		.procname	= "tty",
		.mode		= 0555,
		.child		= tty_table,
	},
	{ }
};

static struct ctl_table tty_root_table[] = {
	{
		.procname	= "dev",
		.mode		= 0555,
		.child		= tty_dir_table,
	},
	{ }
};

void tty_sysctl_init(void)
{
	register_sysctl_table(tty_root_table);
}