This source file includes following definitions.
- get_col_index
- get_row_index
- EXFAT_I
1
2
3
4
5
6 #ifndef _EXFAT_H
7 #define _EXFAT_H
8
9 #include <linux/types.h>
10 #include <linux/buffer_head.h>
11
12 #ifdef CONFIG_EXFAT_KERNEL_DEBUG
13
14
15
16
17
18
19
20 #define EXFAT_IOC_GET_DEBUGFLAGS _IOR('f', 100, long)
21 #define EXFAT_IOC_SET_DEBUGFLAGS _IOW('f', 101, long)
22
23 #define EXFAT_DEBUGFLAGS_INVALID_UMOUNT 0x01
24 #define EXFAT_DEBUGFLAGS_ERROR_RW 0x02
25 #endif
26
27 #ifdef CONFIG_EXFAT_DEBUG_MSG
28 #define DEBUG 1
29 #else
30 #undef DEBUG
31 #endif
32
33 #define DENTRY_SIZE 32
34 #define DENTRY_SIZE_BITS 5
35
36
37 #define PBR_SIGNATURE 0xAA55
38 #define EXT_SIGNATURE 0xAA550000
39 #define VOL_LABEL "NO NAME "
40 #define OEM_NAME "MSWIN4.1"
41 #define STR_FAT12 "FAT12 "
42 #define STR_FAT16 "FAT16 "
43 #define STR_FAT32 "FAT32 "
44 #define STR_EXFAT "EXFAT "
45 #define VOL_CLEAN 0x0000
46 #define VOL_DIRTY 0x0002
47
48
49 #define FAT12_THRESHOLD 4087
50 #define FAT16_THRESHOLD 65527
51 #define FAT32_THRESHOLD 268435457
52 #define EXFAT_THRESHOLD 268435457
53
54
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
75
76
77 #define TM_CREATE 0
78 #define TM_MODIFY 1
79 #define TM_ACCESS 2
80
81
82 #define CS_DIR_ENTRY 0
83 #define CS_PBR_SECTOR 1
84 #define CS_DEFAULT 2
85
86 #define CLUSTER_16(x) ((u16)(x))
87 #define CLUSTER_32(x) ((u32)(x))
88
89 #define START_SECTOR(x) \
90 ((((sector_t)((x) - 2)) << p_fs->sectors_per_clu_bits) + \
91 p_fs->data_start_sector)
92
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)
96
97 #define GET_CLUSTER_FROM_SECTOR(sec) \
98 ((u32)((((sec) - p_fs->data_start_sector) >> \
99 p_fs->sectors_per_clu_bits) + 2))
100
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))
111
112 #define SET16(p_dst, src) \
113 do { \
114 (p_dst)[0] = (u8)(src); \
115 (p_dst)[1] = (u8)(((u16)(src)) >> 8); \
116 } while (0)
117 #define SET32(p_dst, src) \
118 do { \
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); \
123 } while (0)
124 #define SET64(p_dst, src) \
125 do { \
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); \
134 } while (0)
135
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
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)
150 #endif
151
152
153
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
158
159
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)
165
166 static inline u16 get_col_index(u16 i)
167 {
168 return i >> LOW_INDEX_BIT;
169 }
170
171 static inline u16 get_row_index(u16 i)
172 {
173 return i & ~HIGH_INDEX_MASK;
174 }
175
176 #define EXFAT_SUPER_MAGIC (0x2011BAB0L)
177 #define EXFAT_ROOT_INO 1
178
179
180 #define FAT12 0x01
181 #define FAT16 0x0E
182 #define FAT32 0x0C
183 #define EXFAT 0x07
184
185
186 #define MAX_CHARSET_SIZE 3
187 #define MAX_PATH_DEPTH 15
188 #define MAX_NAME_LENGTH 256
189 #define MAX_PATH_LENGTH 260
190 #define DOS_NAME_LENGTH 11
191 #define DOS_PATH_LENGTH 80
192
193
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
204
205
206 #define FM_REGULAR 0x00
207 #define FM_SYMLINK 0x40
208
209
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
224 #define FFS_FULL 14
225 #define FFS_EOF 15
226 #define FFS_DIRBUSY 16
227 #define FFS_MEMORYERR 17
228 #define FFS_NAMETOOLONG 18
229 #define FFS_ERROR 19
230
231 #define NUM_UPCASE 2918
232
233 #define DOS_CUR_DIR_NAME ". "
234 #define DOS_PAR_DIR_NAME ".. "
235
236 #ifdef __LITTLE_ENDIAN
237 #define UNI_CUR_DIR_NAME ".\0"
238 #define UNI_PAR_DIR_NAME ".\0.\0"
239 #else
240 #define UNI_CUR_DIR_NAME "\0."
241 #define UNI_PAR_DIR_NAME "\0.\0."
242 #endif
243
244 struct date_time_t {
245 u16 Year;
246 u16 Month;
247 u16 Day;
248 u16 Hour;
249 u16 Minute;
250 u16 Second;
251 u16 MilliSecond;
252 };
253
254 struct part_info_t {
255 u32 Offset;
256 u32 Size;
257 };
258
259 struct dev_info_t {
260 u32 SecSize;
261 u32 DevSize;
262 };
263
264 struct vol_info_t {
265 u32 FatType;
266 u32 ClusterSize;
267 u32 NumClusters;
268 u32 FreeClusters;
269 u32 UsedClusters;
270 };
271
272
273 struct chain_t {
274 u32 dir;
275 s32 size;
276 u8 flags;
277 };
278
279 struct file_id_t {
280 struct chain_t dir;
281 s32 entry;
282 u32 type;
283 u32 attr;
284 u32 start_clu;
285 u64 size;
286 u8 flags;
287 s64 rwoffset;
288 s32 hint_last_off;
289 u32 hint_last_clu;
290 };
291
292 struct dir_entry_t {
293 char Name[MAX_NAME_LENGTH * MAX_CHARSET_SIZE];
294
295
296 char ShortName[DOS_NAME_LENGTH + 2];
297
298 u32 Attr;
299 u64 Size;
300 u32 NumSubdirs;
301 struct date_time_t CreateTimestamp;
302 struct date_time_t ModifyTimestamp;
303 struct date_time_t AccessTimestamp;
304 };
305
306 struct timestamp_t {
307 u16 sec;
308 u16 min;
309 u16 hour;
310 u16 day;
311 u16 mon;
312 u16 year;
313 };
314
315
316 struct pbr_sector_t {
317 u8 jmp_boot[3];
318 u8 oem_name[8];
319 u8 bpb[109];
320 u8 boot_code[390];
321 u8 signature[2];
322 };
323
324
325 struct bpb16_t {
326 u8 sector_size[2];
327 u8 sectors_per_clu;
328 u8 num_reserved[2];
329 u8 num_fats;
330 u8 num_root_entries[2];
331 u8 num_sectors[2];
332 u8 media_type;
333 u8 num_fat_sectors[2];
334 u8 sectors_in_track[2];
335 u8 num_heads[2];
336 u8 num_hid_sectors[4];
337 u8 num_huge_sectors[4];
338
339 u8 phy_drv_no;
340 u8 reserved;
341 u8 ext_signature;
342 u8 vol_serial[4];
343 u8 vol_label[11];
344 u8 vol_type[8];
345 };
346
347
348 struct bpb32_t {
349 u8 sector_size[2];
350 u8 sectors_per_clu;
351 u8 num_reserved[2];
352 u8 num_fats;
353 u8 num_root_entries[2];
354 u8 num_sectors[2];
355 u8 media_type;
356 u8 num_fat_sectors[2];
357 u8 sectors_in_track[2];
358 u8 num_heads[2];
359 u8 num_hid_sectors[4];
360 u8 num_huge_sectors[4];
361 u8 num_fat32_sectors[4];
362 u8 ext_flags[2];
363 u8 fs_version[2];
364 u8 root_cluster[4];
365 u8 fsinfo_sector[2];
366 u8 backup_sector[2];
367 u8 reserved[12];
368
369 u8 phy_drv_no;
370 u8 ext_reserved;
371 u8 ext_signature;
372 u8 vol_serial[4];
373 u8 vol_label[11];
374 u8 vol_type[8];
375 };
376
377
378 struct bpbex_t {
379 u8 reserved1[53];
380 u8 vol_offset[8];
381 u8 vol_length[8];
382 u8 fat_offset[4];
383 u8 fat_length[4];
384 u8 clu_offset[4];
385 u8 clu_count[4];
386 u8 root_cluster[4];
387 u8 vol_serial[4];
388 u8 fs_version[2];
389 u8 vol_flags[2];
390 u8 sector_size_bits;
391 u8 sectors_per_clu_bits;
392 u8 num_fats;
393 u8 phy_drv_no;
394 u8 perc_in_use;
395 u8 reserved2[7];
396 };
397
398
399 struct fsi_sector_t {
400 u8 signature1[4];
401 u8 reserved1[480];
402 u8 signature2[4];
403 u8 free_cluster[4];
404 u8 next_cluster[4];
405 u8 reserved2[14];
406 u8 signature3[2];
407 };
408
409
410 struct dentry_t {
411 u8 dummy[32];
412 };
413
414 struct dos_dentry_t {
415 u8 name[DOS_NAME_LENGTH];
416 u8 attr;
417 u8 lcase;
418 u8 create_time_ms;
419 u8 create_time[2];
420 u8 create_date[2];
421 u8 access_date[2];
422 u8 start_clu_hi[2];
423 u8 modify_time[2];
424 u8 modify_date[2];
425 u8 start_clu_lo[2];
426 u8 size[4];
427 };
428
429
430 struct ext_dentry_t {
431 u8 order;
432 u8 unicode_0_4[10];
433 u8 attr;
434 u8 sysid;
435 u8 checksum;
436 u8 unicode_5_10[12];
437 u8 start_clu[2];
438 u8 unicode_11_12[4];
439 };
440
441
442 struct file_dentry_t {
443 u8 type;
444 u8 num_ext;
445 u8 checksum[2];
446 u8 attr[2];
447 u8 reserved1[2];
448 u8 create_time[2];
449 u8 create_date[2];
450 u8 modify_time[2];
451 u8 modify_date[2];
452 u8 access_time[2];
453 u8 access_date[2];
454 u8 create_time_ms;
455 u8 modify_time_ms;
456 u8 access_time_ms;
457 u8 reserved2[9];
458 };
459
460
461 struct strm_dentry_t {
462 u8 type;
463 u8 flags;
464 u8 reserved1;
465 u8 name_len;
466 u8 name_hash[2];
467 u8 reserved2[2];
468 u8 valid_size[8];
469 u8 reserved3[4];
470 u8 start_clu[4];
471 u8 size[8];
472 };
473
474
475 struct name_dentry_t {
476 u8 type;
477 u8 flags;
478 u8 unicode_0_14[30];
479 };
480
481
482 struct bmap_dentry_t {
483 u8 type;
484 u8 flags;
485 u8 reserved[18];
486 u8 start_clu[4];
487 u8 size[8];
488 };
489
490
491 struct case_dentry_t {
492 u8 type;
493 u8 reserved1[3];
494 u8 checksum[4];
495 u8 reserved2[12];
496 u8 start_clu[4];
497 u8 size[8];
498 };
499
500
501 struct volm_dentry_t {
502 u8 type;
503 u8 label_len;
504 u8 unicode_0_10[22];
505 u8 reserved[8];
506 };
507
508
509 struct uentry_t {
510 u32 dir;
511 s32 entry;
512 struct chain_t clu;
513 };
514
515
516 struct dos_name_t {
517 u8 name[DOS_NAME_LENGTH];
518 u8 name_case;
519 };
520
521
522 struct uni_name_t {
523 u16 name[MAX_NAME_LENGTH];
524 u16 name_hash;
525 u8 name_len;
526 };
527
528 struct buf_cache_t {
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;
533 s32 drv;
534 sector_t sec;
535 u32 flag;
536 struct buffer_head *buf_bh;
537 };
538
539 struct fs_func {
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,
543 s32 do_relse);
544 s32 (*count_used_clusters)(struct super_block *sb);
545
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,
560 u16 *uniname);
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);
565
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);
580 };
581
582 struct fs_info_t {
583 u32 drv;
584 u32 vol_type;
585 u32 vol_id;
586
587 u64 num_sectors;
588 u32 num_clusters;
589 u32 cluster_size;
590 u32 cluster_size_bits;
591 u32 sectors_per_clu;
592 u32 sectors_per_clu_bits;
593
594 u32 PBR_sector;
595 u32 FAT1_start_sector;
596 u32 FAT2_start_sector;
597 u32 root_start_sector;
598 u32 data_start_sector;
599 u32 num_FAT_sectors;
600
601 u32 root_dir;
602 u32 dentries_in_root;
603 u32 dentries_per_clu;
604
605 u32 vol_flag;
606 struct buffer_head *pbr_bh;
607
608 u32 map_clu;
609 u32 map_sectors;
610 struct buffer_head **vol_amap;
611
612 u16 **vol_utbl;
613
614 u32 clu_srch_ptr;
615 u32 used_clusters;
616 struct uentry_t hint_uentry;
617
618 u32 dev_ejected;
619
620 struct fs_func *fs_func;
621 struct semaphore v_sem;
622
623
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];
627
628
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];
632 };
633
634 #define ES_2_ENTRIES 2
635 #define ES_3_ENTRIES 3
636 #define ES_ALL_ENTRIES 0
637
638 struct entry_set_cache_t {
639
640 sector_t sector;
641
642
643 s32 offset;
644
645
646
647
648
649
650 s32 alloc_flag;
651
652 u32 num_entries;
653
654
655 void *__buf;
656 };
657
658 #define EXFAT_ERRORS_CONT 1
659 #define EXFAT_ERRORS_PANIC 2
660 #define EXFAT_ERRORS_RO 3
661
662
663 #define EXFAT_IOCTL_GET_VOLUME_ID _IOR('r', 0x12, __u32)
664
665 struct exfat_mount_options {
666 kuid_t fs_uid;
667 kgid_t fs_gid;
668 unsigned short fs_fmask;
669 unsigned short fs_dmask;
670
671
672 unsigned short allow_utime;
673
674
675 unsigned short codepage;
676
677
678 char *iocharset;
679
680 unsigned char casesensitive;
681
682
683 unsigned char errors;
684 #ifdef CONFIG_EXFAT_DISCARD
685
686 unsigned char discard;
687 #endif
688 };
689
690 #define EXFAT_HASH_BITS 8
691 #define EXFAT_HASH_SIZE BIT(EXFAT_HASH_BITS)
692
693
694
695
696 struct bd_info_t {
697 s32 sector_size;
698 s32 sector_size_bits;
699 s32 sector_size_mask;
700
701
702 s32 num_sectors;
703
704
705 bool opened;
706 };
707
708 struct exfat_sb_info {
709 struct fs_info_t fs_info;
710 struct bd_info_t bd_info;
711
712 struct exfat_mount_options options;
713
714 int s_dirt;
715 struct mutex s_lock;
716 struct nls_table *nls_disk;
717 struct nls_table *nls_io;
718
719 struct inode *fat_inode;
720
721 spinlock_t inode_hash_lock;
722 struct hlist_head inode_hashtable[EXFAT_HASH_SIZE];
723 #ifdef CONFIG_EXFAT_KERNEL_DEBUG
724 long debug_flags;
725 #endif
726 };
727
728
729
730
731 struct exfat_inode_info {
732 struct file_id_t fid;
733 char *target;
734
735 loff_t mmu_private;
736 loff_t i_pos;
737 struct hlist_node i_hash_fat;
738 struct rw_semaphore truncate_lock;
739 struct inode vfs_inode;
740 struct rw_semaphore i_alloc_sem;
741 };
742
743 #define EXFAT_SB(sb) ((struct exfat_sb_info *)((sb)->s_fs_info))
744
745 static inline struct exfat_inode_info *EXFAT_I(struct inode *inode)
746 {
747 return container_of(inode, struct exfat_inode_info, vfs_inode);
748 }
749
750
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,
764 bool *p_lossy);
765
766
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);
782
783
784 void fs_set_vol_flags(struct super_block *sb, u32 new_flag);
785 void fs_error(struct super_block *sb);
786
787
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,
794 s32 do_relse);
795 void exfat_free_cluster(struct super_block *sb, struct chain_t *p_chain,
796 s32 do_relse);
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);
802
803
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);
810
811
812 s32 load_upcase_table(struct super_block *sb);
813 void free_upcase_table(struct super_block *sb);
814
815
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,
838 u8 mode);
839 void exfat_get_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp,
840 u8 mode);
841 void fat_set_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp,
842 u8 mode);
843 void exfat_set_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp,
844 u8 mode);
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,
859 u16 *uniname);
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,
862 u64 size);
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);
868
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,
872 s32 offset);
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,
877 u32 type,
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,
887 s32 num_entries);
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,
899 u32 type);
900 void update_dir_checksum(struct super_block *sb, struct chain_t *p_dir,
901 s32 entry);
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);
905
906
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,
915 u16 *uniname);
916 void exfat_get_uni_name_from_ext_entry(struct super_block *sb,
917 struct chain_t *p_dir, s32 entry,
918 u16 *uniname);
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);
931
932
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);
936
937
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 exfat_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);
951
952
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);
961
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);
969
970 extern const u8 uni_upcase[];
971 #endif