From: Manuel Estrada Sainz <ranty@ranty.pantax.net>

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) {

_