diff options
Diffstat (limited to 'drivers/tty/vt')
| -rw-r--r-- | drivers/tty/vt/selection.c | 27 | ||||
| -rw-r--r-- | drivers/tty/vt/vt.c | 2 | 
2 files changed, 18 insertions, 11 deletions
| diff --git a/drivers/tty/vt/selection.c b/drivers/tty/vt/selection.c index 0c50d7410b31..d7d2e4b844bc 100644 --- a/drivers/tty/vt/selection.c +++ b/drivers/tty/vt/selection.c @@ -181,7 +181,7 @@ int set_selection_user(const struct tiocl_selection __user *sel,  	return set_selection_kernel(&v, tty);  } -int set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty) +static int __set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty)  {  	struct vc_data *vc = vc_cons[fg_console].d;  	int new_sel_start, new_sel_end, spc; @@ -214,7 +214,6 @@ 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,10 +259,9 @@ int set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty)  			break;  		case TIOCL_SELPOINTER:  			highlight_pointer(pe); -			goto unlock; +			return 0;  		default: -			ret = -EINVAL; -			goto unlock; +			return -EINVAL;  	}  	/* remove the pointer */ @@ -285,7 +283,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 */ -			goto unlock; +			return 0;  		else if (new_sel_end > sel_end)	/* extend to right */  			highlight(sel_end + 2, new_sel_end);  		else				/* contract from right */ @@ -313,8 +311,7 @@ int set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty)  	if (!bp) {  		printk(KERN_WARNING "selection: kmalloc() failed\n");  		clear_selection(); -		ret = -ENOMEM; -		goto unlock; +		return -ENOMEM;  	}  	kfree(sel_buffer);  	sel_buffer = bp; @@ -339,8 +336,20 @@ int set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty)  		}  	}  	sel_buffer_lth = bp - sel_buffer; -unlock: + +	return ret; +} + +int set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty) +{ +	int ret; + +	mutex_lock(&sel_lock); +	console_lock(); +	ret = __set_selection_kernel(v, tty); +	console_unlock();  	mutex_unlock(&sel_lock); +  	return ret;  }  EXPORT_SYMBOL_GPL(set_selection_kernel); diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index 0cfbb7182b5a..15d27698054a 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c @@ -3046,10 +3046,8 @@ int tioclinux(struct tty_struct *tty, unsigned long arg)  	switch (type)  	{  		case TIOCL_SETSEL: -			console_lock();  			ret = set_selection_user((struct tiocl_selection  						 __user *)(p+1), tty); -			console_unlock();  			break;  		case TIOCL_PASTESEL:  			ret = paste_selection(tty); |