[sheepdog] [PATCH 2/3] sheep: count prevent cow requests in a correct manner
Hitoshi Mitake
mitake.hitoshi at lab.ntt.co.jp
Wed Jun 11 07:27:22 CEST 2014
Multiple execution of "dog vdi snapshot" can be overlapped. The
variable should not be boolean.
Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
---
sheep/ops.c | 6 ++++--
sheep/request.c | 2 +-
sheep/sheep_priv.h | 2 +-
3 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/sheep/ops.c b/sheep/ops.c
index 3432c83..3bf4838 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -1207,7 +1207,7 @@ static int local_prevent_cow(const struct sd_req *req, struct sd_rsp *rsp,
sd_debug("preventing COW request, ongoing COW requests: %d",
sys->nr_ongoing_cow_request);
- sys->prevent_cow = true;
+ sys->nr_prevent_cow++;
if (sys->nr_ongoing_cow_request) {
list_add_tail(&rq->pending_prevent_cow_request_list,
@@ -1224,8 +1224,10 @@ static int local_allow_cow(const struct sd_req *req, struct sd_rsp *rsp,
struct request *rq;
sd_debug("allowing COW request");
+ sys->nr_prevent_cow--;
- sys->prevent_cow = false;
+ if (sys->nr_prevent_cow)
+ return SD_RES_SUCCESS;
list_for_each_entry(rq, &sys->prevented_cow_request_queue,
prevented_cow_request_list) {
diff --git a/sheep/request.c b/sheep/request.c
index f5150d5..5a251c2 100644
--- a/sheep/request.c
+++ b/sheep/request.c
@@ -353,7 +353,7 @@ queue_work:
}
if (req->rq.opcode == SD_OP_WRITE_OBJ && is_data_vid_update(&req->rq)) {
- if (sys->prevent_cow) {
+ if (sys->nr_prevent_cow) {
sd_debug("preventing COW");
list_add_tail(&req->prevented_cow_request_list,
&sys->prevented_cow_request_queue);
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index a876fe5..0c590c0 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -166,7 +166,7 @@ struct system_info {
bool upgrade;
struct sd_stat stat;
- bool prevent_cow;
+ int nr_prevent_cow;
int nr_ongoing_cow_request;
struct list_head prevented_cow_request_queue;
struct list_head pending_prevent_cow_request_queue;
--
1.7.1
More information about the sheepdog
mailing list