From: MORITA Kazutaka <morita.kazut...@lab.ntt.co.jp>

Signed-off-by: MORITA Kazutaka <morita.kazut...@lab.ntt.co.jp>
---
 sheep/md.c |   40 ++++++++++++++++++++--------------------
 1 file changed, 20 insertions(+), 20 deletions(-)

diff --git a/sheep/md.c b/sheep/md.c
index 37feeb2..b026d20 100644
--- a/sheep/md.c
+++ b/sheep/md.c
@@ -18,7 +18,7 @@
 #define NONE_EXIST_PATH "/all/disks/are/broken/,ps/əʌo7/!"
 
 struct disk {
-       struct list_node list;
+       struct rb_node rb;
        char path[PATH_MAX];
        uint64_t space;
 };
@@ -31,7 +31,7 @@ struct vdisk {
 
 struct md {
        struct rb_root vroot;
-       struct list_head disk_list;
+       struct rb_root root;
        struct sd_lock lock;
        uint64_t space;
        uint32_t nr_disks;
@@ -39,7 +39,7 @@ struct md {
 
 static struct md md = {
        .vroot = RB_ROOT,
-       .disk_list = LIST_HEAD_INIT(md.disk_list),
+       .root = RB_ROOT,
        .lock = SD_LOCK_INITIALIZER,
 };
 
@@ -59,6 +59,11 @@ static inline int vdisk_number(const struct disk *disk)
        return DIV_ROUND_UP(disk->space, MD_VDISK_SIZE);
 }
 
+static int disk_cmp(const struct disk *d1, const struct disk *d2)
+{
+       return strcmp(d1->path, d2->path);
+}
+
 static int vdisk_cmp(const struct vdisk *d1, const struct vdisk *d2)
 {
        return intcmp(d1->hash, d2->hash);
@@ -104,17 +109,12 @@ static inline void trim_last_slash(char *path)
 
 static struct disk *path_to_disk(const char *path)
 {
-       struct disk *disk;
-       char p[PATH_MAX];
+       struct disk key = {};
 
-       pstrcpy(p, sizeof(p), path);
-       trim_last_slash(p);
-       list_for_each_entry(disk, &md.disk_list, list) {
-               if (strcmp(disk->path, p) == 0)
-                       return disk;
-       }
+       pstrcpy(key.path, sizeof(key.path), path);
+       trim_last_slash(key.path);
 
-       return NULL;
+       return rb_search(&md.root, &key, rb, disk_cmp);
 }
 
 static int get_total_object_size(uint64_t oid, const char *wd, uint32_t epoch,
@@ -274,7 +274,7 @@ bool md_add_disk(const char *path)
        }
 
        create_vdisks(new);
-       list_add(&new->list, &md.disk_list);
+       rb_insert(&md.root, new, rb, disk_cmp);
        md.space += new->space;
        md.nr_disks++;
 
@@ -294,7 +294,7 @@ static inline void md_remove_disk(struct disk *disk)
        struct vdisk *v;
 
        sd_info("%s from multi-disk array", disk->path);
-       list_del(&disk->list);
+       rb_erase(&disk->rb, &md.root);
        md.nr_disks--;
        rb_for_each_entry(v, &md.vroot, rb) {
                if (v->disk == disk)
@@ -338,7 +338,7 @@ int for_each_object_in_wd(int (*func)(uint64_t oid, const 
char *path,
        const struct disk *disk;
 
        sd_read_lock(&md.lock);
-       list_for_each_entry(disk, &md.disk_list, list) {
+       rb_for_each_entry(disk, &md.root, rb) {
                ret = for_each_object_in_path(disk->path, func, cleanup, arg);
                if (ret != SD_RES_SUCCESS)
                        break;
@@ -356,7 +356,7 @@ int for_each_object_in_stale(int (*func)(uint64_t oid, 
const char *path,
        const struct disk *disk;
 
        sd_read_lock(&md.lock);
-       list_for_each_entry(disk, &md.disk_list, list) {
+       rb_for_each_entry(disk, &md.root, rb) {
                snprintf(path, sizeof(path), "%s/.stale", disk->path);
                ret = for_each_object_in_path(path, func, false, arg);
                if (ret != SD_RES_SUCCESS)
@@ -373,7 +373,7 @@ int for_each_obj_path(int (*func)(const char *path))
        const struct disk *disk;
 
        sd_read_lock(&md.lock);
-       list_for_each_entry(disk, &md.disk_list, list) {
+       rb_for_each_entry(disk, &md.root, rb) {
                ret = func(disk->path);
                if (ret != SD_RES_SUCCESS)
                        break;
@@ -530,7 +530,7 @@ static int scan_wd(uint64_t oid, uint32_t epoch)
        const struct disk *disk;
 
        sd_read_lock(&md.lock);
-       list_for_each_entry(disk, &md.disk_list, list) {
+       rb_for_each_entry(disk, &md.root, rb) {
                ret = md_check_and_move(oid, epoch, disk->path);
                if (ret == SD_RES_SUCCESS)
                        break;
@@ -580,7 +580,7 @@ uint32_t md_get_info(struct sd_md_info *info)
 
        memset(info, 0, ret);
        sd_read_lock(&md.lock);
-       list_for_each_entry(disk, &md.disk_list, list) {
+       rb_for_each_entry(disk, &md.root, rb) {
                info->disk[i].idx = i;
                pstrcpy(info->disk[i].path, PATH_MAX, disk->path);
                /* FIXME: better handling failure case. */
@@ -652,7 +652,7 @@ uint64_t md_get_size(uint64_t *used)
 
        *used = 0;
        sd_read_lock(&md.lock);
-       list_for_each_entry(disk, &md.disk_list, list) {
+       rb_for_each_entry(disk, &md.root, rb) {
                fsize += get_path_free_size(disk->path, used);
        }
        sd_unlock(&md.lock);
-- 
1.7.9.5

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

Reply via email to