@@ -631,9 +631,6 @@ static void edac_mci_control_release(struct kobject *kobj)
631
631
632
632
/* decrement the module ref count */
633
633
module_put (mci -> owner );
634
-
635
- /* free the mci instance memory here */
636
- kfree (mci );
637
634
}
638
635
639
636
static struct kobj_type ktype_mci = {
@@ -713,6 +710,8 @@ int edac_mc_register_sysfs_main_kobj(struct mem_ctl_info *mci)
713
710
*/
714
711
void edac_mc_unregister_sysfs_main_kobj (struct mem_ctl_info * mci )
715
712
{
713
+ debugf1 ("%s()\n" , __func__ );
714
+
716
715
/* delete the kobj from the mc_kset */
717
716
kobject_put (& mci -> edac_mci_kobj );
718
717
}
@@ -760,8 +759,6 @@ static void edac_inst_grp_release(struct kobject *kobj)
760
759
761
760
grp = container_of (kobj , struct mcidev_sysfs_group_kobj , kobj );
762
761
mci = grp -> mci ;
763
-
764
- kobject_put (& mci -> edac_mci_kobj );
765
762
}
766
763
767
764
/* Intermediate show/store table */
@@ -784,25 +781,25 @@ static struct kobj_type ktype_inst_grp = {
784
781
* object tree.
785
782
*/
786
783
static int edac_create_mci_instance_attributes (struct mem_ctl_info * mci ,
787
- struct mcidev_sysfs_attribute * sysfs_attrib ,
784
+ const struct mcidev_sysfs_attribute * sysfs_attrib ,
788
785
struct kobject * kobj )
789
786
{
790
787
int err ;
791
788
792
789
debugf1 ("%s()\n" , __func__ );
793
790
794
791
while (sysfs_attrib ) {
792
+ debugf1 ("%s() sysfs_attrib = %p\n" ,__func__ , sysfs_attrib );
795
793
if (sysfs_attrib -> grp ) {
796
794
struct mcidev_sysfs_group_kobj * grp_kobj ;
797
795
798
796
grp_kobj = kzalloc (sizeof (* grp_kobj ), GFP_KERNEL );
799
797
if (!grp_kobj )
800
798
return - ENOMEM ;
801
799
802
- list_add_tail (& grp_kobj -> list , & mci -> grp_kobj_list );
803
-
804
800
grp_kobj -> grp = sysfs_attrib -> grp ;
805
801
grp_kobj -> mci = mci ;
802
+ list_add_tail (& grp_kobj -> list , & mci -> grp_kobj_list );
806
803
807
804
debugf0 ("%s() grp %s, mci %p\n" , __func__ ,
808
805
sysfs_attrib -> grp -> name , mci );
@@ -811,26 +808,28 @@ static int edac_create_mci_instance_attributes(struct mem_ctl_info *mci,
811
808
& ktype_inst_grp ,
812
809
& mci -> edac_mci_kobj ,
813
810
sysfs_attrib -> grp -> name );
814
- if (err )
811
+ if (err < 0 ) {
812
+ printk (KERN_ERR "kobject_init_and_add failed: %d\n" , err );
815
813
return err ;
816
-
814
+ }
817
815
err = edac_create_mci_instance_attributes (mci ,
818
816
grp_kobj -> grp -> mcidev_attr ,
819
817
& grp_kobj -> kobj );
820
818
821
- if (err )
819
+ if (err < 0 )
822
820
return err ;
823
821
} else if (sysfs_attrib -> attr .name ) {
824
822
debugf0 ("%s() file %s\n" , __func__ ,
825
823
sysfs_attrib -> attr .name );
826
824
827
825
err = sysfs_create_file (kobj , & sysfs_attrib -> attr );
826
+ if (err < 0 ) {
827
+ printk (KERN_ERR "sysfs_create_file failed: %d\n" , err );
828
+ return err ;
829
+ }
828
830
} else
829
831
break ;
830
832
831
- if (err ) {
832
- return err ;
833
- }
834
833
sysfs_attrib ++ ;
835
834
}
836
835
@@ -843,7 +842,7 @@ static int edac_create_mci_instance_attributes(struct mem_ctl_info *mci,
843
842
* directory of this mci instance.
844
843
*/
845
844
static void edac_remove_mci_instance_attributes (struct mem_ctl_info * mci ,
846
- struct mcidev_sysfs_attribute * sysfs_attrib ,
845
+ const struct mcidev_sysfs_attribute * sysfs_attrib ,
847
846
struct kobject * kobj , int count )
848
847
{
849
848
struct mcidev_sysfs_group_kobj * grp_kobj , * tmp ;
@@ -855,13 +854,24 @@ static void edac_remove_mci_instance_attributes(struct mem_ctl_info *mci,
855
854
* Remove first all the atributes
856
855
*/
857
856
while (sysfs_attrib ) {
857
+ debugf1 ("%s() sysfs_attrib = %p\n" ,__func__ , sysfs_attrib );
858
858
if (sysfs_attrib -> grp ) {
859
- list_for_each_entry (grp_kobj , & mci -> grp_kobj_list ,
860
- list )
861
- if (grp_kobj -> grp == sysfs_attrib -> grp )
859
+ debugf1 ("%s() seeking for group %s\n" ,
860
+ __func__ , sysfs_attrib -> grp -> name );
861
+ list_for_each_entry (grp_kobj ,
862
+ & mci -> grp_kobj_list , list ) {
863
+ debugf1 ("%s() grp_kobj->grp = %p\n" ,__func__ , grp_kobj -> grp );
864
+ if (grp_kobj -> grp == sysfs_attrib -> grp ) {
862
865
edac_remove_mci_instance_attributes (mci ,
863
866
grp_kobj -> grp -> mcidev_attr ,
864
867
& grp_kobj -> kobj , count + 1 );
868
+ debugf0 ("%s() group %s\n" , __func__ ,
869
+ sysfs_attrib -> grp -> name );
870
+ kobject_put (& grp_kobj -> kobj );
871
+ }
872
+ }
873
+ debugf1 ("%s() end of seeking for group %s\n" ,
874
+ __func__ , sysfs_attrib -> grp -> name );
865
875
} else if (sysfs_attrib -> attr .name ) {
866
876
debugf0 ("%s() file %s\n" , __func__ ,
867
877
sysfs_attrib -> attr .name );
@@ -871,15 +881,14 @@ static void edac_remove_mci_instance_attributes(struct mem_ctl_info *mci,
871
881
sysfs_attrib ++ ;
872
882
}
873
883
874
- /*
875
- * Now that all attributes got removed, it is save to remove all groups
876
- */
877
- if (!count )
878
- list_for_each_entry_safe (grp_kobj , tmp , & mci -> grp_kobj_list ,
879
- list ) {
880
- debugf0 ("%s() grp %s\n" , __func__ , grp_kobj -> grp -> name );
881
- kobject_put (& grp_kobj -> kobj );
882
- }
884
+ /* Remove the group objects */
885
+ if (count )
886
+ return ;
887
+ list_for_each_entry_safe (grp_kobj , tmp ,
888
+ & mci -> grp_kobj_list , list ) {
889
+ list_del (& grp_kobj -> list );
890
+ kfree (grp_kobj );
891
+ }
883
892
}
884
893
885
894
@@ -971,27 +980,28 @@ void edac_remove_sysfs_mci_device(struct mem_ctl_info *mci)
971
980
debugf0 ("%s()\n" , __func__ );
972
981
973
982
/* remove all csrow kobjects */
983
+ debugf0 ("%s() unregister this mci kobj\n" , __func__ );
974
984
for (i = 0 ; i < mci -> nr_csrows ; i ++ ) {
975
985
if (mci -> csrows [i ].nr_pages > 0 ) {
976
986
debugf0 ("%s() unreg csrow-%d\n" , __func__ , i );
977
987
kobject_put (& mci -> csrows [i ].kobj );
978
988
}
979
989
}
980
990
981
- debugf0 ("%s() remove_link\n" , __func__ );
991
+ /* remove this mci instance's attribtes */
992
+ if (mci -> mc_driver_sysfs_attributes ) {
993
+ debugf0 ("%s() unregister mci private attributes\n" , __func__ );
994
+ edac_remove_mci_instance_attributes (mci ,
995
+ mci -> mc_driver_sysfs_attributes ,
996
+ & mci -> edac_mci_kobj , 0 );
997
+ }
982
998
983
999
/* remove the symlink */
1000
+ debugf0 ("%s() remove_link\n" , __func__ );
984
1001
sysfs_remove_link (& mci -> edac_mci_kobj , EDAC_DEVICE_SYMLINK );
985
1002
986
- debugf0 ("%s() remove_mci_instance\n" , __func__ );
987
-
988
- /* remove this mci instance's attribtes */
989
- edac_remove_mci_instance_attributes (mci ,
990
- mci -> mc_driver_sysfs_attributes ,
991
- & mci -> edac_mci_kobj , 0 );
992
- debugf0 ("%s() unregister this mci kobj\n" , __func__ );
993
-
994
1003
/* unregister this instance's kobject */
1004
+ debugf0 ("%s() remove_mci_instance\n" , __func__ );
995
1005
kobject_put (& mci -> edac_mci_kobj );
996
1006
}
997
1007
0 commit comments