0001
0002
0003
0004
0005
0006 #ifndef _EXFAT_RAW_H
0007 #define _EXFAT_RAW_H
0008
0009 #include <linux/types.h>
0010
0011 #define BOOT_SIGNATURE 0xAA55
0012 #define EXBOOT_SIGNATURE 0xAA550000
0013 #define STR_EXFAT "EXFAT "
0014
0015 #define EXFAT_MAX_FILE_LEN 255
0016
0017 #define VOLUME_DIRTY 0x0002
0018 #define MEDIA_FAILURE 0x0004
0019
0020 #define EXFAT_EOF_CLUSTER 0xFFFFFFFFu
0021 #define EXFAT_BAD_CLUSTER 0xFFFFFFF7u
0022 #define EXFAT_FREE_CLUSTER 0
0023
0024 #define EXFAT_RESERVED_CLUSTERS 2
0025 #define EXFAT_FIRST_CLUSTER 2
0026 #define EXFAT_DATA_CLUSTER_COUNT(sbi) \
0027 ((sbi)->num_clusters - EXFAT_RESERVED_CLUSTERS)
0028
0029
0030 #define ALLOC_FAT_CHAIN 0x01
0031 #define ALLOC_NO_FAT_CHAIN 0x03
0032
0033 #define DENTRY_SIZE 32
0034 #define DENTRY_SIZE_BITS 5
0035
0036 #define MAX_EXFAT_DENTRIES 8388608
0037
0038
0039 #define EXFAT_UNUSED 0x00
0040 #define EXFAT_DELETE (~0x80)
0041 #define IS_EXFAT_DELETED(x) ((x) < 0x80)
0042 #define EXFAT_INVAL 0x80
0043 #define EXFAT_BITMAP 0x81
0044 #define EXFAT_UPCASE 0x82
0045 #define EXFAT_VOLUME 0x83
0046 #define EXFAT_FILE 0x85
0047 #define EXFAT_GUID 0xA0
0048 #define EXFAT_PADDING 0xA1
0049 #define EXFAT_ACLTAB 0xA2
0050 #define EXFAT_STREAM 0xC0
0051 #define EXFAT_NAME 0xC1
0052 #define EXFAT_ACL 0xC2
0053
0054 #define IS_EXFAT_CRITICAL_PRI(x) (x < 0xA0)
0055 #define IS_EXFAT_BENIGN_PRI(x) (x < 0xC0)
0056 #define IS_EXFAT_CRITICAL_SEC(x) (x < 0xE0)
0057
0058
0059 #define CS_DIR_ENTRY 0
0060 #define CS_BOOT_SECTOR 1
0061 #define CS_DEFAULT 2
0062
0063
0064 #define ATTR_READONLY 0x0001
0065 #define ATTR_HIDDEN 0x0002
0066 #define ATTR_SYSTEM 0x0004
0067 #define ATTR_VOLUME 0x0008
0068 #define ATTR_SUBDIR 0x0010
0069 #define ATTR_ARCHIVE 0x0020
0070
0071 #define ATTR_RWMASK (ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME | \
0072 ATTR_SUBDIR | ATTR_ARCHIVE)
0073
0074 #define BOOTSEC_JUMP_BOOT_LEN 3
0075 #define BOOTSEC_FS_NAME_LEN 8
0076 #define BOOTSEC_OLDBPB_LEN 53
0077
0078 #define EXFAT_FILE_NAME_LEN 15
0079
0080 #define EXFAT_MIN_SECT_SIZE_BITS 9
0081 #define EXFAT_MAX_SECT_SIZE_BITS 12
0082 #define EXFAT_MAX_SECT_PER_CLUS_BITS(x) (25 - (x)->sect_size_bits)
0083
0084
0085 struct boot_sector {
0086 __u8 jmp_boot[BOOTSEC_JUMP_BOOT_LEN];
0087 __u8 fs_name[BOOTSEC_FS_NAME_LEN];
0088 __u8 must_be_zero[BOOTSEC_OLDBPB_LEN];
0089 __le64 partition_offset;
0090 __le64 vol_length;
0091 __le32 fat_offset;
0092 __le32 fat_length;
0093 __le32 clu_offset;
0094 __le32 clu_count;
0095 __le32 root_cluster;
0096 __le32 vol_serial;
0097 __u8 fs_revision[2];
0098 __le16 vol_flags;
0099 __u8 sect_size_bits;
0100 __u8 sect_per_clus_bits;
0101 __u8 num_fats;
0102 __u8 drv_sel;
0103 __u8 percent_in_use;
0104 __u8 reserved[7];
0105 __u8 boot_code[390];
0106 __le16 signature;
0107 } __packed;
0108
0109 struct exfat_dentry {
0110 __u8 type;
0111 union {
0112 struct {
0113 __u8 num_ext;
0114 __le16 checksum;
0115 __le16 attr;
0116 __le16 reserved1;
0117 __le16 create_time;
0118 __le16 create_date;
0119 __le16 modify_time;
0120 __le16 modify_date;
0121 __le16 access_time;
0122 __le16 access_date;
0123 __u8 create_time_cs;
0124 __u8 modify_time_cs;
0125 __u8 create_tz;
0126 __u8 modify_tz;
0127 __u8 access_tz;
0128 __u8 reserved2[7];
0129 } __packed file;
0130 struct {
0131 __u8 flags;
0132 __u8 reserved1;
0133 __u8 name_len;
0134 __le16 name_hash;
0135 __le16 reserved2;
0136 __le64 valid_size;
0137 __le32 reserved3;
0138 __le32 start_clu;
0139 __le64 size;
0140 } __packed stream;
0141 struct {
0142 __u8 flags;
0143 __le16 unicode_0_14[EXFAT_FILE_NAME_LEN];
0144 } __packed name;
0145 struct {
0146 __u8 flags;
0147 __u8 reserved[18];
0148 __le32 start_clu;
0149 __le64 size;
0150 } __packed bitmap;
0151 struct {
0152 __u8 reserved1[3];
0153 __le32 checksum;
0154 __u8 reserved2[12];
0155 __le32 start_clu;
0156 __le64 size;
0157 } __packed upcase;
0158 } __packed dentry;
0159 } __packed;
0160
0161 #define EXFAT_TZ_VALID (1 << 7)
0162
0163
0164 #define EXFAT_MIN_TIMESTAMP_SECS 315532800LL
0165
0166 #define EXFAT_MAX_TIMESTAMP_SECS 4354819199LL
0167
0168 #endif