static struct vdi_op_message *prepare_cluster_msg(struct request *req, size_t *sizep) { struct vdi_op_message *msg; size_t size; if (has_process_main(req->op)) size = sizeof(*msg) + req->rq.data_length; else size = sizeof(*msg); assert(size <= SD_MAX_EVENT_BUF_SIZE); msg = zalloc(size); if (!msg) { eprintf("failed to allocate memory\n"); return NULL; } memcpy(&msg->req, &req->rq, sizeof(struct sd_req)); memcpy(&msg->rsp, &req->rp, sizeof(struct sd_rsp)); if (has_process_main(req->op)) memcpy(msg->data, req->data, req->rq.data_length); *sizep = size; return msg; }
static void __sd_notify_done(struct event_struct *cevent) { struct work_notify *w = container_of(cevent, struct work_notify, cev); struct vdi_op_message *msg = w->msg; struct request *req = w->req; int ret = msg->rsp.result; struct sd_op_template *op = get_sd_op(msg->req.opcode); if (ret == SD_RES_SUCCESS && has_process_main(op)) ret = do_process_main(op, (const struct sd_req *)&msg->req, (struct sd_rsp *)&msg->rsp, msg->data); if (!req) return; msg->rsp.result = ret; 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); }
void do_cluster_request(struct work *work) { struct request *req = container_of(work, struct request, work); struct sd_req *hdr = (struct sd_req *)&req->rq; struct vdi_op_message *msg; size_t size; eprintf("%p %x\n", req, hdr->opcode); if (has_process_main(req->op)) size = sizeof(*msg) + hdr->data_length; else size = sizeof(*msg); msg = zalloc(size); if (!msg) { eprintf("failed to allocate memory\n"); return; } 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); if (has_process_work(req->op)) sys->cdrv->notify(msg, size, do_cluster_op); else { msg->rsp.result = SD_RES_SUCCESS; sys->cdrv->notify(msg, size, NULL); } free(msg); }
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, data); msg->rsp.result = ret; }