linux/fs/exfat/exfat_raw.h
<<
>>
Prefs
   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_H
   7#define _EXFAT_RAW_H
   8
   9#include <linux/types.h>
  10
  11#define BOOT_SIGNATURE          0xAA55
  12#define EXBOOT_SIGNATURE        0xAA550000
  13#define STR_EXFAT               "EXFAT   "      /* size should be 8 */
  14
  15#define EXFAT_MAX_FILE_LEN      255
  16
  17#define VOLUME_DIRTY            0x0002
  18#define MEDIA_FAILURE           0x0004
  19
  20#define EXFAT_EOF_CLUSTER       0xFFFFFFFFu
  21#define EXFAT_BAD_CLUSTER       0xFFFFFFF7u
  22#define EXFAT_FREE_CLUSTER      0
  23/* Cluster 0, 1 are reserved, the first cluster is 2 in the cluster heap. */
  24#define EXFAT_RESERVED_CLUSTERS 2
  25#define EXFAT_FIRST_CLUSTER     2
  26#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_FAT_CHAIN         0x01
  31#define ALLOC_NO_FAT_CHAIN      0x03
  32
  33#define DENTRY_SIZE             32 /* directory entry size */
  34#define DENTRY_SIZE_BITS        5
  35/* exFAT allows 8388608(256MB) directory entries */
  36#define MAX_EXFAT_DENTRIES      8388608
  37
  38/* dentry types */
  39#define EXFAT_UNUSED            0x00    /* end of directory */
  40#define EXFAT_DELETE            (~0x80)
  41#define IS_EXFAT_DELETED(x)     ((x) < 0x80) /* deleted file (0x01~0x7F) */
  42#define EXFAT_INVAL             0x80    /* invalid value */
  43#define EXFAT_BITMAP            0x81    /* allocation bitmap */
  44#define EXFAT_UPCASE            0x82    /* upcase table */
  45#define EXFAT_VOLUME            0x83    /* volume label */
  46#define EXFAT_FILE              0x85    /* file or dir */
  47#define EXFAT_GUID              0xA0
  48#define EXFAT_PADDING           0xA1
  49#define EXFAT_ACLTAB            0xA2
  50#define EXFAT_STREAM            0xC0    /* stream entry */
  51#define EXFAT_NAME              0xC1    /* file name entry */
  52#define EXFAT_ACL               0xC2    /* stream entry */
  53
  54#define IS_EXFAT_CRITICAL_PRI(x)        (x < 0xA0)
  55#define IS_EXFAT_BENIGN_PRI(x)          (x < 0xC0)
  56#define IS_EXFAT_CRITICAL_SEC(x)        (x < 0xE0)
  57
  58/* checksum types */
  59#define CS_DIR_ENTRY            0
  60#define CS_BOOT_SECTOR          1
  61#define CS_DEFAULT              2
  62
  63/* file attributes */
  64#define ATTR_READONLY           0x0001
  65#define ATTR_HIDDEN             0x0002
  66#define ATTR_SYSTEM             0x0004
  67#define ATTR_VOLUME             0x0008
  68#define ATTR_SUBDIR             0x0010
  69#define ATTR_ARCHIVE            0x0020
  70
  71#define ATTR_RWMASK             (ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME | \
  72                                 ATTR_SUBDIR | ATTR_ARCHIVE)
  73
  74#define BOOTSEC_JUMP_BOOT_LEN           3
  75#define BOOTSEC_FS_NAME_LEN             8
  76#define BOOTSEC_OLDBPB_LEN              53
  77
  78#define EXFAT_FILE_NAME_LEN             15
  79
  80#define EXFAT_MIN_SECT_SIZE_BITS                9
  81#define EXFAT_MAX_SECT_SIZE_BITS                12
  82#define EXFAT_MAX_SECT_PER_CLUS_BITS(x)         (25 - (x)->sect_size_bits)
  83
  84/* EXFAT: Main and Backup Boot Sector (512 bytes) */
  85struct boot_sector {
  86        __u8    jmp_boot[BOOTSEC_JUMP_BOOT_LEN];
  87        __u8    fs_name[BOOTSEC_FS_NAME_LEN];
  88        __u8    must_be_zero[BOOTSEC_OLDBPB_LEN];
  89        __le64  partition_offset;
  90        __le64  vol_length;
  91        __le32  fat_offset;
  92        __le32  fat_length;
  93        __le32  clu_offset;
  94        __le32  clu_count;
  95        __le32  root_cluster;
  96        __le32  vol_serial;
  97        __u8    fs_revision[2];
  98        __le16  vol_flags;
  99        __u8    sect_size_bits;
 100        __u8    sect_per_clus_bits;
 101        __u8    num_fats;
 102        __u8    drv_sel;
 103        __u8    percent_in_use;
 104        __u8    reserved[7];
 105        __u8    boot_code[390];
 106        __le16  signature;
 107} __packed;
 108
 109struct exfat_dentry {
 110        __u8 type;
 111        union {
 112                struct {
 113                        __u8 num_ext;
 114                        __le16 checksum;
 115                        __le16 attr;
 116                        __le16 reserved1;
 117                        __le16 create_time;
 118                        __le16 create_date;
 119                        __le16 modify_time;
 120                        __le16 modify_date;
 121                        __le16 access_time;
 122                        __le16 access_date;
 123                        __u8 create_time_cs;
 124                        __u8 modify_time_cs;
 125                        __u8 create_tz;
 126                        __u8 modify_tz;
 127                        __u8 access_tz;
 128                        __u8 reserved2[7];
 129                } __packed file; /* file directory entry */
 130                struct {
 131                        __u8 flags;
 132                        __u8 reserved1;
 133                        __u8 name_len;
 134                        __le16 name_hash;
 135                        __le16 reserved2;
 136                        __le64 valid_size;
 137                        __le32 reserved3;
 138                        __le32 start_clu;
 139                        __le64 size;
 140                } __packed stream; /* stream extension directory entry */
 141                struct {
 142                        __u8 flags;
 143                        __le16 unicode_0_14[EXFAT_FILE_NAME_LEN];
 144                } __packed name; /* file name directory entry */
 145                struct {
 146                        __u8 flags;
 147                        __u8 reserved[18];
 148                        __le32 start_clu;
 149                        __le64 size;
 150                } __packed bitmap; /* allocation bitmap directory entry */
 151                struct {
 152                        __u8 reserved1[3];
 153                        __le32 checksum;
 154                        __u8 reserved2[12];
 155                        __le32 start_clu;
 156                        __le64 size;
 157                } __packed upcase; /* up-case table directory entry */
 158        } __packed dentry;
 159} __packed;
 160
 161#define EXFAT_TZ_VALID          (1 << 7)
 162
 163/* Jan 1 GMT 00:00:00 1980 */
 164#define EXFAT_MIN_TIMESTAMP_SECS    315532800LL
 165/* Dec 31 GMT 23:59:59 2107 */
 166#define EXFAT_MAX_TIMESTAMP_SECS    4354819199LL
 167
 168#endif /* !_EXFAT_RAW_H */
 169