Sorry, this patch didn't work well.
Please ignore this patch.
But there is problem on vid wrap around.

From: fukumoto.yoshif...@lab.ntt.co.jp
To: sheepdog@lists.wpkg.org
Cc: FUKUMOTO Yoshifumi <fukumoto.yoshif...@lab.ntt.co.jp>
Subject: [sheepdog] [PATCH] sheep: fix vid wrap around
Message-ID:
        <1422855383-1231-1-git-send-email-fukumoto.yoshif...@lab.ntt.co.jp>

From: FUKUMOTO Yoshifumi <fukumoto.yoshif...@lab.ntt.co.jp>

If a vid of a vdi reaches the max number of vid space, creating the snapshot of
the vdi fails.

Example:
$ dog vdi create 00471718 1G
$ dog vdi snapshot 00471718   (repeat 7 times)
failed to read a response
Failed to create snapshot for 00471718: I/O error

This patch fixes the problem.

Signed-off-by: FUKUMOTO Yoshifumi <fukumoto.yoshif...@lab.ntt.co.jp>
---
 sheep/vdi.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/sheep/vdi.c b/sheep/vdi.c
index 2889df6..4113a4f 100644
--- a/sheep/vdi.c
+++ b/sheep/vdi.c
@@ -1398,15 +1398,20 @@ static int fill_vdi_info_range(uint32_t left, uint32_t 
right,
        uint32_t i;
        const char *name = iocb->name;

+       if (!right)
+               return SD_RES_NO_VDI;
        inode = malloc(SD_INODE_HEADER_SIZE);
        if (!inode) {
                sd_err("failed to allocate memory");
                ret = SD_RES_NO_MEM;
                goto out;
        }
-       for (i = right - 1; i && i >= left; i--) {
-               if (!test_bit(i, sys->vdi_inuse))
+       for (i = right - 1; i >= left; i--) {
+               if (!test_bit(i, sys->vdi_inuse)) {
+                       if (!i)
+                               break;
                        continue;
+               }

                ret = sd_read_object(vid_to_vdi_oid(i), (char *)inode,
                                     SD_INODE_HEADER_SIZE, 0);
@@ -1420,9 +1425,13 @@ static int fill_vdi_info_range(uint32_t left, uint32_t 
right,
                                /* Read, delete, clone on snapshots */
                                if (!vdi_is_snapshot(inode)) {
                                        vdi_found = true;
+                                       if (!i)
+                                               break;
                                        continue;
                                }
                                if (!vdi_tag_match(iocb, inode))
+                                       if (!i)
+                                               break;
                                        continue;
                        } else {
                                /*
@@ -1438,6 +1447,8 @@ static int fill_vdi_info_range(uint32_t left, uint32_t 
right,
                        info->vid = inode->vdi_id;
                        goto out;
                }
+               if (!i)
+                       break;
        }
        ret = vdi_found ? SD_RES_NO_TAG : SD_RES_NO_VDI;
 out:
@@ -1458,7 +1469,7 @@ static int fill_vdi_info(unsigned long left, unsigned 
long right,
        switch (ret) {
        case SD_RES_NO_VDI:
        case SD_RES_NO_TAG:
-               ret = fill_vdi_info_range(left, SD_NR_VDIS - 1, iocb, info);
+               ret = fill_vdi_info_range(left, SD_NR_VDIS, iocb, info);
                break;
        default:
                break;
-- 1.9.1


--
sheepdog mailing list
sheepdog@lists.wpkg.org
https://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to