[sheepdog] [PATCH] sheep: set cluster_op_running to false after block request finishes
MORITA Kazutaka
morita.kazutaka at gmail.com
Wed May 29 12:20:32 CEST 2013
From: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
There is a race problem that sd_block_handler() can be executed before
sd_notify_handler() of the previous block request. This leads to
segmentation fault. For example,
1. There are two requests in pending_block_list.
2. sd_block_handler() of the first block request is called.
cluster_op_running is set to true.
3. cluster_op_done of the first block request is called and
cluster_op_running is set to false.
4. sd_block_handler() of the second block request is tried to be
called. However, the first one is still in the pending_block_list
and sd_block_handler() is called against the first request again.
To fix this problem, this patch sets cluster_op_running to false after
the request is removed from the pending_block_list in
sd_notify_handler().
Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
sheep/group.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/sheep/group.c b/sheep/group.c
index fe45ff9..b9399ee 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -272,8 +272,6 @@ static void cluster_op_done(struct work *work)
struct vdi_op_message *msg;
size_t size;
- cluster_op_running = false;
-
sd_dprintf("%s (%p)", op_name(req->op), req);
msg = prepare_cluster_msg(req, &size);
@@ -976,6 +974,9 @@ void sd_notify_handler(const struct sd_node *sender, void *data,
put_request(req);
}
+
+ if (has_process_work(op))
+ cluster_op_running = false;
}
enum cluster_join_result sd_check_join_cb(const struct sd_node *joining,
--
1.7.9.5
More information about the sheepdog
mailing list