ext2_fs.h revision 9f8046fc6dfc13eee2f5c363214e60b533872cac
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * linux/include/linux/ext2_fs.h 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Copyright (C) 1992, 1993, 1994, 1995 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Remy Card (card@masi.ibp.fr) 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Laboratoire MASI - Institut Blaise Pascal 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Universite Pierre et Marie Curie (Paris VI) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * from 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * linux/include/linux/minix_fs.h 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Copyright (C) 1991, 1992 Linus Torvalds 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef _LINUX_EXT2_FS_H 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define _LINUX_EXT2_FS_H 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <asm/types.h> /* Changed from linux/types.h */ 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * The second extended filesystem constants/structures 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Define EXT2FS_DEBUG to produce debug messages 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#undef EXT2FS_DEBUG 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)/* 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Define EXT2_PREALLOCATE to preallocate data blocks for expanding files 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define EXT2_PREALLOCATE 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define EXT2_DEFAULT_PREALLOC_BLOCKS 8 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)/* 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * The second extended file system version 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) */ 3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define EXT2FS_DATE "95/08/09" 4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define EXT2FS_VERSION "0.5b" 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)/* 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * Special inodes numbers 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) */ 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define EXT2_BAD_INO 1 /* Bad blocks inode */ 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define EXT2_ROOT_INO 2 /* Root inode */ 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define EXT2_ACL_IDX_INO 3 /* ACL inode */ 4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define EXT2_ACL_DATA_INO 4 /* ACL inode */ 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define EXT2_RESIZE_INO 7 /* Reserved group descriptors inode */ 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define EXT2_JOURNAL_INO 8 /* Journal inode */ 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* First non-reserved inode for old ext2 filesystems */ 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define EXT2_GOOD_OLD_FIRST_INO 11 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * The second extended file system magic number 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define EXT2_SUPER_MAGIC 0xEF53 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Maximal count of links to a file 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define EXT2_LINK_MAX 32000 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * Macro-instructions used to manage several block sizes 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define EXT2_MIN_BLOCK_SIZE 1024 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define EXT2_MAX_BLOCK_SIZE 4096 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define EXT2_MIN_BLOCK_LOG_SIZE 10 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef __KERNEL__ 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define EXT2_BLOCK_SIZE(s) ((s)->s_blocksize) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define EXT2_ACLE_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_acl_entry)) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32)) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef __KERNEL__ 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef __KERNEL__ 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define EXT2_ADDR_PER_BLOCK_BITS(s) ((s)->u.ext2_sb.s_addr_per_block_bits) 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define EXT2_INODE_SIZE(s) ((s)->u.ext2_sb.s_inode_size) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define EXT2_FIRST_INO(s) ((s)->u.ext2_sb.s_first_ino) 8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define EXT2_INODE_SIZE(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \ 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXT2_GOOD_OLD_INODE_SIZE : \ 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (s)->s_inode_size) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define EXT2_FIRST_INO(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \ 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXT2_GOOD_OLD_FIRST_INO : \ 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) (s)->s_first_ino) 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)/* 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * Macro-instructions used to manage fragments 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) */ 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define EXT2_MIN_FRAG_SIZE 1024 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define EXT2_MAX_FRAG_SIZE 4096 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define EXT2_MIN_FRAG_LOG_SIZE 10 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef __KERNEL__ 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define EXT2_FRAG_SIZE(s) ((s)->u.ext2_sb.s_frag_size) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define EXT2_FRAGS_PER_BLOCK(s) ((s)->u.ext2_sb.s_frags_per_block) 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define EXT2_FRAG_SIZE(s) (EXT2_MIN_FRAG_SIZE << (s)->s_log_frag_size) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define EXT2_FRAGS_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s)) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * ACL structures 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct ext2_acl_header /* Header of Access Control Lists */ 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __u32 aclh_size; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __u32 aclh_file_count; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __u32 aclh_acle_count; 12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) __u32 aclh_first_acle; 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)struct ext2_acl_entry /* Access Control List Entry */ 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __u32 acle_size; 126 __u16 acle_perms; /* Access permissions */ 127 __u16 acle_type; /* Type of entry */ 128 __u16 acle_tag; /* User or group identity */ 129 __u16 acle_pad1; 130 __u32 acle_next; /* Pointer on next entry for the */ 131 /* same inode or on next free entry */ 132}; 133 134/* 135 * Structure of a blocks group descriptor 136 */ 137struct ext2_group_desc 138{ 139 __u32 bg_block_bitmap; /* Blocks bitmap block */ 140 __u32 bg_inode_bitmap; /* Inodes bitmap block */ 141 __u32 bg_inode_table; /* Inodes table block */ 142 __u16 bg_free_blocks_count; /* Free blocks count */ 143 __u16 bg_free_inodes_count; /* Free inodes count */ 144 __u16 bg_used_dirs_count; /* Directories count */ 145 __u16 bg_pad; 146 __u32 bg_reserved[3]; 147}; 148 149/* 150 * Macro-instructions used to manage group descriptors 151 */ 152#ifdef __KERNEL__ 153# define EXT2_BLOCKS_PER_GROUP(s) ((s)->u.ext2_sb.s_blocks_per_group) 154# define EXT2_DESC_PER_BLOCK(s) ((s)->u.ext2_sb.s_desc_per_block) 155# define EXT2_INODES_PER_GROUP(s) ((s)->u.ext2_sb.s_inodes_per_group) 156# define EXT2_DESC_PER_BLOCK_BITS(s) ((s)->u.ext2_sb.s_desc_per_block_bits) 157#else 158# define EXT2_BLOCKS_PER_GROUP(s) ((s)->s_blocks_per_group) 159# define EXT2_DESC_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc)) 160# define EXT2_INODES_PER_GROUP(s) ((s)->s_inodes_per_group) 161#endif 162 163/* 164 * Constants relative to the data blocks 165 */ 166#define EXT2_NDIR_BLOCKS 12 167#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS 168#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1) 169#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1) 170#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1) 171 172/* 173 * Inode flags 174 */ 175#define EXT2_SECRM_FL 0x00000001 /* Secure deletion */ 176#define EXT2_UNRM_FL 0x00000002 /* Undelete */ 177#define EXT2_COMPR_FL 0x00000004 /* Compress file */ 178#define EXT2_SYNC_FL 0x00000008 /* Synchronous updates */ 179#define EXT2_IMMUTABLE_FL 0x00000010 /* Immutable file */ 180#define EXT2_APPEND_FL 0x00000020 /* writes to file may only append */ 181#define EXT2_NODUMP_FL 0x00000040 /* do not dump file */ 182#define EXT2_NOATIME_FL 0x00000080 /* do not update atime */ 183/* Reserved for compression usage... */ 184#define EXT2_DIRTY_FL 0x00000100 185#define EXT2_COMPRBLK_FL 0x00000200 /* One or more compressed clusters */ 186#define EXT2_NOCOMPR_FL 0x00000400 /* Access raw compressed data */ 187#define EXT2_ECOMPR_FL 0x00000800 /* Compression error */ 188/* End compression flags --- maybe not all used */ 189#define EXT2_BTREE_FL 0x00001000 /* btree format dir */ 190#define EXT2_IMAGIC_FL 0x00002000 191#define EXT3_JOURNAL_DATA_FL 0x00004000 /* file data should be journaled */ 192#define EXT2_RESERVED_FL 0x80000000 /* reserved for ext2 lib */ 193 194#define EXT2_FL_USER_VISIBLE 0x00005FFF /* User visible flags */ 195#define EXT2_FL_USER_MODIFIABLE 0x000000FF /* User modifiable flags */ 196 197/* 198 * ioctl commands 199 */ 200#define EXT2_IOC_GETFLAGS _IOR('f', 1, long) 201#define EXT2_IOC_SETFLAGS _IOW('f', 2, long) 202#define EXT2_IOC_GETVERSION _IOR('v', 1, long) 203#define EXT2_IOC_SETVERSION _IOW('v', 2, long) 204 205/* 206 * Structure of an inode on the disk 207 */ 208struct ext2_inode { 209 __u16 i_mode; /* File mode */ 210 __u16 i_uid; /* Low 16 bits of Owner Uid */ 211 __u32 i_size; /* Size in bytes */ 212 __u32 i_atime; /* Access time */ 213 __u32 i_ctime; /* Creation time */ 214 __u32 i_mtime; /* Modification time */ 215 __u32 i_dtime; /* Deletion Time */ 216 __u16 i_gid; /* Low 16 bits of Group Id */ 217 __u16 i_links_count; /* Links count */ 218 __u32 i_blocks; /* Blocks count */ 219 __u32 i_flags; /* File flags */ 220 union { 221 struct { 222 __u32 l_i_reserved1; 223 } linux1; 224 struct { 225 __u32 h_i_translator; 226 } hurd1; 227 struct { 228 __u32 m_i_reserved1; 229 } masix1; 230 } osd1; /* OS dependent 1 */ 231 __u32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */ 232 __u32 i_generation; /* File version (for NFS) */ 233 __u32 i_file_acl; /* File ACL */ 234 __u32 i_dir_acl; /* Directory ACL */ 235 __u32 i_faddr; /* Fragment address */ 236 union { 237 struct { 238 __u8 l_i_frag; /* Fragment number */ 239 __u8 l_i_fsize; /* Fragment size */ 240 __u16 i_pad1; 241 __u16 l_i_uid_high; /* these 2 fields */ 242 __u16 l_i_gid_high; /* were reserved2[0] */ 243 __u32 l_i_reserved2; 244 } linux2; 245 struct { 246 __u8 h_i_frag; /* Fragment number */ 247 __u8 h_i_fsize; /* Fragment size */ 248 __u16 h_i_mode_high; 249 __u16 h_i_uid_high; 250 __u16 h_i_gid_high; 251 __u32 h_i_author; 252 } hurd2; 253 struct { 254 __u8 m_i_frag; /* Fragment number */ 255 __u8 m_i_fsize; /* Fragment size */ 256 __u16 m_pad1; 257 __u32 m_i_reserved2[2]; 258 } masix2; 259 } osd2; /* OS dependent 2 */ 260}; 261 262#define i_size_high i_dir_acl 263 264#if defined(__KERNEL__) || defined(__linux__) 265#define i_reserved1 osd1.linux1.l_i_reserved1 266#define i_frag osd2.linux2.l_i_frag 267#define i_fsize osd2.linux2.l_i_fsize 268#define i_uid_low i_uid 269#define i_gid_low i_gid 270#define i_uid_high osd2.linux2.l_i_uid_high 271#define i_gid_high osd2.linux2.l_i_gid_high 272#define i_reserved2 osd2.linux2.l_i_reserved2 273 274#elif defined(__GNU__) 275 276#define i_translator osd1.hurd1.h_i_translator 277#define i_frag osd2.hurd2.h_i_frag; 278#define i_fsize osd2.hurd2.h_i_fsize; 279#define i_uid_high osd2.hurd2.h_i_uid_high 280#define i_gid_high osd2.hurd2.h_i_gid_high 281#define i_author osd2.hurd2.h_i_author 282 283#elif defined(__masix__) 284 285#define i_reserved1 osd1.masix1.m_i_reserved1 286#define i_frag osd2.masix2.m_i_frag 287#define i_fsize osd2.masix2.m_i_fsize 288#define i_reserved2 osd2.masix2.m_i_reserved2 289 290#endif /* defined(__KERNEL) || defined(__linux__) */ 291 292/* 293 * File system states 294 */ 295#define EXT2_VALID_FS 0x0001 /* Unmounted cleanly */ 296#define EXT2_ERROR_FS 0x0002 /* Errors detected */ 297 298/* 299 * Mount flags 300 */ 301#define EXT2_MOUNT_CHECK 0x0001 /* Do mount-time checks */ 302#define EXT2_MOUNT_GRPID 0x0004 /* Create files with directory's group */ 303#define EXT2_MOUNT_DEBUG 0x0008 /* Some debugging messages */ 304#define EXT2_MOUNT_ERRORS_CONT 0x0010 /* Continue on errors */ 305#define EXT2_MOUNT_ERRORS_RO 0x0020 /* Remount fs ro on errors */ 306#define EXT2_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ 307#define EXT2_MOUNT_MINIX_DF 0x0080 /* Mimics the Minix statfs */ 308#define EXT2_MOUNT_NO_UID32 0x0200 /* Disable 32-bit UIDs */ 309 310#define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt 311#define set_opt(o, opt) o |= EXT2_MOUNT_##opt 312#define test_opt(sb, opt) ((sb)->u.ext2_sb.s_mount_opt & \ 313 EXT2_MOUNT_##opt) 314/* 315 * Maximal mount counts between two filesystem checks 316 */ 317#define EXT2_DFL_MAX_MNT_COUNT 20 /* Allow 20 mounts */ 318#define EXT2_DFL_CHECKINTERVAL 0 /* Don't use interval check */ 319 320/* 321 * Behaviour when detecting errors 322 */ 323#define EXT2_ERRORS_CONTINUE 1 /* Continue execution */ 324#define EXT2_ERRORS_RO 2 /* Remount fs read-only */ 325#define EXT2_ERRORS_PANIC 3 /* Panic */ 326#define EXT2_ERRORS_DEFAULT EXT2_ERRORS_CONTINUE 327 328/* 329 * Structure of the super block 330 */ 331struct ext2_super_block { 332 __u32 s_inodes_count; /* Inodes count */ 333 __u32 s_blocks_count; /* Blocks count */ 334 __u32 s_r_blocks_count; /* Reserved blocks count */ 335 __u32 s_free_blocks_count; /* Free blocks count */ 336 __u32 s_free_inodes_count; /* Free inodes count */ 337 __u32 s_first_data_block; /* First Data Block */ 338 __u32 s_log_block_size; /* Block size */ 339 __s32 s_log_frag_size; /* Fragment size */ 340 __u32 s_blocks_per_group; /* # Blocks per group */ 341 __u32 s_frags_per_group; /* # Fragments per group */ 342 __u32 s_inodes_per_group; /* # Inodes per group */ 343 __u32 s_mtime; /* Mount time */ 344 __u32 s_wtime; /* Write time */ 345 __u16 s_mnt_count; /* Mount count */ 346 __s16 s_max_mnt_count; /* Maximal mount count */ 347 __u16 s_magic; /* Magic signature */ 348 __u16 s_state; /* File system state */ 349 __u16 s_errors; /* Behaviour when detecting errors */ 350 __u16 s_minor_rev_level; /* minor revision level */ 351 __u32 s_lastcheck; /* time of last check */ 352 __u32 s_checkinterval; /* max. time between checks */ 353 __u32 s_creator_os; /* OS */ 354 __u32 s_rev_level; /* Revision level */ 355 __u16 s_def_resuid; /* Default uid for reserved blocks */ 356 __u16 s_def_resgid; /* Default gid for reserved blocks */ 357 /* 358 * These fields are for EXT2_DYNAMIC_REV superblocks only. 359 * 360 * Note: the difference between the compatible feature set and 361 * the incompatible feature set is that if there is a bit set 362 * in the incompatible feature set that the kernel doesn't 363 * know about, it should refuse to mount the filesystem. 364 * 365 * e2fsck's requirements are more strict; if it doesn't know 366 * about a feature in either the compatible or incompatible 367 * feature set, it must abort and not try to meddle with 368 * things it doesn't understand... 369 */ 370 __u32 s_first_ino; /* First non-reserved inode */ 371 __u16 s_inode_size; /* size of inode structure */ 372 __u16 s_block_group_nr; /* block group # of this superblock */ 373 __u32 s_feature_compat; /* compatible feature set */ 374 __u32 s_feature_incompat; /* incompatible feature set */ 375 __u32 s_feature_ro_compat; /* readonly-compatible feature set */ 376 __u8 s_uuid[16]; /* 128-bit uuid for volume */ 377 char s_volume_name[16]; /* volume name */ 378 char s_last_mounted[64]; /* directory where last mounted */ 379 __u32 s_algorithm_usage_bitmap; /* For compression */ 380 /* 381 * Performance hints. Directory preallocation should only 382 * happen if the EXT2_FEATURE_COMPAT_DIR_PREALLOC flag is on. 383 */ 384 __u8 s_prealloc_blocks; /* Nr of blocks to try to preallocate*/ 385 __u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */ 386 __u16 s_padding1; 387 /* 388 * Journaling support valid if EXT2_FEATURE_COMPAT_HAS_JOURNAL set. 389 */ 390 __u8 s_journal_uuid[16]; /* uuid of journal superblock */ 391 __u32 s_journal_inum; /* inode number of journal file */ 392 __u32 s_journal_dev; /* device number of journal file */ 393 __u32 s_last_orphan; /* start of list of inodes to delete */ 394 395 __u32 s_reserved[197]; /* Padding to the end of the block */ 396}; 397 398#ifdef __KERNEL__ 399#define EXT2_SB(sb) (&((sb)->u.ext2_sb)) 400#else 401/* Assume that user mode programs are passing in an ext2fs superblock, not 402 * a kernel struct super_block. This will allow us to call the feature-test 403 * macros from user land. */ 404#define EXT2_SB(sb) (sb) 405#endif 406 407/* 408 * Codes for operating systems 409 */ 410#define EXT2_OS_LINUX 0 411#define EXT2_OS_HURD 1 412#define EXT2_OS_MASIX 2 413#define EXT2_OS_FREEBSD 3 414#define EXT2_OS_LITES 4 415 416/* 417 * Revision levels 418 */ 419#define EXT2_GOOD_OLD_REV 0 /* The good old (original) format */ 420#define EXT2_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */ 421 422#define EXT2_CURRENT_REV EXT2_GOOD_OLD_REV 423#define EXT2_MAX_SUPP_REV EXT2_DYNAMIC_REV 424 425#define EXT2_GOOD_OLD_INODE_SIZE 128 426 427/* 428 * Feature set definitions 429 */ 430 431#define EXT2_HAS_COMPAT_FEATURE(sb,mask) \ 432 ( EXT2_SB(sb)->s_feature_compat & (mask) ) 433#define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask) \ 434 ( EXT2_SB(sb)->s_feature_ro_compat & (mask) ) 435#define EXT2_HAS_INCOMPAT_FEATURE(sb,mask) \ 436 ( EXT2_SB(sb)->s_feature_incompat & (mask) ) 437 438#define EXT2_FEATURE_COMPAT_DIR_PREALLOC 0x0001 439#define EXT2_FEATURE_COMPAT_IMAGIC_INODES 0x0002 440#define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004 441#define EXT2_FEATURE_COMPAT_DIR_INDEX 0x0008 442#define EXT2_FEATURE_COMPAT_RESIZE_INODE 0x0010 443 444#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001 445#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002 446#define EXT2_FEATURE_RO_COMPAT_BTREE_DIR 0x0004 447 448#define EXT2_FEATURE_INCOMPAT_COMPRESSION 0x0001 449#define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002 450#define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */ 451#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */ 452 453#define EXT2_FEATURE_COMPAT_SUPP 0 454#define EXT2_FEATURE_INCOMPAT_SUPP EXT2_FEATURE_INCOMPAT_FILETYPE 455#define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \ 456 EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \ 457 EXT2_FEATURE_RO_COMPAT_BTREE_DIR) 458 459/* 460 * Default values for user and/or group using reserved blocks 461 */ 462#define EXT2_DEF_RESUID 0 463#define EXT2_DEF_RESGID 0 464 465/* 466 * Structure of a directory entry 467 */ 468#define EXT2_NAME_LEN 255 469 470struct ext2_dir_entry { 471 __u32 inode; /* Inode number */ 472 __u16 rec_len; /* Directory entry length */ 473 __u16 name_len; /* Name length */ 474 char name[EXT2_NAME_LEN]; /* File name */ 475}; 476 477/* 478 * The new version of the directory entry. Since EXT2 structures are 479 * stored in intel byte order, and the name_len field could never be 480 * bigger than 255 chars, it's safe to reclaim the extra byte for the 481 * file_type field. 482 */ 483struct ext2_dir_entry_2 { 484 __u32 inode; /* Inode number */ 485 __u16 rec_len; /* Directory entry length */ 486 __u8 name_len; /* Name length */ 487 __u8 file_type; 488 char name[EXT2_NAME_LEN]; /* File name */ 489}; 490 491/* 492 * Ext2 directory file types. Only the low 3 bits are used. The 493 * other bits are reserved for now. 494 */ 495#define EXT2_FT_UNKNOWN 0 496#define EXT2_FT_REG_FILE 1 497#define EXT2_FT_DIR 2 498#define EXT2_FT_CHRDEV 3 499#define EXT2_FT_BLKDEV 4 500#define EXT2_FT_FIFO 5 501#define EXT2_FT_SOCK 6 502#define EXT2_FT_SYMLINK 7 503 504#define EXT2_FT_MAX 8 505 506/* 507 * EXT2_DIR_PAD defines the directory entries boundaries 508 * 509 * NOTE: It must be a multiple of 4 510 */ 511#define EXT2_DIR_PAD 4 512#define EXT2_DIR_ROUND (EXT2_DIR_PAD - 1) 513#define EXT2_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT2_DIR_ROUND) & \ 514 ~EXT2_DIR_ROUND) 515 516#ifdef __KERNEL__ 517/* 518 * Function prototypes 519 */ 520 521/* 522 * Ok, these declarations are also in <linux/kernel.h> but none of the 523 * ext2 source programs needs to include it so they are duplicated here. 524 */ 525# define NORET_TYPE /**/ 526# define ATTRIB_NORET __attribute__((noreturn)) 527# define NORET_AND noreturn, 528 529/* acl.c */ 530extern int ext2_permission (struct inode *, int); 531 532/* balloc.c */ 533extern int ext2_bg_has_super(struct super_block *sb, int group); 534extern unsigned long ext2_bg_num_gdb(struct super_block *sb, int group); 535extern int ext2_new_block (const struct inode *, unsigned long, 536 __u32 *, __u32 *, int *); 537extern void ext2_free_blocks (const struct inode *, unsigned long, 538 unsigned long); 539extern unsigned long ext2_count_free_blocks (struct super_block *); 540extern void ext2_check_blocks_bitmap (struct super_block *); 541extern struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb, 542 unsigned int block_group, 543 struct buffer_head ** bh); 544 545/* bitmap.c */ 546extern unsigned long ext2_count_free (struct buffer_head *, unsigned); 547 548/* dir.c */ 549extern int ext2_check_dir_entry (const char *, struct inode *, 550 struct ext2_dir_entry_2 *, struct buffer_head *, 551 unsigned long); 552 553/* file.c */ 554extern int ext2_read (struct inode *, struct file *, char *, int); 555extern int ext2_write (struct inode *, struct file *, char *, int); 556 557/* fsync.c */ 558extern int ext2_sync_file (struct file *, struct dentry *, int); 559extern int ext2_fsync_inode (struct inode *, int); 560 561/* ialloc.c */ 562extern struct inode * ext2_new_inode (const struct inode *, int); 563extern void ext2_free_inode (struct inode *); 564extern unsigned long ext2_count_free_inodes (struct super_block *); 565extern void ext2_check_inodes_bitmap (struct super_block *); 566 567/* inode.c */ 568 569extern struct buffer_head * ext2_getblk (struct inode *, long, int, int *); 570extern struct buffer_head * ext2_bread (struct inode *, int, int, int *); 571 572extern void ext2_read_inode (struct inode *); 573extern void ext2_write_inode (struct inode *, int); 574extern void ext2_put_inode (struct inode *); 575extern void ext2_delete_inode (struct inode *); 576extern int ext2_sync_inode (struct inode *); 577extern void ext2_discard_prealloc (struct inode *); 578 579/* ioctl.c */ 580extern int ext2_ioctl (struct inode *, struct file *, unsigned int, 581 unsigned long); 582 583/* namei.c */ 584extern struct inode_operations ext2_dir_inode_operations; 585 586/* super.c */ 587extern void ext2_error (struct super_block *, const char *, const char *, ...) 588 __attribute__ ((format (printf, 3, 4))); 589extern NORET_TYPE void ext2_panic (struct super_block *, const char *, 590 const char *, ...) 591 __attribute__ ((NORET_AND format (printf, 3, 4))); 592extern void ext2_warning (struct super_block *, const char *, const char *, ...) 593 __attribute__ ((format (printf, 3, 4))); 594extern void ext2_update_dynamic_rev (struct super_block *sb); 595extern void ext2_put_super (struct super_block *); 596extern void ext2_write_super (struct super_block *); 597extern int ext2_remount (struct super_block *, int *, char *); 598extern struct super_block * ext2_read_super (struct super_block *,void *,int); 599extern int ext2_statfs (struct super_block *, struct statfs *); 600 601/* truncate.c */ 602extern void ext2_truncate (struct inode *); 603 604/* 605 * Inodes and files operations 606 */ 607 608/* dir.c */ 609extern struct file_operations ext2_dir_operations; 610 611/* file.c */ 612extern struct inode_operations ext2_file_inode_operations; 613extern struct file_operations ext2_file_operations; 614 615/* symlink.c */ 616extern struct inode_operations ext2_fast_symlink_inode_operations; 617 618extern struct address_space_operations ext2_aops; 619 620#endif /* __KERNEL__ */ 621 622#endif /* _LINUX_EXT2_FS_H */ 623