Lines Matching refs:node
30 struct exfat_node* exfat_get_node(struct exfat_node* node) in exfat_get_node() argument
34 node->references++; in exfat_get_node()
35 return node; in exfat_get_node()
38 void exfat_put_node(struct exfat* ef, struct exfat_node* node) in exfat_put_node() argument
42 --node->references; in exfat_put_node()
43 if (node->references < 0) in exfat_put_node()
45 exfat_get_name(node, buffer); in exfat_put_node()
48 else if (node->references == 0 && node != ef->root) in exfat_put_node()
50 if (node->is_dirty) in exfat_put_node()
52 exfat_get_name(node, buffer); in exfat_put_node()
62 int exfat_cleanup_node(struct exfat* ef, struct exfat_node* node) in exfat_cleanup_node() argument
66 if (node->references != 0) in exfat_cleanup_node()
68 node->references); in exfat_cleanup_node()
70 if (node->is_unlinked) in exfat_cleanup_node()
73 rc = exfat_truncate(ef, node, 0, true); in exfat_cleanup_node()
75 free(node); in exfat_cleanup_node()
122 struct exfat_node* node = malloc(sizeof(struct exfat_node)); in allocate_node() local
123 if (node == NULL) in allocate_node()
128 memset(node, 0, sizeof(struct exfat_node)); in allocate_node()
129 return node; in allocate_node()
132 static void init_node_meta1(struct exfat_node* node, in init_node_meta1() argument
135 node->attrib = le16_to_cpu(meta1->attrib); in init_node_meta1()
136 node->continuations = meta1->continuations; in init_node_meta1()
137 node->mtime = exfat_exfat2unix(meta1->mdate, meta1->mtime, in init_node_meta1()
140 node->atime = exfat_exfat2unix(meta1->adate, meta1->atime, in init_node_meta1()
144 static void init_node_meta2(struct exfat_node* node, in init_node_meta2() argument
147 node->valid_size = le64_to_cpu(meta2->valid_size); in init_node_meta2()
148 node->size = le64_to_cpu(meta2->size); in init_node_meta2()
149 node->start_cluster = le32_to_cpu(meta2->start_cluster); in init_node_meta2()
150 node->fptr_cluster = node->start_cluster; in init_node_meta2()
151 node->is_contiguous = ((meta2->flags & EXFAT_FLAG_CONTIGUOUS) != 0); in init_node_meta2()
154 static void init_node_name(struct exfat_node* node, in init_node_name() argument
160 memcpy(node->name + i * EXFAT_ENAME_MAX, in init_node_name()
209 static bool check_node(const struct exfat* ef, struct exfat_node* node, in check_node() argument
224 exfat_get_name(node, buffer); in check_node()
227 if (!EXFAT_REPAIR(invalid_node_checksum, ef, node)) in check_node()
237 if (node->valid_size > node->size) in check_node()
239 exfat_get_name(node, buffer); in check_node()
241 "(%"PRIu64")", buffer, node->valid_size, node->size); in check_node()
251 if (node->size == 0 && node->start_cluster != EXFAT_CLUSTER_FREE) in check_node()
253 exfat_get_name(node, buffer); in check_node()
255 node->start_cluster); in check_node()
258 if (node->size > 0 && CLUSTER_INVALID(*ef->sb, node->start_cluster)) in check_node()
260 exfat_get_name(node, buffer); in check_node()
262 node->start_cluster); in check_node()
267 if (node->size > clusters_heap_size) in check_node()
269 exfat_get_name(node, buffer); in check_node()
271 buffer, node->size, clusters_heap_size); in check_node()
276 if (node->size == 0 && node->is_contiguous) in check_node()
278 exfat_get_name(node, buffer); in check_node()
280 node->attrib); in check_node()
285 if ((node->attrib & EXFAT_ATTRIB_DIR) && node->size % cluster_size != 0) in check_node()
287 exfat_get_name(node, buffer); in check_node()
289 node->size, cluster_size); in check_node()
296 static int parse_file_entries(struct exfat* ef, struct exfat_node* node, in parse_file_entries() argument
326 init_node_meta1(node, meta1); in parse_file_entries()
327 init_node_meta2(node, meta2); in parse_file_entries()
328 init_node_name(node, entries + 2, mandatory_entries - 2); in parse_file_entries()
330 if (!check_node(ef, node, exfat_calc_checksum(entries, n), meta1)) in parse_file_entries()
337 struct exfat_node** node, off_t* offset, int n) in parse_file_entry() argument
347 *node = allocate_node(); in parse_file_entry()
348 if (*node == NULL) in parse_file_entry()
350 (*node)->entry_offset = *offset; in parse_file_entry()
352 rc = parse_file_entries(ef, *node, entries, n); in parse_file_entry()
355 free(*node); in parse_file_entry()
388 struct exfat_node** node, off_t* offset) in readdir() argument
410 return parse_file_entry(ef, parent, node, offset, in readdir()
536 struct exfat_node* node; in exfat_cache_directory() local
542 while ((rc = readdir(ef, dir, &node, &offset)) == 0) in exfat_cache_directory()
544 node->parent = dir; in exfat_cache_directory()
547 current->next = node; in exfat_cache_directory()
548 node->prev = current; in exfat_cache_directory()
551 dir->child = node; in exfat_cache_directory()
553 current = node; in exfat_cache_directory()
559 for (current = dir->child; current; current = node) in exfat_cache_directory()
561 node = current->next; in exfat_cache_directory()
572 static void tree_attach(struct exfat_node* dir, struct exfat_node* node) in tree_attach() argument
574 node->parent = dir; in tree_attach()
577 dir->child->prev = node; in tree_attach()
578 node->next = dir->child; in tree_attach()
580 dir->child = node; in tree_attach()
583 static void tree_detach(struct exfat_node* node) in tree_detach() argument
585 if (node->prev) in tree_detach()
586 node->prev->next = node->next; in tree_detach()
588 node->parent->child = node->next; in tree_detach()
589 if (node->next) in tree_detach()
590 node->next->prev = node->prev; in tree_detach()
591 node->parent = NULL; in tree_detach()
592 node->prev = NULL; in tree_detach()
593 node->next = NULL; in tree_detach()
596 static void reset_cache(struct exfat* ef, struct exfat_node* node) in reset_cache() argument
600 while (node->child) in reset_cache()
602 struct exfat_node* p = node->child; in reset_cache()
607 node->is_cached = false; in reset_cache()
608 if (node->references != 0) in reset_cache()
610 exfat_get_name(node, buffer); in reset_cache()
612 node->references, buffer); in reset_cache()
614 if (node != ef->root && node->is_dirty) in reset_cache()
616 exfat_get_name(node, buffer); in reset_cache()
619 while (node->references) in reset_cache()
620 exfat_put_node(ef, node); in reset_cache()
628 int exfat_flush_node(struct exfat* ef, struct exfat_node* node) in exfat_flush_node() argument
630 struct exfat_entry entries[1 + node->continuations]; in exfat_flush_node()
636 if (!node->is_dirty) in exfat_flush_node()
642 if (node->parent == NULL) in exfat_flush_node()
645 rc = read_entries(ef, node->parent, entries, 1 + node->continuations, in exfat_flush_node()
646 node->entry_offset); in exfat_flush_node()
649 if (!check_entries(entries, 1 + node->continuations)) in exfat_flush_node()
652 meta1->attrib = cpu_to_le16(node->attrib); in exfat_flush_node()
653 exfat_unix2exfat(node->mtime, &edate, &etime, in exfat_flush_node()
657 exfat_unix2exfat(node->atime, &edate, &etime, in exfat_flush_node()
661 meta2->valid_size = cpu_to_le64(node->valid_size); in exfat_flush_node()
662 meta2->size = cpu_to_le64(node->size); in exfat_flush_node()
663 meta2->start_cluster = cpu_to_le32(node->start_cluster); in exfat_flush_node()
666 if (node->size != 0 && node->is_contiguous) in exfat_flush_node()
670 meta1->checksum = exfat_calc_checksum(entries, 1 + node->continuations); in exfat_flush_node()
671 rc = write_entries(ef, node->parent, entries, 1 + node->continuations, in exfat_flush_node()
672 node->entry_offset); in exfat_flush_node()
676 node->is_dirty = false; in exfat_flush_node()
695 static int erase_node(struct exfat* ef, struct exfat_node* node) in erase_node() argument
699 exfat_get_node(node->parent); in erase_node()
700 rc = erase_entries(ef, node->parent, 1 + node->continuations, in erase_node()
701 node->entry_offset); in erase_node()
704 exfat_put_node(ef, node->parent); in erase_node()
707 rc = exfat_flush_node(ef, node->parent); in erase_node()
708 exfat_put_node(ef, node->parent); in erase_node()
715 const struct exfat_node* node; in shrink_directory() local
725 for (last_node = node = dir->child; node; node = node->next) in shrink_directory()
727 if (deleted_offset < node->entry_offset) in shrink_directory()
733 if (last_node->entry_offset < node->entry_offset) in shrink_directory()
734 last_node = node; in shrink_directory()
757 static int delete(struct exfat* ef, struct exfat_node* node) in delete() argument
759 struct exfat_node* parent = node->parent; in delete()
760 off_t deleted_offset = node->entry_offset; in delete()
764 rc = erase_node(ef, node); in delete()
770 tree_detach(node); in delete()
772 node->is_unlinked = true; in delete()
785 int exfat_unlink(struct exfat* ef, struct exfat_node* node) in exfat_unlink() argument
787 if (node->attrib & EXFAT_ATTRIB_DIR) in exfat_unlink()
789 return delete(ef, node); in exfat_unlink()
792 int exfat_rmdir(struct exfat* ef, struct exfat_node* node) in exfat_rmdir() argument
796 if (!(node->attrib & EXFAT_ATTRIB_DIR)) in exfat_rmdir()
799 rc = exfat_cache_directory(ef, node); in exfat_rmdir()
802 if (node->child) in exfat_rmdir()
804 return delete(ef, node); in exfat_rmdir()
897 struct exfat_node* node; in commit_entry() local
941 node = allocate_node(); in commit_entry()
942 if (node == NULL) in commit_entry()
944 node->entry_offset = offset; in commit_entry()
945 memcpy(node->name, name, name_length * sizeof(le16_t)); in commit_entry()
946 init_node_meta1(node, meta1); in commit_entry()
947 init_node_meta2(node, meta2); in commit_entry()
949 tree_attach(dir, node); in commit_entry()
998 struct exfat_node* node; in exfat_mkdir() local
1003 rc = exfat_lookup(ef, &node, path); in exfat_mkdir()
1007 rc = exfat_truncate(ef, node, CLUSTER_SIZE(*ef->sb), true); in exfat_mkdir()
1010 delete(ef, node); in exfat_mkdir()
1011 exfat_put_node(ef, node); in exfat_mkdir()
1014 rc = exfat_flush_node(ef, node); in exfat_mkdir()
1017 delete(ef, node); in exfat_mkdir()
1018 exfat_put_node(ef, node); in exfat_mkdir()
1021 exfat_put_node(ef, node); in exfat_mkdir()
1026 struct exfat_node* node, const le16_t* name, off_t new_offset) in rename_entry() argument
1036 rc = read_entries(ef, node->parent, entries, 2, node->entry_offset); in rename_entry()
1044 rc = erase_node(ef, node); in rename_entry()
1048 node->entry_offset = new_offset; in rename_entry()
1049 node->continuations = 1 + name_entries; in rename_entry()
1067 memcpy(node->name, name, (EXFAT_NAME_MAX + 1) * sizeof(le16_t)); in rename_entry()
1068 tree_detach(node); in rename_entry()
1069 tree_attach(dir, node); in rename_entry()
1075 struct exfat_node* node; in exfat_rename() local
1082 rc = exfat_lookup(ef, &node, old_path); in exfat_rename()
1089 exfat_put_node(ef, node); in exfat_rename()
1094 if (node->attrib & EXFAT_ATTRIB_DIR) in exfat_rename()
1099 if (node == p) in exfat_rename()
1104 exfat_put_node(ef, node); in exfat_rename()
1112 if (existing != node) in exfat_rename()
1116 if (node->attrib & EXFAT_ATTRIB_DIR) in exfat_rename()
1123 if (!(node->attrib & EXFAT_ATTRIB_DIR)) in exfat_rename()
1135 exfat_put_node(ef, node); in exfat_rename()
1142 exfat_put_node(ef, node); in exfat_rename()
1155 exfat_put_node(ef, node); in exfat_rename()
1158 rc = rename_entry(ef, dir, node, name, offset); in exfat_rename()
1162 exfat_put_node(ef, node); in exfat_rename()
1167 exfat_put_node(ef, node); in exfat_rename()
1172 void exfat_utimes(struct exfat_node* node, const struct timespec tv[2]) in exfat_utimes() argument
1174 node->atime = tv[0].tv_sec; in exfat_utimes()
1175 node->mtime = tv[1].tv_sec; in exfat_utimes()
1176 node->is_dirty = true; in exfat_utimes()
1179 void exfat_update_atime(struct exfat_node* node) in exfat_update_atime() argument
1181 node->atime = time(NULL); in exfat_update_atime()
1182 node->is_dirty = true; in exfat_update_atime()
1185 void exfat_update_mtime(struct exfat_node* node) in exfat_update_mtime() argument
1187 node->mtime = time(NULL); in exfat_update_mtime()
1188 node->is_dirty = true; in exfat_update_mtime()