aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/tty_io.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/tty_io.c')
-rw-r--r--drivers/char/tty_io.c40
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
139extern struct tty_driver *ptm_driver; /* Unix98 pty masters; for /dev/ptmx */ 138extern struct tty_driver *ptm_driver; /* Unix98 pty masters; for /dev/ptmx */
140extern int pty_limit; /* Config limit on Unix98 ptys */
141static DEFINE_IDR(allocated_ptys);
142static DEFINE_MUTEX(allocated_ptys_lock);
143static int ptmx_open(struct inode *, struct file *); 139static 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;
2852out: 2826out:
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