Lines Matching +full:- +full:grp
1 // SPDX-License-Identifier: GPL-2.0
3 * fs/sysfs/group.c - Operations for adding/removing multiple files at once.
7 * Copyright (c) 2013 Greg Kroah-Hartman
21 const struct attribute_group *grp) in remove_files() argument
26 if (grp->attrs) in remove_files()
27 for (attr = grp->attrs; *attr; attr++) in remove_files()
28 kernfs_remove_by_name(parent, (*attr)->name); in remove_files()
29 if (grp->bin_attrs) in remove_files()
30 for (bin_attr = grp->bin_attrs; *bin_attr; bin_attr++) in remove_files()
31 kernfs_remove_by_name(parent, (*bin_attr)->attr.name); in remove_files()
34 static umode_t __first_visible(const struct attribute_group *grp, struct kobject *kobj) in __first_visible() argument
36 if (grp->attrs && grp->attrs[0] && grp->is_visible) in __first_visible()
37 return grp->is_visible(kobj, grp->attrs[0], 0); in __first_visible()
39 if (grp->bin_attrs && grp->bin_attrs[0] && grp->is_bin_visible) in __first_visible()
40 return grp->is_bin_visible(kobj, grp->bin_attrs[0], 0); in __first_visible()
47 const struct attribute_group *grp, int update) in create_files() argument
53 if (grp->attrs) { in create_files()
54 for (i = 0, attr = grp->attrs; *attr && !error; i++, attr++) { in create_files()
55 umode_t mode = (*attr)->mode; in create_files()
60 * re-adding (if required) the file. in create_files()
63 kernfs_remove_by_name(parent, (*attr)->name); in create_files()
64 if (grp->is_visible) { in create_files()
65 mode = grp->is_visible(kobj, *attr, i); in create_files()
73 (*attr)->name, mode); in create_files()
82 remove_files(parent, grp); in create_files()
87 if (grp->bin_attrs) { in create_files()
88 for (i = 0, bin_attr = grp->bin_attrs; *bin_attr; i++, bin_attr++) { in create_files()
89 umode_t mode = (*bin_attr)->attr.mode; in create_files()
90 size_t size = (*bin_attr)->size; in create_files()
94 (*bin_attr)->attr.name); in create_files()
95 if (grp->is_bin_visible) { in create_files()
96 mode = grp->is_bin_visible(kobj, *bin_attr, i); in create_files()
101 if (grp->bin_size) in create_files()
102 size = grp->bin_size(kobj, *bin_attr, i); in create_files()
106 (*bin_attr)->attr.name, mode); in create_files()
116 remove_files(parent, grp); in create_files()
124 const struct attribute_group *grp) in internal_create_group() argument
131 if (WARN_ON(!kobj || (!update && !kobj->sd))) in internal_create_group()
132 return -EINVAL; in internal_create_group()
135 if (unlikely(update && !kobj->sd)) in internal_create_group()
136 return -EINVAL; in internal_create_group()
138 if (!grp->attrs && !grp->bin_attrs) { in internal_create_group()
140 kobj->name, grp->name ?: ""); in internal_create_group()
145 if (grp->name) { in internal_create_group()
146 umode_t mode = __first_visible(grp, kobj); in internal_create_group()
154 kn = kernfs_find_and_get(kobj->sd, grp->name); in internal_create_group()
156 pr_debug("attr grp %s/%s not created yet\n", in internal_create_group()
157 kobj->name, grp->name); in internal_create_group()
161 sysfs_remove_group(kobj, grp); in internal_create_group()
170 kn = kernfs_create_dir_ns(kobj->sd, grp->name, mode, in internal_create_group()
173 if (PTR_ERR(kn) == -EEXIST) in internal_create_group()
174 sysfs_warn_dup(kobj->sd, grp->name); in internal_create_group()
179 kn = kobj->sd; in internal_create_group()
183 error = create_files(kn, kobj, uid, gid, grp, update); in internal_create_group()
185 if (grp->name) in internal_create_group()
190 if (grp->name && update) in internal_create_group()
197 * sysfs_create_group - given a directory kobject, create an attribute group
199 * @grp: The attribute group to create
207 const struct attribute_group *grp) in sysfs_create_group() argument
209 return internal_create_group(kobj, 0, grp); in sysfs_create_group()
225 while (--i >= 0) in internal_create_groups()
234 * sysfs_create_groups - given a directory kobject, create a bunch of attribute groups
254 * sysfs_update_groups - given a directory kobject, create a bunch of attribute groups
272 * sysfs_update_group - given a directory kobject, update an attribute group
274 * @grp: The attribute group to update
290 const struct attribute_group *grp) in sysfs_update_group() argument
292 return internal_create_group(kobj, 1, grp); in sysfs_update_group()
299 * @grp: group to remove
305 const struct attribute_group *grp) in sysfs_remove_group() argument
307 struct kernfs_node *parent = kobj->sd; in sysfs_remove_group()
310 if (grp->name) { in sysfs_remove_group()
311 kn = kernfs_find_and_get(parent, grp->name); in sysfs_remove_group()
314 grp->name, kobject_name(kobj)); in sysfs_remove_group()
322 remove_files(kn, grp); in sysfs_remove_group()
323 if (grp->name) in sysfs_remove_group()
331 * sysfs_remove_groups - remove a list of groups
351 * sysfs_merge_group - merge files into a pre-existing named attribute group.
353 * @grp: The files to create and the attribute group they belong to.
360 const struct attribute_group *grp) in sysfs_merge_group() argument
369 parent = kernfs_find_and_get(kobj->sd, grp->name); in sysfs_merge_group()
371 return -ENOENT; in sysfs_merge_group()
375 for ((i = 0, attr = grp->attrs); *attr && !error; (++i, ++attr)) in sysfs_merge_group()
376 error = sysfs_add_file_mode_ns(parent, *attr, (*attr)->mode, in sysfs_merge_group()
379 while (--i >= 0) in sysfs_merge_group()
380 kernfs_remove_by_name(parent, (*--attr)->name); in sysfs_merge_group()
389 * sysfs_unmerge_group - remove files from a pre-existing named attribute group.
391 * @grp: The files to remove and the attribute group they belong to.
394 const struct attribute_group *grp) in sysfs_unmerge_group() argument
399 parent = kernfs_find_and_get(kobj->sd, grp->name); in sysfs_unmerge_group()
401 for (attr = grp->attrs; *attr; ++attr) in sysfs_unmerge_group()
402 kernfs_remove_by_name(parent, (*attr)->name); in sysfs_unmerge_group()
409 * sysfs_add_link_to_group - add a symlink to an attribute group.
421 parent = kernfs_find_and_get(kobj->sd, group_name); in sysfs_add_link_to_group()
423 return -ENOENT; in sysfs_add_link_to_group()
433 * sysfs_remove_link_from_group - remove a symlink from an attribute group.
443 parent = kernfs_find_and_get(kobj->sd, group_name); in sysfs_remove_link_from_group()
452 * compat_only_sysfs_link_entry_to_kobj - add a symlink to a kobject pointing
475 target = target_kobj->sd; in compat_only_sysfs_link_entry_to_kobj()
480 return -ENOENT; in compat_only_sysfs_link_entry_to_kobj()
485 return -ENOENT; in compat_only_sysfs_link_entry_to_kobj()
491 link = kernfs_create_link(kobj->sd, symlink_name, entry); in compat_only_sysfs_link_entry_to_kobj()
492 if (PTR_ERR(link) == -EEXIST) in compat_only_sysfs_link_entry_to_kobj()
493 sysfs_warn_dup(kobj->sd, symlink_name); in compat_only_sysfs_link_entry_to_kobj()
502 const struct attribute_group *grp, in sysfs_group_attrs_change_owner() argument
508 if (grp->attrs) { in sysfs_group_attrs_change_owner()
511 for (attr = grp->attrs; *attr; attr++) { in sysfs_group_attrs_change_owner()
512 kn = kernfs_find_and_get(grp_kn, (*attr)->name); in sysfs_group_attrs_change_owner()
514 return -ENOENT; in sysfs_group_attrs_change_owner()
523 if (grp->bin_attrs) { in sysfs_group_attrs_change_owner()
526 for (bin_attr = grp->bin_attrs; *bin_attr; bin_attr++) { in sysfs_group_attrs_change_owner()
527 kn = kernfs_find_and_get(grp_kn, (*bin_attr)->attr.name); in sysfs_group_attrs_change_owner()
529 return -ENOENT; in sysfs_group_attrs_change_owner()
542 * sysfs_group_change_owner - change owner of an attribute group.
544 * @grp: The attribute group.
551 const struct attribute_group *grp, kuid_t kuid, in sysfs_group_change_owner() argument
562 if (!kobj->state_in_sysfs) in sysfs_group_change_owner()
563 return -EINVAL; in sysfs_group_change_owner()
565 if (grp->name) { in sysfs_group_change_owner()
566 grp_kn = kernfs_find_and_get(kobj->sd, grp->name); in sysfs_group_change_owner()
568 kernfs_get(kobj->sd); in sysfs_group_change_owner()
569 grp_kn = kobj->sd; in sysfs_group_change_owner()
572 return -ENOENT; in sysfs_group_change_owner()
576 error = sysfs_group_attrs_change_owner(grp_kn, grp, &newattrs); in sysfs_group_change_owner()
585 * sysfs_groups_change_owner - change owner of a set of attribute groups.
599 if (!kobj->state_in_sysfs) in sysfs_groups_change_owner()
600 return -EINVAL; in sysfs_groups_change_owner()