Lines Matching +full:dlclose +full:- +full:skip
3 Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
5 Implementation of the high-level FUSE API on top of the low-level
97 const typeof( ((type *)0)->member ) *__mptr = (ptr); \
98 (type *)( (char *)__mptr - offsetof(type,member) );})
162 #define TREELOCK_WRITE -1
218 return -1; in fuse_register_module()
220 mod->name = strdup(name); in fuse_register_module()
221 if (!mod->name) { in fuse_register_module()
224 return -1; in fuse_register_module()
226 mod->factory = factory; in fuse_register_module()
227 mod->ctr = 0; in fuse_register_module()
228 mod->so = so; in fuse_register_module()
229 if (mod->so) in fuse_register_module()
230 mod->so->ctr++; in fuse_register_module()
231 mod->next = fuse_modules; in fuse_register_module()
240 for (mp = &fuse_modules; *mp; mp = &(*mp)->next) { in fuse_unregister_module()
242 *mp = (*mp)->next; in fuse_unregister_module()
246 free(m->name); in fuse_unregister_module()
252 int ret = -1; in fuse_load_so_module()
260 return -1; in fuse_load_so_module()
269 so->handle = dlopen(tmp, RTLD_NOW); in fuse_load_so_module()
270 if (so->handle == NULL) { in fuse_load_so_module()
277 *(void**)(&factory) = dlsym(so->handle, tmp); in fuse_load_so_module()
292 dlclose(so->handle); in fuse_load_so_module()
301 for (m = fuse_modules; m; m = m->next) { in fuse_find_module()
302 if (strcmp(module, m->name) == 0) { in fuse_find_module()
303 m->ctr++; in fuse_find_module()
328 if (m->so) in fuse_put_module()
329 assert(m->ctr > 0); in fuse_put_module()
330 /* Builtin modules may already have m->ctr == 0 */ in fuse_put_module()
331 if (m->ctr > 0) in fuse_put_module()
332 m->ctr--; in fuse_put_module()
333 if (!m->ctr && m->so) { in fuse_put_module()
334 struct fusemod_so *so = m->so; in fuse_put_module()
335 assert(so->ctr > 0); in fuse_put_module()
336 so->ctr--; in fuse_put_module()
337 if (!so->ctr) { in fuse_put_module()
340 if ((*mp)->so == so) in fuse_put_module()
343 mp = &(*mp)->next; in fuse_put_module()
345 dlclose(so->handle); in fuse_put_module()
348 } else if (!m->ctr) { in fuse_put_module()
356 list->next = list; in init_list_head()
357 list->prev = list; in init_list_head()
362 return head->next == head; in list_empty()
368 next->prev = new; in list_add()
369 new->next = next; in list_add()
370 new->prev = prev; in list_add()
371 prev->next = new; in list_add()
376 list_add(new, head, head->next); in list_add_head()
381 list_add(new, head->prev, head); in list_add_tail()
386 struct list_head *prev = entry->prev; in list_del()
387 struct list_head *next = entry->next; in list_del()
389 next->prev = prev; in list_del()
390 prev->next = next; in list_del()
395 return f->conf.remember > 0; in lru_enabled()
419 return (struct node_slab *) (((uintptr_t) node) & ~((uintptr_t) f->pagesize - 1)); in node_to_slab()
431 mem = mmap(NULL, f->pagesize, PROT_READ | PROT_WRITE, in alloc_slab()
432 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); in alloc_slab()
435 return -1; in alloc_slab()
438 init_list_head(&slab->freelist); in alloc_slab()
439 slab->used = 0; in alloc_slab()
440 num = (f->pagesize - sizeof(struct node_slab)) / node_size; in alloc_slab()
442 start = (char *) mem + f->pagesize - num * node_size; in alloc_slab()
447 list_add_tail(n, &slab->freelist); in alloc_slab()
449 list_add_tail(&slab->list, &f->partial_slabs); in alloc_slab()
459 if (list_empty(&f->partial_slabs)) { in alloc_node()
464 slab = list_to_slab(f->partial_slabs.next); in alloc_node()
465 slab->used++; in alloc_node()
466 node = slab->freelist.next; in alloc_node()
468 if (list_empty(&slab->freelist)) { in alloc_node()
469 list_del(&slab->list); in alloc_node()
470 list_add_tail(&slab->list, &f->full_slabs); in alloc_node()
481 list_del(&slab->list); in free_slab()
482 res = munmap(slab, f->pagesize); in free_slab()
483 if (res == -1) in free_slab()
493 slab->used--; in free_node_mem()
494 if (slab->used) { in free_node_mem()
495 if (list_empty(&slab->freelist)) { in free_node_mem()
496 list_del(&slab->list); in free_node_mem()
497 list_add_tail(&slab->list, &f->partial_slabs); in free_node_mem()
499 list_add_head(n, &slab->freelist); in free_node_mem()
519 uint64_t hash = ((uint32_t) ino * 2654435761U) % f->id_table.size; in id_hash()
520 uint64_t oldhash = hash % (f->id_table.size / 2); in id_hash()
522 if (oldhash >= f->id_table.split) in id_hash()
533 for (node = f->id_table.array[hash]; node != NULL; node = node->id_next) in get_node_nocheck()
534 if (node->nodeid == nodeid) in get_node_nocheck()
558 list_del(&lnode->lru); in remove_node_lru()
559 init_list_head(&lnode->lru); in remove_node_lru()
566 list_del(&lnode->lru); in set_forget_time()
567 list_add_tail(&lnode->lru, &f->lru_table); in set_forget_time()
568 curr_time(&lnode->forget_time); in set_forget_time()
573 if (node->name != node->inline_name) in free_node()
574 free(node->name); in free_node()
580 size_t newsize = t->size / 2; in node_table_reduce()
586 newarray = realloc(t->array, sizeof(struct node *) * newsize); in node_table_reduce()
588 t->array = newarray; in node_table_reduce()
590 t->size = newsize; in node_table_reduce()
591 t->split = t->size / 2; in node_table_reduce()
596 struct node_table *t = &f->id_table; in remerge_id()
599 if (t->split == 0) in remerge_id()
602 for (iter = 8; t->split > 0 && iter; iter--) { in remerge_id()
605 t->split--; in remerge_id()
606 upper = &t->array[t->split + t->size / 2]; in remerge_id()
610 for (nodep = &t->array[t->split]; *nodep; in remerge_id()
611 nodep = &(*nodep)->id_next); in remerge_id()
622 struct node **nodep = &f->id_table.array[id_hash(f, node->nodeid)]; in unhash_id()
624 for (; *nodep != NULL; nodep = &(*nodep)->id_next) in unhash_id()
626 *nodep = node->id_next; in unhash_id()
627 f->id_table.use--; in unhash_id()
629 if(f->id_table.use < f->id_table.size / 4) in unhash_id()
637 size_t newsize = t->size * 2; in node_table_resize()
640 newarray = realloc(t->array, sizeof(struct node *) * newsize); in node_table_resize()
642 return -1; in node_table_resize()
644 t->array = newarray; in node_table_resize()
645 memset(t->array + t->size, 0, t->size * sizeof(struct node *)); in node_table_resize()
646 t->size = newsize; in node_table_resize()
647 t->split = 0; in node_table_resize()
654 struct node_table *t = &f->id_table; in rehash_id()
659 if (t->split == t->size / 2) in rehash_id()
662 hash = t->split; in rehash_id()
663 t->split++; in rehash_id()
664 for (nodep = &t->array[hash]; *nodep != NULL; nodep = next) { in rehash_id()
666 size_t newhash = id_hash(f, node->nodeid); in rehash_id()
670 *nodep = node->id_next; in rehash_id()
671 node->id_next = t->array[newhash]; in rehash_id()
672 t->array[newhash] = node; in rehash_id()
674 next = &node->id_next; in rehash_id()
677 if (t->split == t->size / 2) in rehash_id()
683 size_t hash = id_hash(f, node->nodeid); in hash_id()
684 node->id_next = f->id_table.array[hash]; in hash_id()
685 f->id_table.array[hash] = node; in hash_id()
686 f->id_table.use++; in hash_id()
688 if (f->id_table.use >= f->id_table.size / 2) in hash_id()
701 hash %= f->name_table.size; in name_hash()
702 oldhash = hash % (f->name_table.size / 2); in name_hash()
703 if (oldhash >= f->name_table.split) in name_hash()
713 struct node_table *t = &f->name_table; in remerge_name()
716 if (t->split == 0) in remerge_name()
719 for (iter = 8; t->split > 0 && iter; iter--) { in remerge_name()
722 t->split--; in remerge_name()
723 upper = &t->array[t->split + t->size / 2]; in remerge_name()
727 for (nodep = &t->array[t->split]; *nodep; in remerge_name()
728 nodep = &(*nodep)->name_next); in remerge_name()
739 if (node->name) { in unhash_name()
740 size_t hash = name_hash(f, node->parent->nodeid, node->name); in unhash_name()
741 struct node **nodep = &f->name_table.array[hash]; in unhash_name()
743 for (; *nodep != NULL; nodep = &(*nodep)->name_next) in unhash_name()
745 *nodep = node->name_next; in unhash_name()
746 node->name_next = NULL; in unhash_name()
747 unref_node(f, node->parent); in unhash_name()
748 if (node->name != node->inline_name) in unhash_name()
749 free(node->name); in unhash_name()
750 node->name = NULL; in unhash_name()
751 node->parent = NULL; in unhash_name()
752 f->name_table.use--; in unhash_name()
754 if (f->name_table.use < f->name_table.size / 4) in unhash_name()
760 (unsigned long long) node->nodeid); in unhash_name()
767 struct node_table *t = &f->name_table; in rehash_name()
772 if (t->split == t->size / 2) in rehash_name()
775 hash = t->split; in rehash_name()
776 t->split++; in rehash_name()
777 for (nodep = &t->array[hash]; *nodep != NULL; nodep = next) { in rehash_name()
779 size_t newhash = name_hash(f, node->parent->nodeid, node->name); in rehash_name()
783 *nodep = node->name_next; in rehash_name()
784 node->name_next = t->array[newhash]; in rehash_name()
785 t->array[newhash] = node; in rehash_name()
787 next = &node->name_next; in rehash_name()
790 if (t->split == t->size / 2) in rehash_name()
799 if (strlen(name) < sizeof(node->inline_name)) { in hash_name()
800 strcpy(node->inline_name, name); in hash_name()
801 node->name = node->inline_name; in hash_name()
803 node->name = strdup(name); in hash_name()
804 if (node->name == NULL) in hash_name()
805 return -1; in hash_name()
808 parent->refctr ++; in hash_name()
809 node->parent = parent; in hash_name()
810 node->name_next = f->name_table.array[hash]; in hash_name()
811 f->name_table.array[hash] = node; in hash_name()
812 f->name_table.use++; in hash_name()
814 if (f->name_table.use >= f->name_table.size / 2) in hash_name()
822 if (f->conf.debug) in delete_node()
824 (unsigned long long) node->nodeid); in delete_node()
826 assert(node->treelock == 0); in delete_node()
836 assert(node->refctr > 0); in unref_node()
837 node->refctr --; in unref_node()
838 if (!node->refctr) in unref_node()
845 f->ctr = (f->ctr + 1) & 0xffffffff; in next_id()
846 if (!f->ctr) in next_id()
847 f->generation ++; in next_id()
848 } while (f->ctr == 0 || f->ctr == FUSE_UNKNOWN_INO || in next_id()
849 get_node_nocheck(f, f->ctr) != NULL); in next_id()
850 return f->ctr; in next_id()
859 for (node = f->name_table.array[hash]; node != NULL; node = node->name_next) in lookup_node()
860 if (node->parent->nodeid == parent && in lookup_node()
861 strcmp(node->name, name) == 0) in lookup_node()
869 if (!node->nlookup) in inc_nlookup()
870 node->refctr++; in inc_nlookup()
871 node->nlookup++; in inc_nlookup()
879 pthread_mutex_lock(&f->lock); in find_node()
889 node->nodeid = next_id(f); in find_node()
890 node->generation = f->generation; in find_node()
891 if (f->conf.remember) in find_node()
894 if (hash_name(f, node, parent, name) == -1) { in find_node()
902 init_list_head(&lnode->lru); in find_node()
904 } else if (lru_enabled(f) && node->nlookup == 1) { in find_node()
909 pthread_mutex_unlock(&f->lock); in find_node()
918 return -ENOMEM; in lookup_path_in_cache()
920 pthread_mutex_lock(&f->lock); in lookup_path_in_cache()
929 err = -ENOENT; in lookup_path_in_cache()
932 ino = node->nodeid; in lookup_path_in_cache()
935 pthread_mutex_unlock(&f->lock); in lookup_path_in_cache()
947 if (s - len <= *buf) { in add_name()
948 unsigned pathlen = *bufsize - (s - *buf); in add_name()
964 s = newbuf + newbufsize - pathlen; in add_name()
965 memmove(s, newbuf + *bufsize - pathlen, pathlen); in add_name()
968 s -= len; in add_name()
970 s--; in add_name()
982 assert(wnode->treelock == TREELOCK_WRITE); in unlock_path()
983 wnode->treelock = 0; in unlock_path()
987 node != end && node->nodeid != FUSE_ROOT_ID; node = node->parent) { in unlock_path()
988 assert(node->treelock != 0); in unlock_path()
989 assert(node->treelock != TREELOCK_WAIT_OFFSET); in unlock_path()
990 assert(node->treelock != TREELOCK_WRITE); in unlock_path()
991 node->treelock--; in unlock_path()
992 if (node->treelock == TREELOCK_WAIT_OFFSET) in unlock_path()
993 node->treelock = 0; in unlock_path()
1009 err = -ENOMEM; in try_get_path()
1014 s = buf + bufsize - 1; in try_get_path()
1019 err = -ENOMEM; in try_get_path()
1028 if (wnode->treelock != 0) { in try_get_path()
1029 if (wnode->treelock > 0) in try_get_path()
1030 wnode->treelock += TREELOCK_WAIT_OFFSET; in try_get_path()
1031 err = -EAGAIN; in try_get_path()
1034 wnode->treelock = TREELOCK_WRITE; in try_get_path()
1038 for (node = get_node(f, nodeid); node->nodeid != FUSE_ROOT_ID; in try_get_path()
1039 node = node->parent) { in try_get_path()
1040 err = -ENOENT; in try_get_path()
1041 if (node->name == NULL || node->parent == NULL) in try_get_path()
1044 err = -ENOMEM; in try_get_path()
1045 s = add_name(&buf, &bufsize, s, node->name); in try_get_path()
1050 err = -EAGAIN; in try_get_path()
1051 if (node->treelock < 0) in try_get_path()
1054 node->treelock++; in try_get_path()
1059 memmove(buf, s, bufsize - (s - buf)); in try_get_path()
1083 if (qe->first_locked) { in queue_element_unlock()
1084 wnode = qe->wnode1 ? *qe->wnode1 : NULL; in queue_element_unlock()
1085 unlock_path(f, qe->nodeid1, wnode, NULL); in queue_element_unlock()
1086 qe->first_locked = false; in queue_element_unlock()
1088 if (qe->second_locked) { in queue_element_unlock()
1089 wnode = qe->wnode2 ? *qe->wnode2 : NULL; in queue_element_unlock()
1090 unlock_path(f, qe->nodeid2, wnode, NULL); in queue_element_unlock()
1091 qe->second_locked = false; in queue_element_unlock()
1098 bool first = (qe == f->lockq); in queue_element_wakeup()
1100 if (!qe->path1) { in queue_element_wakeup()
1102 if (get_node(f, qe->nodeid1)->treelock == 0) in queue_element_wakeup()
1103 pthread_cond_signal(&qe->cond); in queue_element_wakeup()
1108 if (!qe->first_locked) { in queue_element_wakeup()
1109 err = try_get_path(f, qe->nodeid1, qe->name1, qe->path1, in queue_element_wakeup()
1110 qe->wnode1, true); in queue_element_wakeup()
1112 qe->first_locked = true; in queue_element_wakeup()
1113 else if (err != -EAGAIN) in queue_element_wakeup()
1116 if (!qe->second_locked && qe->path2) { in queue_element_wakeup()
1117 err = try_get_path(f, qe->nodeid2, qe->name2, qe->path2, in queue_element_wakeup()
1118 qe->wnode2, true); in queue_element_wakeup()
1120 qe->second_locked = true; in queue_element_wakeup()
1121 else if (err != -EAGAIN) in queue_element_wakeup()
1125 if (qe->first_locked && (qe->second_locked || !qe->path2)) { in queue_element_wakeup()
1146 qe->err = err; in queue_element_wakeup()
1147 qe->done = true; in queue_element_wakeup()
1148 pthread_cond_signal(&qe->cond); in queue_element_wakeup()
1155 for (qe = f->lockq; qe != NULL; qe = qe->next) in wake_up_queued()
1162 if (f->conf.debug) { in debug_path()
1170 msg, (unsigned long long) wnode->nodeid); in debug_path()
1182 qe->done = false; in queue_path()
1183 qe->first_locked = false; in queue_path()
1184 qe->second_locked = false; in queue_path()
1185 pthread_cond_init(&qe->cond, NULL); in queue_path()
1186 qe->next = NULL; in queue_path()
1187 for (qp = &f->lockq; *qp != NULL; qp = &(*qp)->next); in queue_path()
1195 pthread_cond_destroy(&qe->cond); in dequeue_path()
1196 for (qp = &f->lockq; *qp != qe; qp = &(*qp)->next); in dequeue_path()
1197 *qp = qe->next; in dequeue_path()
1205 pthread_cond_wait(&qe->cond, &f->lock); in wait_path()
1206 } while (!qe->done); in wait_path()
1210 return qe->err; in wait_path()
1218 pthread_mutex_lock(&f->lock); in get_path_common()
1220 if (err == -EAGAIN) { in get_path_common()
1231 pthread_mutex_unlock(&f->lock); in get_path_common()
1245 if (f->conf.nullpath_ok) { in get_path_nullok()
1249 if (err == -ENOENT) in get_path_nullok()
1281 id1 = node1 ? node1->nodeid : nodeid1; in check_dir_loop()
1284 id2 = node2 ? node2->nodeid : nodeid2; in check_dir_loop()
1286 for (node = get_node(f, id2); node->nodeid != FUSE_ROOT_ID; in check_dir_loop()
1287 node = node->parent) { in check_dir_loop()
1288 if (node->name == NULL || node->parent == NULL) in check_dir_loop()
1291 if (node->nodeid != id2 && node->nodeid == id1) in check_dir_loop()
1292 return -EINVAL; in check_dir_loop()
1297 for (node = get_node(f, id1); node->nodeid != FUSE_ROOT_ID; in check_dir_loop()
1298 node = node->parent) { in check_dir_loop()
1299 if (node->name == NULL || node->parent == NULL) in check_dir_loop()
1302 if (node->nodeid != id1 && node->nodeid == id2) in check_dir_loop()
1303 return -ENOTEMPTY; in check_dir_loop()
1339 pthread_mutex_lock(&f->lock); in get_path2()
1353 if (err == -EAGAIN) { in get_path2()
1375 pthread_mutex_unlock(&f->lock); in get_path2()
1383 pthread_mutex_lock(&f->lock); in free_path_wrlock()
1385 if (f->lockq) in free_path_wrlock()
1387 pthread_mutex_unlock(&f->lock); in free_path_wrlock()
1401 pthread_mutex_lock(&f->lock); in free_path2()
1405 pthread_mutex_unlock(&f->lock); in free_path2()
1415 pthread_mutex_lock(&f->lock); in forget_node()
1422 while (node->nlookup == nlookup && node->treelock) { in forget_node()
1431 pthread_cond_wait(&qe.cond, &f->lock); in forget_node()
1432 } while (node->nlookup == nlookup && node->treelock); in forget_node()
1438 assert(node->nlookup >= nlookup); in forget_node()
1439 node->nlookup -= nlookup; in forget_node()
1440 if (!node->nlookup) { in forget_node()
1442 } else if (lru_enabled(f) && node->nlookup == 1) { in forget_node()
1445 pthread_mutex_unlock(&f->lock); in forget_node()
1450 if (f->conf.remember) { in unlink_node()
1451 assert(node->nlookup > 1); in unlink_node()
1452 node->nlookup--; in unlink_node()
1461 pthread_mutex_lock(&f->lock); in remove_node()
1465 pthread_mutex_unlock(&f->lock); in remove_node()
1475 pthread_mutex_lock(&f->lock); in rename_node()
1484 err = -EBUSY; in rename_node()
1491 if (hash_name(f, node, newdir, newname) == -1) { in rename_node()
1492 err = -ENOMEM; in rename_node()
1497 node->is_hidden = 1; in rename_node()
1500 pthread_mutex_unlock(&f->lock); in rename_node()
1511 pthread_mutex_lock(&f->lock); in exchange_node()
1520 err = -ENOMEM; in exchange_node()
1522 if (hash_name(f, oldnode, newdir, newname) == -1) in exchange_node()
1526 if (hash_name(f, newnode, olddir, oldname) == -1) in exchange_node()
1531 pthread_mutex_unlock(&f->lock); in exchange_node()
1537 if (!f->conf.use_ino) in set_stat()
1538 stbuf->st_ino = nodeid; in set_stat()
1539 if (f->conf.set_mode) in set_stat()
1540 stbuf->st_mode = (stbuf->st_mode & S_IFMT) | in set_stat()
1541 (0777 & ~f->conf.umask); in set_stat()
1542 if (f->conf.set_uid) in set_stat()
1543 stbuf->st_uid = f->conf.uid; in set_stat()
1544 if (f->conf.set_gid) in set_stat()
1545 stbuf->st_gid = f->conf.gid; in set_stat()
1570 if (d->id == pthread_self()) in fuse_interrupt()
1573 pthread_mutex_lock(&f->lock); in fuse_interrupt()
1574 while (!d->finished) { in fuse_interrupt()
1578 pthread_kill(d->id, f->conf.intr_signal); in fuse_interrupt()
1582 pthread_cond_timedwait(&d->cond, &f->lock, &timeout); in fuse_interrupt()
1584 pthread_mutex_unlock(&f->lock); in fuse_interrupt()
1590 pthread_mutex_lock(&f->lock); in fuse_do_finish_interrupt()
1591 d->finished = 1; in fuse_do_finish_interrupt()
1592 pthread_cond_broadcast(&d->cond); in fuse_do_finish_interrupt()
1593 pthread_mutex_unlock(&f->lock); in fuse_do_finish_interrupt()
1595 pthread_cond_destroy(&d->cond); in fuse_do_finish_interrupt()
1600 d->id = pthread_self(); in fuse_do_prepare_interrupt()
1601 pthread_cond_init(&d->cond, NULL); in fuse_do_prepare_interrupt()
1602 d->finished = 0; in fuse_do_prepare_interrupt()
1609 if (f->conf.intr) in fuse_finish_interrupt()
1616 if (f->conf.intr) in fuse_prepare_interrupt()
1625 snprintf(buf, len, "%llu", (unsigned long long) fi->fh); in file_info_string()
1632 fuse_get_context()->private_data = fs->user_data; in fuse_fs_getattr()
1633 if (fs->op.getattr) { in fuse_fs_getattr()
1634 if (fs->debug) { in fuse_fs_getattr()
1640 return fs->op.getattr(path, buf, fi); in fuse_fs_getattr()
1642 return -ENOSYS; in fuse_fs_getattr()
1649 fuse_get_context()->private_data = fs->user_data; in fuse_fs_rename()
1650 if (fs->op.rename) { in fuse_fs_rename()
1651 if (fs->debug) in fuse_fs_rename()
1655 return fs->op.rename(oldpath, newpath, flags); in fuse_fs_rename()
1657 return -ENOSYS; in fuse_fs_rename()
1663 fuse_get_context()->private_data = fs->user_data; in fuse_fs_unlink()
1664 if (fs->op.unlink) { in fuse_fs_unlink()
1665 if (fs->debug) in fuse_fs_unlink()
1668 return fs->op.unlink(path); in fuse_fs_unlink()
1670 return -ENOSYS; in fuse_fs_unlink()
1676 fuse_get_context()->private_data = fs->user_data; in fuse_fs_rmdir()
1677 if (fs->op.rmdir) { in fuse_fs_rmdir()
1678 if (fs->debug) in fuse_fs_rmdir()
1681 return fs->op.rmdir(path); in fuse_fs_rmdir()
1683 return -ENOSYS; in fuse_fs_rmdir()
1689 fuse_get_context()->private_data = fs->user_data; in fuse_fs_symlink()
1690 if (fs->op.symlink) { in fuse_fs_symlink()
1691 if (fs->debug) in fuse_fs_symlink()
1694 return fs->op.symlink(linkname, path); in fuse_fs_symlink()
1696 return -ENOSYS; in fuse_fs_symlink()
1702 fuse_get_context()->private_data = fs->user_data; in fuse_fs_link()
1703 if (fs->op.link) { in fuse_fs_link()
1704 if (fs->debug) in fuse_fs_link()
1707 return fs->op.link(oldpath, newpath); in fuse_fs_link()
1709 return -ENOSYS; in fuse_fs_link()
1716 fuse_get_context()->private_data = fs->user_data; in fuse_fs_release()
1717 if (fs->op.release) { in fuse_fs_release()
1718 if (fs->debug) in fuse_fs_release()
1720 fi->flush ? "+flush" : "", in fuse_fs_release()
1721 (unsigned long long) fi->fh, fi->flags); in fuse_fs_release()
1723 return fs->op.release(path, fi); in fuse_fs_release()
1732 fuse_get_context()->private_data = fs->user_data; in fuse_fs_opendir()
1733 if (fs->op.opendir) { in fuse_fs_opendir()
1736 if (fs->debug) in fuse_fs_opendir()
1737 fuse_log(FUSE_LOG_DEBUG, "opendir flags: 0x%x %s\n", fi->flags, in fuse_fs_opendir()
1740 err = fs->op.opendir(path, fi); in fuse_fs_opendir()
1742 if (fs->debug && !err) in fuse_fs_opendir()
1744 (unsigned long long) fi->fh, fi->flags, path); in fuse_fs_opendir()
1755 fuse_get_context()->private_data = fs->user_data; in fuse_fs_open()
1756 if (fs->op.open) { in fuse_fs_open()
1759 if (fs->debug) in fuse_fs_open()
1760 fuse_log(FUSE_LOG_DEBUG, "open flags: 0x%x %s\n", fi->flags, in fuse_fs_open()
1763 err = fs->op.open(path, fi); in fuse_fs_open()
1765 if (fs->debug && !err) in fuse_fs_open()
1767 (unsigned long long) fi->fh, fi->flags, path); in fuse_fs_open()
1780 for (i = 0; i < buf->count; i++) in fuse_free_buf()
1781 if (!(buf->buf[i].flags & FUSE_BUF_IS_FD)) in fuse_free_buf()
1782 free(buf->buf[i].mem); in fuse_free_buf()
1791 fuse_get_context()->private_data = fs->user_data; in fuse_fs_read_buf()
1792 if (fs->op.read || fs->op.read_buf) { in fuse_fs_read_buf()
1795 if (fs->debug) in fuse_fs_read_buf()
1798 (unsigned long long) fi->fh, in fuse_fs_read_buf()
1799 size, (unsigned long long) off, fi->flags); in fuse_fs_read_buf()
1801 if (fs->op.read_buf) { in fuse_fs_read_buf()
1802 res = fs->op.read_buf(path, bufp, size, off, fi); in fuse_fs_read_buf()
1809 return -ENOMEM; in fuse_fs_read_buf()
1814 return -ENOMEM; in fuse_fs_read_buf()
1817 buf->buf[0].mem = mem; in fuse_fs_read_buf()
1820 res = fs->op.read(path, mem, size, off, fi); in fuse_fs_read_buf()
1822 buf->buf[0].size = res; in fuse_fs_read_buf()
1825 if (fs->debug && res >= 0) in fuse_fs_read_buf()
1827 (unsigned long long) fi->fh, in fuse_fs_read_buf()
1838 return -ENOSYS; in fuse_fs_read_buf()
1845 fuse_get_context()->private_data = fs->user_data; in fuse_fs_read()
1846 if (fs->op.read || fs->op.read_buf) { in fuse_fs_read()
1849 if (fs->debug) in fuse_fs_read()
1852 (unsigned long long) fi->fh, in fuse_fs_read()
1853 size, (unsigned long long) off, fi->flags); in fuse_fs_read()
1855 if (fs->op.read_buf) { in fuse_fs_read()
1858 res = fs->op.read_buf(path, &buf, size, off, fi); in fuse_fs_read()
1867 res = fs->op.read(path, mem, size, off, fi); in fuse_fs_read()
1870 if (fs->debug && res >= 0) in fuse_fs_read()
1872 (unsigned long long) fi->fh, in fuse_fs_read()
1880 return -ENOSYS; in fuse_fs_read()
1888 fuse_get_context()->private_data = fs->user_data; in fuse_fs_write_buf()
1889 if (fs->op.write_buf || fs->op.write) { in fuse_fs_write_buf()
1893 assert(buf->idx == 0 && buf->off == 0); in fuse_fs_write_buf()
1894 if (fs->debug) in fuse_fs_write_buf()
1897 fi->writepage ? "page" : "", in fuse_fs_write_buf()
1898 (unsigned long long) fi->fh, in fuse_fs_write_buf()
1901 fi->flags); in fuse_fs_write_buf()
1903 if (fs->op.write_buf) { in fuse_fs_write_buf()
1904 res = fs->op.write_buf(path, buf, off, fi); in fuse_fs_write_buf()
1910 if (buf->count == 1 && in fuse_fs_write_buf()
1911 !(buf->buf[0].flags & FUSE_BUF_IS_FD)) { in fuse_fs_write_buf()
1912 flatbuf = &buf->buf[0]; in fuse_fs_write_buf()
1914 res = -ENOMEM; in fuse_fs_write_buf()
1928 res = fs->op.write(path, flatbuf->mem, flatbuf->size, in fuse_fs_write_buf()
1934 if (fs->debug && res >= 0) in fuse_fs_write_buf()
1936 fi->writepage ? "page" : "", in fuse_fs_write_buf()
1937 (unsigned long long) fi->fh, res, in fuse_fs_write_buf()
1944 return -ENOSYS; in fuse_fs_write_buf()
1961 fuse_get_context()->private_data = fs->user_data; in fuse_fs_fsync()
1962 if (fs->op.fsync) { in fuse_fs_fsync()
1963 if (fs->debug) in fuse_fs_fsync()
1965 (unsigned long long) fi->fh, datasync); in fuse_fs_fsync()
1967 return fs->op.fsync(path, datasync, fi); in fuse_fs_fsync()
1969 return -ENOSYS; in fuse_fs_fsync()
1976 fuse_get_context()->private_data = fs->user_data; in fuse_fs_fsyncdir()
1977 if (fs->op.fsyncdir) { in fuse_fs_fsyncdir()
1978 if (fs->debug) in fuse_fs_fsyncdir()
1980 (unsigned long long) fi->fh, datasync); in fuse_fs_fsyncdir()
1982 return fs->op.fsyncdir(path, datasync, fi); in fuse_fs_fsyncdir()
1984 return -ENOSYS; in fuse_fs_fsyncdir()
1991 fuse_get_context()->private_data = fs->user_data; in fuse_fs_flush()
1992 if (fs->op.flush) { in fuse_fs_flush()
1993 if (fs->debug) in fuse_fs_flush()
1995 (unsigned long long) fi->fh); in fuse_fs_flush()
1997 return fs->op.flush(path, fi); in fuse_fs_flush()
1999 return -ENOSYS; in fuse_fs_flush()
2005 fuse_get_context()->private_data = fs->user_data; in fuse_fs_statfs()
2006 if (fs->op.statfs) { in fuse_fs_statfs()
2007 if (fs->debug) in fuse_fs_statfs()
2010 return fs->op.statfs(path, buf); in fuse_fs_statfs()
2012 buf->f_namemax = 255; in fuse_fs_statfs()
2013 buf->f_bsize = 512; in fuse_fs_statfs()
2021 fuse_get_context()->private_data = fs->user_data; in fuse_fs_releasedir()
2022 if (fs->op.releasedir) { in fuse_fs_releasedir()
2023 if (fs->debug) in fuse_fs_releasedir()
2025 (unsigned long long) fi->fh, fi->flags); in fuse_fs_releasedir()
2027 return fs->op.releasedir(path, fi); in fuse_fs_releasedir()
2038 fuse_get_context()->private_data = fs->user_data; in fuse_fs_readdir()
2039 if (fs->op.readdir) { in fuse_fs_readdir()
2040 if (fs->debug) { in fuse_fs_readdir()
2043 (unsigned long long) fi->fh, in fuse_fs_readdir()
2047 return fs->op.readdir(path, buf, filler, off, fi, flags); in fuse_fs_readdir()
2049 return -ENOSYS; in fuse_fs_readdir()
2056 fuse_get_context()->private_data = fs->user_data; in fuse_fs_create()
2057 if (fs->op.create) { in fuse_fs_create()
2060 if (fs->debug) in fuse_fs_create()
2063 fi->flags, path, mode, in fuse_fs_create()
2064 fuse_get_context()->umask); in fuse_fs_create()
2066 err = fs->op.create(path, mode, fi); in fuse_fs_create()
2068 if (fs->debug && !err) in fuse_fs_create()
2070 (unsigned long long) fi->fh, fi->flags, path); in fuse_fs_create()
2074 return -ENOSYS; in fuse_fs_create()
2081 fuse_get_context()->private_data = fs->user_data; in fuse_fs_lock()
2082 if (fs->op.lock) { in fuse_fs_lock()
2083 if (fs->debug) in fuse_fs_lock()
2085 (unsigned long long) fi->fh, in fuse_fs_lock()
2089 (lock->l_type == F_RDLCK ? "F_RDLCK" : in fuse_fs_lock()
2090 (lock->l_type == F_WRLCK ? "F_WRLCK" : in fuse_fs_lock()
2091 (lock->l_type == F_UNLCK ? "F_UNLCK" : in fuse_fs_lock()
2093 (unsigned long long) lock->l_start, in fuse_fs_lock()
2094 (unsigned long long) lock->l_len, in fuse_fs_lock()
2095 (unsigned long long) lock->l_pid); in fuse_fs_lock()
2097 return fs->op.lock(path, fi, cmd, lock); in fuse_fs_lock()
2099 return -ENOSYS; in fuse_fs_lock()
2106 fuse_get_context()->private_data = fs->user_data; in fuse_fs_flock()
2107 if (fs->op.flock) { in fuse_fs_flock()
2108 if (fs->debug) { in fuse_fs_flock()
2112 (unsigned long long) fi->fh, in fuse_fs_flock()
2118 return fs->op.flock(path, fi, op); in fuse_fs_flock()
2120 return -ENOSYS; in fuse_fs_flock()
2127 fuse_get_context()->private_data = fs->user_data; in fuse_fs_chown()
2128 if (fs->op.chown) { in fuse_fs_chown()
2129 if (fs->debug) { in fuse_fs_chown()
2135 return fs->op.chown(path, uid, gid, fi); in fuse_fs_chown()
2137 return -ENOSYS; in fuse_fs_chown()
2144 fuse_get_context()->private_data = fs->user_data; in fuse_fs_truncate()
2145 if (fs->op.truncate) { in fuse_fs_truncate()
2146 if (fs->debug) { in fuse_fs_truncate()
2152 return fs->op.truncate(path, size, fi); in fuse_fs_truncate()
2154 return -ENOSYS; in fuse_fs_truncate()
2161 fuse_get_context()->private_data = fs->user_data; in fuse_fs_utimens()
2162 if (fs->op.utimens) { in fuse_fs_utimens()
2163 if (fs->debug) { in fuse_fs_utimens()
2170 return fs->op.utimens(path, tv, fi); in fuse_fs_utimens()
2172 return -ENOSYS; in fuse_fs_utimens()
2178 fuse_get_context()->private_data = fs->user_data; in fuse_fs_access()
2179 if (fs->op.access) { in fuse_fs_access()
2180 if (fs->debug) in fuse_fs_access()
2183 return fs->op.access(path, mask); in fuse_fs_access()
2185 return -ENOSYS; in fuse_fs_access()
2192 fuse_get_context()->private_data = fs->user_data; in fuse_fs_readlink()
2193 if (fs->op.readlink) { in fuse_fs_readlink()
2194 if (fs->debug) in fuse_fs_readlink()
2198 return fs->op.readlink(path, buf, len); in fuse_fs_readlink()
2200 return -ENOSYS; in fuse_fs_readlink()
2207 fuse_get_context()->private_data = fs->user_data; in fuse_fs_mknod()
2208 if (fs->op.mknod) { in fuse_fs_mknod()
2209 if (fs->debug) in fuse_fs_mknod()
2212 fuse_get_context()->umask); in fuse_fs_mknod()
2214 return fs->op.mknod(path, mode, rdev); in fuse_fs_mknod()
2216 return -ENOSYS; in fuse_fs_mknod()
2222 fuse_get_context()->private_data = fs->user_data; in fuse_fs_mkdir()
2223 if (fs->op.mkdir) { in fuse_fs_mkdir()
2224 if (fs->debug) in fuse_fs_mkdir()
2226 path, mode, fuse_get_context()->umask); in fuse_fs_mkdir()
2228 return fs->op.mkdir(path, mode); in fuse_fs_mkdir()
2230 return -ENOSYS; in fuse_fs_mkdir()
2237 fuse_get_context()->private_data = fs->user_data; in fuse_fs_setxattr()
2238 if (fs->op.setxattr) { in fuse_fs_setxattr()
2239 if (fs->debug) in fuse_fs_setxattr()
2243 return fs->op.setxattr(path, name, value, size, flags); in fuse_fs_setxattr()
2245 return -ENOSYS; in fuse_fs_setxattr()
2252 fuse_get_context()->private_data = fs->user_data; in fuse_fs_getxattr()
2253 if (fs->op.getxattr) { in fuse_fs_getxattr()
2254 if (fs->debug) in fuse_fs_getxattr()
2258 return fs->op.getxattr(path, name, value, size); in fuse_fs_getxattr()
2260 return -ENOSYS; in fuse_fs_getxattr()
2267 fuse_get_context()->private_data = fs->user_data; in fuse_fs_listxattr()
2268 if (fs->op.listxattr) { in fuse_fs_listxattr()
2269 if (fs->debug) in fuse_fs_listxattr()
2273 return fs->op.listxattr(path, list, size); in fuse_fs_listxattr()
2275 return -ENOSYS; in fuse_fs_listxattr()
2282 fuse_get_context()->private_data = fs->user_data; in fuse_fs_bmap()
2283 if (fs->op.bmap) { in fuse_fs_bmap()
2284 if (fs->debug) in fuse_fs_bmap()
2289 return fs->op.bmap(path, blocksize, idx); in fuse_fs_bmap()
2291 return -ENOSYS; in fuse_fs_bmap()
2297 fuse_get_context()->private_data = fs->user_data; in fuse_fs_removexattr()
2298 if (fs->op.removexattr) { in fuse_fs_removexattr()
2299 if (fs->debug) in fuse_fs_removexattr()
2302 return fs->op.removexattr(path, name); in fuse_fs_removexattr()
2304 return -ENOSYS; in fuse_fs_removexattr()
2312 fuse_get_context()->private_data = fs->user_data; in fuse_fs_ioctl()
2313 if (fs->op.ioctl) { in fuse_fs_ioctl()
2314 if (fs->debug) in fuse_fs_ioctl()
2316 (unsigned long long) fi->fh, cmd, flags); in fuse_fs_ioctl()
2318 return fs->op.ioctl(path, cmd, arg, fi, flags, data); in fuse_fs_ioctl()
2320 return -ENOSYS; in fuse_fs_ioctl()
2327 fuse_get_context()->private_data = fs->user_data; in fuse_fs_poll()
2328 if (fs->op.poll) { in fuse_fs_poll()
2331 if (fs->debug) in fuse_fs_poll()
2333 (unsigned long long) fi->fh, ph, in fuse_fs_poll()
2334 fi->poll_events); in fuse_fs_poll()
2336 res = fs->op.poll(path, fi, ph, reventsp); in fuse_fs_poll()
2338 if (fs->debug && !res) in fuse_fs_poll()
2340 (unsigned long long) fi->fh, *reventsp); in fuse_fs_poll()
2344 return -ENOSYS; in fuse_fs_poll()
2350 fuse_get_context()->private_data = fs->user_data; in fuse_fs_fallocate()
2351 if (fs->op.fallocate) { in fuse_fs_fallocate()
2352 if (fs->debug) in fuse_fs_fallocate()
2359 return fs->op.fallocate(path, mode, offset, length, fi); in fuse_fs_fallocate()
2361 return -ENOSYS; in fuse_fs_fallocate()
2370 fuse_get_context()->private_data = fs->user_data; in fuse_fs_copy_file_range()
2371 if (fs->op.copy_file_range) { in fuse_fs_copy_file_range()
2372 if (fs->debug) in fuse_fs_copy_file_range()
2381 return fs->op.copy_file_range(path_in, fi_in, off_in, path_out, in fuse_fs_copy_file_range()
2384 return -ENOSYS; in fuse_fs_copy_file_range()
2390 fuse_get_context()->private_data = fs->user_data; in fuse_fs_lseek()
2391 if (fs->op.lseek) { in fuse_fs_lseek()
2392 if (fs->debug) { in fuse_fs_lseek()
2398 return fs->op.lseek(path, off, whence, fi); in fuse_fs_lseek()
2400 return -ENOSYS; in fuse_fs_lseek()
2408 pthread_mutex_lock(&f->lock); in is_open()
2410 if (node && node->open_count > 0) in is_open()
2412 pthread_mutex_unlock(&f->lock); in is_open()
2427 pthread_mutex_lock(&f->lock); in hidden_name()
2430 pthread_mutex_unlock(&f->lock); in hidden_name()
2434 f->hidectr ++; in hidden_name()
2436 (unsigned int) node->nodeid, f->hidectr); in hidden_name()
2441 pthread_mutex_unlock(&f->lock); in hidden_name()
2446 res = fuse_fs_getattr(f->fs, newpath, &buf, NULL); in hidden_name()
2447 if (res == -ENOENT) in hidden_name()
2451 } while(res == 0 && --failctr); in hidden_name()
2461 int err = -EBUSY; in hide_node()
2465 err = fuse_fs_rename(f->fs, oldpath, newpath, 0); in hide_node()
2475 return stbuf->st_mtime == ts->tv_sec && in mtime_eq()
2476 ST_MTIM_NSEC(stbuf) == ts->tv_nsec; in mtime_eq()
2487 if (res == -1 && errno == EINVAL) { in curr_time()
2491 if (res == -1) { in curr_time()
2499 if (node->cache_valid && (!mtime_eq(stbuf, &node->mtime) || in update_stat()
2500 stbuf->st_size != node->size)) in update_stat()
2501 node->cache_valid = 0; in update_stat()
2502 node->mtime.tv_sec = stbuf->st_mtime; in update_stat()
2503 node->mtime.tv_nsec = ST_MTIM_NSEC(stbuf); in update_stat()
2504 node->size = stbuf->st_size; in update_stat()
2505 curr_time(&node->stat_updated); in update_stat()
2515 return -ENOMEM; in do_lookup()
2517 e->ino = node->nodeid; in do_lookup()
2518 e->generation = node->generation; in do_lookup()
2519 e->entry_timeout = f->conf.entry_timeout; in do_lookup()
2520 e->attr_timeout = f->conf.attr_timeout; in do_lookup()
2521 if (f->conf.auto_cache) { in do_lookup()
2522 pthread_mutex_lock(&f->lock); in do_lookup()
2523 update_stat(node, &e->attr); in do_lookup()
2524 pthread_mutex_unlock(&f->lock); in do_lookup()
2526 set_stat(f, e->ino, &e->attr); in do_lookup()
2537 res = fuse_fs_getattr(f->fs, path, &e->attr, fi); in lookup_path()
2540 if (res == 0 && f->conf.debug) { in lookup_path()
2542 (unsigned long long) e->ino); in lookup_path()
2571 c->ctx.fuse = f; in fuse_create_context()
2591 return -1; in fuse_create_context_key()
2602 fuse_context_ref--; in fuse_delete_context_key()
2614 c->req = req; in req_fuse_prepare()
2615 c->ctx.uid = ctx->uid; in req_fuse_prepare()
2616 c->ctx.gid = ctx->gid; in req_fuse_prepare()
2617 c->ctx.pid = ctx->pid; in req_fuse_prepare()
2618 c->ctx.umask = ctx->umask; in req_fuse_prepare()
2619 return c->ctx.fuse; in req_fuse_prepare()
2624 /* fuse_reply_err() uses non-negated errno values */ in reply_err()
2625 fuse_reply_err(req, -err); in reply_err()
2633 if (fuse_reply_entry(req, e) == -ENOENT) { in reply_entry()
2634 /* Skip forget for negative result */ in reply_entry()
2635 if (e->ino != 0) in reply_entry()
2636 forget_node(f, e->ino, 1); in reply_entry()
2645 fuse_get_context()->private_data = fs->user_data; in fuse_fs_init()
2646 if (!fs->op.write_buf) in fuse_fs_init()
2647 conn->want &= ~FUSE_CAP_SPLICE_READ; in fuse_fs_init()
2648 if (!fs->op.lock) in fuse_fs_init()
2649 conn->want &= ~FUSE_CAP_POSIX_LOCKS; in fuse_fs_init()
2650 if (!fs->op.flock) in fuse_fs_init()
2651 conn->want &= ~FUSE_CAP_FLOCK_LOCKS; in fuse_fs_init()
2652 if (fs->op.init) in fuse_fs_init()
2653 fs->user_data = fs->op.init(conn, cfg); in fuse_fs_init()
2661 if(conn->capable & FUSE_CAP_EXPORT_SUPPORT) in fuse_lib_init()
2662 conn->want |= FUSE_CAP_EXPORT_SUPPORT; in fuse_lib_init()
2663 fuse_fs_init(f->fs, conn, &f->conf); in fuse_lib_init()
2668 fuse_get_context()->private_data = fs->user_data; in fuse_fs_destroy()
2669 if (fs->op.destroy) in fuse_fs_destroy()
2670 fs->op.destroy(fs->user_data); in fuse_fs_destroy()
2671 if (fs->m) in fuse_fs_destroy()
2672 fuse_put_module(fs->m); in fuse_fs_destroy()
2681 fuse_fs_destroy(f->fs); in fuse_lib_destroy()
2682 f->fs = NULL; in fuse_lib_destroy()
2698 pthread_mutex_lock(&f->lock); in fuse_lib_lookup()
2700 if (f->conf.debug) in fuse_lib_lookup()
2701 fuse_log(FUSE_LOG_DEBUG, "LOOKUP-DOT\n"); in fuse_lib_lookup()
2704 pthread_mutex_unlock(&f->lock); in fuse_lib_lookup()
2705 reply_entry(req, &e, -ESTALE); in fuse_lib_lookup()
2708 dot->refctr++; in fuse_lib_lookup()
2710 if (f->conf.debug) in fuse_lib_lookup()
2711 fuse_log(FUSE_LOG_DEBUG, "LOOKUP-DOTDOT\n"); in fuse_lib_lookup()
2712 parent = get_node(f, parent)->parent->nodeid; in fuse_lib_lookup()
2714 pthread_mutex_unlock(&f->lock); in fuse_lib_lookup()
2722 if (f->conf.debug) in fuse_lib_lookup()
2726 if (err == -ENOENT && f->conf.negative_timeout != 0.0) { in fuse_lib_lookup()
2728 e.entry_timeout = f->conf.negative_timeout; in fuse_lib_lookup()
2735 pthread_mutex_lock(&f->lock); in fuse_lib_lookup()
2737 pthread_mutex_unlock(&f->lock); in fuse_lib_lookup()
2744 if (f->conf.debug) in do_forget()
2786 err = fuse_fs_getattr(f->fs, path, &buf, fi); in fuse_lib_getattr()
2793 pthread_mutex_lock(&f->lock); in fuse_lib_getattr()
2795 if (node->is_hidden && buf.st_nlink > 0) in fuse_lib_getattr()
2796 buf.st_nlink--; in fuse_lib_getattr()
2797 if (f->conf.auto_cache) in fuse_lib_getattr()
2799 pthread_mutex_unlock(&f->lock); in fuse_lib_getattr()
2801 fuse_reply_attr(req, &buf, f->conf.attr_timeout); in fuse_lib_getattr()
2809 fuse_get_context()->private_data = fs->user_data; in fuse_fs_chmod()
2810 if (fs->op.chmod) { in fuse_fs_chmod()
2811 if (fs->debug) { in fuse_fs_chmod()
2817 return fs->op.chmod(path, mode, fi); in fuse_fs_chmod()
2820 return -ENOSYS; in fuse_fs_chmod()
2841 err = fuse_fs_chmod(f->fs, path, attr->st_mode, fi); in fuse_lib_setattr()
2844 attr->st_uid : (uid_t) -1; in fuse_lib_setattr()
2846 attr->st_gid : (gid_t) -1; in fuse_lib_setattr()
2847 err = fuse_fs_chown(f->fs, path, uid, gid, fi); in fuse_lib_setattr()
2850 err = fuse_fs_truncate(f->fs, path, in fuse_lib_setattr()
2851 attr->st_size, fi); in fuse_lib_setattr()
2866 tv[0] = attr->st_atim; in fuse_lib_setattr()
2871 tv[1] = attr->st_mtim; in fuse_lib_setattr()
2873 err = fuse_fs_utimens(f->fs, path, tv, fi); in fuse_lib_setattr()
2880 tv[0].tv_sec = attr->st_atime; in fuse_lib_setattr()
2882 tv[1].tv_sec = attr->st_mtime; in fuse_lib_setattr()
2884 err = fuse_fs_utimens(f->fs, path, tv, fi); in fuse_lib_setattr()
2887 err = fuse_fs_getattr(f->fs, path, &buf, fi); in fuse_lib_setattr()
2893 if (f->conf.auto_cache) { in fuse_lib_setattr()
2894 pthread_mutex_lock(&f->lock); in fuse_lib_setattr()
2896 pthread_mutex_unlock(&f->lock); in fuse_lib_setattr()
2899 fuse_reply_attr(req, &buf, f->conf.attr_timeout); in fuse_lib_setattr()
2915 err = fuse_fs_access(f->fs, path, mask); in fuse_lib_access()
2933 err = fuse_fs_readlink(f->fs, path, linkname, sizeof(linkname)); in fuse_lib_readlink()
2957 err = -ENOSYS; in fuse_lib_mknod()
2963 err = fuse_fs_create(f->fs, path, mode, &fi); in fuse_lib_mknod()
2967 fuse_fs_release(f->fs, path, &fi); in fuse_lib_mknod()
2970 if (err == -ENOSYS) { in fuse_lib_mknod()
2971 err = fuse_fs_mknod(f->fs, path, mode, rdev); in fuse_lib_mknod()
2995 err = fuse_fs_mkdir(f->fs, path, mode); in fuse_lib_mkdir()
3017 if (!f->conf.hard_remove && is_open(f, parent, name)) { in fuse_lib_unlink()
3020 err = fuse_fs_unlink(f->fs, path); in fuse_lib_unlink()
3042 err = fuse_fs_rmdir(f->fs, path); in fuse_lib_rmdir()
3064 err = fuse_fs_symlink(f->fs, linkname, path); in fuse_lib_symlink()
3090 if (!f->conf.hard_remove && !(flags & RENAME_EXCHANGE) && in fuse_lib_rename()
3094 err = fuse_fs_rename(f->fs, oldpath, newpath, flags); in fuse_lib_rename()
3126 err = fuse_fs_link(f->fs, oldpath, newpath); in fuse_lib_link()
3142 fuse_fs_release(f->fs, path, fi); in fuse_do_release()
3144 pthread_mutex_lock(&f->lock); in fuse_do_release()
3146 assert(node->open_count > 0); in fuse_do_release()
3147 --node->open_count; in fuse_do_release()
3148 if (node->is_hidden && !node->open_count) { in fuse_do_release()
3150 node->is_hidden = 0; in fuse_do_release()
3152 pthread_mutex_unlock(&f->lock); in fuse_do_release()
3156 fuse_fs_unlink(f->fs, path); in fuse_do_release()
3157 } else if (f->conf.nullpath_ok) { in fuse_do_release()
3161 fuse_fs_unlink(f->fs, unlinkpath); in fuse_do_release()
3181 err = fuse_fs_create(f->fs, path, mode, fi); in fuse_lib_create()
3185 fuse_fs_release(f->fs, path, fi); in fuse_lib_create()
3187 err = -EIO; in fuse_lib_create()
3188 fuse_fs_release(f->fs, path, fi); in fuse_lib_create()
3191 if (f->conf.direct_io) in fuse_lib_create()
3192 fi->direct_io = 1; in fuse_lib_create()
3193 if (f->conf.kernel_cache) in fuse_lib_create()
3194 fi->keep_cache = 1; in fuse_lib_create()
3201 pthread_mutex_lock(&f->lock); in fuse_lib_create()
3202 get_node(f, e.ino)->open_count++; in fuse_lib_create()
3203 pthread_mutex_unlock(&f->lock); in fuse_lib_create()
3204 if (fuse_reply_create(req, &e, fi) == -ENOENT) { in fuse_lib_create()
3220 return (t1->tv_sec - t2->tv_sec) + in diff_timespec()
3221 ((double) t1->tv_nsec - (double) t2->tv_nsec) / 1000000000.0; in diff_timespec()
3229 pthread_mutex_lock(&f->lock); in open_auto_cache()
3231 if (node->cache_valid) { in open_auto_cache()
3235 if (diff_timespec(&now, &node->stat_updated) > in open_auto_cache()
3236 f->conf.ac_attr_timeout) { in open_auto_cache()
3239 pthread_mutex_unlock(&f->lock); in open_auto_cache()
3240 err = fuse_fs_getattr(f->fs, path, &stbuf, fi); in open_auto_cache()
3241 pthread_mutex_lock(&f->lock); in open_auto_cache()
3245 node->cache_valid = 0; in open_auto_cache()
3248 if (node->cache_valid) in open_auto_cache()
3249 fi->keep_cache = 1; in open_auto_cache()
3251 node->cache_valid = 1; in open_auto_cache()
3252 pthread_mutex_unlock(&f->lock); in open_auto_cache()
3266 err = fuse_fs_open(f->fs, path, fi); in fuse_lib_open()
3268 if (f->conf.direct_io) in fuse_lib_open()
3269 fi->direct_io = 1; in fuse_lib_open()
3270 if (f->conf.kernel_cache) in fuse_lib_open()
3271 fi->keep_cache = 1; in fuse_lib_open()
3273 if (f->conf.auto_cache) in fuse_lib_open()
3279 pthread_mutex_lock(&f->lock); in fuse_lib_open()
3280 get_node(f, ino)->open_count++; in fuse_lib_open()
3281 pthread_mutex_unlock(&f->lock); in fuse_lib_open()
3282 if (fuse_reply_open(req, fi) == -ENOENT) { in fuse_lib_open()
3306 res = fuse_fs_read_buf(f->fs, path, &buf, size, off, fi); in fuse_lib_read()
3332 res = fuse_fs_write_buf(f->fs, path, buf, off, fi); in fuse_lib_write_buf()
3355 err = fuse_fs_fsync(f->fs, path, datasync, fi); in fuse_lib_fsync()
3365 struct fuse_dh *dh = (struct fuse_dh *) (uintptr_t) llfi->fh; in get_dirhandle()
3367 fi->fh = dh->fh; in get_dirhandle()
3383 reply_err(req, -ENOMEM); in fuse_lib_opendir()
3387 dh->fuse = f; in fuse_lib_opendir()
3388 dh->contents = NULL; in fuse_lib_opendir()
3389 dh->first = NULL; in fuse_lib_opendir()
3390 dh->len = 0; in fuse_lib_opendir()
3391 dh->filled = 0; in fuse_lib_opendir()
3392 dh->nodeid = ino; in fuse_lib_opendir()
3393 pthread_mutex_init(&dh->lock, NULL); in fuse_lib_opendir()
3395 llfi->fh = (uintptr_t) dh; in fuse_lib_opendir()
3398 fi.flags = llfi->flags; in fuse_lib_opendir()
3403 err = fuse_fs_opendir(f->fs, path, &fi); in fuse_lib_opendir()
3405 dh->fh = fi.fh; in fuse_lib_opendir()
3408 if (fuse_reply_open(req, llfi) == -ENOENT) { in fuse_lib_opendir()
3411 fuse_fs_releasedir(f->fs, path, &fi); in fuse_lib_opendir()
3412 pthread_mutex_destroy(&dh->lock); in fuse_lib_opendir()
3417 pthread_mutex_destroy(&dh->lock); in fuse_lib_opendir()
3425 if (minsize > dh->size) { in extend_contents()
3427 unsigned newsize = dh->size; in extend_contents()
3437 newptr = (char *) realloc(dh->contents, newsize); in extend_contents()
3439 dh->error = -ENOMEM; in extend_contents()
3440 return -1; in extend_contents()
3442 dh->contents = newptr; in extend_contents()
3443 dh->size = newsize; in extend_contents()
3455 dh->error = -ENOMEM; in fuse_add_direntry_to_dh()
3456 return -1; in fuse_add_direntry_to_dh()
3458 de->name = strdup(name); in fuse_add_direntry_to_dh()
3459 if (!de->name) { in fuse_add_direntry_to_dh()
3460 dh->error = -ENOMEM; in fuse_add_direntry_to_dh()
3462 return -1; in fuse_add_direntry_to_dh()
3464 de->stat = *st; in fuse_add_direntry_to_dh()
3465 de->next = NULL; in fuse_add_direntry_to_dh()
3467 *dh->last = de; in fuse_add_direntry_to_dh()
3468 dh->last = &de->next; in fuse_add_direntry_to_dh()
3479 pthread_mutex_lock(&f->lock); in lookup_nodeid()
3482 res = node->nodeid; in lookup_nodeid()
3483 pthread_mutex_unlock(&f->lock); in lookup_nodeid()
3495 dh->error = -EIO; in fill_dir()
3506 if (!dh->fuse->conf.use_ino) { in fill_dir()
3508 if (dh->fuse->conf.readdir_ino) { in fill_dir()
3510 lookup_nodeid(dh->fuse, dh->nodeid, name); in fill_dir()
3517 if (dh->filled) { in fill_dir()
3518 dh->error = -EIO; in fill_dir()
3522 if (dh->first) { in fill_dir()
3523 dh->error = -EIO; in fill_dir()
3527 if (extend_contents(dh, dh->needlen) == -1) in fill_dir()
3530 newlen = dh->len + in fill_dir()
3531 fuse_add_direntry(dh->req, dh->contents + dh->len, in fill_dir()
3532 dh->needlen - dh->len, name, in fill_dir()
3534 if (newlen > dh->needlen) in fill_dir()
3537 dh->len = newlen; in fill_dir()
3539 dh->filled = 1; in fill_dir()
3541 if (fuse_add_direntry_to_dh(dh, name, &stbuf) == -1) in fill_dir()
3561 struct fuse *f = dh->fuse; in fill_dir_plus()
3565 dh->error = -EIO; in fill_dir_plus()
3573 res = do_lookup(f, dh->nodeid, name, &e); in fill_dir_plus()
3575 dh->error = res; in fill_dir_plus()
3582 e.attr.st_mode = statp->st_mode; in fill_dir_plus()
3583 if (f->conf.use_ino) in fill_dir_plus()
3584 e.attr.st_ino = statp->st_ino; in fill_dir_plus()
3586 if (!f->conf.use_ino && f->conf.readdir_ino) { in fill_dir_plus()
3588 lookup_nodeid(f, dh->nodeid, name); in fill_dir_plus()
3595 if (dh->filled) { in fill_dir_plus()
3596 dh->error = -EIO; in fill_dir_plus()
3600 if (dh->first) { in fill_dir_plus()
3601 dh->error = -EIO; in fill_dir_plus()
3604 if (extend_contents(dh, dh->needlen) == -1) in fill_dir_plus()
3607 newlen = dh->len + in fill_dir_plus()
3608 fuse_add_direntry_plus(dh->req, dh->contents + dh->len, in fill_dir_plus()
3609 dh->needlen - dh->len, name, in fill_dir_plus()
3611 if (newlen > dh->needlen) in fill_dir_plus()
3613 dh->len = newlen; in fill_dir_plus()
3615 dh->filled = 1; in fill_dir_plus()
3617 if (fuse_add_direntry_to_dh(dh, name, &e.attr) == -1) in fill_dir_plus()
3627 struct fuse_direntry *next = de->next; in free_direntries()
3628 free(de->name); in free_direntries()
3642 if (f->fs->op.readdir) in readdir_fill()
3653 free_direntries(dh->first); in readdir_fill()
3654 dh->first = NULL; in readdir_fill()
3655 dh->last = &dh->first; in readdir_fill()
3656 dh->len = 0; in readdir_fill()
3657 dh->error = 0; in readdir_fill()
3658 dh->needlen = size; in readdir_fill()
3659 dh->filled = 0; in readdir_fill()
3660 dh->req = req; in readdir_fill()
3662 err = fuse_fs_readdir(f->fs, path, dh, filler, off, fi, flags); in readdir_fill()
3664 dh->req = NULL; in readdir_fill()
3666 err = dh->error; in readdir_fill()
3668 dh->filled = 0; in readdir_fill()
3678 struct fuse_direntry *de = dh->first; in readdir_fill_from_list()
3680 dh->len = 0; in readdir_fill_from_list()
3682 if (extend_contents(dh, dh->needlen) == -1) in readdir_fill_from_list()
3683 return dh->error; in readdir_fill_from_list()
3689 de = de->next; in readdir_fill_from_list()
3692 char *p = dh->contents + dh->len; in readdir_fill_from_list()
3693 unsigned rem = dh->needlen - dh->len; in readdir_fill_from_list()
3701 .attr = de->stat, in readdir_fill_from_list()
3704 de->name, &e, pos); in readdir_fill_from_list()
3707 de->name, &de->stat, pos); in readdir_fill_from_list()
3709 newlen = dh->len + thislen; in readdir_fill_from_list()
3710 if (newlen > dh->needlen) in readdir_fill_from_list()
3712 dh->len = newlen; in readdir_fill_from_list()
3713 de = de->next; in readdir_fill_from_list()
3727 pthread_mutex_lock(&dh->lock); in fuse_readdir_common()
3731 dh->filled = 0; in fuse_readdir_common()
3733 if (!dh->filled) { in fuse_readdir_common()
3740 if (dh->filled) { in fuse_readdir_common()
3741 dh->needlen = size; in fuse_readdir_common()
3748 fuse_reply_buf(req, dh->contents, dh->len); in fuse_readdir_common()
3750 pthread_mutex_unlock(&dh->lock); in fuse_readdir_common()
3777 fuse_fs_releasedir(f->fs, path, &fi); in fuse_lib_releasedir()
3781 pthread_mutex_lock(&dh->lock); in fuse_lib_releasedir()
3782 pthread_mutex_unlock(&dh->lock); in fuse_lib_releasedir()
3783 pthread_mutex_destroy(&dh->lock); in fuse_lib_releasedir()
3784 free_direntries(dh->first); in fuse_lib_releasedir()
3785 free(dh->contents); in fuse_lib_releasedir()
3804 err = fuse_fs_fsyncdir(f->fs, path, datasync, &fi); in fuse_lib_fsyncdir()
3825 err = fuse_fs_statfs(f->fs, path ? path : "/", &buf); in fuse_lib_statfs()
3847 err = fuse_fs_setxattr(f->fs, path, name, value, size, flags); in fuse_lib_setxattr()
3864 err = fuse_fs_getxattr(f->fs, path, name, value, size); in common_getxattr()
3880 reply_err(req, -ENOMEM); in fuse_lib_getxattr()
3908 err = fuse_fs_listxattr(f->fs, path, list, size); in common_listxattr()
3923 reply_err(req, -ENOMEM); in fuse_lib_listxattr()
3952 err = fuse_fs_removexattr(f->fs, path, name); in fuse_lib_removexattr()
3963 for (l = node->locks; l; l = l->next) in locks_conflict()
3964 if (l->owner != lock->owner && in locks_conflict()
3965 lock->start <= l->end && l->start <= lock->end && in locks_conflict()
3966 (l->type == F_WRLCK || lock->type == F_WRLCK)) in locks_conflict()
3975 *lockp = l->next; in delete_lock()
3981 lock->next = *pos; in insert_lock()
3991 if (lock->type != F_UNLCK || lock->start != 0 || in locks_insert()
3992 lock->end != OFFSET_MAX) { in locks_insert()
3999 return -ENOLCK; in locks_insert()
4003 for (lp = &node->locks; *lp;) { in locks_insert()
4005 if (l->owner != lock->owner) in locks_insert()
4006 goto skip; in locks_insert()
4008 if (lock->type == l->type) { in locks_insert()
4009 if (l->end < lock->start - 1) in locks_insert()
4010 goto skip; in locks_insert()
4011 if (lock->end < l->start - 1) in locks_insert()
4013 if (l->start <= lock->start && lock->end <= l->end) in locks_insert()
4015 if (l->start < lock->start) in locks_insert()
4016 lock->start = l->start; in locks_insert()
4017 if (lock->end < l->end) in locks_insert()
4018 lock->end = l->end; in locks_insert()
4021 if (l->end < lock->start) in locks_insert()
4022 goto skip; in locks_insert()
4023 if (lock->end < l->start) in locks_insert()
4025 if (lock->start <= l->start && l->end <= lock->end) in locks_insert()
4027 if (l->end <= lock->end) { in locks_insert()
4028 l->end = lock->start - 1; in locks_insert()
4029 goto skip; in locks_insert()
4031 if (lock->start <= l->start) { in locks_insert()
4032 l->start = lock->end + 1; in locks_insert()
4036 newl2->start = lock->end + 1; in locks_insert()
4037 l->end = lock->start - 1; in locks_insert()
4038 insert_lock(&l->next, newl2); in locks_insert()
4041 skip: in locks_insert()
4042 lp = &l->next; in locks_insert()
4048 if (lock->type != F_UNLCK) { in locks_insert()
4062 lock->type = flock->l_type; in flock_to_lock()
4063 lock->start = flock->l_start; in flock_to_lock()
4064 lock->end = in flock_to_lock()
4065 flock->l_len ? flock->l_start + flock->l_len - 1 : OFFSET_MAX; in flock_to_lock()
4066 lock->pid = flock->l_pid; in flock_to_lock()
4071 flock->l_type = lock->type; in lock_to_flock()
4072 flock->l_start = lock->start; in lock_to_flock()
4073 flock->l_len = in lock_to_flock()
4074 (lock->end == OFFSET_MAX) ? 0 : lock->end - lock->start + 1; in lock_to_flock()
4075 flock->l_pid = lock->pid; in lock_to_flock()
4091 err = fuse_fs_flush(f->fs, path, fi); in fuse_flush_common()
4092 errlock = fuse_fs_lock(f->fs, path, fi, F_SETLK, &lock); in fuse_flush_common()
4095 if (errlock != -ENOSYS) { in fuse_flush_common()
4097 l.owner = fi->lock_owner; in fuse_flush_common()
4098 pthread_mutex_lock(&f->lock); in fuse_flush_common()
4100 pthread_mutex_unlock(&f->lock); in fuse_flush_common()
4104 if (err == -ENOSYS) in fuse_flush_common()
4119 if (fi->flush) { in fuse_lib_release()
4121 if (err == -ENOSYS) in fuse_lib_release()
4159 err = fuse_fs_lock(f->fs, path, fi, cmd, lock); in fuse_lock_common()
4175 l.owner = fi->lock_owner; in fuse_lib_getlk()
4176 pthread_mutex_lock(&f->lock); in fuse_lib_getlk()
4180 pthread_mutex_unlock(&f->lock); in fuse_lib_getlk()
4202 l.owner = fi->lock_owner; in fuse_lib_setlk()
4203 pthread_mutex_lock(&f->lock); in fuse_lib_setlk()
4205 pthread_mutex_unlock(&f->lock); in fuse_lib_setlk()
4221 err = fuse_fs_flock(f->fs, path, fi, op); in fuse_lib_flock()
4239 err = fuse_fs_bmap(f->fs, path, blocksize, &idx); in fuse_lib_bmap()
4260 err = -EPERM; in fuse_lib_ioctl()
4270 err = -ENOMEM; in fuse_lib_ioctl()
4286 err = fuse_fs_ioctl(f->fs, path, cmd, arg, &fi, flags, in fuse_lib_ioctl()
4312 err = fuse_fs_poll(f->fs, path, fi, ph, &revents); in fuse_lib_poll()
4333 err = fuse_fs_fallocate(f->fs, path, mode, offset, length, fi); in fuse_lib_fallocate()
4366 res = fuse_fs_copy_file_range(f->fs, path_in, fi_in, off_in, path_out, in fuse_lib_copy_file_range()
4395 res = fuse_fs_lseek(f->fs, path, off, whence, fi); in fuse_lib_lseek()
4413 int sleep_time = f->conf.remember / 10; in clean_delay()
4429 pthread_mutex_lock(&f->lock); in fuse_clean_cache()
4433 for (curr = f->lru_table.next; curr != &f->lru_table; curr = next) { in fuse_clean_cache()
4436 next = curr->next; in fuse_clean_cache()
4438 node = &lnode->node; in fuse_clean_cache()
4440 age = diff_timespec(&now, &lnode->forget_time); in fuse_clean_cache()
4441 if (age <= f->conf.remember) in fuse_clean_cache()
4444 assert(node->nlookup == 1); in fuse_clean_cache()
4447 if (node->refctr > 1) in fuse_clean_cache()
4450 node->nlookup = 0; in fuse_clean_cache()
4454 pthread_mutex_unlock(&f->lock); in fuse_clean_cache()
4511 return f->se; in fuse_get_session()
4516 struct fuse_session *se = f->se; in fuse_session_loop_remember()
4521 .fd = se->fd, in fuse_session_loop_remember()
4535 timeout = next_clean - now.tv_sec; in fuse_session_loop_remember()
4540 if (res == -1) { in fuse_session_loop_remember()
4548 if (res == -EINTR) in fuse_session_loop_remember()
4563 return res < 0 ? -1 : 0; in fuse_session_loop_remember()
4569 return -1; in fuse_loop()
4574 return fuse_session_loop(f->se); in fuse_loop()
4581 return -1; in fuse_loop_mt_32()
4585 return -1; in fuse_loop_mt_32()
4604 fuse_session_exit(f->se); in fuse_exit()
4612 return &c->ctx; in fuse_get_context()
4621 return -EINVAL; in fuse_getgroups()
4623 return fuse_req_getgroups(c->req, size, list); in fuse_getgroups()
4631 return fuse_req_interrupted(c->req); in fuse_interrupted()
4643 return fuse_lowlevel_notify_inval_inode(f->se, ino, 0, 0); in fuse_invalidate_path()
4650 FUSE_OPT_KEY("-d", FUSE_OPT_KEY_KEEP),
4652 FUSE_LIB_OPT("-d", debug, 1),
4667 FUSE_LIB_OPT("noforget", remember, -1),
4693 if (fuse_opt_add_arg(&a, "") == -1 || in print_module_help()
4694 fuse_opt_add_arg(&a, "-h") == -1) in print_module_help()
4704 may be of interest to an end-user */ in fuse_lib_help()
4706 " -o kernel_cache cache files in kernel\n" in fuse_lib_help()
4707 " -o [no]auto_cache enable caching based on modification times (off)\n" in fuse_lib_help()
4708 " -o umask=M set file permissions (octal)\n" in fuse_lib_help()
4709 " -o uid=N set file owner\n" in fuse_lib_help()
4710 " -o gid=N set file group\n" in fuse_lib_help()
4711 " -o entry_timeout=T cache timeout for names (1.0s)\n" in fuse_lib_help()
4712 " -o negative_timeout=T cache timeout for deleted names (0.0s)\n" in fuse_lib_help()
4713 " -o attr_timeout=T cache timeout for attributes (1.0s)\n" in fuse_lib_help()
4714 " -o ac_attr_timeout=T auto cache timeout for attributes (attr_timeout)\n" in fuse_lib_help()
4715 " -o noforget never forget cached inodes\n" in fuse_lib_help()
4716 " -o remember=T remember cached inodes for T seconds (0s)\n" in fuse_lib_help()
4717 " -o modules=M1[:M2...] names of modules to push onto filesystem stack\n"); in fuse_lib_help()
4720 /* Print low-level help */ in fuse_lib_help()
4733 fuse_lib_opt_proc) == -1 in fuse_lib_help()
4750 print_module_help(module, &m->factory); in fuse_lib_help()
4760 if (sigaction(signum, NULL, &old_sa) == -1) { in fuse_init_intr_signal()
4762 return -1; in fuse_init_intr_signal()
4772 if (sigaction(signum, &sa, NULL) == -1) { in fuse_init_intr_signal()
4774 return -1; in fuse_init_intr_signal()
4794 struct fuse_fs *fs[2] = { f->fs, NULL }; in fuse_push_module()
4799 return -1; in fuse_push_module()
4801 newfs = m->factory(args, fs); in fuse_push_module()
4804 return -1; in fuse_push_module()
4806 newfs->m = m; in fuse_push_module()
4807 f->fs = newfs; in fuse_push_module()
4827 fs->user_data = user_data; in fuse_fs_new()
4829 memcpy(&fs->op, op, op_size); in fuse_fs_new()
4835 t->size = NODE_TABLE_MIN_SIZE; in node_table_init()
4836 t->array = (struct node **) calloc(1, sizeof(struct node *) * t->size); in node_table_init()
4837 if (t->array == NULL) { in node_table_init()
4839 return -1; in node_table_init()
4841 t->use = 0; in node_table_init()
4842 t->split = 0; in node_table_init()
4862 return fuse_start_thread(&f->prune_thread, fuse_prune_nodes, f); in fuse_start_cleanup_thread()
4870 pthread_mutex_lock(&f->lock); in fuse_stop_cleanup_thread()
4871 pthread_cancel(f->prune_thread); in fuse_stop_cleanup_thread()
4872 pthread_mutex_unlock(&f->lock); in fuse_stop_cleanup_thread()
4873 pthread_join(f->prune_thread, NULL); in fuse_stop_cleanup_thread()
4894 f->conf.entry_timeout = 1.0; in fuse_new_31()
4895 f->conf.attr_timeout = 1.0; in fuse_new_31()
4896 f->conf.negative_timeout = 0.0; in fuse_new_31()
4897 f->conf.intr_signal = FUSE_DEFAULT_INTR_SIGNAL; in fuse_new_31()
4900 if (fuse_opt_parse(args, &f->conf, fuse_lib_opts, in fuse_new_31()
4901 fuse_lib_opt_proc) == -1) in fuse_new_31()
4917 if (fuse_create_context_key() == -1) in fuse_new_31()
4924 f->fs = fs; in fuse_new_31()
4927 if (!fs->op.lock) { in fuse_new_31()
4932 f->pagesize = getpagesize(); in fuse_new_31()
4933 init_list_head(&f->partial_slabs); in fuse_new_31()
4934 init_list_head(&f->full_slabs); in fuse_new_31()
4935 init_list_head(&f->lru_table); in fuse_new_31()
4937 if (f->conf.modules) { in fuse_new_31()
4941 for (module = f->conf.modules; module; module = next) { in fuse_new_31()
4947 fuse_push_module(f, module, args) == -1) in fuse_new_31()
4952 if (!f->conf.ac_attr_timeout_set) in fuse_new_31()
4953 f->conf.ac_attr_timeout = f->conf.attr_timeout; in fuse_new_31()
4960 f->conf.readdir_ino = 1; in fuse_new_31()
4963 f->se = fuse_session_new(args, &llop, sizeof(llop), f); in fuse_new_31()
4964 if (f->se == NULL) in fuse_new_31()
4967 if (f->conf.debug) { in fuse_new_31()
4968 fuse_log(FUSE_LOG_DEBUG, "nullpath_ok: %i\n", f->conf.nullpath_ok); in fuse_new_31()
4972 f->fs->debug = f->conf.debug; in fuse_new_31()
4973 f->ctr = 0; in fuse_new_31()
4974 f->generation = 0; in fuse_new_31()
4975 if (node_table_init(&f->name_table) == -1) in fuse_new_31()
4978 if (node_table_init(&f->id_table) == -1) in fuse_new_31()
4981 pthread_mutex_init(&f->lock, NULL); in fuse_new_31()
4990 init_list_head(&lnode->lru); in fuse_new_31()
4993 strcpy(root->inline_name, "/"); in fuse_new_31()
4994 root->name = root->inline_name; in fuse_new_31()
4996 if (f->conf.intr && in fuse_new_31()
4997 fuse_init_intr_signal(f->conf.intr_signal, in fuse_new_31()
4998 &f->intr_installed) == -1) in fuse_new_31()
5001 root->parent = NULL; in fuse_new_31()
5002 root->nodeid = FUSE_ROOT_ID; in fuse_new_31()
5011 free(f->id_table.array); in fuse_new_31()
5013 free(f->name_table.array); in fuse_new_31()
5015 fuse_session_destroy(f->se); in fuse_new_31()
5017 if (f->fs->m) in fuse_new_31()
5018 fuse_put_module(f->fs->m); in fuse_new_31()
5019 free(f->fs); in fuse_new_31()
5020 free(f->conf.modules); in fuse_new_31()
5029 /* Emulates 3.0-style fuse_new(), which processes --help */
5042 FUSE_LIB_OPT("-h", show_help, 1), in fuse_new_30()
5043 FUSE_LIB_OPT("--help", show_help, 1), in fuse_new_30()
5048 fuse_lib_opt_proc) == -1) in fuse_new_30()
5062 if (f->conf.intr && f->intr_installed) in fuse_destroy()
5063 fuse_restore_intr_signal(f->conf.intr_signal); in fuse_destroy()
5065 if (f->fs) { in fuse_destroy()
5068 for (i = 0; i < f->id_table.size; i++) { in fuse_destroy()
5071 for (node = f->id_table.array[i]; node != NULL; in fuse_destroy()
5072 node = node->id_next) { in fuse_destroy()
5073 if (node->is_hidden) { in fuse_destroy()
5075 if (try_get_path(f, node->nodeid, NULL, &path, NULL, false) == 0) { in fuse_destroy()
5076 fuse_fs_unlink(f->fs, path); in fuse_destroy()
5083 for (i = 0; i < f->id_table.size; i++) { in fuse_destroy()
5087 for (node = f->id_table.array[i]; node != NULL; node = next) { in fuse_destroy()
5088 next = node->id_next; in fuse_destroy()
5090 f->id_table.use--; in fuse_destroy()
5093 assert(list_empty(&f->partial_slabs)); in fuse_destroy()
5094 assert(list_empty(&f->full_slabs)); in fuse_destroy()
5099 free(f->id_table.array); in fuse_destroy()
5100 free(f->name_table.array); in fuse_destroy()
5101 pthread_mutex_destroy(&f->lock); in fuse_destroy()
5102 fuse_session_destroy(f->se); in fuse_destroy()
5103 free(f->conf.modules); in fuse_destroy()