if (kbd->key_maps[i]) kfree(kbd->key_maps[i]); 
kfree(kbd->key_maps[i]); 
kbd_alloc(void) {	struct kbd_data *kbd;	int i, len;	kbd = kmalloc(sizeof(struct kbd_data), GFP_KERNEL);	if (!kbd)		goto out;	memset(kbd, 0, sizeof(struct kbd_data));	kbd->key_maps = kmalloc(sizeof(key_maps), GFP_KERNEL);	if (!key_maps)		goto out_kbd;	memset(kbd->key_maps, 0, sizeof(key_maps));	for (i = 0; i < ARRAY_SIZE(key_maps); i++) {		if (key_maps[i]) {			kbd->key_maps[i] =				kmalloc(sizeof(u_short)*NR_KEYS, GFP_KERNEL);			if (!kbd->key_maps[i])				goto out_maps;			memcpy(kbd->key_maps[i], key_maps[i],			       sizeof(u_short)*NR_KEYS);		}	}	kbd->func_table = kmalloc(sizeof(func_table), GFP_KERNEL);	if (!kbd->func_table)		goto out_maps;	memset(kbd->func_table, 0, sizeof(func_table));	for (i = 0; i < ARRAY_SIZE(func_table); i++) {		if (func_table[i]) {			len = strlen(func_table[i]) + 1;			kbd->func_table[i] = kmalloc(len, GFP_KERNEL);			if (!kbd->func_table[i])				goto out_func;			memcpy(kbd->func_table[i], func_table[i], len);		}	}	kbd->fn_handler =		kmalloc(sizeof(fn_handler_fn *) * NR_FN_HANDLER, GFP_KERNEL);	if (!kbd->fn_handler)		goto out_func;	memset(kbd->fn_handler, 0, sizeof(fn_handler_fn *) * NR_FN_HANDLER);	kbd->accent_table =		kmalloc(sizeof(struct kbdiacr)*MAX_DIACR, GFP_KERNEL);	if (!kbd->accent_table)		goto out_fn_handler;	memcpy(kbd->accent_table, accent_table,	       sizeof(struct kbdiacr)*MAX_DIACR);	kbd->accent_table_size = accent_table_size;	return kbd;out_fn_handler:	kfree(kbd->fn_handler);out_func:	for (i = 0; i < ARRAY_SIZE(func_table); i++)		if (kbd->func_table[i])			kfree(kbd->func_table[i]);	kfree(kbd->func_table);out_maps:	for (i = 0; i < ARRAY_SIZE(key_maps); i++)		if (kbd->key_maps[i])			kfree(kbd->key_maps[i]);	kfree(kbd->key_maps);out_kbd:	kfree(kbd);out:	return 0;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/17fd682e544556a2a829e94383239c029bb21c5e/keyboard.c/clean/drivers/s390/char/keyboard.c