Lines Matching refs:ef
38 void exfat_put_node(struct exfat* ef, struct exfat_node* node) in exfat_put_node() argument
48 else if (node->references == 0 && node != ef->root) in exfat_put_node()
62 int exfat_cleanup_node(struct exfat* ef, struct exfat_node* node) in exfat_cleanup_node() argument
73 rc = exfat_truncate(ef, node, 0, true); in exfat_cleanup_node()
80 static int read_entries(struct exfat* ef, struct exfat_node* dir, in read_entries() argument
88 size = exfat_generic_pread(ef, dir, entries, in read_entries()
101 static int write_entries(struct exfat* ef, struct exfat_node* dir, in write_entries() argument
109 size = exfat_generic_pwrite(ef, dir, entries, in write_entries()
209 static bool check_node(const struct exfat* ef, struct exfat_node* node, in check_node() argument
212 int cluster_size = CLUSTER_SIZE(*ef->sb); in check_node()
214 (uint64_t) le32_to_cpu(ef->sb->cluster_count) * cluster_size; in check_node()
227 if (!EXFAT_REPAIR(invalid_node_checksum, ef, node)) in check_node()
258 if (node->size > 0 && CLUSTER_INVALID(*ef->sb, node->start_cluster)) in check_node()
296 static int parse_file_entries(struct exfat* ef, struct exfat_node* node, in parse_file_entries() argument
330 if (!check_node(ef, node, exfat_calc_checksum(entries, n), meta1)) in parse_file_entries()
336 static int parse_file_entry(struct exfat* ef, struct exfat_node* parent, in parse_file_entry() argument
342 rc = read_entries(ef, parent, entries, n, *offset); in parse_file_entry()
352 rc = parse_file_entries(ef, *node, entries, n); in parse_file_entry()
387 static int readdir(struct exfat* ef, struct exfat_node* parent, in readdir() argument
402 rc = read_entries(ef, parent, &entry, 1, *offset); in readdir()
410 return parse_file_entry(ef, parent, node, offset, in readdir()
414 if (ef->upcase != NULL) in readdir()
417 if (CLUSTER_INVALID(*ef->sb, le32_to_cpu(upcase->start_cluster))) in readdir()
441 if (exfat_pread(ef->dev, upcase_comp, upcase_size, in readdir()
442 exfat_c2o(ef, le32_to_cpu(upcase->start_cluster))) < 0) in readdir()
453 ef->upcase = calloc(EXFAT_UPCASE_CHARS, sizeof(uint16_t)); in readdir()
454 if (ef->upcase == NULL) in readdir()
460 decompress_upcase(ef->upcase, upcase_comp, in readdir()
467 ef->cmap.start_cluster = le32_to_cpu(bitmap->start_cluster); in readdir()
468 if (CLUSTER_INVALID(*ef->sb, ef->cmap.start_cluster)) in readdir()
471 ef->cmap.start_cluster); in readdir()
474 ef->cmap.size = le32_to_cpu(ef->sb->cluster_count); in readdir()
475 if (le64_to_cpu(bitmap->size) < DIV_ROUND_UP(ef->cmap.size, 8)) in readdir()
480 DIV_ROUND_UP(ef->cmap.size, 8)); in readdir()
484 ef->cmap.chunk_size = ef->cmap.size; in readdir()
485 ef->cmap.chunk = malloc(BMAP_SIZE(ef->cmap.chunk_size)); in readdir()
486 if (ef->cmap.chunk == NULL) in readdir()
493 if (exfat_pread(ef->dev, ef->cmap.chunk, in readdir()
494 BMAP_SIZE(ef->cmap.chunk_size), in readdir()
495 exfat_c2o(ef, ef->cmap.start_cluster)) < 0) in readdir()
499 le64_to_cpu(bitmap->size), ef->cmap.start_cluster); in readdir()
514 if (exfat_utf16_to_utf8(ef->label, label_name, in readdir()
515 sizeof(ef->label), EXFAT_ENAME_MAX) != 0) in readdir()
524 if (!EXFAT_REPAIR(unknown_entry, ef, parent, &entry, *offset)) in readdir()
532 int exfat_cache_directory(struct exfat* ef, struct exfat_node* dir) in exfat_cache_directory() argument
542 while ((rc = readdir(ef, dir, &node, &offset)) == 0) in exfat_cache_directory()
596 static void reset_cache(struct exfat* ef, struct exfat_node* node) in reset_cache() argument
603 reset_cache(ef, p); in reset_cache()
614 if (node != ef->root && node->is_dirty) in reset_cache()
620 exfat_put_node(ef, node); in reset_cache()
623 void exfat_reset_cache(struct exfat* ef) in exfat_reset_cache() argument
625 reset_cache(ef, ef->root); in exfat_reset_cache()
628 int exfat_flush_node(struct exfat* ef, struct exfat_node* node) in exfat_flush_node() argument
639 if (ef->ro) in exfat_flush_node()
645 rc = read_entries(ef, node->parent, entries, 1 + node->continuations, in exfat_flush_node()
671 rc = write_entries(ef, node->parent, entries, 1 + node->continuations, in exfat_flush_node()
677 return exfat_flush(ef); in exfat_flush_node()
680 static int erase_entries(struct exfat* ef, struct exfat_node* dir, int n, in erase_entries() argument
687 rc = read_entries(ef, dir, entries, n, offset); in erase_entries()
692 return write_entries(ef, dir, entries, n, offset); in erase_entries()
695 static int erase_node(struct exfat* ef, struct exfat_node* node) in erase_node() argument
700 rc = erase_entries(ef, node->parent, 1 + node->continuations, 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()
712 static int shrink_directory(struct exfat* ef, struct exfat_node* dir, in shrink_directory() argument
749 CLUSTER_SIZE(*ef->sb)) * CLUSTER_SIZE(*ef->sb); in shrink_directory()
751 new_size = CLUSTER_SIZE(*ef->sb); in shrink_directory()
754 return exfat_truncate(ef, dir, new_size, true); in shrink_directory()
757 static int delete(struct exfat* ef, struct exfat_node* node) in delete() argument
764 rc = erase_node(ef, node); in delete()
767 exfat_put_node(ef, parent); in delete()
771 rc = shrink_directory(ef, parent, deleted_offset); in delete()
775 exfat_flush_node(ef, parent); in delete()
776 exfat_put_node(ef, parent); in delete()
780 rc = exfat_flush_node(ef, parent); in delete()
781 exfat_put_node(ef, parent); in delete()
785 int exfat_unlink(struct exfat* ef, struct exfat_node* node) in exfat_unlink() argument
789 return delete(ef, node); in exfat_unlink()
792 int exfat_rmdir(struct exfat* ef, struct exfat_node* node) in exfat_rmdir() argument
799 rc = exfat_cache_directory(ef, node); in exfat_rmdir()
804 return delete(ef, node); in exfat_rmdir()
807 static int check_slot(struct exfat* ef, struct exfat_node* dir, off_t offset, in check_slot() argument
817 if (dir != ef->root) in check_slot()
820 rc = read_entries(ef, dir, entries, n, offset); in check_slot()
829 static int find_slot(struct exfat* ef, struct exfat_node* dir, in find_slot() argument
865 rc = check_slot(ef, dir, *offset, n); in find_slot()
888 return exfat_truncate(ef, dir, in find_slot()
890 CLUSTER_SIZE(*ef->sb)), in find_slot()
894 static int commit_entry(struct exfat* ef, struct exfat_node* dir, in commit_entry() argument
922 meta2->name_hash = exfat_calc_name_hash(ef, name, name_length); in commit_entry()
937 rc = write_entries(ef, dir, entries, 2 + name_entries, offset); in commit_entry()
953 static int create(struct exfat* ef, const char* path, uint16_t attrib) in create() argument
961 rc = exfat_split(ef, &dir, &existing, name, path); in create()
966 exfat_put_node(ef, existing); in create()
967 exfat_put_node(ef, dir); in create()
971 rc = find_slot(ef, dir, &offset, in create()
975 exfat_put_node(ef, dir); in create()
978 rc = commit_entry(ef, dir, name, offset, attrib); in create()
981 exfat_put_node(ef, dir); in create()
985 rc = exfat_flush_node(ef, dir); in create()
986 exfat_put_node(ef, dir); in create()
990 int exfat_mknod(struct exfat* ef, const char* path) in exfat_mknod() argument
992 return create(ef, path, EXFAT_ATTRIB_ARCH); in exfat_mknod()
995 int exfat_mkdir(struct exfat* ef, const char* path) in exfat_mkdir() argument
1000 rc = create(ef, path, EXFAT_ATTRIB_DIR); in exfat_mkdir()
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()
1025 static int rename_entry(struct exfat* ef, struct exfat_node* dir, in rename_entry() argument
1036 rc = read_entries(ef, node->parent, entries, 2, node->entry_offset); in rename_entry()
1042 meta2->name_hash = exfat_calc_name_hash(ef, name, name_length); in rename_entry()
1044 rc = erase_node(ef, node); in rename_entry()
1063 rc = write_entries(ef, dir, entries, 2 + name_entries, new_offset); in rename_entry()
1073 int exfat_rename(struct exfat* ef, const char* old_path, const char* new_path) in exfat_rename() argument
1082 rc = exfat_lookup(ef, &node, old_path); in exfat_rename()
1086 rc = exfat_split(ef, &dir, &existing, name, new_path); in exfat_rename()
1089 exfat_put_node(ef, node); in exfat_rename()
1102 exfat_put_node(ef, existing); in exfat_rename()
1103 exfat_put_node(ef, dir); in exfat_rename()
1104 exfat_put_node(ef, node); in exfat_rename()
1117 rc = exfat_rmdir(ef, existing); in exfat_rename()
1124 rc = exfat_unlink(ef, existing); in exfat_rename()
1128 exfat_put_node(ef, existing); in exfat_rename()
1133 exfat_cleanup_node(ef, existing); in exfat_rename()
1134 exfat_put_node(ef, dir); in exfat_rename()
1135 exfat_put_node(ef, node); in exfat_rename()
1138 rc = exfat_cleanup_node(ef, existing); in exfat_rename()
1141 exfat_put_node(ef, dir); in exfat_rename()
1142 exfat_put_node(ef, node); in exfat_rename()
1147 exfat_put_node(ef, existing); in exfat_rename()
1150 rc = find_slot(ef, dir, &offset, in exfat_rename()
1154 exfat_put_node(ef, dir); in exfat_rename()
1155 exfat_put_node(ef, node); in exfat_rename()
1158 rc = rename_entry(ef, dir, node, name, offset); in exfat_rename()
1161 exfat_put_node(ef, dir); in exfat_rename()
1162 exfat_put_node(ef, node); in exfat_rename()
1165 rc = exfat_flush_node(ef, dir); in exfat_rename()
1166 exfat_put_node(ef, dir); in exfat_rename()
1167 exfat_put_node(ef, node); in exfat_rename()
1192 const char* exfat_get_label(struct exfat* ef) in exfat_get_label() argument
1194 return ef->label; in exfat_get_label()
1197 static int find_label(struct exfat* ef, off_t* offset) in find_label() argument
1204 rc = read_entries(ef, ef->root, &entry, 1, *offset); in find_label()
1213 int exfat_set_label(struct exfat* ef, const char* label) in exfat_set_label() argument
1226 rc = find_label(ef, &offset); in exfat_set_label()
1228 rc = find_slot(ef, ef->root, &offset, 1); in exfat_set_label()
1238 rc = write_entries(ef, ef->root, (struct exfat_entry*) &entry, 1, offset); in exfat_set_label()
1242 strcpy(ef->label, label); in exfat_set_label()