]> git.sven.stormbind.net Git - sven/exfatprogs.git/blob - include/exfat_fs.h
Add CVE ID to debian changelog
[sven/exfatprogs.git] / include / exfat_fs.h
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
12 struct exfat_dentry;
13
14 struct 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
32 struct 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
51 struct exfat_dentry_loc {
52         struct exfat_inode      *parent;
53         off_t                   file_offset;
54         off_t                   dev_offset;
55 };
56
57 struct 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
63 struct buffer_desc {
64         __u32           p_clus;
65         unsigned int    offset;
66         char            *buffer;
67         char            *dirty;
68 };
69
70 struct exfat *exfat_alloc_exfat(struct exfat_blk_dev *blk_dev, struct pbr *bs);
71 void exfat_free_exfat(struct exfat *exfat);
72
73 struct exfat_inode *exfat_alloc_inode(__u16 attr);
74 void exfat_free_inode(struct exfat_inode *node);
75
76 void exfat_free_children(struct exfat_inode *dir, bool file_only);
77 void exfat_free_file_children(struct exfat_inode *dir);
78 void exfat_free_ancestors(struct exfat_inode *child);
79 void exfat_free_dir_list(struct exfat *exfat);
80
81 int exfat_resolve_path(struct path_resolve_ctx *ctx, struct exfat_inode *child);
82 int exfat_resolve_path_parent(struct path_resolve_ctx *ctx,
83                               struct exfat_inode *parent, struct exfat_inode *child);
84
85 struct buffer_desc *exfat_alloc_buffer(int count,
86                                        unsigned int clu_size, unsigned int sect_size);
87 void exfat_free_buffer(struct buffer_desc *bd, int count);
88 #endif