@@ -498,17 +498,26 @@ int compat_only_sysfs_link_entry_to_kobj(struct kobject *kobj,
498498}
499499EXPORT_SYMBOL_GPL (compat_only_sysfs_link_entry_to_kobj );
500500
501- static int sysfs_group_attrs_change_owner (struct kernfs_node * grp_kn ,
501+ static int sysfs_group_attrs_change_owner (struct kobject * kobj ,
502+ struct kernfs_node * grp_kn ,
502503 const struct attribute_group * grp ,
503504 struct iattr * newattrs )
504505{
505506 struct kernfs_node * kn ;
506- int error ;
507+ int error , i ;
508+ umode_t mode ;
507509
508510 if (grp -> attrs ) {
509511 struct attribute * const * attr ;
510512
511- for (attr = grp -> attrs ; * attr ; attr ++ ) {
513+ for (i = 0 , attr = grp -> attrs ; * attr ; i ++ , attr ++ ) {
514+ if (grp -> is_visible ) {
515+ mode = grp -> is_visible (kobj , * attr , i );
516+ if (mode & SYSFS_GROUP_INVISIBLE )
517+ break ;
518+ if (!mode )
519+ continue ;
520+ }
512521 kn = kernfs_find_and_get (grp_kn , (* attr )-> name );
513522 if (!kn )
514523 return - ENOENT ;
@@ -523,7 +532,14 @@ static int sysfs_group_attrs_change_owner(struct kernfs_node *grp_kn,
523532 if (grp -> bin_attrs ) {
524533 const struct bin_attribute * const * bin_attr ;
525534
526- for (bin_attr = grp -> bin_attrs ; * bin_attr ; bin_attr ++ ) {
535+ for (i = 0 , bin_attr = grp -> bin_attrs ; * bin_attr ; i ++ , bin_attr ++ ) {
536+ if (grp -> is_bin_visible ) {
537+ mode = grp -> is_bin_visible (kobj , * bin_attr , i );
538+ if (mode & SYSFS_GROUP_INVISIBLE )
539+ break ;
540+ if (!mode )
541+ continue ;
542+ }
527543 kn = kernfs_find_and_get (grp_kn , (* bin_attr )-> attr .name );
528544 if (!kn )
529545 return - ENOENT ;
@@ -573,7 +589,7 @@ int sysfs_group_change_owner(struct kobject *kobj,
573589
574590 error = kernfs_setattr (grp_kn , & newattrs );
575591 if (!error )
576- error = sysfs_group_attrs_change_owner (grp_kn , grp , & newattrs );
592+ error = sysfs_group_attrs_change_owner (kobj , grp_kn , grp , & newattrs );
577593
578594 kernfs_put (grp_kn );
579595
0 commit comments