From: Manuel Estrada Sainz Based on patch and suggestions from Dmitry Torokhov - use vfree to free vmalloc memory. - Make sure fw_setup_class_device sets *class_dev_p to NULL in all case of error. - Fix error handling in firmware_class_init. --- 25-akpm/drivers/base/firmware_class.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff -puN drivers/base/firmware_class.c~request_firmware-01-class-fixes drivers/base/firmware_class.c --- 25/drivers/base/firmware_class.c~request_firmware-01-class-fixes Tue Feb 24 17:55:45 2004 +++ 25-akpm/drivers/base/firmware_class.c Tue Feb 24 17:55:45 2004 @@ -119,7 +119,7 @@ firmware_loading_store(struct class_devi complete(&fw_priv->completion); break; case 1: - kfree(fw_priv->fw->data); + vfree(fw_priv->fw->data); fw_priv->fw->data = NULL; fw_priv->fw->size = 0; fw_priv->alloc_size = 0; @@ -297,6 +297,7 @@ fw_setup_class_device(struct class_devic } memset(fw_priv->fw, 0, sizeof (*fw_priv->fw)); + *class_dev_p = class_dev; goto out; error_remove_loading: @@ -310,7 +311,6 @@ error_kfree: kfree(class_dev); *class_dev_p = NULL; out: - *class_dev_p = class_dev; return retval; } static void @@ -489,6 +489,7 @@ firmware_class_init(void) error = class_register(&firmware_class); if (error) { printk(KERN_ERR "%s: class_register failed\n", __FUNCTION__); + return error; } error = class_create_file(&firmware_class, &class_attr_timeout); if (error) { _