At Thu, 5 Sep 2013 10:58:43 +0800,
Liu Yuan wrote:
> 
> On Thu, Sep 05, 2013 at 09:29:18AM +0900, MORITA Kazutaka wrote:
> > From: MORITA Kazutaka <morita.kazut...@lab.ntt.co.jp>
> > 
> > Signed-off-by: MORITA Kazutaka <morita.kazut...@lab.ntt.co.jp>
> > ---
> >  dog/farm/farm.c |   27 +++++++++++++++------------
> >  1 file changed, 15 insertions(+), 12 deletions(-)
> > 
> > diff --git a/dog/farm/farm.c b/dog/farm/farm.c
> > index d034c7a..878d14d 100644
> > --- a/dog/farm/farm.c
> > +++ b/dog/farm/farm.c
> > @@ -16,7 +16,7 @@
> >  #include <pthread.h>
> >  
> >  #include "farm.h"
> > -#include "list.h"
> > +#include "rbtree.h"
> >  
> >  static char farm_object_dir[PATH_MAX];
> >  static char farm_dir[PATH_MAX];
> > @@ -28,9 +28,9 @@ struct vdi_entry {
> >     uint32_t vdi_id;
> >     uint32_t snap_id;
> >     uint8_t  nr_copies;
> > -   struct list_node list;
> > +   struct rb_node rb;
> >  };
> > -static LIST_HEAD(last_vdi_list);
> > +static struct rb_root last_vdi_tree = RB_ROOT;
> >  
> >  struct snapshot_work {
> >     struct trunk_entry entry;
> > @@ -40,15 +40,18 @@ struct snapshot_work {
> >  static struct work_queue *wq;
> >  static uatomic_bool work_error;
> >  
> > +static int vdi_cmp(const struct vdi_entry *e1, const struct vdi_entry *e2)
> > +{
> > +   return strcmp(e1->name, e2->name);
> > +}
> > +
> >  static struct vdi_entry *find_vdi(const char *name)
> >  {
> > -   struct vdi_entry *vdi;
> > +   struct vdi_entry key = {};
> >  
> > -   list_for_each_entry(vdi, &last_vdi_list, list) {
> > -           if (!strcmp(vdi->name, name))
> > -                   return vdi;
> > -   }
> > -   return NULL;
> > +   pstrcpy(key.name, sizeof(key.name), name);
> > +
> > +   return rb_search(&last_vdi_tree, &key, rb, vdi_cmp);
> >  }
> >  
> >  static struct vdi_entry *new_vdi(const char *name, uint64_t vdi_size,
> > @@ -75,7 +78,7 @@ static void insert_vdi(struct sd_inode *new)
> >                           new->vdi_id,
> >                           new->snap_id,
> >                           new->nr_copies);
> > -           list_add(&vdi->list, &last_vdi_list);
> > +           rb_insert(&last_vdi_tree, vdi, rb, vdi_cmp);
> >     } else if (vdi->snap_id < new->snap_id) {
> >             vdi->vdi_size = new->vdi_size;
> >             vdi->vdi_id = new->vdi_id;
> > @@ -88,7 +91,7 @@ static int create_active_vdis(void)
> >  {
> >     struct vdi_entry *vdi;
> >     uint32_t new_vid;
> > -   list_for_each_entry(vdi, &last_vdi_list, list) {
> > +   rb_for_each_entry(vdi, &last_vdi_tree, rb) {
> >             if (do_vdi_create(vdi->name,
> >                               vdi->vdi_size,
> >                               vdi->vdi_id, &new_vid,
> > @@ -101,7 +104,7 @@ static int create_active_vdis(void)
> >  static void free_vdi_list(void)
> >  {
> >     struct vdi_entry *vdi;
> > -   list_for_each_entry(vdi, &last_vdi_list, list)
> > +   rb_for_each_entry(vdi, &last_vdi_tree, rb)
> >             free(vdi);
> 
> we need rb_erase() too here?

Looks necessary.  I wonder why the current code doesn't call
list_del() here.

Thanks,

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

Reply via email to