diff options
-rw-r--r-- | drivers/char/pty.c | 18 | ||||
-rw-r--r-- | drivers/char/tty_io.c | 14 | ||||
-rw-r--r-- | fs/devpts/inode.c | 11 | ||||
-rw-r--r-- | include/linux/devpts_fs.h | 31 | ||||
-rw-r--r-- | include/linux/tty_driver.h | 3 |
5 files changed, 47 insertions, 30 deletions
diff --git a/drivers/char/pty.c b/drivers/char/pty.c index c5a192dd00db..a391badef52a 100644 --- a/drivers/char/pty.c +++ b/drivers/char/pty.c | |||
@@ -60,7 +60,7 @@ static void pty_close(struct tty_struct * tty, struct file * filp) | |||
60 | set_bit(TTY_OTHER_CLOSED, &tty->flags); | 60 | set_bit(TTY_OTHER_CLOSED, &tty->flags); |
61 | #ifdef CONFIG_UNIX98_PTYS | 61 | #ifdef CONFIG_UNIX98_PTYS |
62 | if (tty->driver == ptm_driver) | 62 | if (tty->driver == ptm_driver) |
63 | devpts_pty_kill(tty->index); | 63 | devpts_pty_kill(tty->link); |
64 | #endif | 64 | #endif |
65 | tty_vhangup(tty->link); | 65 | tty_vhangup(tty->link); |
66 | } | 66 | } |
@@ -453,9 +453,10 @@ static int pty_unix98_ioctl(struct tty_struct *tty, struct file *file, | |||
453 | * This provides our locking. | 453 | * This provides our locking. |
454 | */ | 454 | */ |
455 | 455 | ||
456 | static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver, int idx) | 456 | static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver, |
457 | struct inode *ptm_inode, int idx) | ||
457 | { | 458 | { |
458 | struct tty_struct *tty = devpts_get_tty(idx); | 459 | struct tty_struct *tty = devpts_get_tty(ptm_inode, idx); |
459 | if (tty) | 460 | if (tty) |
460 | tty = tty->link; | 461 | tty = tty->link; |
461 | return tty; | 462 | return tty; |
@@ -470,9 +471,10 @@ static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver, int idx) | |||
470 | * This provides our locking. | 471 | * This provides our locking. |
471 | */ | 472 | */ |
472 | 473 | ||
473 | static struct tty_struct *pts_unix98_lookup(struct tty_driver *driver, int idx) | 474 | static struct tty_struct *pts_unix98_lookup(struct tty_driver *driver, |
475 | struct inode *pts_inode, int idx) | ||
474 | { | 476 | { |
475 | struct tty_struct *tty = devpts_get_tty(idx); | 477 | struct tty_struct *tty = devpts_get_tty(pts_inode, idx); |
476 | /* Master must be open before slave */ | 478 | /* Master must be open before slave */ |
477 | if (!tty) | 479 | if (!tty) |
478 | return ERR_PTR(-EIO); | 480 | return ERR_PTR(-EIO); |
@@ -602,7 +604,7 @@ static int __ptmx_open(struct inode *inode, struct file *filp) | |||
602 | nonseekable_open(inode, filp); | 604 | nonseekable_open(inode, filp); |
603 | 605 | ||
604 | /* find a device that is not in use. */ | 606 | /* find a device that is not in use. */ |
605 | index = devpts_new_index(); | 607 | index = devpts_new_index(inode); |
606 | if (index < 0) | 608 | if (index < 0) |
607 | return index; | 609 | return index; |
608 | 610 | ||
@@ -619,7 +621,7 @@ static int __ptmx_open(struct inode *inode, struct file *filp) | |||
619 | filp->private_data = tty; | 621 | filp->private_data = tty; |
620 | file_move(filp, &tty->tty_files); | 622 | file_move(filp, &tty->tty_files); |
621 | 623 | ||
622 | retval = devpts_pty_new(tty->link); | 624 | retval = devpts_pty_new(inode, tty->link); |
623 | if (retval) | 625 | if (retval) |
624 | goto out1; | 626 | goto out1; |
625 | 627 | ||
@@ -630,7 +632,7 @@ out1: | |||
630 | tty_release_dev(filp); | 632 | tty_release_dev(filp); |
631 | return retval; | 633 | return retval; |
632 | out: | 634 | out: |
633 | devpts_kill_index(index); | 635 | devpts_kill_index(inode, index); |
634 | return retval; | 636 | return retval; |
635 | } | 637 | } |
636 | 638 | ||
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index 36098ee8fe65..959083961024 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
@@ -1213,12 +1213,13 @@ static void tty_line_name(struct tty_driver *driver, int index, char *p) | |||
1213 | * be held until the 'fast-open' is also done. Will change once we | 1213 | * be held until the 'fast-open' is also done. Will change once we |
1214 | * have refcounting in the driver and per driver locking | 1214 | * have refcounting in the driver and per driver locking |
1215 | */ | 1215 | */ |
1216 | struct tty_struct *tty_driver_lookup_tty(struct tty_driver *driver, int idx) | 1216 | struct tty_struct *tty_driver_lookup_tty(struct tty_driver *driver, |
1217 | struct inode *inode, int idx) | ||
1217 | { | 1218 | { |
1218 | struct tty_struct *tty; | 1219 | struct tty_struct *tty; |
1219 | 1220 | ||
1220 | if (driver->ops->lookup) | 1221 | if (driver->ops->lookup) |
1221 | return driver->ops->lookup(driver, idx); | 1222 | return driver->ops->lookup(driver, inode, idx); |
1222 | 1223 | ||
1223 | tty = driver->ttys[idx]; | 1224 | tty = driver->ttys[idx]; |
1224 | return tty; | 1225 | return tty; |
@@ -1539,10 +1540,11 @@ void tty_release_dev(struct file *filp) | |||
1539 | int devpts; | 1540 | int devpts; |
1540 | int idx; | 1541 | int idx; |
1541 | char buf[64]; | 1542 | char buf[64]; |
1543 | struct inode *inode; | ||
1542 | 1544 | ||
1545 | inode = filp->f_path.dentry->d_inode; | ||
1543 | tty = (struct tty_struct *)filp->private_data; | 1546 | tty = (struct tty_struct *)filp->private_data; |
1544 | if (tty_paranoia_check(tty, filp->f_path.dentry->d_inode, | 1547 | if (tty_paranoia_check(tty, inode, "tty_release_dev")) |
1545 | "tty_release_dev")) | ||
1546 | return; | 1548 | return; |
1547 | 1549 | ||
1548 | check_tty_count(tty, "tty_release_dev"); | 1550 | check_tty_count(tty, "tty_release_dev"); |
@@ -1751,7 +1753,7 @@ void tty_release_dev(struct file *filp) | |||
1751 | 1753 | ||
1752 | /* Make this pty number available for reallocation */ | 1754 | /* Make this pty number available for reallocation */ |
1753 | if (devpts) | 1755 | if (devpts) |
1754 | devpts_kill_index(idx); | 1756 | devpts_kill_index(inode, idx); |
1755 | } | 1757 | } |
1756 | 1758 | ||
1757 | /** | 1759 | /** |
@@ -1836,7 +1838,7 @@ retry_open: | |||
1836 | got_driver: | 1838 | got_driver: |
1837 | if (!tty) { | 1839 | if (!tty) { |
1838 | /* check whether we're reopening an existing tty */ | 1840 | /* check whether we're reopening an existing tty */ |
1839 | tty = tty_driver_lookup_tty(driver, index); | 1841 | tty = tty_driver_lookup_tty(driver, inode, index); |
1840 | 1842 | ||
1841 | if (IS_ERR(tty)) | 1843 | if (IS_ERR(tty)) |
1842 | return PTR_ERR(tty); | 1844 | return PTR_ERR(tty); |
diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c index 488eb424f662..638db9b769ac 100644 --- a/fs/devpts/inode.c +++ b/fs/devpts/inode.c | |||
@@ -177,7 +177,7 @@ static struct dentry *get_node(int num) | |||
177 | return lookup_one_len(s, root, sprintf(s, "%d", num)); | 177 | return lookup_one_len(s, root, sprintf(s, "%d", num)); |
178 | } | 178 | } |
179 | 179 | ||
180 | int devpts_new_index(void) | 180 | int devpts_new_index(struct inode *ptmx_inode) |
181 | { | 181 | { |
182 | int index; | 182 | int index; |
183 | int ida_ret; | 183 | int ida_ret; |
@@ -205,14 +205,14 @@ retry: | |||
205 | return index; | 205 | return index; |
206 | } | 206 | } |
207 | 207 | ||
208 | void devpts_kill_index(int idx) | 208 | void devpts_kill_index(struct inode *ptmx_inode, int idx) |
209 | { | 209 | { |
210 | mutex_lock(&allocated_ptys_lock); | 210 | mutex_lock(&allocated_ptys_lock); |
211 | ida_remove(&allocated_ptys, idx); | 211 | ida_remove(&allocated_ptys, idx); |
212 | mutex_unlock(&allocated_ptys_lock); | 212 | mutex_unlock(&allocated_ptys_lock); |
213 | } | 213 | } |
214 | 214 | ||
215 | int devpts_pty_new(struct tty_struct *tty) | 215 | int devpts_pty_new(struct inode *ptmx_inode, struct tty_struct *tty) |
216 | { | 216 | { |
217 | int number = tty->index; /* tty layer puts index from devpts_new_index() in here */ | 217 | int number = tty->index; /* tty layer puts index from devpts_new_index() in here */ |
218 | struct tty_driver *driver = tty->driver; | 218 | struct tty_driver *driver = tty->driver; |
@@ -245,7 +245,7 @@ int devpts_pty_new(struct tty_struct *tty) | |||
245 | return 0; | 245 | return 0; |
246 | } | 246 | } |
247 | 247 | ||
248 | struct tty_struct *devpts_get_tty(int number) | 248 | struct tty_struct *devpts_get_tty(struct inode *pts_inode, int number) |
249 | { | 249 | { |
250 | struct dentry *dentry = get_node(number); | 250 | struct dentry *dentry = get_node(number); |
251 | struct tty_struct *tty; | 251 | struct tty_struct *tty; |
@@ -262,8 +262,9 @@ struct tty_struct *devpts_get_tty(int number) | |||
262 | return tty; | 262 | return tty; |
263 | } | 263 | } |
264 | 264 | ||
265 | void devpts_pty_kill(int number) | 265 | void devpts_pty_kill(struct tty_struct *tty) |
266 | { | 266 | { |
267 | int number = tty->index; | ||
267 | struct dentry *dentry = get_node(number); | 268 | struct dentry *dentry = get_node(number); |
268 | 269 | ||
269 | if (!IS_ERR(dentry)) { | 270 | if (!IS_ERR(dentry)) { |
diff --git a/include/linux/devpts_fs.h b/include/linux/devpts_fs.h index 154769cad3f3..5ce0e5fd712e 100644 --- a/include/linux/devpts_fs.h +++ b/include/linux/devpts_fs.h | |||
@@ -17,20 +17,31 @@ | |||
17 | 17 | ||
18 | #ifdef CONFIG_UNIX98_PTYS | 18 | #ifdef CONFIG_UNIX98_PTYS |
19 | 19 | ||
20 | int devpts_new_index(void); | 20 | int devpts_new_index(struct inode *ptmx_inode); |
21 | void devpts_kill_index(int idx); | 21 | void devpts_kill_index(struct inode *ptmx_inode, int idx); |
22 | int devpts_pty_new(struct tty_struct *tty); /* mknod in devpts */ | 22 | /* mknod in devpts */ |
23 | struct tty_struct *devpts_get_tty(int number); /* get tty structure */ | 23 | int devpts_pty_new(struct inode *ptmx_inode, struct tty_struct *tty); |
24 | void devpts_pty_kill(int number); /* unlink */ | 24 | /* get tty structure */ |
25 | struct tty_struct *devpts_get_tty(struct inode *pts_inode, int number); | ||
26 | /* unlink */ | ||
27 | void devpts_pty_kill(struct tty_struct *tty); | ||
25 | 28 | ||
26 | #else | 29 | #else |
27 | 30 | ||
28 | /* Dummy stubs in the no-pty case */ | 31 | /* Dummy stubs in the no-pty case */ |
29 | static inline int devpts_new_index(void) { return -EINVAL; } | 32 | static inline int devpts_new_index(struct inode *ptmx_inode) { return -EINVAL; } |
30 | static inline void devpts_kill_index(int idx) { } | 33 | static inline void devpts_kill_index(struct inode *ptmx_inode, int idx) { } |
31 | static inline int devpts_pty_new(struct tty_struct *tty) { return -EINVAL; } | 34 | static inline int devpts_pty_new(struct inode *ptmx_inode, |
32 | static inline struct tty_struct *devpts_get_tty(int number) { return NULL; } | 35 | struct tty_struct *tty) |
33 | static inline void devpts_pty_kill(int number) { } | 36 | { |
37 | return -EINVAL; | ||
38 | } | ||
39 | static inline struct tty_struct *devpts_get_tty(struct inode *pts_inode, | ||
40 | int number) | ||
41 | { | ||
42 | return NULL; | ||
43 | } | ||
44 | static inline void devpts_pty_kill(struct tty_struct *tty) { } | ||
34 | 45 | ||
35 | #endif | 46 | #endif |
36 | 47 | ||
diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h index 005d06ad46a6..78416b901589 100644 --- a/include/linux/tty_driver.h +++ b/include/linux/tty_driver.h | |||
@@ -225,7 +225,8 @@ struct tty_struct; | |||
225 | struct tty_driver; | 225 | struct tty_driver; |
226 | 226 | ||
227 | struct tty_operations { | 227 | struct tty_operations { |
228 | struct tty_struct * (*lookup)(struct tty_driver *driver, int idx); | 228 | struct tty_struct * (*lookup)(struct tty_driver *driver, |
229 | struct inode *inode, int idx); | ||
229 | int (*install)(struct tty_driver *driver, struct tty_struct *tty); | 230 | int (*install)(struct tty_driver *driver, struct tty_struct *tty); |
230 | void (*remove)(struct tty_driver *driver, struct tty_struct *tty); | 231 | void (*remove)(struct tty_driver *driver, struct tty_struct *tty); |
231 | int (*open)(struct tty_struct * tty, struct file * filp); | 232 | int (*open)(struct tty_struct * tty, struct file * filp); |