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