Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 113465
b: refs/heads/master
c: 15f1a63
h: refs/heads/master
i:
  113463: f370699
v: v3
  • Loading branch information
Sukadev Bhattiprolu authored and Linus Torvalds committed Oct 13, 2008
1 parent 0b52238 commit 38d0d81
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 31 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: 4a2b5fddd53b80efcb3266ee36e23b8de28e761a
refs/heads/master: 15f1a6338ddd4e69fff965d4b3a0e1bfb7a13d9c
18 changes: 10 additions & 8 deletions trunk/drivers/char/pty.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ static void pty_close(struct tty_struct * tty, struct file * filp)
set_bit(TTY_OTHER_CLOSED, &tty->flags);
#ifdef CONFIG_UNIX98_PTYS
if (tty->driver == ptm_driver)
devpts_pty_kill(tty->index);
devpts_pty_kill(tty->link);
#endif
tty_vhangup(tty->link);
}
Expand Down Expand Up @@ -453,9 +453,10 @@ static int pty_unix98_ioctl(struct tty_struct *tty, struct file *file,
* This provides our locking.
*/

static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver, int idx)
static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver,
struct inode *ptm_inode, int idx)
{
struct tty_struct *tty = devpts_get_tty(idx);
struct tty_struct *tty = devpts_get_tty(ptm_inode, idx);
if (tty)
tty = tty->link;
return tty;
Expand All @@ -470,9 +471,10 @@ static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver, int idx)
* This provides our locking.
*/

static struct tty_struct *pts_unix98_lookup(struct tty_driver *driver, int idx)
static struct tty_struct *pts_unix98_lookup(struct tty_driver *driver,
struct inode *pts_inode, int idx)
{
struct tty_struct *tty = devpts_get_tty(idx);
struct tty_struct *tty = devpts_get_tty(pts_inode, idx);
/* Master must be open before slave */
if (!tty)
return ERR_PTR(-EIO);
Expand Down Expand Up @@ -602,7 +604,7 @@ static int __ptmx_open(struct inode *inode, struct file *filp)
nonseekable_open(inode, filp);

/* find a device that is not in use. */
index = devpts_new_index();
index = devpts_new_index(inode);
if (index < 0)
return index;

Expand All @@ -619,7 +621,7 @@ static int __ptmx_open(struct inode *inode, struct file *filp)
filp->private_data = tty;
file_move(filp, &tty->tty_files);

retval = devpts_pty_new(tty->link);
retval = devpts_pty_new(inode, tty->link);
if (retval)
goto out1;

Expand All @@ -630,7 +632,7 @@ static int __ptmx_open(struct inode *inode, struct file *filp)
tty_release_dev(filp);
return retval;
out:
devpts_kill_index(index);
devpts_kill_index(inode, index);
return retval;
}

Expand Down
14 changes: 8 additions & 6 deletions trunk/drivers/char/tty_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -1213,12 +1213,13 @@ static void tty_line_name(struct tty_driver *driver, int index, char *p)
* be held until the 'fast-open' is also done. Will change once we
* have refcounting in the driver and per driver locking
*/
struct tty_struct *tty_driver_lookup_tty(struct tty_driver *driver, int idx)
struct tty_struct *tty_driver_lookup_tty(struct tty_driver *driver,
struct inode *inode, int idx)
{
struct tty_struct *tty;

if (driver->ops->lookup)
return driver->ops->lookup(driver, idx);
return driver->ops->lookup(driver, inode, idx);

tty = driver->ttys[idx];
return tty;
Expand Down Expand Up @@ -1539,10 +1540,11 @@ void tty_release_dev(struct file *filp)
int devpts;
int idx;
char buf[64];
struct inode *inode;

inode = filp->f_path.dentry->d_inode;
tty = (struct tty_struct *)filp->private_data;
if (tty_paranoia_check(tty, filp->f_path.dentry->d_inode,
"tty_release_dev"))
if (tty_paranoia_check(tty, inode, "tty_release_dev"))
return;

check_tty_count(tty, "tty_release_dev");
Expand Down Expand Up @@ -1751,7 +1753,7 @@ void tty_release_dev(struct file *filp)

/* Make this pty number available for reallocation */
if (devpts)
devpts_kill_index(idx);
devpts_kill_index(inode, idx);
}

/**
Expand Down Expand Up @@ -1836,7 +1838,7 @@ static int __tty_open(struct inode *inode, struct file *filp)
got_driver:
if (!tty) {
/* check whether we're reopening an existing tty */
tty = tty_driver_lookup_tty(driver, index);
tty = tty_driver_lookup_tty(driver, inode, index);

if (IS_ERR(tty))
return PTR_ERR(tty);
Expand Down
11 changes: 6 additions & 5 deletions trunk/fs/devpts/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ static struct dentry *get_node(int num)
return lookup_one_len(s, root, sprintf(s, "%d", num));
}

int devpts_new_index(void)
int devpts_new_index(struct inode *ptmx_inode)
{
int index;
int ida_ret;
Expand Down Expand Up @@ -205,14 +205,14 @@ int devpts_new_index(void)
return index;
}

void devpts_kill_index(int idx)
void devpts_kill_index(struct inode *ptmx_inode, int idx)
{
mutex_lock(&allocated_ptys_lock);
ida_remove(&allocated_ptys, idx);
mutex_unlock(&allocated_ptys_lock);
}

int devpts_pty_new(struct tty_struct *tty)
int devpts_pty_new(struct inode *ptmx_inode, struct tty_struct *tty)
{
int number = tty->index; /* tty layer puts index from devpts_new_index() in here */
struct tty_driver *driver = tty->driver;
Expand Down Expand Up @@ -245,7 +245,7 @@ int devpts_pty_new(struct tty_struct *tty)
return 0;
}

struct tty_struct *devpts_get_tty(int number)
struct tty_struct *devpts_get_tty(struct inode *pts_inode, int number)
{
struct dentry *dentry = get_node(number);
struct tty_struct *tty;
Expand All @@ -262,8 +262,9 @@ struct tty_struct *devpts_get_tty(int number)
return tty;
}

void devpts_pty_kill(int number)
void devpts_pty_kill(struct tty_struct *tty)
{
int number = tty->index;
struct dentry *dentry = get_node(number);

if (!IS_ERR(dentry)) {
Expand Down
31 changes: 21 additions & 10 deletions trunk/include/linux/devpts_fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,31 @@

#ifdef CONFIG_UNIX98_PTYS

int devpts_new_index(void);
void devpts_kill_index(int idx);
int devpts_pty_new(struct tty_struct *tty); /* mknod in devpts */
struct tty_struct *devpts_get_tty(int number); /* get tty structure */
void devpts_pty_kill(int number); /* unlink */
int devpts_new_index(struct inode *ptmx_inode);
void devpts_kill_index(struct inode *ptmx_inode, int idx);
/* mknod in devpts */
int devpts_pty_new(struct inode *ptmx_inode, struct tty_struct *tty);
/* get tty structure */
struct tty_struct *devpts_get_tty(struct inode *pts_inode, int number);
/* unlink */
void devpts_pty_kill(struct tty_struct *tty);

#else

/* Dummy stubs in the no-pty case */
static inline int devpts_new_index(void) { return -EINVAL; }
static inline void devpts_kill_index(int idx) { }
static inline int devpts_pty_new(struct tty_struct *tty) { return -EINVAL; }
static inline struct tty_struct *devpts_get_tty(int number) { return NULL; }
static inline void devpts_pty_kill(int number) { }
static inline int devpts_new_index(struct inode *ptmx_inode) { return -EINVAL; }
static inline void devpts_kill_index(struct inode *ptmx_inode, int idx) { }
static inline int devpts_pty_new(struct inode *ptmx_inode,
struct tty_struct *tty)
{
return -EINVAL;
}
static inline struct tty_struct *devpts_get_tty(struct inode *pts_inode,
int number)
{
return NULL;
}
static inline void devpts_pty_kill(struct tty_struct *tty) { }

#endif

Expand Down
3 changes: 2 additions & 1 deletion trunk/include/linux/tty_driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,8 @@ struct tty_struct;
struct tty_driver;

struct tty_operations {
struct tty_struct * (*lookup)(struct tty_driver *driver, int idx);
struct tty_struct * (*lookup)(struct tty_driver *driver,
struct inode *inode, int idx);
int (*install)(struct tty_driver *driver, struct tty_struct *tty);
void (*remove)(struct tty_driver *driver, struct tty_struct *tty);
int (*open)(struct tty_struct * tty, struct file * filp);
Expand Down

0 comments on commit 38d0d81

Please sign in to comment.