|
@@ -148,6 +148,65 @@ void sysfs_remove_group(struct kobject * kobj,
|
|
|
sysfs_put(sd);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * sysfs_merge_group - merge files into a pre-existing attribute group.
|
|
|
+ * @kobj: The kobject containing the group.
|
|
|
+ * @grp: The files to create and the attribute group they belong to.
|
|
|
+ *
|
|
|
+ * This function returns an error if the group doesn't exist or any of the
|
|
|
+ * files already exist in that group, in which case none of the new files
|
|
|
+ * are created.
|
|
|
+ */
|
|
|
+int sysfs_merge_group(struct kobject *kobj,
|
|
|
+ const struct attribute_group *grp)
|
|
|
+{
|
|
|
+ struct sysfs_dirent *dir_sd;
|
|
|
+ int error = 0;
|
|
|
+ struct attribute *const *attr;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ if (grp)
|
|
|
+ dir_sd = sysfs_get_dirent(kobj->sd, NULL, grp->name);
|
|
|
+ else
|
|
|
+ dir_sd = sysfs_get(kobj->sd);
|
|
|
+ if (!dir_sd)
|
|
|
+ return -ENOENT;
|
|
|
+
|
|
|
+ for ((i = 0, attr = grp->attrs); *attr && !error; (++i, ++attr))
|
|
|
+ error = sysfs_add_file(dir_sd, *attr, SYSFS_KOBJ_ATTR);
|
|
|
+ if (error) {
|
|
|
+ while (--i >= 0)
|
|
|
+ sysfs_hash_and_remove(dir_sd, NULL, (*--attr)->name);
|
|
|
+ }
|
|
|
+ sysfs_put(dir_sd);
|
|
|
+
|
|
|
+ return error;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(sysfs_merge_group);
|
|
|
+
|
|
|
+/**
|
|
|
+ * sysfs_unmerge_group - remove files from a pre-existing attribute group.
|
|
|
+ * @kobj: The kobject containing the group.
|
|
|
+ * @grp: The files to remove and the attribute group they belong to.
|
|
|
+ */
|
|
|
+void sysfs_unmerge_group(struct kobject *kobj,
|
|
|
+ const struct attribute_group *grp)
|
|
|
+{
|
|
|
+ struct sysfs_dirent *dir_sd;
|
|
|
+ struct attribute *const *attr;
|
|
|
+
|
|
|
+ if (grp)
|
|
|
+ dir_sd = sysfs_get_dirent(kobj->sd, NULL, grp->name);
|
|
|
+ else
|
|
|
+ dir_sd = sysfs_get(kobj->sd);
|
|
|
+ if (dir_sd) {
|
|
|
+ for (attr = grp->attrs; *attr; ++attr)
|
|
|
+ sysfs_hash_and_remove(dir_sd, NULL, (*attr)->name);
|
|
|
+ sysfs_put(dir_sd);
|
|
|
+ }
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(sysfs_unmerge_group);
|
|
|
+
|
|
|
|
|
|
EXPORT_SYMBOL_GPL(sysfs_create_group);
|
|
|
EXPORT_SYMBOL_GPL(sysfs_update_group);
|