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

Commit 09995411 authored by Guoqing Jiang's avatar Guoqing Jiang Committed by Goldwyn Rodrigues
Browse files

md-cluster: send BITMAP_NEEDS_SYNC when node is leaving cluster



Previously, BITMAP_NEEDS_SYNC message is sent when the resyc
aborts, but it could abort for different reasons, and not all
of reasons require another node to take over the resync ownship.

It is better make BITMAP_NEEDS_SYNC message only be sent when
the node is leaving cluster with dirty bitmap. And we also need
to ensure dlm connection is ok.

Signed-off-by: default avatarGuoqing Jiang <gqjiang@suse.com>
Signed-off-by: default avatarNeilBrown <neilb@suse.com>
parent c40f341f
Loading
Loading
Loading
Loading
+20 −0
Original line number Original line Diff line number Diff line
@@ -774,12 +774,32 @@ static int join(struct mddev *mddev, int nodes)
	return ret;
	return ret;
}
}


static void resync_bitmap(struct mddev *mddev)
{
	struct md_cluster_info *cinfo = mddev->cluster_info;
	struct cluster_msg cmsg = {0};
	int err;

	cmsg.type = cpu_to_le32(BITMAP_NEEDS_SYNC);
	err = sendmsg(cinfo, &cmsg);
	if (err)
		pr_err("%s:%d: failed to send BITMAP_NEEDS_SYNC message (%d)\n",
			__func__, __LINE__, err);
}

static int leave(struct mddev *mddev)
static int leave(struct mddev *mddev)
{
{
	struct md_cluster_info *cinfo = mddev->cluster_info;
	struct md_cluster_info *cinfo = mddev->cluster_info;


	if (!cinfo)
	if (!cinfo)
		return 0;
		return 0;

	/* BITMAP_NEEDS_SYNC message should be sent when node
	 * is leaving the cluster with dirty bitmap, also we
	 * can only deliver it when dlm connection is available */
	if (cinfo->slot_number > 0 && mddev->recovery_cp != MaxSector)
		resync_bitmap(mddev);

	md_unregister_thread(&cinfo->recovery_thread);
	md_unregister_thread(&cinfo->recovery_thread);
	md_unregister_thread(&cinfo->recv_thread);
	md_unregister_thread(&cinfo->recv_thread);
	lockres_free(cinfo->message_lockres);
	lockres_free(cinfo->message_lockres);