This increases performance of vdi traversing.

Signed-off-by: MORITA Kazutaka <morita.kazut...@lab.ntt.co.jp>
---
 collie/cluster.c | 12 ++++++------
 collie/common.c  | 10 ++++++----
 2 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/collie/cluster.c b/collie/cluster.c
index 0c5ac13..715d658 100644
--- a/collie/cluster.c
+++ b/collie/cluster.c
@@ -65,6 +65,11 @@ static int list_store(void)
        return EXIT_SYSFAIL;
 }
 
+static bool no_vdi(const unsigned long *vdis)
+{
+       return find_next_bit(vdis, SD_NR_VDIS, 0) == SD_NR_VDIS;
+}
+
 #define FORMAT_PRINT                           \
        "    __\n"                              \
        "   ()'`;\n"                            \
@@ -80,7 +85,6 @@ static int cluster_format(int argc, char **argv)
        struct timeval tv;
        char store_name[STORE_LEN];
        static DECLARE_BITMAP(vdi_inuse, SD_NR_VDIS);
-       unsigned long nr;
 
        sd_init_req((struct sd_req *)&hdr, SD_OP_READ_VDIS);
        hdr.data_length = sizeof(vdi_inuse);
@@ -90,11 +94,7 @@ static int cluster_format(int argc, char **argv)
        if (ret < 0)
                return EXIT_SYSFAIL;
 
-       for (nr = 0; nr < SD_NR_VDIS; nr++)
-               if (test_bit(nr, vdi_inuse))
-                       break;
-
-       if (nr != SD_NR_VDIS)
+       if (!no_vdi(vdi_inuse))
                confirm(FORMAT_PRINT);
 
        gettimeofday(&tv, NULL);
diff --git a/collie/common.c b/collie/common.c
index 0642ee0..ce40822 100644
--- a/collie/common.c
+++ b/collie/common.c
@@ -113,6 +113,11 @@ int sd_write_object(uint64_t oid, uint64_t cow_oid, void 
*data,
        return SD_RES_SUCCESS;
 }
 
+#define FOR_EACH_VDI(nr, vdis)                                 \
+       for (nr = find_next_bit((vdis), SD_NR_VDIS, 0);         \
+            nr < SD_NR_VDIS;                                   \
+            nr = find_next_bit((vdis), SD_NR_VDIS, nr + 1))
+
 int parse_vdi(vdi_parser_func_t func, size_t size, void *data)
 {
        int ret;
@@ -129,13 +134,10 @@ int parse_vdi(vdi_parser_func_t func, size_t size, void 
*data)
        if (ret < 0)
                goto out;
 
-       for (nr = 0; nr < SD_NR_VDIS; nr++) {
+       FOR_EACH_VDI(nr, vdi_inuse) {
                uint64_t oid;
                uint32_t snapid;
 
-               if (!test_bit(nr, vdi_inuse))
-                       continue;
-
                oid = vid_to_vdi_oid(nr);
 
                memset(&i, 0, sizeof(i));
-- 
1.8.1.3.566.gaa39828

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

Reply via email to