1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd.
9 #include <linux/types.h>
10 #include <linux/buffer_head.h>
12 #ifdef CONFIG_EXFAT_KERNEL_DEBUG
13 /* For Debugging Purpose */
14 /* IOCTL code 'f' used by
15 * - file systems typically #0~0x1F
16 * - embedded terminal devices #128~
17 * - exts for debugging purpose #99
18 * number 100 and 101 is available now but has possible conflicts
20 #define EXFAT_IOC_GET_DEBUGFLAGS _IOR('f', 100, long)
21 #define EXFAT_IOC_SET_DEBUGFLAGS _IOW('f', 101, long)
23 #define EXFAT_DEBUGFLAGS_INVALID_UMOUNT 0x01
24 #define EXFAT_DEBUGFLAGS_ERROR_RW 0x02
25 #endif /* CONFIG_EXFAT_KERNEL_DEBUG */
27 #ifdef CONFIG_EXFAT_DEBUG_MSG
33 #define DENTRY_SIZE 32 /* dir entry size */
34 #define DENTRY_SIZE_BITS 5
37 #define PBR_SIGNATURE 0xAA55
38 #define EXT_SIGNATURE 0xAA550000
39 #define VOL_LABEL "NO NAME " /* size should be 11 */
40 #define OEM_NAME "MSWIN4.1" /* size should be 8 */
41 #define STR_FAT12 "FAT12 " /* size should be 8 */
42 #define STR_FAT16 "FAT16 " /* size should be 8 */
43 #define STR_FAT32 "FAT32 " /* size should be 8 */
44 #define STR_EXFAT "EXFAT " /* size should be 8 */
45 #define VOL_CLEAN 0x0000
46 #define VOL_DIRTY 0x0002
48 /* max number of clusters */
49 #define FAT12_THRESHOLD 4087 /* 2^12 - 1 + 2 (clu 0 & 1) */
50 #define FAT16_THRESHOLD 65527 /* 2^16 - 1 + 2 */
51 #define FAT32_THRESHOLD 268435457 /* 2^28 - 1 + 2 */
52 #define EXFAT_THRESHOLD 268435457 /* 2^28 - 1 + 2 */
55 #define TYPE_UNUSED 0x0000
56 #define TYPE_DELETED 0x0001
57 #define TYPE_INVALID 0x0002
58 #define TYPE_CRITICAL_PRI 0x0100
59 #define TYPE_BITMAP 0x0101
60 #define TYPE_UPCASE 0x0102
61 #define TYPE_VOLUME 0x0103
62 #define TYPE_DIR 0x0104
63 #define TYPE_FILE 0x011F
64 #define TYPE_SYMLINK 0x015F
65 #define TYPE_CRITICAL_SEC 0x0200
66 #define TYPE_STREAM 0x0201
67 #define TYPE_EXTEND 0x0202
68 #define TYPE_ACL 0x0203
69 #define TYPE_BENIGN_PRI 0x0400
70 #define TYPE_GUID 0x0401
71 #define TYPE_PADDING 0x0402
72 #define TYPE_ACLTAB 0x0403
73 #define TYPE_BENIGN_SEC 0x0800
74 #define TYPE_ALL 0x0FFF
82 #define CS_DIR_ENTRY 0
83 #define CS_PBR_SECTOR 1
86 #define CLUSTER_16(x) ((u16)(x))
87 #define CLUSTER_32(x) ((u32)(x))
89 #define START_SECTOR(x) \
90 ((((sector_t)((x) - 2)) << p_fs->sectors_per_clu_bits) + \
91 p_fs->data_start_sector)
93 #define IS_LAST_SECTOR_IN_CLUSTER(sec) \
94 ((((sec) - p_fs->data_start_sector + 1) & \
95 ((1 << p_fs->sectors_per_clu_bits) - 1)) == 0)
97 #define GET_CLUSTER_FROM_SECTOR(sec) \
98 ((u32)((((sec) - p_fs->data_start_sector) >> \
99 p_fs->sectors_per_clu_bits) + 2))
101 #define GET16(p_src) \
102 (((u16)(p_src)[0]) | (((u16)(p_src)[1]) << 8))
103 #define GET32(p_src) \
104 (((u32)(p_src)[0]) | (((u32)(p_src)[1]) << 8) | \
105 (((u32)(p_src)[2]) << 16) | (((u32)(p_src)[3]) << 24))
106 #define GET64(p_src) \
107 (((u64)(p_src)[0]) | (((u64)(p_src)[1]) << 8) | \
108 (((u64)(p_src)[2]) << 16) | (((u64)(p_src)[3]) << 24) | \
109 (((u64)(p_src)[4]) << 32) | (((u64)(p_src)[5]) << 40) | \
110 (((u64)(p_src)[6]) << 48) | (((u64)(p_src)[7]) << 56))
112 #define SET16(p_dst, src) \
114 (p_dst)[0] = (u8)(src); \
115 (p_dst)[1] = (u8)(((u16)(src)) >> 8); \
117 #define SET32(p_dst, src) \
119 (p_dst)[0] = (u8)(src); \
120 (p_dst)[1] = (u8)(((u32)(src)) >> 8); \
121 (p_dst)[2] = (u8)(((u32)(src)) >> 16); \
122 (p_dst)[3] = (u8)(((u32)(src)) >> 24); \
124 #define SET64(p_dst, src) \
126 (p_dst)[0] = (u8)(src); \
127 (p_dst)[1] = (u8)(((u64)(src)) >> 8); \
128 (p_dst)[2] = (u8)(((u64)(src)) >> 16); \
129 (p_dst)[3] = (u8)(((u64)(src)) >> 24); \
130 (p_dst)[4] = (u8)(((u64)(src)) >> 32); \
131 (p_dst)[5] = (u8)(((u64)(src)) >> 40); \
132 (p_dst)[6] = (u8)(((u64)(src)) >> 48); \
133 (p_dst)[7] = (u8)(((u64)(src)) >> 56); \
136 #ifdef __LITTLE_ENDIAN
137 #define GET16_A(p_src) (*((u16 *)(p_src)))
138 #define GET32_A(p_src) (*((u32 *)(p_src)))
139 #define GET64_A(p_src) (*((u64 *)(p_src)))
140 #define SET16_A(p_dst, src) (*((u16 *)(p_dst)) = (u16)(src))
141 #define SET32_A(p_dst, src) (*((u32 *)(p_dst)) = (u32)(src))
142 #define SET64_A(p_dst, src) (*((u64 *)(p_dst)) = (u64)(src))
143 #else /* BIG_ENDIAN */
144 #define GET16_A(p_src) GET16(p_src)
145 #define GET32_A(p_src) GET32(p_src)
146 #define GET64_A(p_src) GET64(p_src)
147 #define SET16_A(p_dst, src) SET16(p_dst, src)
148 #define SET32_A(p_dst, src) SET32(p_dst, src)
149 #define SET64_A(p_dst, src) SET64(p_dst, src)
152 /* cache size (in number of sectors) */
153 /* (should be an exponential value of 2) */
154 #define FAT_CACHE_SIZE 128
155 #define FAT_CACHE_HASH_SIZE 64
156 #define BUF_CACHE_SIZE 256
157 #define BUF_CACHE_HASH_SIZE 64
159 /* Upcase table macro */
160 #define HIGH_INDEX_BIT (8)
161 #define HIGH_INDEX_MASK (0xFF00)
162 #define LOW_INDEX_BIT (16 - HIGH_INDEX_BIT)
163 #define UTBL_ROW_COUNT BIT(LOW_INDEX_BIT)
164 #define UTBL_COL_COUNT BIT(HIGH_INDEX_BIT)
166 static inline u16
get_col_index(u16 i
)
168 return i
>> LOW_INDEX_BIT
;
171 static inline u16
get_row_index(u16 i
)
173 return i
& ~HIGH_INDEX_MASK
;
176 #define EXFAT_SUPER_MAGIC (0x2011BAB0L)
177 #define EXFAT_ROOT_INO 1
180 #define FAT12 0x01 /* FAT12 */
181 #define FAT16 0x0E /* Win95 FAT16 (LBA) */
182 #define FAT32 0x0C /* Win95 FAT32 (LBA) */
183 #define EXFAT 0x07 /* exFAT */
185 /* file name lengths */
186 #define MAX_CHARSET_SIZE 3 /* max size of multi-byte character */
187 #define MAX_PATH_DEPTH 15 /* max depth of path name */
188 #define MAX_NAME_LENGTH 256 /* max len of filename including NULL */
189 #define MAX_PATH_LENGTH 260 /* max len of pathname including NULL */
190 #define DOS_NAME_LENGTH 11 /* DOS filename length excluding NULL */
191 #define DOS_PATH_LENGTH 80 /* DOS pathname length excluding NULL */
193 /* file attributes */
194 #define ATTR_NORMAL 0x0000
195 #define ATTR_READONLY 0x0001
196 #define ATTR_HIDDEN 0x0002
197 #define ATTR_SYSTEM 0x0004
198 #define ATTR_VOLUME 0x0008
199 #define ATTR_SUBDIR 0x0010
200 #define ATTR_ARCHIVE 0x0020
201 #define ATTR_SYMLINK 0x0040
202 #define ATTR_EXTEND 0x000F
203 #define ATTR_RWMASK 0x007E
205 /* file creation modes */
206 #define FM_REGULAR 0x00
207 #define FM_SYMLINK 0x40
210 #define FFS_SUCCESS 0
211 #define FFS_MEDIAERR 1
212 #define FFS_FORMATERR 2
213 #define FFS_MOUNTED 3
214 #define FFS_NOTMOUNTED 4
215 #define FFS_ALIGNMENTERR 5
216 #define FFS_SEMAPHOREERR 6
217 #define FFS_INVALIDPATH 7
218 #define FFS_INVALIDFID 8
219 #define FFS_NOTFOUND 9
220 #define FFS_FILEEXIST 10
221 #define FFS_PERMISSIONERR 11
222 #define FFS_NOTOPENED 12
223 #define FFS_MAXOPENED 13
226 #define FFS_DIRBUSY 16
227 #define FFS_MEMORYERR 17
228 #define FFS_NAMETOOLONG 18
231 #define NUM_UPCASE 2918
233 #define DOS_CUR_DIR_NAME ". "
234 #define DOS_PAR_DIR_NAME ".. "
236 #ifdef __LITTLE_ENDIAN
237 #define UNI_CUR_DIR_NAME ".\0"
238 #define UNI_PAR_DIR_NAME ".\0.\0"
240 #define UNI_CUR_DIR_NAME "\0."
241 #define UNI_PAR_DIR_NAME "\0.\0."
255 u32 Offset
; /* start sector number of the partition */
256 u32 Size
; /* in sectors */
260 u32 SecSize
; /* sector size in bytes */
261 u32 DevSize
; /* block device size in sectors */
272 /* directory structure */
293 char Name
[MAX_NAME_LENGTH
* MAX_CHARSET_SIZE
];
295 /* used only for FAT12/16/32, not used for exFAT */
296 char ShortName
[DOS_NAME_LENGTH
+ 2];
301 struct date_time_t CreateTimestamp
;
302 struct date_time_t ModifyTimestamp
;
303 struct date_time_t AccessTimestamp
;
307 u16 sec
; /* 0 ~ 59 */
308 u16 min
; /* 0 ~ 59 */
309 u16 hour
; /* 0 ~ 23 */
310 u16 day
; /* 1 ~ 31 */
311 u16 mon
; /* 1 ~ 12 */
312 u16 year
; /* 0 ~ 127 (since 1980) */
315 /* MS_DOS FAT partition boot record (512 bytes) */
316 struct pbr_sector_t
{
324 /* MS-DOS FAT12/16 BIOS parameter block (51 bytes) */
330 u8 num_root_entries
[2];
333 u8 num_fat_sectors
[2];
334 u8 sectors_in_track
[2];
336 u8 num_hid_sectors
[4];
337 u8 num_huge_sectors
[4];
347 /* MS-DOS FAT32 BIOS parameter block (79 bytes) */
353 u8 num_root_entries
[2];
356 u8 num_fat_sectors
[2];
357 u8 sectors_in_track
[2];
359 u8 num_hid_sectors
[4];
360 u8 num_huge_sectors
[4];
361 u8 num_fat32_sectors
[4];
377 /* MS-DOS EXFAT BIOS parameter block (109 bytes) */
391 u8 sectors_per_clu_bits
;
398 /* MS-DOS FAT file system information sector (512 bytes) */
399 struct fsi_sector_t
{
409 /* MS-DOS FAT directory entry (32 bytes) */
414 struct dos_dentry_t
{
415 u8 name
[DOS_NAME_LENGTH
];
429 /* MS-DOS FAT extended directory entry (32 bytes) */
430 struct ext_dentry_t
{
441 /* MS-DOS EXFAT file directory entry (32 bytes) */
442 struct file_dentry_t
{
460 /* MS-DOS EXFAT stream extension directory entry (32 bytes) */
461 struct strm_dentry_t
{
474 /* MS-DOS EXFAT file name directory entry (32 bytes) */
475 struct name_dentry_t
{
481 /* MS-DOS EXFAT allocation bitmap directory entry (32 bytes) */
482 struct bmap_dentry_t
{
490 /* MS-DOS EXFAT up-case table directory entry (32 bytes) */
491 struct case_dentry_t
{
500 /* MS-DOS EXFAT volume label directory entry (32 bytes) */
501 struct volm_dentry_t
{
508 /* unused entry hint information */
515 /* DOS name structure */
517 u8 name
[DOS_NAME_LENGTH
];
521 /* unicode name structure */
523 u16 name
[MAX_NAME_LENGTH
];
529 struct buf_cache_t
*next
;
530 struct buf_cache_t
*prev
;
531 struct buf_cache_t
*hash_next
;
532 struct buf_cache_t
*hash_prev
;
536 struct buffer_head
*buf_bh
;
540 s32 (*alloc_cluster
)(struct super_block
*sb
, s32 num_alloc
,
541 struct chain_t
*p_chain
);
542 void (*free_cluster
)(struct super_block
*sb
, struct chain_t
*p_chain
,
544 s32 (*count_used_clusters
)(struct super_block
*sb
);
546 s32 (*init_dir_entry
)(struct super_block
*sb
, struct chain_t
*p_dir
,
547 s32 entry
, u32 type
, u32 start_clu
, u64 size
);
548 s32 (*init_ext_entry
)(struct super_block
*sb
, struct chain_t
*p_dir
,
549 s32 entry
, s32 num_entries
,
550 struct uni_name_t
*p_uniname
,
551 struct dos_name_t
*p_dosname
);
552 s32 (*find_dir_entry
)(struct super_block
*sb
, struct chain_t
*p_dir
,
553 struct uni_name_t
*p_uniname
, s32 num_entries
,
554 struct dos_name_t
*p_dosname
, u32 type
);
555 void (*delete_dir_entry
)(struct super_block
*sb
,
556 struct chain_t
*p_dir
, s32 entry
,
557 s32 offset
, s32 num_entries
);
558 void (*get_uni_name_from_ext_entry
)(struct super_block
*sb
,
559 struct chain_t
*p_dir
, s32 entry
,
561 s32 (*count_ext_entries
)(struct super_block
*sb
,
562 struct chain_t
*p_dir
, s32 entry
,
563 struct dentry_t
*p_entry
);
564 s32 (*calc_num_entries
)(struct uni_name_t
*p_uniname
);
566 u32 (*get_entry_type
)(struct dentry_t
*p_entry
);
567 void (*set_entry_type
)(struct dentry_t
*p_entry
, u32 type
);
568 u32 (*get_entry_attr
)(struct dentry_t
*p_entry
);
569 void (*set_entry_attr
)(struct dentry_t
*p_entry
, u32 attr
);
570 u8 (*get_entry_flag
)(struct dentry_t
*p_entry
);
571 void (*set_entry_flag
)(struct dentry_t
*p_entry
, u8 flag
);
572 u32 (*get_entry_clu0
)(struct dentry_t
*p_entry
);
573 void (*set_entry_clu0
)(struct dentry_t
*p_entry
, u32 clu0
);
574 u64 (*get_entry_size
)(struct dentry_t
*p_entry
);
575 void (*set_entry_size
)(struct dentry_t
*p_entry
, u64 size
);
576 void (*get_entry_time
)(struct dentry_t
*p_entry
,
577 struct timestamp_t
*tp
, u8 mode
);
578 void (*set_entry_time
)(struct dentry_t
*p_entry
,
579 struct timestamp_t
*tp
, u8 mode
);
583 u32 drv
; /* drive ID */
584 u32 vol_type
; /* volume FAT type */
585 u32 vol_id
; /* volume serial number */
587 u64 num_sectors
; /* num of sectors in volume */
588 u32 num_clusters
; /* num of clusters in volume */
589 u32 cluster_size
; /* cluster size in bytes */
590 u32 cluster_size_bits
;
591 u32 sectors_per_clu
; /* cluster size in sectors */
592 u32 sectors_per_clu_bits
;
594 u32 PBR_sector
; /* PBR sector */
595 u32 FAT1_start_sector
; /* FAT1 start sector */
596 u32 FAT2_start_sector
; /* FAT2 start sector */
597 u32 root_start_sector
; /* root dir start sector */
598 u32 data_start_sector
; /* data area start sector */
599 u32 num_FAT_sectors
; /* num of FAT sectors */
601 u32 root_dir
; /* root dir cluster */
602 u32 dentries_in_root
; /* num of dentries in root dir */
603 u32 dentries_per_clu
; /* num of dentries per cluster */
605 u32 vol_flag
; /* volume dirty flag */
606 struct buffer_head
*pbr_bh
; /* PBR sector */
608 u32 map_clu
; /* allocation bitmap start cluster */
609 u32 map_sectors
; /* num of allocation bitmap sectors */
610 struct buffer_head
**vol_amap
; /* allocation bitmap */
612 u16
**vol_utbl
; /* upcase table */
614 u32 clu_srch_ptr
; /* cluster search pointer */
615 u32 used_clusters
; /* number of used clusters */
616 struct uentry_t hint_uentry
; /* unused entry hint information */
618 u32 dev_ejected
; /* block device operation error flag */
620 struct fs_func
*fs_func
;
621 struct semaphore v_sem
;
624 struct buf_cache_t FAT_cache_array
[FAT_CACHE_SIZE
];
625 struct buf_cache_t FAT_cache_lru_list
;
626 struct buf_cache_t FAT_cache_hash_list
[FAT_CACHE_HASH_SIZE
];
629 struct buf_cache_t buf_cache_array
[BUF_CACHE_SIZE
];
630 struct buf_cache_t buf_cache_lru_list
;
631 struct buf_cache_t buf_cache_hash_list
[BUF_CACHE_HASH_SIZE
];
634 #define ES_2_ENTRIES 2
635 #define ES_3_ENTRIES 3
636 #define ES_ALL_ENTRIES 0
638 struct entry_set_cache_t
{
639 /* sector number that contains file_entry */
642 /* byte offset in the sector */
646 * flag in stream entry.
647 * 01 for cluster chain,
648 * 03 for contig. clusteres.
654 /* __buf should be the last member */
658 #define EXFAT_ERRORS_CONT 1 /* ignore error and continue */
659 #define EXFAT_ERRORS_PANIC 2 /* panic on error */
660 #define EXFAT_ERRORS_RO 3 /* remount r/o on error */
663 #define EXFAT_IOCTL_GET_VOLUME_ID _IOR('r', 0x12, __u32)
665 struct exfat_mount_options
{
668 unsigned short fs_fmask
;
669 unsigned short fs_dmask
;
671 /* permission for setting the [am]time */
672 unsigned short allow_utime
;
674 /* codepage for shortname conversions */
675 unsigned short codepage
;
677 /* charset for filename input/display */
680 unsigned char casesensitive
;
682 /* on error: continue, panic, remount-ro */
683 unsigned char errors
;
684 #ifdef CONFIG_EXFAT_DISCARD
685 /* flag on if -o dicard specified and device support discard() */
686 unsigned char discard
;
687 #endif /* CONFIG_EXFAT_DISCARD */
690 #define EXFAT_HASH_BITS 8
691 #define EXFAT_HASH_SIZE BIT(EXFAT_HASH_BITS)
694 * EXFAT file system in-core superblock data
697 s32 sector_size
; /* in bytes */
698 s32 sector_size_bits
;
699 s32 sector_size_mask
;
701 /* total number of sectors in this block device */
708 struct exfat_sb_info
{
709 struct fs_info_t fs_info
;
710 struct bd_info_t bd_info
;
712 struct exfat_mount_options options
;
716 struct nls_table
*nls_disk
; /* Codepage used on disk */
717 struct nls_table
*nls_io
; /* Charset used for input and display */
719 struct inode
*fat_inode
;
721 spinlock_t inode_hash_lock
;
722 struct hlist_head inode_hashtable
[EXFAT_HASH_SIZE
];
723 #ifdef CONFIG_EXFAT_KERNEL_DEBUG
725 #endif /* CONFIG_EXFAT_KERNEL_DEBUG */
729 * EXFAT file system inode data in memory
731 struct exfat_inode_info
{
732 struct file_id_t fid
;
734 /* NOTE: mmu_private is 64bits, so must hold ->i_mutex to access */
735 loff_t mmu_private
; /* physically allocated size */
736 loff_t i_pos
; /* on-disk position of directory entry or 0 */
737 struct hlist_node i_hash_fat
; /* hash by i_location */
738 struct rw_semaphore truncate_lock
;
739 struct inode vfs_inode
;
740 struct rw_semaphore i_alloc_sem
; /* protect bmap against truncate */
743 #define EXFAT_SB(sb) ((struct exfat_sb_info *)((sb)->s_fs_info))
745 static inline struct exfat_inode_info
*EXFAT_I(struct inode
*inode
)
747 return container_of(inode
, struct exfat_inode_info
, vfs_inode
);
750 /* NLS management function */
751 u16
nls_upper(struct super_block
*sb
, u16 a
);
752 int nls_dosname_cmp(struct super_block
*sb
, u8
*a
, u8
*b
);
753 int nls_uniname_cmp(struct super_block
*sb
, u16
*a
, u16
*b
);
754 void nls_uniname_to_dosname(struct super_block
*sb
,
755 struct dos_name_t
*p_dosname
,
756 struct uni_name_t
*p_uniname
, bool *p_lossy
);
757 void nls_dosname_to_uniname(struct super_block
*sb
,
758 struct uni_name_t
*p_uniname
,
759 struct dos_name_t
*p_dosname
);
760 void nls_uniname_to_cstring(struct super_block
*sb
, u8
*p_cstring
,
761 struct uni_name_t
*p_uniname
);
762 void nls_cstring_to_uniname(struct super_block
*sb
,
763 struct uni_name_t
*p_uniname
, u8
*p_cstring
,
766 /* buffer cache management */
767 void buf_init(struct super_block
*sb
);
768 void buf_shutdown(struct super_block
*sb
);
769 int FAT_read(struct super_block
*sb
, u32 loc
, u32
*content
);
770 s32
FAT_write(struct super_block
*sb
, u32 loc
, u32 content
);
771 u8
*FAT_getblk(struct super_block
*sb
, sector_t sec
);
772 void FAT_modify(struct super_block
*sb
, sector_t sec
);
773 void FAT_release_all(struct super_block
*sb
);
774 void FAT_sync(struct super_block
*sb
);
775 u8
*buf_getblk(struct super_block
*sb
, sector_t sec
);
776 void buf_modify(struct super_block
*sb
, sector_t sec
);
777 void buf_lock(struct super_block
*sb
, sector_t sec
);
778 void buf_unlock(struct super_block
*sb
, sector_t sec
);
779 void buf_release(struct super_block
*sb
, sector_t sec
);
780 void buf_release_all(struct super_block
*sb
);
781 void buf_sync(struct super_block
*sb
);
783 /* fs management functions */
784 void fs_set_vol_flags(struct super_block
*sb
, u32 new_flag
);
785 void fs_error(struct super_block
*sb
);
787 /* cluster management functions */
788 s32
clear_cluster(struct super_block
*sb
, u32 clu
);
789 s32
fat_alloc_cluster(struct super_block
*sb
, s32 num_alloc
,
790 struct chain_t
*p_chain
);
791 s32
exfat_alloc_cluster(struct super_block
*sb
, s32 num_alloc
,
792 struct chain_t
*p_chain
);
793 void fat_free_cluster(struct super_block
*sb
, struct chain_t
*p_chain
,
795 void exfat_free_cluster(struct super_block
*sb
, struct chain_t
*p_chain
,
797 u32
find_last_cluster(struct super_block
*sb
, struct chain_t
*p_chain
);
798 s32
count_num_clusters(struct super_block
*sb
, struct chain_t
*dir
);
799 s32
fat_count_used_clusters(struct super_block
*sb
);
800 s32
exfat_count_used_clusters(struct super_block
*sb
);
801 void exfat_chain_cont_cluster(struct super_block
*sb
, u32 chain
, s32 len
);
803 /* allocation bitmap management functions */
804 s32
load_alloc_bitmap(struct super_block
*sb
);
805 void free_alloc_bitmap(struct super_block
*sb
);
806 s32
set_alloc_bitmap(struct super_block
*sb
, u32 clu
);
807 s32
clr_alloc_bitmap(struct super_block
*sb
, u32 clu
);
808 u32
test_alloc_bitmap(struct super_block
*sb
, u32 clu
);
809 void sync_alloc_bitmap(struct super_block
*sb
);
811 /* upcase table management functions */
812 s32
load_upcase_table(struct super_block
*sb
);
813 void free_upcase_table(struct super_block
*sb
);
815 /* dir entry management functions */
816 u32
fat_get_entry_type(struct dentry_t
*p_entry
);
817 u32
exfat_get_entry_type(struct dentry_t
*p_entry
);
818 void fat_set_entry_type(struct dentry_t
*p_entry
, u32 type
);
819 void exfat_set_entry_type(struct dentry_t
*p_entry
, u32 type
);
820 u32
fat_get_entry_attr(struct dentry_t
*p_entry
);
821 u32
exfat_get_entry_attr(struct dentry_t
*p_entry
);
822 void fat_set_entry_attr(struct dentry_t
*p_entry
, u32 attr
);
823 void exfat_set_entry_attr(struct dentry_t
*p_entry
, u32 attr
);
824 u8
fat_get_entry_flag(struct dentry_t
*p_entry
);
825 u8
exfat_get_entry_flag(struct dentry_t
*p_entry
);
826 void fat_set_entry_flag(struct dentry_t
*p_entry
, u8 flag
);
827 void exfat_set_entry_flag(struct dentry_t
*p_entry
, u8 flag
);
828 u32
fat_get_entry_clu0(struct dentry_t
*p_entry
);
829 u32
exfat_get_entry_clu0(struct dentry_t
*p_entry
);
830 void fat_set_entry_clu0(struct dentry_t
*p_entry
, u32 start_clu
);
831 void exfat_set_entry_clu0(struct dentry_t
*p_entry
, u32 start_clu
);
832 u64
fat_get_entry_size(struct dentry_t
*p_entry
);
833 u64
exfat_get_entry_size(struct dentry_t
*p_entry
);
834 void fat_set_entry_size(struct dentry_t
*p_entry
, u64 size
);
835 void exfat_set_entry_size(struct dentry_t
*p_entry
, u64 size
);
836 struct timestamp_t
*tm_current(struct timestamp_t
*tm
);
837 void fat_get_entry_time(struct dentry_t
*p_entry
, struct timestamp_t
*tp
,
839 void exfat_get_entry_time(struct dentry_t
*p_entry
, struct timestamp_t
*tp
,
841 void fat_set_entry_time(struct dentry_t
*p_entry
, struct timestamp_t
*tp
,
843 void exfat_set_entry_time(struct dentry_t
*p_entry
, struct timestamp_t
*tp
,
845 s32
fat_init_dir_entry(struct super_block
*sb
, struct chain_t
*p_dir
, s32 entry
,
846 u32 type
, u32 start_clu
, u64 size
);
847 s32
exfat_init_dir_entry(struct super_block
*sb
, struct chain_t
*p_dir
,
848 s32 entry
, u32 type
, u32 start_clu
, u64 size
);
849 s32
fat_init_ext_dir_entry(struct super_block
*sb
, struct chain_t
*p_dir
,
850 s32 entry
, s32 num_entries
,
851 struct uni_name_t
*p_uniname
,
852 struct dos_name_t
*p_dosname
);
853 s32
exfat_init_ext_dir_entry(struct super_block
*sb
, struct chain_t
*p_dir
,
854 s32 entry
, s32 num_entries
,
855 struct uni_name_t
*p_uniname
,
856 struct dos_name_t
*p_dosname
);
857 void init_dos_entry(struct dos_dentry_t
*ep
, u32 type
, u32 start_clu
);
858 void init_ext_entry(struct ext_dentry_t
*ep
, s32 order
, u8 chksum
,
860 void init_file_entry(struct file_dentry_t
*ep
, u32 type
);
861 void init_strm_entry(struct strm_dentry_t
*ep
, u8 flags
, u32 start_clu
,
863 void init_name_entry(struct name_dentry_t
*ep
, u16
*uniname
);
864 void fat_delete_dir_entry(struct super_block
*sb
, struct chain_t
*p_dir
,
865 s32 entry
, s32 order
, s32 num_entries
);
866 void exfat_delete_dir_entry(struct super_block
*sb
, struct chain_t
*p_dir
,
867 s32 entry
, s32 order
, s32 num_entries
);
869 s32
find_location(struct super_block
*sb
, struct chain_t
*p_dir
, s32 entry
,
870 sector_t
*sector
, s32
*offset
);
871 struct dentry_t
*get_entry_with_sector(struct super_block
*sb
, sector_t sector
,
873 struct dentry_t
*get_entry_in_dir(struct super_block
*sb
, struct chain_t
*p_dir
,
874 s32 entry
, sector_t
*sector
);
875 struct entry_set_cache_t
*get_entry_set_in_dir(struct super_block
*sb
,
876 struct chain_t
*p_dir
, s32 entry
,
878 struct dentry_t
**file_ep
);
879 void release_entry_set(struct entry_set_cache_t
*es
);
880 s32
write_whole_entry_set(struct super_block
*sb
, struct entry_set_cache_t
*es
);
881 s32
write_partial_entries_in_entry_set(struct super_block
*sb
,
882 struct entry_set_cache_t
*es
,
883 struct dentry_t
*ep
, u32 count
);
884 s32
search_deleted_or_unused_entry(struct super_block
*sb
,
885 struct chain_t
*p_dir
, s32 num_entries
);
886 s32
find_empty_entry(struct inode
*inode
, struct chain_t
*p_dir
,
888 s32
fat_find_dir_entry(struct super_block
*sb
, struct chain_t
*p_dir
,
889 struct uni_name_t
*p_uniname
, s32 num_entries
,
890 struct dos_name_t
*p_dosname
, u32 type
);
891 s32
exfat_find_dir_entry(struct super_block
*sb
, struct chain_t
*p_dir
,
892 struct uni_name_t
*p_uniname
, s32 num_entries
,
893 struct dos_name_t
*p_dosname
, u32 type
);
894 s32
fat_count_ext_entries(struct super_block
*sb
, struct chain_t
*p_dir
,
895 s32 entry
, struct dentry_t
*p_entry
);
896 s32
exfat_count_ext_entries(struct super_block
*sb
, struct chain_t
*p_dir
,
897 s32 entry
, struct dentry_t
*p_entry
);
898 s32
count_dos_name_entries(struct super_block
*sb
, struct chain_t
*p_dir
,
900 void update_dir_checksum(struct super_block
*sb
, struct chain_t
*p_dir
,
902 void update_dir_checksum_with_entry_set(struct super_block
*sb
,
903 struct entry_set_cache_t
*es
);
904 bool is_dir_empty(struct super_block
*sb
, struct chain_t
*p_dir
);
906 /* name conversion functions */
907 s32
get_num_entries_and_dos_name(struct super_block
*sb
, struct chain_t
*p_dir
,
908 struct uni_name_t
*p_uniname
, s32
*entries
,
909 struct dos_name_t
*p_dosname
);
910 void get_uni_name_from_dos_entry(struct super_block
*sb
,
911 struct dos_dentry_t
*ep
,
912 struct uni_name_t
*p_uniname
, u8 mode
);
913 void fat_get_uni_name_from_ext_entry(struct super_block
*sb
,
914 struct chain_t
*p_dir
, s32 entry
,
916 void exfat_get_uni_name_from_ext_entry(struct super_block
*sb
,
917 struct chain_t
*p_dir
, s32 entry
,
919 s32
extract_uni_name_from_ext_entry(struct ext_dentry_t
*ep
,
920 u16
*uniname
, s32 order
);
921 s32
extract_uni_name_from_name_entry(struct name_dentry_t
*ep
,
922 u16
*uniname
, s32 order
);
923 s32
fat_generate_dos_name(struct super_block
*sb
, struct chain_t
*p_dir
,
924 struct dos_name_t
*p_dosname
);
925 void fat_attach_count_to_dos_name(u8
*dosname
, s32 count
);
926 s32
fat_calc_num_entries(struct uni_name_t
*p_uniname
);
927 s32
exfat_calc_num_entries(struct uni_name_t
*p_uniname
);
928 u8
calc_checksum_1byte(void *data
, s32 len
, u8 chksum
);
929 u16
calc_checksum_2byte(void *data
, s32 len
, u16 chksum
, s32 type
);
930 u32
calc_checksum_4byte(void *data
, s32 len
, u32 chksum
, s32 type
);
932 /* name resolution functions */
933 s32
resolve_path(struct inode
*inode
, char *path
, struct chain_t
*p_dir
,
934 struct uni_name_t
*p_uniname
);
935 s32
resolve_name(u8
*name
, u8
**arg
);
937 /* file operation functions */
938 s32
fat16_mount(struct super_block
*sb
, struct pbr_sector_t
*p_pbr
);
939 s32
fat32_mount(struct super_block
*sb
, struct pbr_sector_t
*p_pbr
);
940 s32
exfat_mount(struct super_block
*sb
, struct pbr_sector_t
*p_pbr
);
941 s32
create_dir(struct inode
*inode
, struct chain_t
*p_dir
,
942 struct uni_name_t
*p_uniname
, struct file_id_t
*fid
);
943 s32
create_file(struct inode
*inode
, struct chain_t
*p_dir
,
944 struct uni_name_t
*p_uniname
, u8 mode
, struct file_id_t
*fid
);
945 void remove_file(struct inode
*inode
, struct chain_t
*p_dir
, s32 entry
);
946 s32
rename_file(struct inode
*inode
, struct chain_t
*p_dir
, s32 old_entry
,
947 struct uni_name_t
*p_uniname
, struct file_id_t
*fid
);
948 s32
move_file(struct inode
*inode
, struct chain_t
*p_olddir
, s32 oldentry
,
949 struct chain_t
*p_newdir
, struct uni_name_t
*p_uniname
,
950 struct file_id_t
*fid
);
952 /* sector read/write functions */
953 int sector_read(struct super_block
*sb
, sector_t sec
,
954 struct buffer_head
**bh
, bool read
);
955 int sector_write(struct super_block
*sb
, sector_t sec
,
956 struct buffer_head
*bh
, bool sync
);
957 int multi_sector_read(struct super_block
*sb
, sector_t sec
,
958 struct buffer_head
**bh
, s32 num_secs
, bool read
);
959 int multi_sector_write(struct super_block
*sb
, sector_t sec
,
960 struct buffer_head
*bh
, s32 num_secs
, bool sync
);
962 void bdev_open(struct super_block
*sb
);
963 void bdev_close(struct super_block
*sb
);
964 int bdev_read(struct super_block
*sb
, sector_t secno
,
965 struct buffer_head
**bh
, u32 num_secs
, bool read
);
966 int bdev_write(struct super_block
*sb
, sector_t secno
,
967 struct buffer_head
*bh
, u32 num_secs
, bool sync
);
968 int bdev_sync(struct super_block
*sb
);
970 extern const u8 uni_upcase
[];
971 #endif /* _EXFAT_H */