Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 113456
b: refs/heads/master
c: feebed6
h: refs/heads/master
v: v3
  • Loading branch information
Alan Cox authored and Linus Torvalds committed Oct 13, 2008
1 parent 4862521 commit 6b17cb2
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 43 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: bf7a06bcce205705ea5c7675cbb8ea9239ea30a0
refs/heads/master: feebed6515a113eeb33919e9557a8b9710ea627c
15 changes: 11 additions & 4 deletions trunk/drivers/char/pty.c
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,14 @@ static int pty_unix98_ioctl(struct tty_struct *tty, struct file *file,
return -ENOIOCTLCMD;
}

static const struct tty_operations pty_unix98_ops = {
static void pty_shutdown(struct tty_struct *tty)
{
/* We have our own method as we don't use the tty index */
kfree(tty->termios);
kfree(tty->termios_locked);
}

static const struct tty_operations ptm_unix98_ops = {
.open = pty_open,
.close = pty_close,
.write = pty_write,
Expand All @@ -397,10 +404,10 @@ static const struct tty_operations pty_unix98_ops = {
.chars_in_buffer = pty_chars_in_buffer,
.unthrottle = pty_unthrottle,
.set_termios = pty_set_termios,
.ioctl = pty_unix98_ioctl
.ioctl = pty_unix98_ioctl,
.shutdown = pty_shutdown
};


static void __init unix98_pty_init(void)
{
ptm_driver = alloc_tty_driver(NR_UNIX98_PTY_MAX);
Expand All @@ -427,7 +434,7 @@ static void __init unix98_pty_init(void)
ptm_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW |
TTY_DRIVER_DYNAMIC_DEV | TTY_DRIVER_DEVPTS_MEM;
ptm_driver->other = pts_driver;
tty_set_operations(ptm_driver, &pty_unix98_ops);
tty_set_operations(ptm_driver, &ptm_unix98_ops);

pts_driver->owner = THIS_MODULE;
pts_driver->driver_name = "pty_slave";
Expand Down
49 changes: 29 additions & 20 deletions trunk/drivers/char/tty_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -1482,6 +1482,31 @@ static int init_dev(struct tty_driver *driver, int idx,
goto end_init;
}

void tty_free_termios(struct tty_struct *tty)
{
struct ktermios *tp;
int idx = tty->index;
/* Kill this flag and push into drivers for locking etc */
if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
/* FIXME: Locking on ->termios array */
tp = tty->termios;
tty->driver->termios[idx] = NULL;
kfree(tp);

tp = tty->termios_locked;
tty->driver->termios_locked[idx] = NULL;
kfree(tp);
}
}
EXPORT_SYMBOL(tty_free_termios);

void tty_shutdown(struct tty_struct *tty)
{
tty->driver->ttys[tty->index] = NULL;
tty_free_termios(tty);
}
EXPORT_SYMBOL(tty_shutdown);

/**
* release_one_tty - release tty structure memory
* @kref: kref of tty we are obliterating
Expand All @@ -1499,27 +1524,11 @@ static void release_one_tty(struct kref *kref)
{
struct tty_struct *tty = container_of(kref, struct tty_struct, kref);
struct tty_driver *driver = tty->driver;
int devpts = tty->driver->flags & TTY_DRIVER_DEVPTS_MEM;
struct ktermios *tp;
int idx = tty->index;

if (!devpts)
tty->driver->ttys[idx] = NULL;

if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
/* FIXME: Locking on ->termios array */
tp = tty->termios;
if (!devpts)
tty->driver->termios[idx] = NULL;
kfree(tp);

tp = tty->termios_locked;
if (!devpts)
tty->driver->termios_locked[idx] = NULL;
kfree(tp);
}


if (tty->ops->shutdown)
tty->ops->shutdown(tty);
else
tty_shutdown(tty);
tty->magic = 0;
/* FIXME: locking on tty->driver->refcount */
tty->driver->refcount--;
Expand Down
34 changes: 17 additions & 17 deletions trunk/drivers/char/vt.c
Original file line number Diff line number Diff line change
Expand Up @@ -2758,6 +2758,12 @@ static int con_open(struct tty_struct *tty, struct file *filp)
ret = vc_allocate(currcons);
if (ret == 0) {
struct vc_data *vc = vc_cons[currcons].d;

/* Still being freed */
if (vc->vc_tty) {
release_console_sem();
return -ERESTARTSYS;
}
tty->driver_data = vc;
vc->vc_tty = tty;

Expand Down Expand Up @@ -2787,25 +2793,18 @@ static int con_open(struct tty_struct *tty, struct file *filp)
*/
static void con_close(struct tty_struct *tty, struct file *filp)
{
mutex_lock(&tty_mutex);
acquire_console_sem();
if (tty && tty->count == 1) {
struct vc_data *vc = tty->driver_data;
/* Nothing to do - we defer to shutdown */
}

if (vc)
vc->vc_tty = NULL;
tty->driver_data = NULL;
vcs_remove_sysfs(tty);
release_console_sem();
mutex_unlock(&tty_mutex);
/*
* tty_mutex is released, but we still hold BKL, so there is
* still exclusion against init_dev()
*/
return;
}
static void con_shutdown(struct tty_struct *tty)
{
struct vc_data *vc = tty->driver_data;
BUG_ON(vc == NULL);
acquire_console_sem();
vc->vc_tty = NULL;
vcs_remove_sysfs(tty);
release_console_sem();
mutex_unlock(&tty_mutex);
tty_shutdown(tty);
}

static int default_italic_color = 2; // green (ASCII)
Expand Down Expand Up @@ -2930,6 +2929,7 @@ static const struct tty_operations con_ops = {
.throttle = con_throttle,
.unthrottle = con_unthrottle,
.resize = vt_resize,
.shutdown = con_shutdown
};

int __init vty_init(void)
Expand Down
3 changes: 2 additions & 1 deletion trunk/include/linux/tty.h
Original file line number Diff line number Diff line change
Expand Up @@ -354,7 +354,8 @@ extern void tty_throttle(struct tty_struct *tty);
extern void tty_unthrottle(struct tty_struct *tty);
extern int tty_do_resize(struct tty_struct *tty, struct tty_struct *real_tty,
struct winsize *ws);

extern void tty_shutdown(struct tty_struct *tty);
extern void tty_free_termios(struct tty_struct *tty);
extern int is_current_pgrp_orphaned(void);
extern struct pid *tty_get_pgrp(struct tty_struct *tty);
extern int is_ignored(int sig);
Expand Down
6 changes: 6 additions & 0 deletions trunk/include/linux/tty_driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@
*
* Required method.
*
* void (*shutdown)(struct tty_struct * tty);
*
* This routine is called when a particular tty device is closed for
* the last time freeing up the resources.
*
* int (*write)(struct tty_struct * tty,
* const unsigned char *buf, int count);
*
Expand Down Expand Up @@ -200,6 +205,7 @@ struct tty_driver;
struct tty_operations {
int (*open)(struct tty_struct * tty, struct file * filp);
void (*close)(struct tty_struct * tty, struct file * filp);
void (*shutdown)(struct tty_struct *tty);
int (*write)(struct tty_struct * tty,
const unsigned char *buf, int count);
int (*put_char)(struct tty_struct *tty, unsigned char ch);
Expand Down

0 comments on commit 6b17cb2

Please sign in to comment.