1 typedef struct Xfs Xfs; 2 typedef struct Xfile Xfile; 3 typedef struct Iobuf Iobuf; 4 typedef struct Ext2 Ext2; 5 6 typedef struct SuperBlock SuperBlock; 7 typedef struct GroupDesc GroupDesc; 8 typedef struct Inode Inode; 9 typedef struct DirEntry DirEntry; 10 11 #define SECTORSIZE 512 12 #define OFFSET_SUPER_BLOCK 1024 13 14 #define EXT2_SUPER_MAGIC 0xEF53 15 #define EXT2_MIN_BLOCK_SIZE 1024 16 #define EXT2_MAX_BLOCK_SIZE 4096 17 #define EXT2_ROOT_INODE 2 18 #define EXT2_FIRST_INO 11 19 #define EXT2_VALID_FS 0x0001 20 #define EXT2_ERROR_FS 0x0002 21 22 /* 23 * Structure of the super block 24 */ 25 struct SuperBlock { 26 uint s_inodes_count; /* Inodes count */ 27 uint s_blocks_count; /* Blocks count */ 28 uint s_r_blocks_count; /* Reserved blocks count */ 29 uint s_free_blocks_count; /* Free blocks count */ 30 uint s_free_inodes_count; /* Free inodes count */ 31 uint s_first_data_block; /* First Data Block */ 32 uint s_log_block_size; /* Block size */ 33 int s_log_frag_size; /* Fragment size */ 34 uint s_blocks_per_group; /* # Blocks per group */ 35 uint s_frags_per_group; /* # Fragments per group */ 36 uint s_inodes_per_group; /* # Inodes per group */ 37 uint s_mtime; /* Mount time */ 38 uint s_wtime; /* Write time */ 39 ushort s_mnt_count; /* Mount count */ 40 short s_max_mnt_count; /* Maximal mount count */ 41 ushort s_magic; /* Magic signature */ 42 ushort s_state; /* File system state */ 43 ushort s_errors; /* Behaviour when detecting errors */ 44 ushort s_pad; 45 uint s_lastcheck; /* time of last check */ 46 uint s_checkinterval; /* max. time between checks */ 47 uint s_creator_os; /* OS */ 48 uint s_rev_level; /* Revision level */ 49 ushort s_def_resuid; /* Default uid for reserved blocks */ 50 ushort s_def_resgid; /* Default gid for reserved blocks */ 51 uint s_reserved[235]; /* Padding to the end of the block */ 52 }; 53 54 /* 55 * Structure of a blocks group descriptor 56 */ 57 struct GroupDesc 58 { 59 uint bg_block_bitmap; /* Blocks bitmap block */ 60 uint bg_inode_bitmap; /* Inodes bitmap block */ 61 uint bg_inode_table; /* Inodes table block */ 62 ushort bg_free_blocks_count; /* Free blocks count */ 63 ushort bg_free_inodes_count; /* Free inodes count */ 64 ushort bg_used_dirs_count; /* Directories count */ 65 ushort bg_pad; 66 uint bg_reserved[3]; 67 }; 68 69 /* 70 * Constants relative to the data blocks 71 */ 72 #define EXT2_NDIR_BLOCKS 12 73 #define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS 74 #define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1) 75 #define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1) 76 #define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1) 77 78 /* 79 * Structure of an inode on the disk 80 */ 81 struct Inode { 82 ushort i_mode; /* File mode */ 83 ushort i_uid; /* Owner Uid */ 84 uint i_size; /* Size in bytes */ 85 uint i_atime; /* Access time */ 86 uint i_ctime; /* Creation time */ 87 uint i_mtime; /* Modification time */ 88 uint i_dtime; /* Deletion Time */ 89 ushort i_gid; /* Group Id */ 90 ushort i_links_count; /* Links count */ 91 uint i_blocks; /* Blocks count */ 92 uint i_flags; /* File flags */ 93 uint osd1; 94 uint i_block[EXT2_N_BLOCKS];/* Pointers to blocks */ 95 uint i_version; /* File version (for NFS) */ 96 uint i_file_acl; /* File ACL */ 97 uint i_dir_acl; /* Directory ACL */ 98 uint i_faddr; /* Fragment address */ 99 uchar osd2[12]; 100 }; 101 102 /* 103 * Structure of a directory entry 104 */ 105 #define EXT2_NAME_LEN 255 106 #define DIR_REC_LEN(name_len) (((name_len) + 8 + 3) & ~3) 107 108 struct DirEntry { 109 uint inode; /* Inode number */ 110 ushort rec_len; /* Directory entry length */ 111 uchar name_len; /* Name length */ 112 uchar reserved; 113 char name[EXT2_NAME_LEN]; /* File name */ 114 }; 115 116 #define S_IFMT 00170000 117 #define S_IFLNK 0120000 118 #define S_IFREG 0100000 119 #define S_IFDIR 0040000 120 121 #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) 122 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) 123 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) 124 125 #define DEFAULT_UID 200 126 #define DEFAULT_GID 100 127 128 struct Iobuf 129 { 130 Xfs *dev; 131 long addr; 132 Iobuf *next; 133 Iobuf *prev; 134 Iobuf *hash; 135 int busy; 136 int dirty; 137 char *iobuf; 138 }; 139 140 struct Xfs{ 141 Xfs *next; 142 char *name; /* of file containing external f.s. */ 143 Qid qid; /* of file containing external f.s. */ 144 long ref; /* attach count */ 145 Qid rootqid; /* of plan9 constructed root directory */ 146 short dev; 147 short fmt; 148 void *ptr; 149 150 /* data from super block */ 151 152 int block_size; 153 int desc_per_block; 154 int inodes_per_group; 155 int inodes_per_block; 156 int addr_per_block; 157 int blocks_per_group; 158 159 int ngroups; 160 int superaddr, superoff; 161 int grpaddr; 162 }; 163 164 struct Xfile{ 165 Xfile *next; /* in hash bucket */ 166 long client; 167 long fid; 168 Xfs * xf; 169 void * ptr; 170 171 uint inbr; /* inode nbr */ 172 uint pinbr; /* parrent inode */ 173 ulong bufaddr; /* addr of inode block */ 174 ulong bufoffset; 175 int root; /* true on attach for ref count */ 176 int dirindex; /* next dir entry to read */ 177 }; 178 179 #define EXT2_SUPER 1 180 #define EXT2_DESC 2 181 #define EXT2_BBLOCK 3 182 #define EXT2_BINODE 4 183 184 struct Ext2{ 185 char type; 186 union{ 187 SuperBlock *sb; 188 GroupDesc *gd; 189 char *bmp; 190 }u; 191 Iobuf *buf; 192 }; 193 194 #define DESC_ADDR(xf,n) ( (xf)->grpaddr + ((n)/(xf)->desc_per_block) ) 195 #define DESC_OFFSET(xf,d,n) ( ((GroupDesc *)(d)) + ((n)%(xf)->desc_per_block) ) 196 197 enum{ 198 Asis, Clean, Clunk 199 }; 200 201 enum{ 202 Enevermind, 203 Eformat, 204 Eio, 205 Enomem, 206 Enonexist, 207 Eexist, 208 Eperm, 209 Enofilsys, 210 Eauth, 211 Enospace, 212 Elink, 213 Elongname, 214 Eintern, 215 Ecorrupt, 216 Enotclean 217 }; 218 219 extern int chatty; 220 extern int errno; 221 extern char *deffile; 222 extern int rdonly; 223