191 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd.4 */5 6#ifndef _EXFAT_RAW_H7#define _EXFAT_RAW_H8 9#include <linux/types.h>10 11#define BOOT_SIGNATURE 0xAA5512#define EXBOOT_SIGNATURE 0xAA55000013#define STR_EXFAT "EXFAT " /* size should be 8 */14 15#define EXFAT_MAX_FILE_LEN 25516 17#define VOLUME_DIRTY 0x000218#define MEDIA_FAILURE 0x000419 20#define EXFAT_EOF_CLUSTER 0xFFFFFFFFu21#define EXFAT_BAD_CLUSTER 0xFFFFFFF7u22#define EXFAT_FREE_CLUSTER 023/* Cluster 0, 1 are reserved, the first cluster is 2 in the cluster heap. */24#define EXFAT_RESERVED_CLUSTERS 225#define EXFAT_FIRST_CLUSTER 226#define EXFAT_DATA_CLUSTER_COUNT(sbi) \27 ((sbi)->num_clusters - EXFAT_RESERVED_CLUSTERS)28 29/* AllocationPossible and NoFatChain field in GeneralSecondaryFlags Field */30#define ALLOC_POSSIBLE 0x0131#define ALLOC_FAT_CHAIN 0x0132#define ALLOC_NO_FAT_CHAIN 0x0333 34#define DENTRY_SIZE 32 /* directory entry size */35#define DENTRY_SIZE_BITS 536/* exFAT allows 8388608(256MB) directory entries */37#define MAX_EXFAT_DENTRIES 838860838 39/* dentry types */40#define EXFAT_UNUSED 0x00 /* end of directory */41#define EXFAT_DELETE (~0x80)42#define IS_EXFAT_DELETED(x) ((x) < 0x80) /* deleted file (0x01~0x7F) */43#define EXFAT_INVAL 0x80 /* invalid value */44#define EXFAT_BITMAP 0x81 /* allocation bitmap */45#define EXFAT_UPCASE 0x82 /* upcase table */46#define EXFAT_VOLUME 0x83 /* volume label */47#define EXFAT_FILE 0x85 /* file or dir */48#define EXFAT_GUID 0xA049#define EXFAT_PADDING 0xA150#define EXFAT_ACLTAB 0xA251#define EXFAT_STREAM 0xC0 /* stream entry */52#define EXFAT_NAME 0xC1 /* file name entry */53#define EXFAT_ACL 0xC2 /* stream entry */54#define EXFAT_VENDOR_EXT 0xE0 /* vendor extension entry */55#define EXFAT_VENDOR_ALLOC 0xE1 /* vendor allocation entry */56 57#define IS_EXFAT_CRITICAL_PRI(x) (x < 0xA0)58#define IS_EXFAT_BENIGN_PRI(x) (x < 0xC0)59#define IS_EXFAT_CRITICAL_SEC(x) (x < 0xE0)60 61/* checksum types */62#define CS_DIR_ENTRY 063#define CS_BOOT_SECTOR 164#define CS_DEFAULT 265 66/* file attributes */67#define EXFAT_ATTR_READONLY 0x000168#define EXFAT_ATTR_HIDDEN 0x000269#define EXFAT_ATTR_SYSTEM 0x000470#define EXFAT_ATTR_VOLUME 0x000871#define EXFAT_ATTR_SUBDIR 0x001072#define EXFAT_ATTR_ARCHIVE 0x002073 74#define EXFAT_ATTR_RWMASK (EXFAT_ATTR_HIDDEN | EXFAT_ATTR_SYSTEM | \75 EXFAT_ATTR_VOLUME | EXFAT_ATTR_SUBDIR | \76 EXFAT_ATTR_ARCHIVE)77 78#define BOOTSEC_JUMP_BOOT_LEN 379#define BOOTSEC_FS_NAME_LEN 880#define BOOTSEC_OLDBPB_LEN 5381 82#define EXFAT_FILE_NAME_LEN 1583 84#define EXFAT_MIN_SECT_SIZE_BITS 985#define EXFAT_MAX_SECT_SIZE_BITS 1286#define EXFAT_MAX_SECT_PER_CLUS_BITS(x) (25 - (x)->sect_size_bits)87 88/* EXFAT: Main and Backup Boot Sector (512 bytes) */89struct boot_sector {90 __u8 jmp_boot[BOOTSEC_JUMP_BOOT_LEN];91 __u8 fs_name[BOOTSEC_FS_NAME_LEN];92 __u8 must_be_zero[BOOTSEC_OLDBPB_LEN];93 __le64 partition_offset;94 __le64 vol_length;95 __le32 fat_offset;96 __le32 fat_length;97 __le32 clu_offset;98 __le32 clu_count;99 __le32 root_cluster;100 __le32 vol_serial;101 __u8 fs_revision[2];102 __le16 vol_flags;103 __u8 sect_size_bits;104 __u8 sect_per_clus_bits;105 __u8 num_fats;106 __u8 drv_sel;107 __u8 percent_in_use;108 __u8 reserved[7];109 __u8 boot_code[390];110 __le16 signature;111} __packed;112 113struct exfat_dentry {114 __u8 type;115 union {116 struct {117 __u8 num_ext;118 __le16 checksum;119 __le16 attr;120 __le16 reserved1;121 __le16 create_time;122 __le16 create_date;123 __le16 modify_time;124 __le16 modify_date;125 __le16 access_time;126 __le16 access_date;127 __u8 create_time_cs;128 __u8 modify_time_cs;129 __u8 create_tz;130 __u8 modify_tz;131 __u8 access_tz;132 __u8 reserved2[7];133 } __packed file; /* file directory entry */134 struct {135 __u8 flags;136 __u8 reserved1;137 __u8 name_len;138 __le16 name_hash;139 __le16 reserved2;140 __le64 valid_size;141 __le32 reserved3;142 __le32 start_clu;143 __le64 size;144 } __packed stream; /* stream extension directory entry */145 struct {146 __u8 flags;147 __le16 unicode_0_14[EXFAT_FILE_NAME_LEN];148 } __packed name; /* file name directory entry */149 struct {150 __u8 flags;151 __u8 reserved[18];152 __le32 start_clu;153 __le64 size;154 } __packed bitmap; /* allocation bitmap directory entry */155 struct {156 __u8 reserved1[3];157 __le32 checksum;158 __u8 reserved2[12];159 __le32 start_clu;160 __le64 size;161 } __packed upcase; /* up-case table directory entry */162 struct {163 __u8 flags;164 __u8 vendor_guid[16];165 __u8 vendor_defined[14];166 } __packed vendor_ext; /* vendor extension directory entry */167 struct {168 __u8 flags;169 __u8 vendor_guid[16];170 __u8 vendor_defined[2];171 __le32 start_clu;172 __le64 size;173 } __packed vendor_alloc; /* vendor allocation directory entry */174 struct {175 __u8 flags;176 __u8 custom_defined[18];177 __le32 start_clu;178 __le64 size;179 } __packed generic_secondary; /* generic secondary directory entry */180 } __packed dentry;181} __packed;182 183#define EXFAT_TZ_VALID (1 << 7)184 185/* Jan 1 GMT 00:00:00 1980 */186#define EXFAT_MIN_TIMESTAMP_SECS 315532800LL187/* Dec 31 GMT 23:59:59 2107 */188#define EXFAT_MAX_TIMESTAMP_SECS 4354819199LL189 190#endif /* !_EXFAT_RAW_H */191