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.c41
1 files changed, 34 insertions, 7 deletions
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
index 750131010af0..047a17339f83 100644
--- a/drivers/char/tty_io.c
+++ b/drivers/char/tty_io.c
@@ -2665,7 +2665,7 @@ static void release_dev(struct file *filp)
2665 * ->siglock protects ->signal/->sighand 2665 * ->siglock protects ->signal/->sighand
2666 */ 2666 */
2667 2667
2668static int tty_open(struct inode *inode, struct file *filp) 2668static int __tty_open(struct inode *inode, struct file *filp)
2669{ 2669{
2670 struct tty_struct *tty; 2670 struct tty_struct *tty;
2671 int noctty, retval; 2671 int noctty, retval;
@@ -2779,6 +2779,19 @@ got_driver:
2779 return 0; 2779 return 0;
2780} 2780}
2781 2781
2782/* BKL pushdown: scary code avoidance wrapper */
2783static int tty_open(struct inode *inode, struct file *filp)
2784{
2785 int ret;
2786
2787 lock_kernel();
2788 ret = __tty_open(inode, filp);
2789 unlock_kernel();
2790 return ret;
2791}
2792
2793
2794
2782#ifdef CONFIG_UNIX98_PTYS 2795#ifdef CONFIG_UNIX98_PTYS
2783/** 2796/**
2784 * ptmx_open - open a unix 98 pty master 2797 * ptmx_open - open a unix 98 pty master
@@ -2792,7 +2805,7 @@ got_driver:
2792 * allocated_ptys_lock handles the list of free pty numbers 2805 * allocated_ptys_lock handles the list of free pty numbers
2793 */ 2806 */
2794 2807
2795static int ptmx_open(struct inode *inode, struct file *filp) 2808static int __ptmx_open(struct inode *inode, struct file *filp)
2796{ 2809{
2797 struct tty_struct *tty; 2810 struct tty_struct *tty;
2798 int retval; 2811 int retval;
@@ -2831,6 +2844,16 @@ out:
2831 devpts_kill_index(index); 2844 devpts_kill_index(index);
2832 return retval; 2845 return retval;
2833} 2846}
2847
2848static int ptmx_open(struct inode *inode, struct file *filp)
2849{
2850 int ret;
2851
2852 lock_kernel();
2853 ret = __ptmx_open(inode, filp);
2854 unlock_kernel();
2855 return ret;
2856}
2834#endif 2857#endif
2835 2858
2836/** 2859/**
@@ -2886,15 +2909,16 @@ static int tty_fasync(int fd, struct file *filp, int on)
2886{ 2909{
2887 struct tty_struct *tty; 2910 struct tty_struct *tty;
2888 unsigned long flags; 2911 unsigned long flags;
2889 int retval; 2912 int retval = 0;
2890 2913
2914 lock_kernel();
2891 tty = (struct tty_struct *)filp->private_data; 2915 tty = (struct tty_struct *)filp->private_data;
2892 if (tty_paranoia_check(tty, filp->f_path.dentry->d_inode, "tty_fasync")) 2916 if (tty_paranoia_check(tty, filp->f_path.dentry->d_inode, "tty_fasync"))
2893 return 0; 2917 goto out;
2894 2918
2895 retval = fasync_helper(fd, filp, on, &tty->fasync); 2919 retval = fasync_helper(fd, filp, on, &tty->fasync);
2896 if (retval <= 0) 2920 if (retval <= 0)
2897 return retval; 2921 goto out;
2898 2922
2899 if (on) { 2923 if (on) {
2900 enum pid_type type; 2924 enum pid_type type;
@@ -2912,12 +2936,15 @@ static int tty_fasync(int fd, struct file *filp, int on)
2912 spin_unlock_irqrestore(&tty->ctrl_lock, flags); 2936 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
2913 retval = __f_setown(filp, pid, type, 0); 2937 retval = __f_setown(filp, pid, type, 0);
2914 if (retval) 2938 if (retval)
2915 return retval; 2939 goto out;
2916 } else { 2940 } else {
2917 if (!tty->fasync && !waitqueue_active(&tty->read_wait)) 2941 if (!tty->fasync && !waitqueue_active(&tty->read_wait))
2918 tty->minimum_to_wake = N_TTY_BUF_SIZE; 2942 tty->minimum_to_wake = N_TTY_BUF_SIZE;
2919 } 2943 }
2920 return 0; 2944 retval = 0;
2945out:
2946 unlock_kernel();
2947 return retval;
2921} 2948}
2922 2949
2923/** 2950/**