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

Configure Feed

Select the types of activity you want to include in your feed.

md: delete mddev kobj before deleting gendisk kobj

In sync del gendisk path, it deletes gendisk first and the directory
/sys/block/md is removed. Then it releases mddev kobj in a delayed work.
If we enable debug log in sysfs_remove_group, we can see the debug log
'sysfs group bitmap not found for kobject md'. It's the reason that the
parent kobj has been deleted, so it can't find parent directory.

In creating path, it allocs gendisk first, then adds mddev kobj. So it
should delete mddev kobj before deleting gendisk.

Before commit 9e59d609763f ("md: call del_gendisk in control path"), it
releases mddev kobj first. If the kobj hasn't been deleted, it does clean
job and deletes the kobj. Then it calls del_gendisk and releases gendisk
kobj. So it doesn't need to call kobject_del to delete mddev kobj. After
this patch, in sync del gendisk path, the sequence changes. So it needs
to call kobject_del to delete mddev kobj.

After this patch, the sequence is:
1. kobject del mddev kobj
2. del_gendisk deletes gendisk kobj
3. mddev_delayed_delete releases mddev kobj
4. md_kobj_release releases gendisk kobj

Link: https://lore.kernel.org/linux-raid/20250928012424.61370-1-xni@redhat.com
Fixes: 9e59d609763f ("md: call del_gendisk in control path")
Signed-off-by: Xiao Ni <xni@redhat.com>
Reviewed-by: Li Nan <linan122@huawei.com>
Signed-off-by: Yu Kuai <yukuai@fnnas.com>

authored by

Xiao Ni and committed by
Yu Kuai
cc394b94 3d7b1dba

+3 -1
+3 -1
drivers/md/md.c
··· 941 941 * do_md_stop. dm raid only uses md_stop to stop. So dm raid 942 942 * doesn't need to check MD_DELETED when getting reconfig lock 943 943 */ 944 - if (test_bit(MD_DELETED, &mddev->flags)) 944 + if (test_bit(MD_DELETED, &mddev->flags)) { 945 + kobject_del(&mddev->kobj); 945 946 del_gendisk(mddev->gendisk); 947 + } 946 948 } 947 949 } 948 950 EXPORT_SYMBOL_GPL(mddev_unlock);