[sheepdog] [PATCH] sheep: cleanup generational reference counting code and document

Hitoshi Mitake mitake.hitoshi at lab.ntt.co.jp
Fri Aug 22 10:39:23 CEST 2014


This patch does a little refactoring of generational reference
counting. It also fixes trivial problems of pseudo code in
doc/object-reclaim.txt.

Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
---
 doc/object-reclaim.txt |  6 +++++-
 sheep/vdi.c            | 21 ++++++++-------------
 2 files changed, 13 insertions(+), 14 deletions(-)

diff --git a/doc/object-reclaim.txt b/doc/object-reclaim.txt
index 4cef5f5..d9c8fca 100644
--- a/doc/object-reclaim.txt
+++ b/doc/object-reclaim.txt
@@ -43,6 +43,9 @@ Generational reference counting is performed as follows:
    reference B is initialized as follows:
 
        for (i = 0; i < MAX_DATA_OBJS; i++) {
+       	   if (!A.data_vdi_id[i])
+              continue;
+
            B.gref[i].generation = A.gref[i].generation + 1;
            B.gref[i].count = 0;
        }
@@ -50,7 +53,8 @@ Generational reference counting is performed as follows:
    In addition, A.gref.count's are incremented:
 
        for (i = 0; i < MAX_DATA_OBJS; i++) {
-           A.gref[i].count++;
+       	   if (A.data_vdi_id[i])
+              A.gref[i].count++;
        }
 
 3. When a object o is removed, a decrement message is sent to its
diff --git a/sheep/vdi.c b/sheep/vdi.c
index 05cae7b..0adbea0 100644
--- a/sheep/vdi.c
+++ b/sheep/vdi.c
@@ -992,10 +992,8 @@ static int snapshot_vdi(const struct vdi_iocb *iocb, uint32_t new_snapid,
 	base->snap_ctime = iocb->time;
 
 	for (int i = 0; i < ARRAY_SIZE(base->gref); i++) {
-		if (!base->data_vdi_id[i])
-			continue;
-
-		base->gref[i].count++;
+		if (base->data_vdi_id[i])
+			base->gref[i].count++;
 	}
 
 	ret = sd_write_object(vid_to_vdi_oid(base_vid), (char *)base,
@@ -1007,13 +1005,8 @@ static int snapshot_vdi(const struct vdi_iocb *iocb, uint32_t new_snapid,
 	}
 
 	/* create a new vdi */
-	new = alloc_inode(iocb, new_snapid, new_vid, base->data_vdi_id, NULL);
-	for (int i = 0; i < ARRAY_SIZE(base->gref); i++) {
-		if (!base->data_vdi_id[i])
-			continue;
-
-		new->gref[i].generation = base->gref[i].generation + 1;
-	}
+	new = alloc_inode(iocb, new_snapid, new_vid, base->data_vdi_id,
+			  base->gref);
 	ret = sd_write_object(vid_to_vdi_oid(new_vid), (char *)new,
 			      sizeof(*new), 0, true);
 	if (ret != SD_RES_SUCCESS)
@@ -1073,8 +1066,10 @@ static int rebase_vdi(const struct vdi_iocb *iocb, uint32_t new_snapid,
 		goto out;
 	}
 
-	for (int i = 0; i < ARRAY_SIZE(base->gref); i++)
-		base->gref[i].count++;
+	for (int i = 0; i < ARRAY_SIZE(base->gref); i++) {
+		if (base->data_vdi_id[i])
+			base->gref[i].count++;
+	}
 	/* update current working vdi */
 	ret = sd_write_object(vid_to_vdi_oid(base_vid), (char *)base->gref,
 			      sizeof(base->gref),
-- 
1.8.3.2



More information about the sheepdog mailing list