Lines Matching refs:node

73 	struct node **wnode1;
77 struct node **wnode2;
83 struct node **array;
135 struct node {
136 struct node *name_next;
137 struct node *id_next;
141 struct node *parent;
159 struct node node;
391 static struct node_lru *node_lru(struct node *node)
393 return (struct node_lru *) node;
401 return sizeof(struct node);
410 static struct node_slab *node_to_slab(struct fuse *f, struct node *node)
412 return (struct node_slab *) (((uintptr_t) node) & ~((uintptr_t) f->pagesize - 1));
447 static struct node *alloc_node(struct fuse *f)
450 struct list_head *node;
459 node = slab->freelist.next;
460 list_del(node);
465 memset(node, 0, sizeof(struct node));
467 return (struct node *) node;
481 static void free_node_mem(struct fuse *f, struct node *node)
483 struct node_slab *slab = node_to_slab(f, node);
484 struct list_head *n = (struct list_head *) node;
498 static struct node *alloc_node(struct fuse *f)
500 return (struct node *) calloc(1, get_node_size(f));
503 static void free_node_mem(struct fuse *f, struct node *node)
506 free(node);
521 static struct node *get_node_nocheck(struct fuse *f, fuse_ino_t nodeid)
524 struct node *node;
526 for (node = f->id_table.array[hash]; node != NULL; node = node->id_next)
527 if (node->nodeid == nodeid)
528 return node;
533 static struct node *get_node(struct fuse *f, fuse_ino_t nodeid)
535 struct node *node = get_node_nocheck(f, nodeid);
536 if (!node) {
537 fuse_log(FUSE_LOG_ERR, "fuse internal error: node %llu not found\n",
541 return node;
548 static void remove_node_lru(struct node *node)
550 struct node_lru *lnode = node_lru(node);
555 static void set_forget_time(struct fuse *f, struct node *node)
557 struct node_lru *lnode = node_lru(node);
564 static void free_node(struct fuse *f, struct node *node)
566 if (node->name != node->inline_name)
567 free(node->name);
568 free_node_mem(f, node);
579 newarray = realloc(t->array, sizeof(struct node *) * newsize);
596 struct node **upper;
601 struct node **nodep;
613 static void unhash_id(struct fuse *f, struct node *node)
615 struct node **nodep = &f->id_table.array[id_hash(f, node->nodeid)];
618 if (*nodep == node) {
619 *nodep = node->id_next;
633 newarray = realloc(t->array, sizeof(struct node *) * newsize);
638 memset(t->array + t->size, 0, t->size * sizeof(struct node *));
648 struct node **nodep;
649 struct node **next;
658 struct node *node = *nodep;
659 size_t newhash = id_hash(f, node->nodeid);
663 *nodep = node->id_next;
664 node->id_next = t->array[newhash];
665 t->array[newhash] = node;
667 next = &node->id_next;
674 static void hash_id(struct fuse *f, struct node *node)
676 size_t hash = id_hash(f, node->nodeid);
677 node->id_next = f->id_table.array[hash];
678 f->id_table.array[hash] = node;
702 static void unref_node(struct fuse *f, struct node *node);
713 struct node **upper;
718 struct node **nodep;
730 static void unhash_name(struct fuse *f, struct node *node)
732 if (node->name) {
733 size_t hash = name_hash(f, node->parent->nodeid, node->name);
734 struct node **nodep = &f->name_table.array[hash];
737 if (*nodep == node) {
738 *nodep = node->name_next;
739 node->name_next = NULL;
740 unref_node(f, node->parent);
741 if (node->name != node->inline_name)
742 free(node->name);
743 node->name = NULL;
744 node->parent = NULL;
752 "fuse internal error: unable to unhash node: %llu\n",
753 (unsigned long long) node->nodeid);
761 struct node **nodep;
762 struct node **next;
771 struct node *node = *nodep;
772 size_t newhash = name_hash(f, node->parent->nodeid, node->name);
776 *nodep = node->name_next;
777 node->name_next = t->array[newhash];
778 t->array[newhash] = node;
780 next = &node->name_next;
787 static int hash_name(struct fuse *f, struct node *node, fuse_ino_t parentid,
791 struct node *parent = get_node(f, parentid);
792 if (strlen(name) < sizeof(node->inline_name)) {
793 strcpy(node->inline_name, name);
794 node->name = node->inline_name;
796 node->name = strdup(name);
797 if (node->name == NULL)
802 node->parent = parent;
803 node->name_next = f->name_table.array[hash];
804 f->name_table.array[hash] = node;
813 static void delete_node(struct fuse *f, struct node *node)
817 (unsigned long long) node->nodeid);
819 assert(node->treelock == 0);
820 unhash_name(f, node);
822 remove_node_lru(node);
823 unhash_id(f, node);
824 free_node(f, node);
827 static void unref_node(struct fuse *f, struct node *node)
829 assert(node->refctr > 0);
830 node->refctr --;
831 if (!node->refctr)
832 delete_node(f, node);
846 static struct node *lookup_node(struct fuse *f, fuse_ino_t parent,
850 struct node *node;
852 for (node = f->name_table.array[hash]; node != NULL; node = node->name_next)
853 if (node->parent->nodeid == parent &&
854 strcmp(node->name, name) == 0)
855 return node;
860 static void inc_nlookup(struct node *node)
862 if (!node->nlookup)
863 node->refctr++;
864 node->nlookup++;
867 static struct node *find_node(struct fuse *f, fuse_ino_t parent,
870 struct node *node;
874 node = get_node(f, parent);
876 node = lookup_node(f, parent, name);
877 if (node == NULL) {
878 node = alloc_node(f);
879 if (node == NULL)
882 node->nodeid = next_id(f);
883 node->generation = f->generation;
885 inc_nlookup(node);
887 if (hash_name(f, node, parent, name) == -1) {
888 free_node(f, node);
889 node = NULL;
892 hash_id(f, node);
894 struct node_lru *lnode = node_lru(node);
897 } else if (lru_enabled(f) && node->nlookup == 1) {
898 remove_node_lru(node);
900 inc_nlookup(node);
903 return node;
920 struct node *node = lookup_node(f, ino, path_element);
921 if (node == NULL) {
925 ino = node->nodeid;
969 static void unlock_path(struct fuse *f, fuse_ino_t nodeid, struct node *wnode,
970 struct node *end)
972 struct node *node;
979 for (node = get_node(f, nodeid);
980 node != end && node->nodeid != FUSE_ROOT_ID; node = node->parent) {
981 assert(node->treelock != 0);
982 assert(node->treelock != TREELOCK_WAIT_OFFSET);
983 assert(node->treelock != TREELOCK_WRITE);
984 node->treelock--;
985 if (node->treelock == TREELOCK_WAIT_OFFSET)
986 node->treelock = 0;
991 char **path, struct node **wnodep, bool need_lock)
996 struct node *node;
997 struct node *wnode = NULL;
1031 for (node = get_node(f, nodeid); node->nodeid != FUSE_ROOT_ID;
1032 node = node->parent) {
1034 if (node->name == NULL || node->parent == NULL)
1038 s = add_name(&buf, &bufsize, s, node->name);
1044 if (node->treelock < 0)
1047 node->treelock++;
1064 unlock_path(f, nodeid, wnode, node);
1075 struct node **wnode1, struct node **wnode2)
1084 struct node *wn1 = wnode1 ? *wnode1 : NULL;
1137 struct node *wnode = NULL;
1186 char **path, struct node **wnode)
1235 char **path, struct node **wnode)
1249 struct node *node, *node1, *node2;
1258 for (node = get_node(f, id2); node->nodeid != FUSE_ROOT_ID;
1259 node = node->parent) {
1260 if (node->name == NULL || node->parent == NULL)
1263 if (node->nodeid != id2 && node->nodeid == id1)
1269 for (node = get_node(f, id1); node->nodeid != FUSE_ROOT_ID;
1270 node = node->parent) {
1271 if (node->name == NULL || node->parent == NULL)
1274 if (node->nodeid != id1 && node->nodeid == id2)
1286 struct node **wnode1, struct node **wnode2)
1332 struct node *wnode, char *path)
1349 struct node *wnode1, struct node *wnode2,
1363 struct node *node;
1367 node = get_node(f, nodeid);
1373 while (node->nlookup == nlookup && node->treelock) {
1383 } while (node->nlookup == nlookup && node->treelock);
1389 assert(node->nlookup >= nlookup);
1390 node->nlookup -= nlookup;
1391 if (!node->nlookup) {
1392 unref_node(f, node);
1393 } else if (lru_enabled(f) && node->nlookup == 1) {
1394 set_forget_time(f, node);
1399 static void unlink_node(struct fuse *f, struct node *node)
1402 assert(node->nlookup > 1);
1403 node->nlookup--;
1405 unhash_name(f, node);
1410 struct node *node;
1413 node = lookup_node(f, dir, name);
1414 if (node != NULL)
1415 unlink_node(f, node);
1422 struct node *node;
1423 struct node *newnode;
1427 node = lookup_node(f, olddir, oldname);
1429 if (node == NULL)
1441 unhash_name(f, node);
1442 if (hash_name(f, node, newdir, newname) == -1) {
1448 node->is_hidden = 1;
1458 struct node *oldnode;
1459 struct node *newnode;
2357 struct node *node;
2360 node = lookup_node(f, dir, name);
2361 if (node && node->open_count > 0)
2371 struct node *node;
2372 struct node *newnode;
2379 node = lookup_node(f, dir, oldname);
2380 if (node == NULL) {
2387 (unsigned int) node->nodeid, f->hidectr);
2448 static void update_stat(struct node *node, const struct stat *stbuf)
2450 if (node->cache_valid && (!mtime_eq(stbuf, &node->mtime) ||
2451 stbuf->st_size != node->size))
2452 node->cache_valid = 0;
2453 node->mtime.tv_sec = stbuf->st_mtime;
2454 node->mtime.tv_nsec = ST_MTIM_NSEC(stbuf);
2455 node->size = stbuf->st_size;
2456 curr_time(&node->stat_updated);
2462 struct node *node;
2464 node = find_node(f, nodeid, name);
2465 if (node == NULL)
2468 e->ino = node->nodeid;
2469 e->generation = node->generation;
2474 update_stat(node, &e->attr);
2639 struct node *dot = NULL;
2738 struct node *node;
2741 node = get_node(f, ino);
2742 if (node->is_hidden && buf.st_nlink > 0)
2745 update_stat(node, &buf);
2955 struct node *wnode;
2967 /* we have hidden the node so now check again under a lock in case it is not used any more */
2994 struct node *wnode;
3041 struct node *wnode1;
3042 struct node *wnode2;
3100 struct node *node;
3106 node = get_node(f, ino);
3107 assert(node->open_count > 0);
3108 --node->open_count;
3109 if (node->is_hidden && !node->open_count) {
3111 node->is_hidden = 0;
3190 struct node *node;
3193 node = get_node(f, ino);
3194 if (node->cache_valid) {
3198 if (diff_timespec(&now, &node->stat_updated) >
3206 update_stat(node, &stbuf);
3208 node->cache_valid = 0;
3211 if (node->cache_valid)
3214 node->cache_valid = 1;
3449 struct node *node;
3453 node = lookup_node(f, parent, name);
3454 if (node)
3455 res = node->nodeid;
3932 static struct lock *locks_conflict(struct node *node, const struct lock *lock)
3936 for (l = node->locks; l; l = l->next)
3958 static int locks_insert(struct node *node, struct lock *lock)
3976 for (lp = &node->locks; *lp;) {
4401 struct node *node;
4413 node = &lnode->node;
4419 assert(node->nlookup == 1);
4422 if (node->refctr > 1)
4425 node->nlookup = 0;
4426 unhash_name(f, node);
4427 unref_node(f, node);
4839 t->array = (struct node **) calloc(1, sizeof(struct node *) * t->size);
4887 struct node *root;
5070 struct node *node;
5072 for (node = f->id_table.array[i]; node != NULL;
5073 node = node->id_next) {
5074 if (node->is_hidden) {
5076 if (try_get_path(f, node->nodeid, NULL, &path, NULL, false) == 0) {
5085 struct node *node;
5086 struct node *next;
5088 for (node = f->id_table.array[i]; node != NULL; node = next) {
5089 next = node->id_next;
5090 free_node(f, node);