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