xref: /third_party/exfatprogs/include/exfat_fs.h (revision a7ce5b29)
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 *   Copyright (C) 2021 LG Electronics.
4 *
5 *   Author(s): Hyunchul Lee <hyc.lee@gmail.com>
6 */
7#ifndef _EXFAT_FS_H_
8#define _EXFAT_FS_H_
9
10#include "list.h"
11
12struct exfat_dentry;
13
14struct exfat_inode {
15	struct exfat_inode	*parent;
16	struct list_head	children;
17	struct list_head	sibling;
18	struct list_head	list;
19	clus_t			first_clus;
20	__u16			attr;
21	uint64_t		size;
22	bool			is_contiguous;
23	struct exfat_dentry	*dentry_set;
24	int			dentry_count;
25	off_t			dev_offset;
26	__le16			name[0];	/* only for directory */
27};
28
29#define EXFAT_NAME_MAX			255
30#define NAME_BUFFER_SIZE		((EXFAT_NAME_MAX + 1) * 2)
31
32struct exfat {
33	struct exfat_blk_dev	*blk_dev;
34	struct pbr		*bs;
35	char			volume_label[VOLUME_LABEL_BUFFER_SIZE];
36	struct exfat_inode	*root;
37	struct list_head	dir_list;
38	clus_t			clus_count;
39	unsigned int		clus_size;
40	unsigned int		sect_size;
41	char			*disk_bitmap;
42	char			*alloc_bitmap;
43	char			*ohead_bitmap;
44	clus_t			disk_bitmap_clus;
45	unsigned int		disk_bitmap_size;
46	__u16			*upcase_table;
47	clus_t			start_clu;
48	char			*zero_cluster;
49};
50
51struct exfat_dentry_loc {
52	struct exfat_inode	*parent;
53	off_t			file_offset;
54	off_t			dev_offset;
55};
56
57struct path_resolve_ctx {
58	struct exfat_inode	*ancestors[255];
59	__le16			utf16_path[PATH_MAX + 2];
60	char			local_path[PATH_MAX * MB_LEN_MAX + 1];
61};
62
63struct buffer_desc {
64	__u32		p_clus;
65	unsigned int	offset;
66	char		*buffer;
67	char		*dirty;
68};
69
70struct exfat *exfat_alloc_exfat(struct exfat_blk_dev *blk_dev, struct pbr *bs);
71void exfat_free_exfat(struct exfat *exfat);
72
73struct exfat_inode *exfat_alloc_inode(__u16 attr);
74void exfat_free_inode(struct exfat_inode *node);
75
76void exfat_free_children(struct exfat_inode *dir, bool file_only);
77void exfat_free_file_children(struct exfat_inode *dir);
78void exfat_free_ancestors(struct exfat_inode *child);
79void exfat_free_dir_list(struct exfat *exfat);
80
81int exfat_resolve_path(struct path_resolve_ctx *ctx, struct exfat_inode *child);
82int exfat_resolve_path_parent(struct path_resolve_ctx *ctx,
83			      struct exfat_inode *parent, struct exfat_inode *child);
84
85struct buffer_desc *exfat_alloc_buffer(int count,
86				       unsigned int clu_size, unsigned int sect_size);
87void exfat_free_buffer(struct buffer_desc *bd, int count);
88#endif
89