diff options
author | Arjan van de Ven <arjan@infradead.org> | 2006-09-29 05:00:43 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-29 12:18:16 -0400 |
commit | 5785c95baede8459d70c4aa0f7becb6e8b5fde4b (patch) | |
tree | 17744eac694b4eab81cba4db28c4e083d779b753 /drivers/char/tty_ioctl.c | |
parent | 54306cf04c0ea0a8c432603dbc657ab62a438668 (diff) |
[PATCH] tty: make termios_sem a mutex
[akpm@osdl.org: fix]
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Arjan van de Ven <arjan@infradead.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/char/tty_ioctl.c')
-rw-r--r-- | drivers/char/tty_ioctl.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/drivers/char/tty_ioctl.c b/drivers/char/tty_ioctl.c index 4ad47d321bd4..4d540619ac84 100644 --- a/drivers/char/tty_ioctl.c +++ b/drivers/char/tty_ioctl.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/mm.h> | 20 | #include <linux/mm.h> |
21 | #include <linux/module.h> | 21 | #include <linux/module.h> |
22 | #include <linux/bitops.h> | 22 | #include <linux/bitops.h> |
23 | #include <linux/mutex.h> | ||
23 | 24 | ||
24 | #include <asm/io.h> | 25 | #include <asm/io.h> |
25 | #include <asm/uaccess.h> | 26 | #include <asm/uaccess.h> |
@@ -131,7 +132,7 @@ static void change_termios(struct tty_struct * tty, struct termios * new_termios | |||
131 | 132 | ||
132 | /* FIXME: we need to decide on some locking/ordering semantics | 133 | /* FIXME: we need to decide on some locking/ordering semantics |
133 | for the set_termios notification eventually */ | 134 | for the set_termios notification eventually */ |
134 | down(&tty->termios_sem); | 135 | mutex_lock(&tty->termios_mutex); |
135 | 136 | ||
136 | *tty->termios = *new_termios; | 137 | *tty->termios = *new_termios; |
137 | unset_locked_termios(tty->termios, &old_termios, tty->termios_locked); | 138 | unset_locked_termios(tty->termios, &old_termios, tty->termios_locked); |
@@ -176,7 +177,7 @@ static void change_termios(struct tty_struct * tty, struct termios * new_termios | |||
176 | (ld->set_termios)(tty, &old_termios); | 177 | (ld->set_termios)(tty, &old_termios); |
177 | tty_ldisc_deref(ld); | 178 | tty_ldisc_deref(ld); |
178 | } | 179 | } |
179 | up(&tty->termios_sem); | 180 | mutex_unlock(&tty->termios_mutex); |
180 | } | 181 | } |
181 | 182 | ||
182 | /** | 183 | /** |
@@ -284,13 +285,13 @@ static int get_sgttyb(struct tty_struct * tty, struct sgttyb __user * sgttyb) | |||
284 | { | 285 | { |
285 | struct sgttyb tmp; | 286 | struct sgttyb tmp; |
286 | 287 | ||
287 | down(&tty->termios_sem); | 288 | mutex_lock(&tty->termios_mutex); |
288 | tmp.sg_ispeed = 0; | 289 | tmp.sg_ispeed = 0; |
289 | tmp.sg_ospeed = 0; | 290 | tmp.sg_ospeed = 0; |
290 | tmp.sg_erase = tty->termios->c_cc[VERASE]; | 291 | tmp.sg_erase = tty->termios->c_cc[VERASE]; |
291 | tmp.sg_kill = tty->termios->c_cc[VKILL]; | 292 | tmp.sg_kill = tty->termios->c_cc[VKILL]; |
292 | tmp.sg_flags = get_sgflags(tty); | 293 | tmp.sg_flags = get_sgflags(tty); |
293 | up(&tty->termios_sem); | 294 | mutex_unlock(&tty->termios_mutex); |
294 | 295 | ||
295 | return copy_to_user(sgttyb, &tmp, sizeof(tmp)) ? -EFAULT : 0; | 296 | return copy_to_user(sgttyb, &tmp, sizeof(tmp)) ? -EFAULT : 0; |
296 | } | 297 | } |
@@ -345,12 +346,12 @@ static int set_sgttyb(struct tty_struct * tty, struct sgttyb __user * sgttyb) | |||
345 | if (copy_from_user(&tmp, sgttyb, sizeof(tmp))) | 346 | if (copy_from_user(&tmp, sgttyb, sizeof(tmp))) |
346 | return -EFAULT; | 347 | return -EFAULT; |
347 | 348 | ||
348 | down(&tty->termios_sem); | 349 | mutex_lock(&tty->termios_mutex); |
349 | termios = *tty->termios; | 350 | termios = *tty->termios; |
350 | termios.c_cc[VERASE] = tmp.sg_erase; | 351 | termios.c_cc[VERASE] = tmp.sg_erase; |
351 | termios.c_cc[VKILL] = tmp.sg_kill; | 352 | termios.c_cc[VKILL] = tmp.sg_kill; |
352 | set_sgflags(&termios, tmp.sg_flags); | 353 | set_sgflags(&termios, tmp.sg_flags); |
353 | up(&tty->termios_sem); | 354 | mutex_unlock(&tty->termios_mutex); |
354 | change_termios(tty, &termios); | 355 | change_termios(tty, &termios); |
355 | return 0; | 356 | return 0; |
356 | } | 357 | } |
@@ -592,11 +593,11 @@ int n_tty_ioctl(struct tty_struct * tty, struct file * file, | |||
592 | case TIOCSSOFTCAR: | 593 | case TIOCSSOFTCAR: |
593 | if (get_user(arg, (unsigned int __user *) arg)) | 594 | if (get_user(arg, (unsigned int __user *) arg)) |
594 | return -EFAULT; | 595 | return -EFAULT; |
595 | down(&tty->termios_sem); | 596 | mutex_lock(&tty->termios_mutex); |
596 | tty->termios->c_cflag = | 597 | tty->termios->c_cflag = |
597 | ((tty->termios->c_cflag & ~CLOCAL) | | 598 | ((tty->termios->c_cflag & ~CLOCAL) | |
598 | (arg ? CLOCAL : 0)); | 599 | (arg ? CLOCAL : 0)); |
599 | up(&tty->termios_sem); | 600 | mutex_unlock(&tty->termios_mutex); |
600 | return 0; | 601 | return 0; |
601 | default: | 602 | default: |
602 | return -ENOIOCTLCMD; | 603 | return -ENOIOCTLCMD; |