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