md: protect md_thread with rcu
authorYu Kuai <yukuai3@huawei.com>
Tue, 23 May 2023 02:10:17 +0000 (10:10 +0800)
committerSong Liu <song@kernel.org>
Tue, 13 Jun 2023 22:25:39 +0000 (15:25 -0700)
commit4469315439827290923fce4f3f672599cabeb366
tree83e7d30c4570cd28774226f0e9d36b110c823ff8
parent4eeb6535cd51100460ec8873bb68addef17b3e81
md: protect md_thread with rcu

Currently, there are many places that md_thread can be accessed without
protection, following are known scenarios that can cause
null-ptr-dereference or uaf:

1) sync_thread that is allocated and started from md_start_sync()
2) mddev->thread can be accessed directly from timeout_store() and
   md_bitmap_daemon_work()
3) md_unregister_thread() from action_store().

Currently, a global spinlock 'pers_lock' is borrowed to protect
'mddev->thread' in some places, this problem can be fixed likewise,
however, use a global lock for all the cases is not good.

Fix this problem by protecting all md_thread with rcu.

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Song Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20230523021017.3048783-6-yukuai1@huaweicloud.com
12 files changed:
drivers/md/md-bitmap.c
drivers/md/md-cluster.c
drivers/md/md-multipath.c
drivers/md/md.c
drivers/md/md.h
drivers/md/raid1.c
drivers/md/raid1.h
drivers/md/raid10.c
drivers/md/raid10.h
drivers/md/raid5-cache.c
drivers/md/raid5.c
drivers/md/raid5.h