diff options
author | Yu Kuai <yukuai3@huawei.com> | 2023-05-23 10:10:17 +0800 |
---|---|---|
committer | Song Liu <song@kernel.org> | 2023-06-13 15:25:39 -0700 |
commit | 4469315439827290923fce4f3f672599cabeb366 (patch) | |
tree | 83e7d30c4570cd28774226f0e9d36b110c823ff8 /drivers/md/raid10.h | |
parent | 4eeb6535cd51100460ec8873bb68addef17b3e81 (diff) | |
download | lwn-4469315439827290923fce4f3f672599cabeb366.tar.gz lwn-4469315439827290923fce4f3f672599cabeb366.zip |
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
Diffstat (limited to 'drivers/md/raid10.h')
-rw-r--r-- | drivers/md/raid10.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/md/raid10.h b/drivers/md/raid10.h index 8c072ce0bc54..63e48b11b552 100644 --- a/drivers/md/raid10.h +++ b/drivers/md/raid10.h @@ -100,7 +100,7 @@ struct r10conf { /* When taking over an array from a different personality, we store * the new thread here until we fully activate the array. */ - struct md_thread *thread; + struct md_thread __rcu *thread; /* * Keep track of cluster resync window to send to other nodes. |