[Sheepdog] [PATCH] sheep: fix cluster multicast

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Fri Jan 6 10:12:10 CET 2012


Cluster ops with process_main() will be multicasted, so we need to set
req->data to msg->data in such cases.

Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
Hi Yuan,

This patch is necessary to multicast buffer data with cluster ops.

Thanks,

Kazutaka

 sheep/group.c |   19 ++++++++++++++-----
 1 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/sheep/group.c b/sheep/group.c
index ae9958e..a2bd9e5 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -207,10 +207,16 @@ static void do_cluster_op(void *arg)
 	struct vdi_op_message *msg = arg;
 	int ret;
 	struct request *req;
+	void *data;
 
 	req = list_first_entry(&sys->pending_list, struct request, pending_list);
+
+	if (has_process_main(req->op))
+		data = msg->data;
+	else
+		data = req->data;
 	ret = do_process_work(req->op, (const struct sd_req *)&msg->req,
-			      (struct sd_rsp *)&msg->rsp, req->data);
+			      (struct sd_rsp *)&msg->rsp, data);
 
 	msg->rsp.result = ret;
 }
@@ -224,10 +230,10 @@ void do_cluster_request(struct work *work)
 
 	eprintf("%p %x\n", req, hdr->opcode);
 
-	if (hdr->flags & SD_FLAG_CMD_WRITE)
-		size = sizeof(*msg);
-	else
+	if (has_process_main(req->op))
 		size = sizeof(*msg) + hdr->data_length;
+	else
+		size = sizeof(*msg);
 
 	msg = zalloc(size);
 	if (!msg) {
@@ -237,6 +243,8 @@ void do_cluster_request(struct work *work)
 
 	msg->req = *((struct sd_vdi_req *)&req->rq);
 	msg->rsp = *((struct sd_vdi_rsp *)&req->rp);
+	if (has_process_main(req->op))
+		memcpy(msg->data, req->data, hdr->data_length);
 
 	list_add_tail(&req->pending_list, &sys->pending_list);
 
@@ -607,7 +615,8 @@ static void __sd_notify_done(struct cpg_event *cevent)
 		return;
 
 	msg->rsp.result = ret;
-	memcpy(req->data, msg->data, msg->rsp.data_length);
+	if (has_process_main(req->op))
+		memcpy(req->data, msg->data, msg->rsp.data_length);
 	memcpy(&req->rp, &msg->rsp, sizeof(req->rp));
 	req->done(req);
 }
-- 
1.7.2.5




More information about the sheepdog mailing list