lib: optimization: store parent pointer in node instead of parent id
diff --git a/lib/fuse.c b/lib/fuse.c
index 42866f1..8e801b8 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -107,7 +107,7 @@
     fuse_ino_t nodeid;
     unsigned int generation;
     int refctr;
-    fuse_ino_t parent;
+    struct node *parent;
     char *name;
     uint64_t nlookup;
     int open_count;
@@ -315,17 +315,17 @@
 static void unhash_name(struct fuse *f, struct node *node)
 {
     if (node->name) {
-        size_t hash = name_hash(f, node->parent, node->name);
+        size_t hash = name_hash(f, node->parent->nodeid, node->name);
         struct node **nodep = &f->name_table[hash];
 
         for (; *nodep != NULL; nodep = &(*nodep)->name_next)
             if (*nodep == node) {
                 *nodep = node->name_next;
                 node->name_next = NULL;
-                unref_node(f, get_node(f, node->parent));
+                unref_node(f, node->parent);
                 free(node->name);
                 node->name = NULL;
-                node->parent = 0;
+                node->parent = NULL;
                 return;
             }
         fprintf(stderr, "fuse internal error: unable to unhash node: %llu\n",
@@ -334,15 +334,16 @@
     }
 }
 
-static int hash_name(struct fuse *f, struct node *node, fuse_ino_t parent,
+static int hash_name(struct fuse *f, struct node *node, fuse_ino_t parentid,
                      const char *name)
 {
-    size_t hash = name_hash(f, parent, name);
+    size_t hash = name_hash(f, parentid, name);
+    struct node *parent = get_node(f, parentid);
     node->name = strdup(name);
     if (node->name == NULL)
         return -1;
 
-    get_node(f, parent)->refctr ++;
+    parent->refctr ++;
     node->parent = parent;
     node->name_next = f->name_table[hash];
     f->name_table[hash] = node;
@@ -386,7 +387,7 @@
     struct node *node;
 
     for (node = f->name_table[hash]; node != NULL; node = node->name_next)
-        if (node->parent == parent && strcmp(node->name, name) == 0)
+        if (node->parent->nodeid == parent && strcmp(node->name, name) == 0)
             return node;
 
     return NULL;
@@ -453,7 +454,7 @@
 
     pthread_mutex_lock(&f->lock);
     for (node = get_node(f, nodeid); node && node->nodeid != FUSE_ROOT_ID;
-         node = get_node(f, node->parent)) {
+         node = node->parent) {
         if (node->name == NULL) {
             s = NULL;
             break;
@@ -3170,7 +3171,7 @@
         fuse_init_intr_signal(f->conf.intr_signal, &f->intr_installed) == -1)
         goto out_free_root_name;
 
-    root->parent = 0;
+    root->parent = NULL;
     root->nodeid = FUSE_ROOT_ID;
     root->generation = 0;
     root->refctr = 1;