1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * fs/befs/befs_fs_types.h 4 * 5 * Copyright (C) 2001 Will Dyson (will@cs.earlham.edu) 6 * 7 * 8 * 9 * from linux/include/linux/befs_fs.h 10 * 11 * Copyright (C) 1999 Makoto Kato (m_kato@ga2.so-net.ne.jp) 12 * 13 */ 14 15 #ifndef _LINUX_BEFS_FS_TYPES 16 #define _LINUX_BEFS_FS_TYPES 17 18 #ifdef __KERNEL__ 19 #include <linux/types.h> 20 #endif /*__KERNEL__*/ 21 22 #define PACKED __attribute__ ((__packed__)) 23 24 /* 25 * Max name lengths of BFS 26 */ 27 28 #define BEFS_NAME_LEN 255 29 30 #define BEFS_SYMLINK_LEN 144 31 #define BEFS_NUM_DIRECT_BLOCKS 12 32 #define B_OS_NAME_LENGTH 32 33 34 /* The datastream blocks mapped by the double-indirect 35 * block are always 4 fs blocks long. 36 * This eliminates the need for linear searches among 37 * the potentially huge number of indirect blocks 38 * 39 * Err. Should that be 4 fs blocks or 4k??? 40 * It matters on large blocksize volumes 41 */ 42 #define BEFS_DBLINDIR_BRUN_LEN 4 43 44 /* 45 * Flags of superblock 46 */ 47 48 enum super_flags { 49 BEFS_BYTESEX_BE, 50 BEFS_BYTESEX_LE, 51 BEFS_CLEAN = 0x434c454e, 52 BEFS_DIRTY = 0x44495254, 53 BEFS_SUPER_MAGIC1 = 0x42465331, /* BFS1 */ 54 BEFS_SUPER_MAGIC2 = 0xdd121031, 55 BEFS_SUPER_MAGIC3 = 0x15b6830e, 56 }; 57 58 #define BEFS_BYTEORDER_NATIVE 0x42494745 59 #define BEFS_BYTEORDER_NATIVE_LE ((__force fs32)cpu_to_le32(BEFS_BYTEORDER_NATIVE)) 60 #define BEFS_BYTEORDER_NATIVE_BE ((__force fs32)cpu_to_be32(BEFS_BYTEORDER_NATIVE)) 61 62 #define BEFS_SUPER_MAGIC BEFS_SUPER_MAGIC1 63 #define BEFS_SUPER_MAGIC1_LE ((__force fs32)cpu_to_le32(BEFS_SUPER_MAGIC1)) 64 #define BEFS_SUPER_MAGIC1_BE ((__force fs32)cpu_to_be32(BEFS_SUPER_MAGIC1)) 65 66 /* 67 * Flags of inode 68 */ 69 70 #define BEFS_INODE_MAGIC1 0x3bbe0ad9 71 72 enum inode_flags { 73 BEFS_INODE_IN_USE = 0x00000001, 74 BEFS_ATTR_INODE = 0x00000004, 75 BEFS_INODE_LOGGED = 0x00000008, 76 BEFS_INODE_DELETED = 0x00000010, 77 BEFS_LONG_SYMLINK = 0x00000040, 78 BEFS_PERMANENT_FLAG = 0x0000ffff, 79 BEFS_INODE_NO_CREATE = 0x00010000, 80 BEFS_INODE_WAS_WRITTEN = 0x00020000, 81 BEFS_NO_TRANSACTION = 0x00040000, 82 }; 83 /* 84 * On-Disk datastructures of BeFS 85 */ 86 87 typedef u64 __bitwise fs64; 88 typedef u32 __bitwise fs32; 89 typedef u16 __bitwise fs16; 90 91 typedef u64 befs_off_t; 92 typedef fs64 befs_time_t; 93 94 /* Block runs */ 95 typedef struct { 96 fs32 allocation_group; 97 fs16 start; 98 fs16 len; 99 } PACKED befs_disk_block_run; 100 101 typedef struct { 102 u32 allocation_group; 103 u16 start; 104 u16 len; 105 } PACKED befs_block_run; 106 107 typedef befs_disk_block_run befs_disk_inode_addr; 108 typedef befs_block_run befs_inode_addr; 109 110 /* 111 * The Superblock Structure 112 */ 113 typedef struct { 114 char name[B_OS_NAME_LENGTH]; 115 fs32 magic1; 116 fs32 fs_byte_order; 117 118 fs32 block_size; 119 fs32 block_shift; 120 121 fs64 num_blocks; 122 fs64 used_blocks; 123 124 fs32 inode_size; 125 126 fs32 magic2; 127 fs32 blocks_per_ag; 128 fs32 ag_shift; 129 fs32 num_ags; 130 131 fs32 flags; 132 133 befs_disk_block_run log_blocks; 134 fs64 log_start; 135 fs64 log_end; 136 137 fs32 magic3; 138 befs_disk_inode_addr root_dir; 139 befs_disk_inode_addr indices; 140 141 } PACKED befs_super_block; 142 143 /* 144 * Note: the indirect and dbl_indir block_runs may 145 * be longer than one block! 146 */ 147 typedef struct { 148 befs_disk_block_run direct[BEFS_NUM_DIRECT_BLOCKS]; 149 fs64 max_direct_range; 150 befs_disk_block_run indirect; 151 fs64 max_indirect_range; 152 befs_disk_block_run double_indirect; 153 fs64 max_double_indirect_range; 154 fs64 size; 155 } PACKED befs_disk_data_stream; 156 157 typedef struct { 158 befs_block_run direct[BEFS_NUM_DIRECT_BLOCKS]; 159 befs_off_t max_direct_range; 160 befs_block_run indirect; 161 befs_off_t max_indirect_range; 162 befs_block_run double_indirect; 163 befs_off_t max_double_indirect_range; 164 befs_off_t size; 165 } PACKED befs_data_stream; 166 167 /* Attribute */ 168 typedef struct { 169 fs32 type; 170 fs16 name_size; 171 fs16 data_size; 172 char name[1]; 173 } PACKED befs_small_data; 174 175 /* Inode structure */ 176 typedef struct { 177 fs32 magic1; 178 befs_disk_inode_addr inode_num; 179 fs32 uid; 180 fs32 gid; 181 fs32 mode; 182 fs32 flags; 183 befs_time_t create_time; 184 befs_time_t last_modified_time; 185 befs_disk_inode_addr parent; 186 befs_disk_inode_addr attributes; 187 fs32 type; 188 189 fs32 inode_size; 190 fs32 etc; /* not use */ 191 192 union { 193 befs_disk_data_stream datastream; 194 char symlink[BEFS_SYMLINK_LEN]; 195 } data; 196 197 fs32 pad[4]; /* not use */ 198 befs_small_data small_data[1]; 199 } PACKED befs_inode; 200 201 /* 202 * B+tree superblock 203 */ 204 205 #define BEFS_BTREE_MAGIC 0x69f6c2e8 206 207 enum btree_types { 208 BTREE_STRING_TYPE = 0, 209 BTREE_INT32_TYPE = 1, 210 BTREE_UINT32_TYPE = 2, 211 BTREE_INT64_TYPE = 3, 212 BTREE_UINT64_TYPE = 4, 213 BTREE_FLOAT_TYPE = 5, 214 BTREE_DOUBLE_TYPE = 6 215 }; 216 217 typedef struct { 218 fs32 magic; 219 fs32 node_size; 220 fs32 max_depth; 221 fs32 data_type; 222 fs64 root_node_ptr; 223 fs64 free_node_ptr; 224 fs64 max_size; 225 } PACKED befs_disk_btree_super; 226 227 typedef struct { 228 u32 magic; 229 u32 node_size; 230 u32 max_depth; 231 u32 data_type; 232 befs_off_t root_node_ptr; 233 befs_off_t free_node_ptr; 234 befs_off_t max_size; 235 } PACKED befs_btree_super; 236 237 /* 238 * Header structure of each btree node 239 */ 240 typedef struct { 241 fs64 left; 242 fs64 right; 243 fs64 overflow; 244 fs16 all_key_count; 245 fs16 all_key_length; 246 } PACKED befs_btree_nodehead; 247 248 typedef struct { 249 befs_off_t left; 250 befs_off_t right; 251 befs_off_t overflow; 252 u16 all_key_count; 253 u16 all_key_length; 254 } PACKED befs_host_btree_nodehead; 255 256 #endif /* _LINUX_BEFS_FS_TYPES */ 257