Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5f0aa21d authored by Guoqing Jiang's avatar Guoqing Jiang Committed by Shaohua Li
Browse files

md-cluster: protect md_find_rdev_nr_rcu with rcu lock



We need to use rcu_read_lock/unlock to avoid potential
race.

Reported-by: default avatarShaohua Li <shli@fb.com>
Reviewed-by: default avatarNeilBrown <neilb@suse.com>
Signed-off-by: default avatarGuoqing Jiang <gqjiang@suse.com>
Signed-off-by: default avatarShaohua Li <shli@fb.com>
parent c20c33f0
Loading
Loading
Loading
Loading
+8 −4
Original line number Original line Diff line number Diff line
@@ -489,9 +489,10 @@ static void process_metadata_update(struct mddev *mddev, struct cluster_msg *msg


static void process_remove_disk(struct mddev *mddev, struct cluster_msg *msg)
static void process_remove_disk(struct mddev *mddev, struct cluster_msg *msg)
{
{
	struct md_rdev *rdev = md_find_rdev_nr_rcu(mddev,
	struct md_rdev *rdev;
						   le32_to_cpu(msg->raid_slot));


	rcu_read_lock();
	rdev = md_find_rdev_nr_rcu(mddev, le32_to_cpu(msg->raid_slot));
	if (rdev) {
	if (rdev) {
		set_bit(ClusterRemove, &rdev->flags);
		set_bit(ClusterRemove, &rdev->flags);
		set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
		set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
@@ -500,18 +501,21 @@ static void process_remove_disk(struct mddev *mddev, struct cluster_msg *msg)
	else
	else
		pr_warn("%s: %d Could not find disk(%d) to REMOVE\n",
		pr_warn("%s: %d Could not find disk(%d) to REMOVE\n",
			__func__, __LINE__, le32_to_cpu(msg->raid_slot));
			__func__, __LINE__, le32_to_cpu(msg->raid_slot));
	rcu_read_unlock();
}
}


static void process_readd_disk(struct mddev *mddev, struct cluster_msg *msg)
static void process_readd_disk(struct mddev *mddev, struct cluster_msg *msg)
{
{
	struct md_rdev *rdev = md_find_rdev_nr_rcu(mddev,
	struct md_rdev *rdev;
						   le32_to_cpu(msg->raid_slot));


	rcu_read_lock();
	rdev = md_find_rdev_nr_rcu(mddev, le32_to_cpu(msg->raid_slot));
	if (rdev && test_bit(Faulty, &rdev->flags))
	if (rdev && test_bit(Faulty, &rdev->flags))
		clear_bit(Faulty, &rdev->flags);
		clear_bit(Faulty, &rdev->flags);
	else
	else
		pr_warn("%s: %d Could not find disk(%d) which is faulty",
		pr_warn("%s: %d Could not find disk(%d) which is faulty",
			__func__, __LINE__, le32_to_cpu(msg->raid_slot));
			__func__, __LINE__, le32_to_cpu(msg->raid_slot));
	rcu_read_unlock();
}
}


static int process_recvd_msg(struct mddev *mddev, struct cluster_msg *msg)
static int process_recvd_msg(struct mddev *mddev, struct cluster_msg *msg)