Skip to content

Commit f150e75

Browse files
Jiasheng Jianghailan94
authored andcommitted
md-cluster: fix NULL pointer dereference in process_metadata_update
The function process_metadata_update() blindly dereferences the 'thread' pointer (acquired via rcu_dereference_protected) within the wait_event() macro. While the code comment states "daemon thread must exist", there is a valid race condition window during the MD array startup sequence (md_run): 1. bitmap_load() is called, which invokes md_cluster_ops->join(). 2. join() starts the "cluster_recv" thread (recv_daemon). 3. At this point, recv_daemon is active and processing messages. 4. However, mddev->thread (the main MD thread) is not initialized until later in md_run(). If a METADATA_UPDATED message is received from a remote node during this specific window, process_metadata_update() will be called while mddev->thread is still NULL, leading to a kernel panic. To fix this, we must validate the 'thread' pointer. If it is NULL, we release the held lock (no_new_dev_lockres) and return early, safely ignoring the update request as the array is not yet fully ready to process it. Link: https://lore.kernel.org/linux-raid/[email protected] Signed-off-by: Jiasheng Jiang <[email protected]> Signed-off-by: Yu Kuai <[email protected]>
1 parent 46ef85f commit f150e75

1 file changed

Lines changed: 6 additions & 1 deletion

File tree

drivers/md/md-cluster.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,8 +549,13 @@ static void process_metadata_update(struct mddev *mddev, struct cluster_msg *msg
549549

550550
dlm_lock_sync(cinfo->no_new_dev_lockres, DLM_LOCK_CR);
551551

552-
/* daemaon thread must exist */
553552
thread = rcu_dereference_protected(mddev->thread, true);
553+
if (!thread) {
554+
pr_warn("md-cluster: Received metadata update but MD thread is not ready\n");
555+
dlm_unlock_sync(cinfo->no_new_dev_lockres);
556+
return;
557+
}
558+
554559
wait_event(thread->wqueue,
555560
(got_lock = mddev_trylock(mddev)) ||
556561
test_bit(MD_CLUSTER_HOLDING_MUTEX_FOR_RECVD, &cinfo->state));

0 commit comments

Comments
 (0)