diff options
Diffstat (limited to 'drivers/tty/vt/consolemap.c')
| -rw-r--r-- | drivers/tty/vt/consolemap.c | 54 | 
1 files changed, 22 insertions, 32 deletions
diff --git a/drivers/tty/vt/consolemap.c b/drivers/tty/vt/consolemap.c index 2978ca596a7..610b720d3b9 100644 --- a/drivers/tty/vt/consolemap.c +++ b/drivers/tty/vt/consolemap.c @@ -179,7 +179,6 @@ struct uni_pagedir {  	unsigned long	sum;  	unsigned char	*inverse_translations[4];  	u16		*inverse_trans_unicode; -	int		readonly;  };  static struct uni_pagedir *dflt; @@ -262,7 +261,7 @@ u16 inverse_translate(struct vc_data *conp, int glyph, int use_unicode)  	int m;  	if (glyph < 0 || glyph >= MAX_GLYPH)  		return 0; -	else if (!(p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc)) +	else if (!(p = *conp->vc_uni_pagedir_loc))  		return glyph;  	else if (use_unicode) {  		if (!p->inverse_trans_unicode) @@ -287,7 +286,7 @@ static void update_user_maps(void)  	for (i = 0; i < MAX_NR_CONSOLES; i++) {  		if (!vc_cons_allocated(i))  			continue; -		p = (struct uni_pagedir *)*vc_cons[i].d->vc_uni_pagedir_loc; +		p = *vc_cons[i].d->vc_uni_pagedir_loc;  		if (p && p != q) {  			set_inverse_transl(vc_cons[i].d, p, USER_MAP);  			set_inverse_trans_unicode(vc_cons[i].d, p); @@ -418,10 +417,10 @@ void con_free_unimap(struct vc_data *vc)  {  	struct uni_pagedir *p; -	p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; +	p = *vc->vc_uni_pagedir_loc;  	if (!p)  		return; -	*vc->vc_uni_pagedir_loc = 0; +	*vc->vc_uni_pagedir_loc = NULL;  	if (--p->refcount)  		return;  	con_release_unimap(p); @@ -436,7 +435,7 @@ static int con_unify_unimap(struct vc_data *conp, struct uni_pagedir *p)  	for (i = 0; i < MAX_NR_CONSOLES; i++) {  		if (!vc_cons_allocated(i))  			continue; -		q = (struct uni_pagedir *)*vc_cons[i].d->vc_uni_pagedir_loc; +		q = *vc_cons[i].d->vc_uni_pagedir_loc;  		if (!q || q == p || q->sum != p->sum)  			continue;  		for (j = 0; j < 32; j++) { @@ -459,7 +458,7 @@ static int con_unify_unimap(struct vc_data *conp, struct uni_pagedir *p)  		}  		if (j == 32) {  			q->refcount++; -			*conp->vc_uni_pagedir_loc = (unsigned long)q; +			*conp->vc_uni_pagedir_loc = q;  			con_release_unimap(p);  			kfree(p);  			return 1; @@ -500,10 +499,7 @@ static int con_do_clear_unimap(struct vc_data *vc, struct unimapinit *ui)  {  	struct uni_pagedir *p, *q; -	p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; -	if (p && p->readonly) -		return -EIO; - +	p = *vc->vc_uni_pagedir_loc;  	if (!p || --p->refcount) {  		q = kzalloc(sizeof(*p), GFP_KERNEL);  		if (!q) { @@ -512,7 +508,7 @@ static int con_do_clear_unimap(struct vc_data *vc, struct unimapinit *ui)  			return -ENOMEM;  		}  		q->refcount=1; -		*vc->vc_uni_pagedir_loc = (unsigned long)q; +		*vc->vc_uni_pagedir_loc = q;  	} else {  		if (p == dflt) dflt = NULL;  		p->refcount++; @@ -536,19 +532,13 @@ int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list)  	int err = 0, err1, i;  	struct uni_pagedir *p, *q; +	if (!ct) +		return 0; +  	console_lock();  	/* Save original vc_unipagdir_loc in case we allocate a new one */ -	p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; -	if (p->readonly) { -		console_unlock(); -		return -EIO; -	} -	 -	if (!ct) { -		console_unlock(); -		return 0; -	} +	p = *vc->vc_uni_pagedir_loc;  	if (p->refcount > 1) {  		int j, k; @@ -564,7 +554,7 @@ int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list)  		 * Since refcount was > 1, con_clear_unimap() allocated a  		 * a new uni_pagedir for this vc.  Re: p != q  		 */ -		q = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; +		q = *vc->vc_uni_pagedir_loc;  		/*  		 * uni_pgdir is a 32*32*64 table with rows allocated @@ -586,7 +576,7 @@ int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list)  					err1 = con_insert_unipair(q, l, p2[k]);  					if (err1) {  						p->refcount++; -						*vc->vc_uni_pagedir_loc = (unsigned long)p; +						*vc->vc_uni_pagedir_loc = p;  						con_release_unimap(q);  						kfree(q);  						console_unlock(); @@ -655,12 +645,12 @@ int con_set_default_unimap(struct vc_data *vc)  	struct uni_pagedir *p;  	if (dflt) { -		p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; +		p = *vc->vc_uni_pagedir_loc;  		if (p == dflt)  			return 0;  		dflt->refcount++; -		*vc->vc_uni_pagedir_loc = (unsigned long)dflt; +		*vc->vc_uni_pagedir_loc = dflt;  		if (p && !--p->refcount) {  			con_release_unimap(p);  			kfree(p); @@ -674,7 +664,7 @@ int con_set_default_unimap(struct vc_data *vc)  	if (err)  		return err; -	p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; +	p = *vc->vc_uni_pagedir_loc;  	q = dfont_unitable;  	for (i = 0; i < 256; i++) @@ -685,7 +675,7 @@ int con_set_default_unimap(struct vc_data *vc)  		}  	if (con_unify_unimap(vc, p)) { -		dflt = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; +		dflt = *vc->vc_uni_pagedir_loc;  		return err;  	} @@ -713,9 +703,9 @@ int con_copy_unimap(struct vc_data *dst_vc, struct vc_data *src_vc)  	if (*dst_vc->vc_uni_pagedir_loc == *src_vc->vc_uni_pagedir_loc)  		return 0;  	con_free_unimap(dst_vc); -	q = (struct uni_pagedir *)*src_vc->vc_uni_pagedir_loc; +	q = *src_vc->vc_uni_pagedir_loc;  	q->refcount++; -	*dst_vc->vc_uni_pagedir_loc = (long)q; +	*dst_vc->vc_uni_pagedir_loc = q;  	return 0;  }  EXPORT_SYMBOL(con_copy_unimap); @@ -737,7 +727,7 @@ int con_get_unimap(struct vc_data *vc, ushort ct, ushort __user *uct, struct uni  	ect = 0;  	if (*vc->vc_uni_pagedir_loc) { -		p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; +		p = *vc->vc_uni_pagedir_loc;  		for (i = 0; i < 32; i++)  		if ((p1 = p->uni_pgdir[i]))  			for (j = 0; j < 32; j++) @@ -810,7 +800,7 @@ conv_uni_to_pc(struct vc_data *conp, long ucs)  	if (!*conp->vc_uni_pagedir_loc)  		return -3; -	p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc;   +	p = *conp->vc_uni_pagedir_loc;  	if ((p1 = p->uni_pgdir[ucs >> 11]) &&  	    (p2 = p1[(ucs >> 6) & 0x1f]) &&  	    (h = p2[ucs & 0x3f]) < MAX_GLYPH)  | 
