Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

md: get sysfs entry after redundancy attr group create

"sync_completed" and "degraded" belongs to redundancy attr group,
it was not exist yet when md device was created.

Reported-by: kernel test robot <rong.a.chen@intel.com>
Fixes: e1a86dbbbd6a ("md: fix deadlock causing by sysfs_notify")
Signed-off-by: Junxiao Bi <junxiao.bi@oracle.com>
Signed-off-by: Song Liu <songliubraving@fb.com>

authored by

Junxiao Bi and committed by
Song Liu
e8efa9b8 f59589fc

+10 -7
+10 -7
drivers/md/md.c
··· 876 876 sysfs_remove_group(&mddev->kobj, &md_redundancy_group); 877 877 if (mddev->sysfs_action) 878 878 sysfs_put(mddev->sysfs_action); 879 + if (mddev->sysfs_completed) 880 + sysfs_put(mddev->sysfs_completed); 881 + if (mddev->sysfs_degraded) 882 + sysfs_put(mddev->sysfs_degraded); 879 883 mddev->sysfs_action = NULL; 884 + mddev->sysfs_completed = NULL; 885 + mddev->sysfs_degraded = NULL; 880 886 } 881 887 } 882 888 mddev->sysfs_active = 0; ··· 4100 4094 pr_warn("md: cannot register extra attributes for %s\n", 4101 4095 mdname(mddev)); 4102 4096 mddev->sysfs_action = sysfs_get_dirent(mddev->kobj.sd, "sync_action"); 4097 + mddev->sysfs_completed = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_completed"); 4098 + mddev->sysfs_degraded = sysfs_get_dirent_safe(mddev->kobj.sd, "degraded"); 4103 4099 } 4104 4100 if (oldpers->sync_request != NULL && 4105 4101 pers->sync_request == NULL) { ··· 5617 5609 5618 5610 if (mddev->sysfs_state) 5619 5611 sysfs_put(mddev->sysfs_state); 5620 - if (mddev->sysfs_completed) 5621 - sysfs_put(mddev->sysfs_completed); 5622 - if (mddev->sysfs_degraded) 5623 - sysfs_put(mddev->sysfs_degraded); 5624 5612 if (mddev->sysfs_level) 5625 5613 sysfs_put(mddev->sysfs_level); 5626 - 5627 5614 5628 5615 if (mddev->gendisk) 5629 5616 del_gendisk(mddev->gendisk); ··· 5786 5783 if (!error && mddev->kobj.sd) { 5787 5784 kobject_uevent(&mddev->kobj, KOBJ_ADD); 5788 5785 mddev->sysfs_state = sysfs_get_dirent_safe(mddev->kobj.sd, "array_state"); 5789 - mddev->sysfs_completed = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_completed"); 5790 - mddev->sysfs_degraded = sysfs_get_dirent_safe(mddev->kobj.sd, "degraded"); 5791 5786 mddev->sysfs_level = sysfs_get_dirent_safe(mddev->kobj.sd, "level"); 5792 5787 } 5793 5788 mddev_put(mddev); ··· 6065 6064 pr_warn("md: cannot register extra attributes for %s\n", 6066 6065 mdname(mddev)); 6067 6066 mddev->sysfs_action = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_action"); 6067 + mddev->sysfs_completed = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_completed"); 6068 + mddev->sysfs_degraded = sysfs_get_dirent_safe(mddev->kobj.sd, "degraded"); 6068 6069 } else if (mddev->ro == 2) /* auto-readonly not meaningful */ 6069 6070 mddev->ro = 0; 6070 6071