summaryrefslogtreecommitdiffstats
path: root/include/exfat_fs.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/exfat_fs.h')
-rw-r--r--include/exfat_fs.h88
1 files changed, 88 insertions, 0 deletions
diff --git a/include/exfat_fs.h b/include/exfat_fs.h
new file mode 100644
index 0000000..d35b12c
--- /dev/null
+++ b/include/exfat_fs.h
@@ -0,0 +1,88 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2021 LG Electronics.
+ *
+ * Author(s): Hyunchul Lee <hyc.lee@gmail.com>
+ */
+#ifndef _EXFAT_FS_H_
+#define _EXFAT_FS_H_
+
+#include "list.h"
+
+struct exfat_dentry;
+
+struct exfat_inode {
+ struct exfat_inode *parent;
+ struct list_head children;
+ struct list_head sibling;
+ struct list_head list;
+ clus_t first_clus;
+ __u16 attr;
+ uint64_t size;
+ bool is_contiguous;
+ struct exfat_dentry *dentry_set;
+ int dentry_count;
+ off_t dev_offset;
+ __le16 name[0]; /* only for directory */
+};
+
+#define EXFAT_NAME_MAX 255
+#define NAME_BUFFER_SIZE ((EXFAT_NAME_MAX + 1) * 2)
+
+struct exfat {
+ struct exfat_blk_dev *blk_dev;
+ struct pbr *bs;
+ char volume_label[VOLUME_LABEL_BUFFER_SIZE];
+ struct exfat_inode *root;
+ struct list_head dir_list;
+ clus_t clus_count;
+ unsigned int clus_size;
+ unsigned int sect_size;
+ char *disk_bitmap;
+ char *alloc_bitmap;
+ char *ohead_bitmap;
+ clus_t disk_bitmap_clus;
+ unsigned int disk_bitmap_size;
+ __u16 *upcase_table;
+ clus_t start_clu;
+ char *zero_cluster;
+};
+
+struct exfat_dentry_loc {
+ struct exfat_inode *parent;
+ off_t file_offset;
+ off_t dev_offset;
+};
+
+struct path_resolve_ctx {
+ struct exfat_inode *ancestors[255];
+ __le16 utf16_path[PATH_MAX + 2];
+ char local_path[PATH_MAX * MB_LEN_MAX + 1];
+};
+
+struct buffer_desc {
+ __u32 p_clus;
+ unsigned int offset;
+ char *buffer;
+ char *dirty;
+};
+
+struct exfat *exfat_alloc_exfat(struct exfat_blk_dev *blk_dev, struct pbr *bs);
+void exfat_free_exfat(struct exfat *exfat);
+
+struct exfat_inode *exfat_alloc_inode(__u16 attr);
+void exfat_free_inode(struct exfat_inode *node);
+
+void exfat_free_children(struct exfat_inode *dir, bool file_only);
+void exfat_free_file_children(struct exfat_inode *dir);
+void exfat_free_ancestors(struct exfat_inode *child);
+void exfat_free_dir_list(struct exfat *exfat);
+
+int exfat_resolve_path(struct path_resolve_ctx *ctx, struct exfat_inode *child);
+int exfat_resolve_path_parent(struct path_resolve_ctx *ctx,
+ struct exfat_inode *parent, struct exfat_inode *child);
+
+struct buffer_desc *exfat_alloc_buffer(int count,
+ unsigned int clu_size, unsigned int sect_size);
+void exfat_free_buffer(struct buffer_desc *bd, int count);
+#endif