Merge 5.6-rc3 into tty-next
We want the tty fixes in here as well. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
#include <linux/tty.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
@@ -29,6 +30,8 @@
|
||||
#include <linux/console.h>
|
||||
#include <linux/tty_flip.h>
|
||||
|
||||
#include <linux/sched/signal.h>
|
||||
|
||||
/* Don't take this from <ctype.h>: 011-015 on the screen aren't spaces */
|
||||
#define isspace(c) ((c) == ' ')
|
||||
|
||||
@@ -43,6 +46,7 @@ static volatile int sel_start = -1; /* cleared by clear_selection */
|
||||
static int sel_end;
|
||||
static int sel_buffer_lth;
|
||||
static char *sel_buffer;
|
||||
static DEFINE_MUTEX(sel_lock);
|
||||
|
||||
/* clear_selection, highlight and highlight_pointer can be called
|
||||
from interrupt (via scrollback/front) */
|
||||
@@ -189,7 +193,7 @@ int set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty)
|
||||
char *bp, *obp;
|
||||
int i, ps, pe, multiplier;
|
||||
u32 c;
|
||||
int mode;
|
||||
int mode, ret = 0;
|
||||
|
||||
poke_blanked_console();
|
||||
|
||||
@@ -215,6 +219,7 @@ int set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty)
|
||||
if (ps > pe) /* make sel_start <= sel_end */
|
||||
swap(ps, pe);
|
||||
|
||||
mutex_lock(&sel_lock);
|
||||
if (sel_cons != vc_cons[fg_console].d) {
|
||||
clear_selection();
|
||||
sel_cons = vc_cons[fg_console].d;
|
||||
@@ -260,9 +265,10 @@ int set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty)
|
||||
break;
|
||||
case TIOCL_SELPOINTER:
|
||||
highlight_pointer(pe);
|
||||
return 0;
|
||||
goto unlock;
|
||||
default:
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
/* remove the pointer */
|
||||
@@ -284,7 +290,7 @@ int set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty)
|
||||
else if (new_sel_start == sel_start)
|
||||
{
|
||||
if (new_sel_end == sel_end) /* no action required */
|
||||
return 0;
|
||||
goto unlock;
|
||||
else if (new_sel_end > sel_end) /* extend to right */
|
||||
highlight(sel_end + 2, new_sel_end);
|
||||
else /* contract from right */
|
||||
@@ -312,7 +318,8 @@ int set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty)
|
||||
if (!bp) {
|
||||
printk(KERN_WARNING "selection: kmalloc() failed\n");
|
||||
clear_selection();
|
||||
return -ENOMEM;
|
||||
ret = -ENOMEM;
|
||||
goto unlock;
|
||||
}
|
||||
kfree(sel_buffer);
|
||||
sel_buffer = bp;
|
||||
@@ -337,7 +344,9 @@ int set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty)
|
||||
}
|
||||
}
|
||||
sel_buffer_lth = bp - sel_buffer;
|
||||
return 0;
|
||||
unlock:
|
||||
mutex_unlock(&sel_lock);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(set_selection_kernel);
|
||||
|
||||
@@ -355,6 +364,7 @@ int paste_selection(struct tty_struct *tty)
|
||||
unsigned int count;
|
||||
struct tty_ldisc *ld;
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
int ret = 0;
|
||||
|
||||
console_lock();
|
||||
poke_blanked_console();
|
||||
@@ -366,10 +376,17 @@ int paste_selection(struct tty_struct *tty)
|
||||
tty_buffer_lock_exclusive(&vc->port);
|
||||
|
||||
add_wait_queue(&vc->paste_wait, &wait);
|
||||
mutex_lock(&sel_lock);
|
||||
while (sel_buffer && sel_buffer_lth > pasted) {
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
if (signal_pending(current)) {
|
||||
ret = -EINTR;
|
||||
break;
|
||||
}
|
||||
if (tty_throttled(tty)) {
|
||||
mutex_unlock(&sel_lock);
|
||||
schedule();
|
||||
mutex_lock(&sel_lock);
|
||||
continue;
|
||||
}
|
||||
__set_current_state(TASK_RUNNING);
|
||||
@@ -378,11 +395,12 @@ int paste_selection(struct tty_struct *tty)
|
||||
count);
|
||||
pasted += count;
|
||||
}
|
||||
mutex_unlock(&sel_lock);
|
||||
remove_wait_queue(&vc->paste_wait, &wait);
|
||||
__set_current_state(TASK_RUNNING);
|
||||
|
||||
tty_buffer_unlock_exclusive(&vc->port);
|
||||
tty_ldisc_deref(ld);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(paste_selection);
|
||||
|
Reference in New Issue
Block a user