diff options
author | Alan Cox <alan@lxorguk.ukuu.org.uk> | 2008-04-30 03:53:17 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-30 11:29:38 -0400 |
commit | 37925e050379ef4db9f4ed251786b6d43da6ec71 (patch) | |
tree | 774ec9963acd20249a876d6be265da46da0b95d9 /drivers/char/epca.c | |
parent | 7b130c0efd7acbdc3cf9b2e7cc9a26e923feec93 (diff) |
epca: lock_kernel push down
Prepare epca for removing the lock from above. Most of epca is internally
locked so we can trivially push it down to a few bits of code. Drop the TIOCG/SSOFTCAR handling as that is done *properly* with locks by the mid layer.
Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/char/epca.c')
-rw-r--r-- | drivers/char/epca.c | 17 |
1 files changed, 2 insertions, 15 deletions
diff --git a/drivers/char/epca.c b/drivers/char/epca.c index ffd747c5dff0..9a682851283e 100644 --- a/drivers/char/epca.c +++ b/drivers/char/epca.c | |||
@@ -2206,21 +2206,6 @@ static int pc_ioctl(struct tty_struct *tty, struct file * file, | |||
2206 | tty_wait_until_sent(tty, 0); | 2206 | tty_wait_until_sent(tty, 0); |
2207 | digi_send_break(ch, arg ? arg*(HZ/10) : HZ/4); | 2207 | digi_send_break(ch, arg ? arg*(HZ/10) : HZ/4); |
2208 | return 0; | 2208 | return 0; |
2209 | case TIOCGSOFTCAR: | ||
2210 | if (put_user(C_CLOCAL(tty)?1:0, (unsigned long __user *)arg)) | ||
2211 | return -EFAULT; | ||
2212 | return 0; | ||
2213 | case TIOCSSOFTCAR: | ||
2214 | { | ||
2215 | unsigned int value; | ||
2216 | |||
2217 | if (get_user(value, (unsigned __user *)argp)) | ||
2218 | return -EFAULT; | ||
2219 | tty->termios->c_cflag = | ||
2220 | ((tty->termios->c_cflag & ~CLOCAL) | | ||
2221 | (value ? CLOCAL : 0)); | ||
2222 | return 0; | ||
2223 | } | ||
2224 | case TIOCMODG: | 2209 | case TIOCMODG: |
2225 | mflag = pc_tiocmget(tty, file); | 2210 | mflag = pc_tiocmget(tty, file); |
2226 | if (put_user(mflag, (unsigned long __user *)argp)) | 2211 | if (put_user(mflag, (unsigned long __user *)argp)) |
@@ -2253,6 +2238,7 @@ static int pc_ioctl(struct tty_struct *tty, struct file * file, | |||
2253 | break; | 2238 | break; |
2254 | case DIGI_SETAW: | 2239 | case DIGI_SETAW: |
2255 | case DIGI_SETAF: | 2240 | case DIGI_SETAF: |
2241 | lock_kernel(); | ||
2256 | if (cmd == DIGI_SETAW) { | 2242 | if (cmd == DIGI_SETAW) { |
2257 | /* Setup an event to indicate when the transmit buffer empties */ | 2243 | /* Setup an event to indicate when the transmit buffer empties */ |
2258 | spin_lock_irqsave(&epca_lock, flags); | 2244 | spin_lock_irqsave(&epca_lock, flags); |
@@ -2264,6 +2250,7 @@ static int pc_ioctl(struct tty_struct *tty, struct file * file, | |||
2264 | if (tty->ldisc.flush_buffer) | 2250 | if (tty->ldisc.flush_buffer) |
2265 | tty->ldisc.flush_buffer(tty); | 2251 | tty->ldisc.flush_buffer(tty); |
2266 | } | 2252 | } |
2253 | unlock_kernel(); | ||
2267 | /* Fall Thru */ | 2254 | /* Fall Thru */ |
2268 | case DIGI_SETA: | 2255 | case DIGI_SETA: |
2269 | if (copy_from_user(&ch->digiext, argp, sizeof(digi_t))) | 2256 | if (copy_from_user(&ch->digiext, argp, sizeof(digi_t))) |