diff options
Diffstat (limited to 'drivers/char/tty_io.c')
-rw-r--r-- | drivers/char/tty_io.c | 40 |
1 files changed, 6 insertions, 34 deletions
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index edcb7e471f02..1d298c2cf930 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
@@ -91,7 +91,6 @@ | |||
91 | #include <linux/module.h> | 91 | #include <linux/module.h> |
92 | #include <linux/smp_lock.h> | 92 | #include <linux/smp_lock.h> |
93 | #include <linux/device.h> | 93 | #include <linux/device.h> |
94 | #include <linux/idr.h> | ||
95 | #include <linux/wait.h> | 94 | #include <linux/wait.h> |
96 | #include <linux/bitops.h> | 95 | #include <linux/bitops.h> |
97 | #include <linux/delay.h> | 96 | #include <linux/delay.h> |
@@ -137,9 +136,6 @@ EXPORT_SYMBOL(tty_mutex); | |||
137 | 136 | ||
138 | #ifdef CONFIG_UNIX98_PTYS | 137 | #ifdef CONFIG_UNIX98_PTYS |
139 | extern struct tty_driver *ptm_driver; /* Unix98 pty masters; for /dev/ptmx */ | 138 | extern struct tty_driver *ptm_driver; /* Unix98 pty masters; for /dev/ptmx */ |
140 | extern int pty_limit; /* Config limit on Unix98 ptys */ | ||
141 | static DEFINE_IDR(allocated_ptys); | ||
142 | static DEFINE_MUTEX(allocated_ptys_lock); | ||
143 | static int ptmx_open(struct inode *, struct file *); | 139 | static int ptmx_open(struct inode *, struct file *); |
144 | #endif | 140 | #endif |
145 | 141 | ||
@@ -2639,15 +2635,9 @@ static void release_dev(struct file *filp) | |||
2639 | */ | 2635 | */ |
2640 | release_tty(tty, idx); | 2636 | release_tty(tty, idx); |
2641 | 2637 | ||
2642 | #ifdef CONFIG_UNIX98_PTYS | ||
2643 | /* Make this pty number available for reallocation */ | 2638 | /* Make this pty number available for reallocation */ |
2644 | if (devpts) { | 2639 | if (devpts) |
2645 | mutex_lock(&allocated_ptys_lock); | 2640 | devpts_kill_index(idx); |
2646 | idr_remove(&allocated_ptys, idx); | ||
2647 | mutex_unlock(&allocated_ptys_lock); | ||
2648 | } | ||
2649 | #endif | ||
2650 | |||
2651 | } | 2641 | } |
2652 | 2642 | ||
2653 | /** | 2643 | /** |
@@ -2803,29 +2793,13 @@ static int ptmx_open(struct inode *inode, struct file *filp) | |||
2803 | struct tty_struct *tty; | 2793 | struct tty_struct *tty; |
2804 | int retval; | 2794 | int retval; |
2805 | int index; | 2795 | int index; |
2806 | int idr_ret; | ||
2807 | 2796 | ||
2808 | nonseekable_open(inode, filp); | 2797 | nonseekable_open(inode, filp); |
2809 | 2798 | ||
2810 | /* find a device that is not in use. */ | 2799 | /* find a device that is not in use. */ |
2811 | mutex_lock(&allocated_ptys_lock); | 2800 | index = devpts_new_index(); |
2812 | if (!idr_pre_get(&allocated_ptys, GFP_KERNEL)) { | 2801 | if (index < 0) |
2813 | mutex_unlock(&allocated_ptys_lock); | 2802 | return index; |
2814 | return -ENOMEM; | ||
2815 | } | ||
2816 | idr_ret = idr_get_new(&allocated_ptys, NULL, &index); | ||
2817 | if (idr_ret < 0) { | ||
2818 | mutex_unlock(&allocated_ptys_lock); | ||
2819 | if (idr_ret == -EAGAIN) | ||
2820 | return -ENOMEM; | ||
2821 | return -EIO; | ||
2822 | } | ||
2823 | if (index >= pty_limit) { | ||
2824 | idr_remove(&allocated_ptys, index); | ||
2825 | mutex_unlock(&allocated_ptys_lock); | ||
2826 | return -EIO; | ||
2827 | } | ||
2828 | mutex_unlock(&allocated_ptys_lock); | ||
2829 | 2803 | ||
2830 | mutex_lock(&tty_mutex); | 2804 | mutex_lock(&tty_mutex); |
2831 | retval = init_dev(ptm_driver, index, &tty); | 2805 | retval = init_dev(ptm_driver, index, &tty); |
@@ -2850,9 +2824,7 @@ out1: | |||
2850 | release_dev(filp); | 2824 | release_dev(filp); |
2851 | return retval; | 2825 | return retval; |
2852 | out: | 2826 | out: |
2853 | mutex_lock(&allocated_ptys_lock); | 2827 | devpts_kill_index(index); |
2854 | idr_remove(&allocated_ptys, index); | ||
2855 | mutex_unlock(&allocated_ptys_lock); | ||
2856 | return retval; | 2828 | return retval; |
2857 | } | 2829 | } |
2858 | #endif | 2830 | #endif |