Skip to content

Commit e8efa9b

Browse files
biger410liu-song-6
authored andcommitted
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 <[email protected]> Fixes: e1a86db ("md: fix deadlock causing by sysfs_notify") Signed-off-by: Junxiao Bi <[email protected]> Signed-off-by: Song Liu <[email protected]>
1 parent f59589f commit e8efa9b

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

drivers/md/md.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,13 @@ void mddev_unlock(struct mddev *mddev)
876876
sysfs_remove_group(&mddev->kobj, &md_redundancy_group);
877877
if (mddev->sysfs_action)
878878
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);
879883
mddev->sysfs_action = NULL;
884+
mddev->sysfs_completed = NULL;
885+
mddev->sysfs_degraded = NULL;
880886
}
881887
}
882888
mddev->sysfs_active = 0;
@@ -4094,6 +4100,8 @@ level_store(struct mddev *mddev, const char *buf, size_t len)
40944100
pr_warn("md: cannot register extra attributes for %s\n",
40954101
mdname(mddev));
40964102
mddev->sysfs_action = sysfs_get_dirent(mddev->kobj.sd, "sync_action");
4103+
mddev->sysfs_completed = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_completed");
4104+
mddev->sysfs_degraded = sysfs_get_dirent_safe(mddev->kobj.sd, "degraded");
40974105
}
40984106
if (oldpers->sync_request != NULL &&
40994107
pers->sync_request == NULL) {
@@ -5609,14 +5617,9 @@ static void md_free(struct kobject *ko)
56095617

56105618
if (mddev->sysfs_state)
56115619
sysfs_put(mddev->sysfs_state);
5612-
if (mddev->sysfs_completed)
5613-
sysfs_put(mddev->sysfs_completed);
5614-
if (mddev->sysfs_degraded)
5615-
sysfs_put(mddev->sysfs_degraded);
56165620
if (mddev->sysfs_level)
56175621
sysfs_put(mddev->sysfs_level);
56185622

5619-
56205623
if (mddev->gendisk)
56215624
del_gendisk(mddev->gendisk);
56225625
if (mddev->queue)
@@ -5783,8 +5786,6 @@ static int md_alloc(dev_t dev, char *name)
57835786
if (!error && mddev->kobj.sd) {
57845787
kobject_uevent(&mddev->kobj, KOBJ_ADD);
57855788
mddev->sysfs_state = sysfs_get_dirent_safe(mddev->kobj.sd, "array_state");
5786-
mddev->sysfs_completed = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_completed");
5787-
mddev->sysfs_degraded = sysfs_get_dirent_safe(mddev->kobj.sd, "degraded");
57885789
mddev->sysfs_level = sysfs_get_dirent_safe(mddev->kobj.sd, "level");
57895790
}
57905791
mddev_put(mddev);
@@ -6064,6 +6065,8 @@ int md_run(struct mddev *mddev)
60646065
pr_warn("md: cannot register extra attributes for %s\n",
60656066
mdname(mddev));
60666067
mddev->sysfs_action = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_action");
6068+
mddev->sysfs_completed = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_completed");
6069+
mddev->sysfs_degraded = sysfs_get_dirent_safe(mddev->kobj.sd, "degraded");
60676070
} else if (mddev->ro == 2) /* auto-readonly not meaningful */
60686071
mddev->ro = 0;
60696072

0 commit comments

Comments
 (0)