diff options
| -rw-r--r-- | drivers/base/core.c | 41 | ||||
| -rw-r--r-- | include/linux/device.h | 1 | 
2 files changed, 40 insertions, 2 deletions
diff --git a/drivers/base/core.c b/drivers/base/core.c index 6ed645411c4..76135926158 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -338,6 +338,35 @@ static void device_remove_attributes(struct device *dev,  			device_remove_file(dev, &attrs[i]);  } +static int device_add_bin_attributes(struct device *dev, +				     struct bin_attribute *attrs) +{ +	int error = 0; +	int i; + +	if (attrs) { +		for (i = 0; attr_name(attrs[i]); i++) { +			error = device_create_bin_file(dev, &attrs[i]); +			if (error) +				break; +		} +		if (error) +			while (--i >= 0) +				device_remove_bin_file(dev, &attrs[i]); +	} +	return error; +} + +static void device_remove_bin_attributes(struct device *dev, +					 struct bin_attribute *attrs) +{ +	int i; + +	if (attrs) +		for (i = 0; attr_name(attrs[i]); i++) +			device_remove_bin_file(dev, &attrs[i]); +} +  static int device_add_groups(struct device *dev,  			     const struct attribute_group **groups)  { @@ -378,12 +407,15 @@ static int device_add_attrs(struct device *dev)  		error = device_add_attributes(dev, class->dev_attrs);  		if (error)  			return error; +		error = device_add_bin_attributes(dev, class->dev_bin_attrs); +		if (error) +			goto err_remove_class_attrs;  	}  	if (type) {  		error = device_add_groups(dev, type->groups);  		if (error) -			goto err_remove_class_attrs; +			goto err_remove_class_bin_attrs;  	}  	error = device_add_groups(dev, dev->groups); @@ -395,6 +427,9 @@ static int device_add_attrs(struct device *dev)   err_remove_type_groups:  	if (type)  		device_remove_groups(dev, type->groups); + err_remove_class_bin_attrs: +	if (class) +		device_remove_bin_attributes(dev, class->dev_bin_attrs);   err_remove_class_attrs:  	if (class)  		device_remove_attributes(dev, class->dev_attrs); @@ -412,8 +447,10 @@ static void device_remove_attrs(struct device *dev)  	if (type)  		device_remove_groups(dev, type->groups); -	if (class) +	if (class) {  		device_remove_attributes(dev, class->dev_attrs); +		device_remove_bin_attributes(dev, class->dev_bin_attrs); +	}  } diff --git a/include/linux/device.h b/include/linux/device.h index dd489531346..032bdb5406a 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -197,6 +197,7 @@ struct class {  	struct class_attribute		*class_attrs;  	struct device_attribute		*dev_attrs; +	struct bin_attribute		*dev_bin_attrs;  	struct kobject			*dev_kobj;  	int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env);  |