Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd.
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   "  /* size should be 8 */
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 /* Cluster 0, 1 are reserved, the first cluster is 2 in the cluster heap. */
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 /* AllocationPossible and NoFatChain field in GeneralSecondaryFlags Field */
0030 #define ALLOC_FAT_CHAIN     0x01
0031 #define ALLOC_NO_FAT_CHAIN  0x03
0032 
0033 #define DENTRY_SIZE     32 /* directory entry size */
0034 #define DENTRY_SIZE_BITS    5
0035 /* exFAT allows 8388608(256MB) directory entries */
0036 #define MAX_EXFAT_DENTRIES  8388608
0037 
0038 /* dentry types */
0039 #define EXFAT_UNUSED        0x00    /* end of directory */
0040 #define EXFAT_DELETE        (~0x80)
0041 #define IS_EXFAT_DELETED(x) ((x) < 0x80) /* deleted file (0x01~0x7F) */
0042 #define EXFAT_INVAL     0x80    /* invalid value */
0043 #define EXFAT_BITMAP        0x81    /* allocation bitmap */
0044 #define EXFAT_UPCASE        0x82    /* upcase table */
0045 #define EXFAT_VOLUME        0x83    /* volume label */
0046 #define EXFAT_FILE      0x85    /* file or dir */
0047 #define EXFAT_GUID      0xA0
0048 #define EXFAT_PADDING       0xA1
0049 #define EXFAT_ACLTAB        0xA2
0050 #define EXFAT_STREAM        0xC0    /* stream entry */
0051 #define EXFAT_NAME      0xC1    /* file name entry */
0052 #define EXFAT_ACL       0xC2    /* stream entry */
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 /* checksum types */
0059 #define CS_DIR_ENTRY        0
0060 #define CS_BOOT_SECTOR      1
0061 #define CS_DEFAULT      2
0062 
0063 /* file attributes */
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 /* EXFAT: Main and Backup Boot Sector (512 bytes) */
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; /* file directory entry */
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; /* stream extension directory entry */
0141         struct {
0142             __u8 flags;
0143             __le16 unicode_0_14[EXFAT_FILE_NAME_LEN];
0144         } __packed name; /* file name directory entry */
0145         struct {
0146             __u8 flags;
0147             __u8 reserved[18];
0148             __le32 start_clu;
0149             __le64 size;
0150         } __packed bitmap; /* allocation bitmap directory entry */
0151         struct {
0152             __u8 reserved1[3];
0153             __le32 checksum;
0154             __u8 reserved2[12];
0155             __le32 start_clu;
0156             __le64 size;
0157         } __packed upcase; /* up-case table directory entry */
0158     } __packed dentry;
0159 } __packed;
0160 
0161 #define EXFAT_TZ_VALID      (1 << 7)
0162 
0163 /* Jan 1 GMT 00:00:00 1980 */
0164 #define EXFAT_MIN_TIMESTAMP_SECS    315532800LL
0165 /* Dec 31 GMT 23:59:59 2107 */
0166 #define EXFAT_MAX_TIMESTAMP_SECS    4354819199LL
0167 
0168 #endif /* !_EXFAT_RAW_H */