diff options
Diffstat (limited to 'kernel/drivers/staging/speakup/selection.c')
-rw-r--r-- | kernel/drivers/staging/speakup/selection.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/kernel/drivers/staging/speakup/selection.c b/kernel/drivers/staging/speakup/selection.c index a0315701c..41ef099b7 100644 --- a/kernel/drivers/staging/speakup/selection.c +++ b/kernel/drivers/staging/speakup/selection.c @@ -7,7 +7,7 @@ #include <linux/workqueue.h> #include <linux/tty.h> #include <linux/tty_flip.h> -#include <asm/cmpxchg.h> +#include <linux/atomic.h> #include "speakup.h" @@ -114,7 +114,8 @@ int speakup_set_selection(struct tty_struct *tty) obp = bp; if (!((i + 2) % vc->vc_size_row)) { /* strip trailing blanks from line and add newline, - unless non-space at end of line. */ + * unless non-space at end of line. + */ if (obp != bp) { bp = obp; *bp++ = '\r'; @@ -141,7 +142,9 @@ static void __speakup_paste_selection(struct work_struct *work) struct tty_ldisc *ld; DECLARE_WAITQUEUE(wait, current); - ld = tty_ldisc_ref_wait(tty); + ld = tty_ldisc_ref(tty); + if (!ld) + goto tty_unref; tty_buffer_lock_exclusive(&vc->port); add_wait_queue(&vc->paste_wait, &wait); @@ -161,6 +164,7 @@ static void __speakup_paste_selection(struct work_struct *work) tty_buffer_unlock_exclusive(&vc->port); tty_ldisc_deref(ld); +tty_unref: tty_kref_put(tty); } |