diff options
| -rw-r--r-- | drivers/firmware/edd.c | 20 | 
1 files changed, 13 insertions, 7 deletions
| diff --git a/drivers/firmware/edd.c b/drivers/firmware/edd.c index 110e24e50883..f287fe79edc4 100644 --- a/drivers/firmware/edd.c +++ b/drivers/firmware/edd.c @@ -744,7 +744,7 @@ static inline int edd_num_devices(void)  static int __init  edd_init(void)  { -	unsigned int i; +	int i;  	int rc=0;  	struct edd_device *edev; @@ -760,21 +760,27 @@ edd_init(void)  	if (!edd_kset)  		return -ENOMEM; -	for (i = 0; i < edd_num_devices() && !rc; i++) { +	for (i = 0; i < edd_num_devices(); i++) {  		edev = kzalloc(sizeof (*edev), GFP_KERNEL); -		if (!edev) -			return -ENOMEM; +		if (!edev) { +			rc = -ENOMEM; +			goto out; +		}  		rc = edd_device_register(edev, i);  		if (rc) {  			kfree(edev); -			break; +			goto out;  		}  		edd_devices[i] = edev;  	} -	if (rc) -		kset_unregister(edd_kset); +	return 0; + +out: +	while (--i >= 0) +		edd_device_unregister(edd_devices[i]); +	kset_unregister(edd_kset);  	return rc;  } | 
