diff options
-rw-r--r-- | drivers/char/n_tty.c | 148 |
1 files changed, 73 insertions, 75 deletions
diff --git a/drivers/char/n_tty.c b/drivers/char/n_tty.c index 90c3969012a3..46b2a1cc8b54 100644 --- a/drivers/char/n_tty.c +++ b/drivers/char/n_tty.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * n_tty.c --- implements the N_TTY line discipline. | 2 | * n_tty.c --- implements the N_TTY line discipline. |
3 | * | 3 | * |
4 | * This code used to be in tty_io.c, but things are getting hairy | 4 | * This code used to be in tty_io.c, but things are getting hairy |
5 | * enough that it made sense to split things off. (The N_TTY | 5 | * enough that it made sense to split things off. (The N_TTY |
6 | * processing has changed so much that it's hardly recognizable, | 6 | * processing has changed so much that it's hardly recognizable, |
@@ -8,19 +8,19 @@ | |||
8 | * | 8 | * |
9 | * Note that the open routine for N_TTY is guaranteed never to return | 9 | * Note that the open routine for N_TTY is guaranteed never to return |
10 | * an error. This is because Linux will fall back to setting a line | 10 | * an error. This is because Linux will fall back to setting a line |
11 | * to N_TTY if it can not switch to any other line discipline. | 11 | * to N_TTY if it can not switch to any other line discipline. |
12 | * | 12 | * |
13 | * Written by Theodore Ts'o, Copyright 1994. | 13 | * Written by Theodore Ts'o, Copyright 1994. |
14 | * | 14 | * |
15 | * This file also contains code originally written by Linus Torvalds, | 15 | * This file also contains code originally written by Linus Torvalds, |
16 | * Copyright 1991, 1992, 1993, and by Julian Cowley, Copyright 1994. | 16 | * Copyright 1991, 1992, 1993, and by Julian Cowley, Copyright 1994. |
17 | * | 17 | * |
18 | * This file may be redistributed under the terms of the GNU General Public | 18 | * This file may be redistributed under the terms of the GNU General Public |
19 | * License. | 19 | * License. |
20 | * | 20 | * |
21 | * Reduced memory usage for older ARM systems - Russell King. | 21 | * Reduced memory usage for older ARM systems - Russell King. |
22 | * | 22 | * |
23 | * 2000/01/20 Fixed SMP locking on put_tty_queue using bits of | 23 | * 2000/01/20 Fixed SMP locking on put_tty_queue using bits of |
24 | * the patch by Andrew J. Kroll <ag784@freenet.buffalo.edu> | 24 | * the patch by Andrew J. Kroll <ag784@freenet.buffalo.edu> |
25 | * who actually finally proved there really was a race. | 25 | * who actually finally proved there really was a race. |
26 | * | 26 | * |
@@ -144,11 +144,11 @@ static void put_tty_queue(unsigned char c, struct tty_struct *tty) | |||
144 | * Can sleep, may be called under the atomic_read_lock mutex but | 144 | * Can sleep, may be called under the atomic_read_lock mutex but |
145 | * this is not guaranteed. | 145 | * this is not guaranteed. |
146 | */ | 146 | */ |
147 | 147 | ||
148 | static void check_unthrottle(struct tty_struct * tty) | 148 | static void check_unthrottle(struct tty_struct *tty) |
149 | { | 149 | { |
150 | if (tty->count && | 150 | if (tty->count && |
151 | test_and_clear_bit(TTY_THROTTLED, &tty->flags) && | 151 | test_and_clear_bit(TTY_THROTTLED, &tty->flags) && |
152 | tty->driver->unthrottle) | 152 | tty->driver->unthrottle) |
153 | tty->driver->unthrottle(tty); | 153 | tty->driver->unthrottle(tty); |
154 | } | 154 | } |
@@ -157,7 +157,7 @@ static void check_unthrottle(struct tty_struct * tty) | |||
157 | * reset_buffer_flags - reset buffer state | 157 | * reset_buffer_flags - reset buffer state |
158 | * @tty: terminal to reset | 158 | * @tty: terminal to reset |
159 | * | 159 | * |
160 | * Reset the read buffer counters, clear the flags, | 160 | * Reset the read buffer counters, clear the flags, |
161 | * and make sure the driver is unthrottled. Called | 161 | * and make sure the driver is unthrottled. Called |
162 | * from n_tty_open() and n_tty_flush_buffer(). | 162 | * from n_tty_open() and n_tty_flush_buffer(). |
163 | */ | 163 | */ |
@@ -186,12 +186,12 @@ static void reset_buffer_flags(struct tty_struct *tty) | |||
186 | * FIXME: tty->ctrl_status is not spinlocked and relies on | 186 | * FIXME: tty->ctrl_status is not spinlocked and relies on |
187 | * lock_kernel() still. | 187 | * lock_kernel() still. |
188 | */ | 188 | */ |
189 | 189 | ||
190 | static void n_tty_flush_buffer(struct tty_struct * tty) | 190 | static void n_tty_flush_buffer(struct tty_struct *tty) |
191 | { | 191 | { |
192 | /* clear everything and unthrottle the driver */ | 192 | /* clear everything and unthrottle the driver */ |
193 | reset_buffer_flags(tty); | 193 | reset_buffer_flags(tty); |
194 | 194 | ||
195 | if (!tty->link) | 195 | if (!tty->link) |
196 | return; | 196 | return; |
197 | 197 | ||
@@ -206,9 +206,9 @@ static void n_tty_flush_buffer(struct tty_struct * tty) | |||
206 | * @tty: tty device | 206 | * @tty: tty device |
207 | * | 207 | * |
208 | * Report the number of characters buffered to be delivered to user | 208 | * Report the number of characters buffered to be delivered to user |
209 | * at this instant in time. | 209 | * at this instant in time. |
210 | */ | 210 | */ |
211 | 211 | ||
212 | static ssize_t n_tty_chars_in_buffer(struct tty_struct *tty) | 212 | static ssize_t n_tty_chars_in_buffer(struct tty_struct *tty) |
213 | { | 213 | { |
214 | unsigned long flags; | 214 | unsigned long flags; |
@@ -234,7 +234,7 @@ static ssize_t n_tty_chars_in_buffer(struct tty_struct *tty) | |||
234 | * character. We use this to correctly compute the on screen size | 234 | * character. We use this to correctly compute the on screen size |
235 | * of the character when printing | 235 | * of the character when printing |
236 | */ | 236 | */ |
237 | 237 | ||
238 | static inline int is_utf8_continuation(unsigned char c) | 238 | static inline int is_utf8_continuation(unsigned char c) |
239 | { | 239 | { |
240 | return (c & 0xc0) == 0x80; | 240 | return (c & 0xc0) == 0x80; |
@@ -247,7 +247,7 @@ static inline int is_utf8_continuation(unsigned char c) | |||
247 | * Returns true if the utf8 character 'c' is a multibyte continuation | 247 | * Returns true if the utf8 character 'c' is a multibyte continuation |
248 | * character and the terminal is in unicode mode. | 248 | * character and the terminal is in unicode mode. |
249 | */ | 249 | */ |
250 | 250 | ||
251 | static inline int is_continuation(unsigned char c, struct tty_struct *tty) | 251 | static inline int is_continuation(unsigned char c, struct tty_struct *tty) |
252 | { | 252 | { |
253 | return I_IUTF8(tty) && is_utf8_continuation(c); | 253 | return I_IUTF8(tty) && is_utf8_continuation(c); |
@@ -266,7 +266,7 @@ static inline int is_continuation(unsigned char c, struct tty_struct *tty) | |||
266 | * Called from both the receive and transmit sides and can be called | 266 | * Called from both the receive and transmit sides and can be called |
267 | * re-entrantly. Relies on lock_kernel() still. | 267 | * re-entrantly. Relies on lock_kernel() still. |
268 | */ | 268 | */ |
269 | 269 | ||
270 | static int opost(unsigned char c, struct tty_struct *tty) | 270 | static int opost(unsigned char c, struct tty_struct *tty) |
271 | { | 271 | { |
272 | int space, spaces; | 272 | int space, spaces; |
@@ -339,9 +339,9 @@ static int opost(unsigned char c, struct tty_struct *tty) | |||
339 | * | 339 | * |
340 | * Called from write_chan under the tty layer write lock. | 340 | * Called from write_chan under the tty layer write lock. |
341 | */ | 341 | */ |
342 | 342 | ||
343 | static ssize_t opost_block(struct tty_struct * tty, | 343 | static ssize_t opost_block(struct tty_struct *tty, |
344 | const unsigned char * buf, unsigned int nr) | 344 | const unsigned char *buf, unsigned int nr) |
345 | { | 345 | { |
346 | int space; | 346 | int space; |
347 | int i; | 347 | int i; |
@@ -386,7 +386,7 @@ static ssize_t opost_block(struct tty_struct * tty, | |||
386 | break_out: | 386 | break_out: |
387 | if (tty->driver->flush_chars) | 387 | if (tty->driver->flush_chars) |
388 | tty->driver->flush_chars(tty); | 388 | tty->driver->flush_chars(tty); |
389 | i = tty->driver->write(tty, buf, i); | 389 | i = tty->driver->write(tty, buf, i); |
390 | return i; | 390 | return i; |
391 | } | 391 | } |
392 | 392 | ||
@@ -398,7 +398,7 @@ break_out: | |||
398 | * | 398 | * |
399 | * Queue a byte to the driver layer for output | 399 | * Queue a byte to the driver layer for output |
400 | */ | 400 | */ |
401 | 401 | ||
402 | static inline void put_char(unsigned char c, struct tty_struct *tty) | 402 | static inline void put_char(unsigned char c, struct tty_struct *tty) |
403 | { | 403 | { |
404 | tty->driver->put_char(tty, c); | 404 | tty->driver->put_char(tty, c); |
@@ -409,7 +409,7 @@ static inline void put_char(unsigned char c, struct tty_struct *tty) | |||
409 | * @c: unicode byte to echo | 409 | * @c: unicode byte to echo |
410 | * @tty: terminal device | 410 | * @tty: terminal device |
411 | * | 411 | * |
412 | * Echo user input back onto the screen. This must be called only when | 412 | * Echo user input back onto the screen. This must be called only when |
413 | * L_ECHO(tty) is true. Called from the driver receive_buf path. | 413 | * L_ECHO(tty) is true. Called from the driver receive_buf path. |
414 | */ | 414 | */ |
415 | 415 | ||
@@ -441,7 +441,7 @@ static inline void finish_erasing(struct tty_struct *tty) | |||
441 | * present in the stream from the driver layer. Handles the complexities | 441 | * present in the stream from the driver layer. Handles the complexities |
442 | * of UTF-8 multibyte symbols. | 442 | * of UTF-8 multibyte symbols. |
443 | */ | 443 | */ |
444 | 444 | ||
445 | static void eraser(unsigned char c, struct tty_struct *tty) | 445 | static void eraser(unsigned char c, struct tty_struct *tty) |
446 | { | 446 | { |
447 | enum { ERASE, WERASE, KILL } kill_type; | 447 | enum { ERASE, WERASE, KILL } kill_type; |
@@ -541,7 +541,7 @@ static void eraser(unsigned char c, struct tty_struct *tty) | |||
541 | 541 | ||
542 | /* should never happen */ | 542 | /* should never happen */ |
543 | if (tty->column > 0x80000000) | 543 | if (tty->column > 0x80000000) |
544 | tty->column = 0; | 544 | tty->column = 0; |
545 | 545 | ||
546 | /* Now backup to that column. */ | 546 | /* Now backup to that column. */ |
547 | while (tty->column > col) { | 547 | while (tty->column > col) { |
@@ -585,7 +585,7 @@ static void eraser(unsigned char c, struct tty_struct *tty) | |||
585 | * settings and character used. Called from the driver receive_buf | 585 | * settings and character used. Called from the driver receive_buf |
586 | * path so serialized. | 586 | * path so serialized. |
587 | */ | 587 | */ |
588 | 588 | ||
589 | static inline void isig(int sig, struct tty_struct *tty, int flush) | 589 | static inline void isig(int sig, struct tty_struct *tty, int flush) |
590 | { | 590 | { |
591 | if (tty->pgrp) | 591 | if (tty->pgrp) |
@@ -606,7 +606,7 @@ static inline void isig(int sig, struct tty_struct *tty, int flush) | |||
606 | * | 606 | * |
607 | * Called from the receive_buf path so single threaded. | 607 | * Called from the receive_buf path so single threaded. |
608 | */ | 608 | */ |
609 | 609 | ||
610 | static inline void n_tty_receive_break(struct tty_struct *tty) | 610 | static inline void n_tty_receive_break(struct tty_struct *tty) |
611 | { | 611 | { |
612 | if (I_IGNBRK(tty)) | 612 | if (I_IGNBRK(tty)) |
@@ -635,7 +635,7 @@ static inline void n_tty_receive_break(struct tty_struct *tty) | |||
635 | * need locking as num_overrun and overrun_time are function | 635 | * need locking as num_overrun and overrun_time are function |
636 | * private. | 636 | * private. |
637 | */ | 637 | */ |
638 | 638 | ||
639 | static inline void n_tty_receive_overrun(struct tty_struct *tty) | 639 | static inline void n_tty_receive_overrun(struct tty_struct *tty) |
640 | { | 640 | { |
641 | char buf[64]; | 641 | char buf[64]; |
@@ -662,9 +662,8 @@ static inline void n_tty_receive_overrun(struct tty_struct *tty) | |||
662 | static inline void n_tty_receive_parity_error(struct tty_struct *tty, | 662 | static inline void n_tty_receive_parity_error(struct tty_struct *tty, |
663 | unsigned char c) | 663 | unsigned char c) |
664 | { | 664 | { |
665 | if (I_IGNPAR(tty)) { | 665 | if (I_IGNPAR(tty)) |
666 | return; | 666 | return; |
667 | } | ||
668 | if (I_PARMRK(tty)) { | 667 | if (I_PARMRK(tty)) { |
669 | put_tty_queue('\377', tty); | 668 | put_tty_queue('\377', tty); |
670 | put_tty_queue('\0', tty); | 669 | put_tty_queue('\0', tty); |
@@ -682,7 +681,7 @@ static inline void n_tty_receive_parity_error(struct tty_struct *tty, | |||
682 | * @c: character | 681 | * @c: character |
683 | * | 682 | * |
684 | * Process an individual character of input received from the driver. | 683 | * Process an individual character of input received from the driver. |
685 | * This is serialized with respect to itself by the rules for the | 684 | * This is serialized with respect to itself by the rules for the |
686 | * driver above. | 685 | * driver above. |
687 | */ | 686 | */ |
688 | 687 | ||
@@ -694,7 +693,7 @@ static inline void n_tty_receive_char(struct tty_struct *tty, unsigned char c) | |||
694 | put_tty_queue(c, tty); | 693 | put_tty_queue(c, tty); |
695 | return; | 694 | return; |
696 | } | 695 | } |
697 | 696 | ||
698 | if (I_ISTRIP(tty)) | 697 | if (I_ISTRIP(tty)) |
699 | c &= 0x7f; | 698 | c &= 0x7f; |
700 | if (I_IUCLC(tty) && L_IEXTEN(tty)) | 699 | if (I_IUCLC(tty) && L_IEXTEN(tty)) |
@@ -739,7 +738,7 @@ static inline void n_tty_receive_char(struct tty_struct *tty, unsigned char c) | |||
739 | put_tty_queue(c, tty); | 738 | put_tty_queue(c, tty); |
740 | return; | 739 | return; |
741 | } | 740 | } |
742 | 741 | ||
743 | if (c == '\r') { | 742 | if (c == '\r') { |
744 | if (I_IGNCR(tty)) | 743 | if (I_IGNCR(tty)) |
745 | return; | 744 | return; |
@@ -825,8 +824,8 @@ send_signal: | |||
825 | goto handle_newline; | 824 | goto handle_newline; |
826 | } | 825 | } |
827 | if (c == EOF_CHAR(tty)) { | 826 | if (c == EOF_CHAR(tty)) { |
828 | if (tty->canon_head != tty->read_head) | 827 | if (tty->canon_head != tty->read_head) |
829 | set_bit(TTY_PUSH, &tty->flags); | 828 | set_bit(TTY_PUSH, &tty->flags); |
830 | c = __DISABLED_CHAR; | 829 | c = __DISABLED_CHAR; |
831 | goto handle_newline; | 830 | goto handle_newline; |
832 | } | 831 | } |
@@ -850,7 +849,7 @@ send_signal: | |||
850 | if (I_PARMRK(tty) && c == (unsigned char) '\377') | 849 | if (I_PARMRK(tty) && c == (unsigned char) '\377') |
851 | put_tty_queue(c, tty); | 850 | put_tty_queue(c, tty); |
852 | 851 | ||
853 | handle_newline: | 852 | handle_newline: |
854 | spin_lock_irqsave(&tty->read_lock, flags); | 853 | spin_lock_irqsave(&tty->read_lock, flags); |
855 | set_bit(tty->read_head, tty->read_flags); | 854 | set_bit(tty->read_head, tty->read_flags); |
856 | put_tty_queue_nolock(c, tty); | 855 | put_tty_queue_nolock(c, tty); |
@@ -863,7 +862,7 @@ send_signal: | |||
863 | return; | 862 | return; |
864 | } | 863 | } |
865 | } | 864 | } |
866 | 865 | ||
867 | finish_erasing(tty); | 866 | finish_erasing(tty); |
868 | if (L_ECHO(tty)) { | 867 | if (L_ECHO(tty)) { |
869 | if (tty->read_cnt >= N_TTY_BUF_SIZE-1) { | 868 | if (tty->read_cnt >= N_TTY_BUF_SIZE-1) { |
@@ -884,7 +883,7 @@ send_signal: | |||
884 | put_tty_queue(c, tty); | 883 | put_tty_queue(c, tty); |
885 | 884 | ||
886 | put_tty_queue(c, tty); | 885 | put_tty_queue(c, tty); |
887 | } | 886 | } |
888 | 887 | ||
889 | 888 | ||
890 | /** | 889 | /** |
@@ -898,12 +897,10 @@ send_signal: | |||
898 | 897 | ||
899 | static void n_tty_write_wakeup(struct tty_struct *tty) | 898 | static void n_tty_write_wakeup(struct tty_struct *tty) |
900 | { | 899 | { |
901 | if (tty->fasync) | 900 | if (tty->fasync) { |
902 | { | 901 | set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); |
903 | set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); | ||
904 | kill_fasync(&tty->fasync, SIGIO, POLL_OUT); | 902 | kill_fasync(&tty->fasync, SIGIO, POLL_OUT); |
905 | } | 903 | } |
906 | return; | ||
907 | } | 904 | } |
908 | 905 | ||
909 | /** | 906 | /** |
@@ -918,7 +915,7 @@ static void n_tty_write_wakeup(struct tty_struct *tty) | |||
918 | * not from interrupt context. The driver is responsible for making | 915 | * not from interrupt context. The driver is responsible for making |
919 | * calls one at a time and in order (or using flush_to_ldisc) | 916 | * calls one at a time and in order (or using flush_to_ldisc) |
920 | */ | 917 | */ |
921 | 918 | ||
922 | static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp, | 919 | static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp, |
923 | char *fp, int count) | 920 | char *fp, int count) |
924 | { | 921 | { |
@@ -950,7 +947,7 @@ static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp, | |||
950 | tty->read_cnt += i; | 947 | tty->read_cnt += i; |
951 | spin_unlock_irqrestore(&tty->read_lock, cpuflags); | 948 | spin_unlock_irqrestore(&tty->read_lock, cpuflags); |
952 | } else { | 949 | } else { |
953 | for (i=count, p = cp, f = fp; i; i--, p++) { | 950 | for (i = count, p = cp, f = fp; i; i--, p++) { |
954 | if (f) | 951 | if (f) |
955 | flags = *f++; | 952 | flags = *f++; |
956 | switch (flags) { | 953 | switch (flags) { |
@@ -968,7 +965,7 @@ static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp, | |||
968 | n_tty_receive_overrun(tty); | 965 | n_tty_receive_overrun(tty); |
969 | break; | 966 | break; |
970 | default: | 967 | default: |
971 | printk("%s: unknown flag %d\n", | 968 | printk(KERN_ERR "%s: unknown flag %d\n", |
972 | tty_name(tty, buf), flags); | 969 | tty_name(tty, buf), flags); |
973 | break; | 970 | break; |
974 | } | 971 | } |
@@ -1001,7 +998,7 @@ static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp, | |||
1001 | int is_ignored(int sig) | 998 | int is_ignored(int sig) |
1002 | { | 999 | { |
1003 | return (sigismember(¤t->blocked, sig) || | 1000 | return (sigismember(¤t->blocked, sig) || |
1004 | current->sighand->action[sig-1].sa.sa_handler == SIG_IGN); | 1001 | current->sighand->action[sig-1].sa.sa_handler == SIG_IGN); |
1005 | } | 1002 | } |
1006 | 1003 | ||
1007 | /** | 1004 | /** |
@@ -1011,16 +1008,16 @@ int is_ignored(int sig) | |||
1011 | * | 1008 | * |
1012 | * Called by the tty layer when the user changes termios flags so | 1009 | * Called by the tty layer when the user changes termios flags so |
1013 | * that the line discipline can plan ahead. This function cannot sleep | 1010 | * that the line discipline can plan ahead. This function cannot sleep |
1014 | * and is protected from re-entry by the tty layer. The user is | 1011 | * and is protected from re-entry by the tty layer. The user is |
1015 | * guaranteed that this function will not be re-entered or in progress | 1012 | * guaranteed that this function will not be re-entered or in progress |
1016 | * when the ldisc is closed. | 1013 | * when the ldisc is closed. |
1017 | */ | 1014 | */ |
1018 | 1015 | ||
1019 | static void n_tty_set_termios(struct tty_struct *tty, struct ktermios * old) | 1016 | static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old) |
1020 | { | 1017 | { |
1021 | if (!tty) | 1018 | if (!tty) |
1022 | return; | 1019 | return; |
1023 | 1020 | ||
1024 | tty->icanon = (L_ICANON(tty) != 0); | 1021 | tty->icanon = (L_ICANON(tty) != 0); |
1025 | if (test_bit(TTY_HW_COOK_IN, &tty->flags)) { | 1022 | if (test_bit(TTY_HW_COOK_IN, &tty->flags)) { |
1026 | tty->raw = 1; | 1023 | tty->raw = 1; |
@@ -1085,12 +1082,12 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios * old) | |||
1085 | * n_tty_close - close the ldisc for this tty | 1082 | * n_tty_close - close the ldisc for this tty |
1086 | * @tty: device | 1083 | * @tty: device |
1087 | * | 1084 | * |
1088 | * Called from the terminal layer when this line discipline is | 1085 | * Called from the terminal layer when this line discipline is |
1089 | * being shut down, either because of a close or becsuse of a | 1086 | * being shut down, either because of a close or becsuse of a |
1090 | * discipline change. The function will not be called while other | 1087 | * discipline change. The function will not be called while other |
1091 | * ldisc methods are in progress. | 1088 | * ldisc methods are in progress. |
1092 | */ | 1089 | */ |
1093 | 1090 | ||
1094 | static void n_tty_close(struct tty_struct *tty) | 1091 | static void n_tty_close(struct tty_struct *tty) |
1095 | { | 1092 | { |
1096 | n_tty_flush_buffer(tty); | 1093 | n_tty_flush_buffer(tty); |
@@ -1104,7 +1101,7 @@ static void n_tty_close(struct tty_struct *tty) | |||
1104 | * n_tty_open - open an ldisc | 1101 | * n_tty_open - open an ldisc |
1105 | * @tty: terminal to open | 1102 | * @tty: terminal to open |
1106 | * | 1103 | * |
1107 | * Called when this line discipline is being attached to the | 1104 | * Called when this line discipline is being attached to the |
1108 | * terminal device. Can sleep. Called serialized so that no | 1105 | * terminal device. Can sleep. Called serialized so that no |
1109 | * other events will occur in parallel. No further open will occur | 1106 | * other events will occur in parallel. No further open will occur |
1110 | * until a close. | 1107 | * until a close. |
@@ -1157,7 +1154,7 @@ static inline int input_available_p(struct tty_struct *tty, int amt) | |||
1157 | * Called under the tty->atomic_read_lock sem | 1154 | * Called under the tty->atomic_read_lock sem |
1158 | * | 1155 | * |
1159 | */ | 1156 | */ |
1160 | 1157 | ||
1161 | static int copy_from_read_buf(struct tty_struct *tty, | 1158 | static int copy_from_read_buf(struct tty_struct *tty, |
1162 | unsigned char __user **b, | 1159 | unsigned char __user **b, |
1163 | size_t *nr) | 1160 | size_t *nr) |
@@ -1186,7 +1183,8 @@ static int copy_from_read_buf(struct tty_struct *tty, | |||
1186 | return retval; | 1183 | return retval; |
1187 | } | 1184 | } |
1188 | 1185 | ||
1189 | extern ssize_t redirected_tty_write(struct file *,const char *,size_t,loff_t *); | 1186 | extern ssize_t redirected_tty_write(struct file *, const char *, |
1187 | size_t, loff_t *); | ||
1190 | 1188 | ||
1191 | /** | 1189 | /** |
1192 | * job_control - check job control | 1190 | * job_control - check job control |
@@ -1194,10 +1192,10 @@ extern ssize_t redirected_tty_write(struct file *,const char *,size_t,loff_t *); | |||
1194 | * @file: file handle | 1192 | * @file: file handle |
1195 | * | 1193 | * |
1196 | * Perform job control management checks on this file/tty descriptor | 1194 | * Perform job control management checks on this file/tty descriptor |
1197 | * and if appropriate send any needed signals and return a negative | 1195 | * and if appropriate send any needed signals and return a negative |
1198 | * error code if action should be taken. | 1196 | * error code if action should be taken. |
1199 | */ | 1197 | */ |
1200 | 1198 | ||
1201 | static int job_control(struct tty_struct *tty, struct file *file) | 1199 | static int job_control(struct tty_struct *tty, struct file *file) |
1202 | { | 1200 | { |
1203 | /* Job control check -- must be done at start and after | 1201 | /* Job control check -- must be done at start and after |
@@ -1208,7 +1206,7 @@ static int job_control(struct tty_struct *tty, struct file *file) | |||
1208 | if (file->f_op->write != redirected_tty_write && | 1206 | if (file->f_op->write != redirected_tty_write && |
1209 | current->signal->tty == tty) { | 1207 | current->signal->tty == tty) { |
1210 | if (!tty->pgrp) | 1208 | if (!tty->pgrp) |
1211 | printk("read_chan: no tty->pgrp!\n"); | 1209 | printk(KERN_ERR "read_chan: no tty->pgrp!\n"); |
1212 | else if (task_pgrp(current) != tty->pgrp) { | 1210 | else if (task_pgrp(current) != tty->pgrp) { |
1213 | if (is_ignored(SIGTTIN) || | 1211 | if (is_ignored(SIGTTIN) || |
1214 | is_current_pgrp_orphaned()) | 1212 | is_current_pgrp_orphaned()) |
@@ -1220,7 +1218,7 @@ static int job_control(struct tty_struct *tty, struct file *file) | |||
1220 | } | 1218 | } |
1221 | return 0; | 1219 | return 0; |
1222 | } | 1220 | } |
1223 | 1221 | ||
1224 | 1222 | ||
1225 | /** | 1223 | /** |
1226 | * read_chan - read function for tty | 1224 | * read_chan - read function for tty |
@@ -1236,7 +1234,7 @@ static int job_control(struct tty_struct *tty, struct file *file) | |||
1236 | * | 1234 | * |
1237 | * This code must be sure never to sleep through a hangup. | 1235 | * This code must be sure never to sleep through a hangup. |
1238 | */ | 1236 | */ |
1239 | 1237 | ||
1240 | static ssize_t read_chan(struct tty_struct *tty, struct file *file, | 1238 | static ssize_t read_chan(struct tty_struct *tty, struct file *file, |
1241 | unsigned char __user *buf, size_t nr) | 1239 | unsigned char __user *buf, size_t nr) |
1242 | { | 1240 | { |
@@ -1252,14 +1250,14 @@ static ssize_t read_chan(struct tty_struct *tty, struct file *file, | |||
1252 | do_it_again: | 1250 | do_it_again: |
1253 | 1251 | ||
1254 | if (!tty->read_buf) { | 1252 | if (!tty->read_buf) { |
1255 | printk("n_tty_read_chan: called with read_buf == NULL?!?\n"); | 1253 | printk(KERN_ERR "n_tty_read_chan: read_buf == NULL?!?\n"); |
1256 | return -EIO; | 1254 | return -EIO; |
1257 | } | 1255 | } |
1258 | 1256 | ||
1259 | c = job_control(tty, file); | 1257 | c = job_control(tty, file); |
1260 | if(c < 0) | 1258 | if (c < 0) |
1261 | return c; | 1259 | return c; |
1262 | 1260 | ||
1263 | minimum = time = 0; | 1261 | minimum = time = 0; |
1264 | timeout = MAX_SCHEDULE_TIMEOUT; | 1262 | timeout = MAX_SCHEDULE_TIMEOUT; |
1265 | if (!tty->icanon) { | 1263 | if (!tty->icanon) { |
@@ -1287,8 +1285,7 @@ do_it_again: | |||
1287 | if (file->f_flags & O_NONBLOCK) { | 1285 | if (file->f_flags & O_NONBLOCK) { |
1288 | if (!mutex_trylock(&tty->atomic_read_lock)) | 1286 | if (!mutex_trylock(&tty->atomic_read_lock)) |
1289 | return -EAGAIN; | 1287 | return -EAGAIN; |
1290 | } | 1288 | } else { |
1291 | else { | ||
1292 | if (mutex_lock_interruptible(&tty->atomic_read_lock)) | 1289 | if (mutex_lock_interruptible(&tty->atomic_read_lock)) |
1293 | return -ERESTARTSYS; | 1290 | return -ERESTARTSYS; |
1294 | } | 1291 | } |
@@ -1314,11 +1311,11 @@ do_it_again: | |||
1314 | so that any interrupt will set the state back to | 1311 | so that any interrupt will set the state back to |
1315 | TASK_RUNNING. */ | 1312 | TASK_RUNNING. */ |
1316 | set_current_state(TASK_INTERRUPTIBLE); | 1313 | set_current_state(TASK_INTERRUPTIBLE); |
1317 | 1314 | ||
1318 | if (((minimum - (b - buf)) < tty->minimum_to_wake) && | 1315 | if (((minimum - (b - buf)) < tty->minimum_to_wake) && |
1319 | ((minimum - (b - buf)) >= 1)) | 1316 | ((minimum - (b - buf)) >= 1)) |
1320 | tty->minimum_to_wake = (minimum - (b - buf)); | 1317 | tty->minimum_to_wake = (minimum - (b - buf)); |
1321 | 1318 | ||
1322 | if (!input_available_p(tty, 0)) { | 1319 | if (!input_available_p(tty, 0)) { |
1323 | if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) { | 1320 | if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) { |
1324 | retval = -EIO; | 1321 | retval = -EIO; |
@@ -1355,7 +1352,7 @@ do_it_again: | |||
1355 | if (tty->icanon) { | 1352 | if (tty->icanon) { |
1356 | /* N.B. avoid overrun if nr == 0 */ | 1353 | /* N.B. avoid overrun if nr == 0 */ |
1357 | while (nr && tty->read_cnt) { | 1354 | while (nr && tty->read_cnt) { |
1358 | int eol; | 1355 | int eol; |
1359 | 1356 | ||
1360 | eol = test_and_clear_bit(tty->read_tail, | 1357 | eol = test_and_clear_bit(tty->read_tail, |
1361 | tty->read_flags); | 1358 | tty->read_flags); |
@@ -1427,7 +1424,7 @@ do_it_again: | |||
1427 | if (size) { | 1424 | if (size) { |
1428 | retval = size; | 1425 | retval = size; |
1429 | if (nr) | 1426 | if (nr) |
1430 | clear_bit(TTY_PUSH, &tty->flags); | 1427 | clear_bit(TTY_PUSH, &tty->flags); |
1431 | } else if (test_and_clear_bit(TTY_PUSH, &tty->flags)) | 1428 | } else if (test_and_clear_bit(TTY_PUSH, &tty->flags)) |
1432 | goto do_it_again; | 1429 | goto do_it_again; |
1433 | 1430 | ||
@@ -1450,9 +1447,9 @@ do_it_again: | |||
1450 | * | 1447 | * |
1451 | * This code must be sure never to sleep through a hangup. | 1448 | * This code must be sure never to sleep through a hangup. |
1452 | */ | 1449 | */ |
1453 | 1450 | ||
1454 | static ssize_t write_chan(struct tty_struct * tty, struct file * file, | 1451 | static ssize_t write_chan(struct tty_struct *tty, struct file *file, |
1455 | const unsigned char * buf, size_t nr) | 1452 | const unsigned char *buf, size_t nr) |
1456 | { | 1453 | { |
1457 | const unsigned char *b = buf; | 1454 | const unsigned char *b = buf; |
1458 | DECLARE_WAITQUEUE(wait, current); | 1455 | DECLARE_WAITQUEUE(wait, current); |
@@ -1542,8 +1539,9 @@ break_out: | |||
1542 | * recompute the new limits. Possibly set_termios should issue | 1539 | * recompute the new limits. Possibly set_termios should issue |
1543 | * a read wakeup to fix this bug. | 1540 | * a read wakeup to fix this bug. |
1544 | */ | 1541 | */ |
1545 | 1542 | ||
1546 | static unsigned int normal_poll(struct tty_struct * tty, struct file * file, poll_table *wait) | 1543 | static unsigned int normal_poll(struct tty_struct *tty, struct file *file, |
1544 | poll_table *wait) | ||
1547 | { | 1545 | { |
1548 | unsigned int mask = 0; | 1546 | unsigned int mask = 0; |
1549 | 1547 | ||