00001 /*! \file include/kernel/ext2.h 00002 * \brief ext2 file system header. 00003 * \author 00004 * Filippo Brogi 00005 * \note Copyright (©) 2003 00006 * Filippo Brogi 00007 * \date Last update: 00008 * 2003-09-30 by Andrea Righi 00009 * init_ext2() now returns a boolean value.\n 00010 */ 00011 00012 #ifndef EXT2_H 00013 #define EXT2_H 00014 00015 #include <const.h> 00016 00017 /** \ingroup FileSystem 00018 * \defgroup FSext2 Ext2 00019 * The ext2 file system. 00020 * @{ 00021 */ 00022 00023 // dimensione blocco del disco 00024 #define SIZE_SEC 512 00025 00026 // numero magico ext2 00027 #define N_EXT2_NUMERO_MAGICO 0xEF53 //for normal versione of ext2 00028 #define P_EXT2_NUMERO_MAGICO 0xEF51 //for versions of ext2fs prior to 0.2b. 00029 00030 // costanti errore ext2 00031 #define EXT2_ERRORS_CONTINUE 1 // continua come se niente fosse 00032 #define EXT2_ERRORS_RO 2 // rimonta a sola lettura 00033 #define EXT3_ERRORS_PANIC 3 // causa un panic nel kernel 00034 00035 // valori EXT2_OS 00036 #define EXT2_OS_LINUX 0 00037 #define EXT2_OS_HURD 1 00038 #define EXT2_MASIX 2 00039 #define EXT2_FREEBSD 3 00040 #define EXT2_OS_LITES4 4 00041 00042 // livelli di revisione 00043 #define EXT2_GOOD_OLD_REV 0 //original format 00044 #define EXT2DYNAMIC_REV 1 // formato v2 con dimensione inode dinamica 00045 00046 // valori EXT2_*_INO 00047 #define EXT2_BAD_INO 0x01 //blocco inode danneggiato 00048 #define EXT2_ROOT_INO 0x02 // inode directory radice 00049 #define EXT2_ACL_IDX_INO 0x03 //ACL index inode 00050 #define EXT2_ACL_DARA_INO 0x04 //ACL data inode 00051 #define EXT2_BOOTLOADER INO 0x05 //boot loader inode 00052 #define EXT2_UNDEL_DIR_INO 0x06 // inode directory ripristinata 00053 00054 // valori EXT2_S_I 00055 00056 // ------------ file format ------------ 00057 #define MODE_MASK 0xF000 // format mask 00058 #define MODE_SOCK 0xC000 // socket 00059 #define MODE_LINK 0xA000 // symbolic link 00060 #define MODE_FILE 0x8000 // regular file 00061 #define MODE_BDEV 0x6000 // block device 00062 #define MODE_DIR 0x4000 // directory 00063 #define MODE_CDEV 0x2000 // character device 00064 #define MODE_FIFO 0x1000 // fifo 00065 00066 // ------------ access rights ------------ 00067 #define EXT2_S_ISUID 0x0800 // SUID 00068 #define EXT2_S_ISGID 0x0400 // SGID 00069 #define EXT2_S_ISVTX 0x0200 // sticky bit 00070 #define EXT2_S_IRWXU 0x01C0 // user access rights mask 00071 #define EXT2_S_IRUSR 0x0100 // read 00072 #define EXT2_S_IWUSR 0x0080 // write 00073 #define EXT2_S_IXUSR 0x0040 // execute 00074 #define EXT2_S_IRWXG 0x0038 // group access right mask 00075 #define EXT2_S_IRGRP 0x0020 // read 00076 #define EXT2_S_IWGRP 0x0010 // write 00077 #define EXT2_S_IXGRP 0x0008 // execute 00078 #define EXT2_S_IRWXO 0x0007 // others access rights mask 00079 #define EXT2_S_IROTH 0x0004 // read 00080 #define EXT2_S_IWOTH 0x0003 // write 00081 #define EXT2_S_IXOTH 0x0001 // execute 00082 00083 00084 // valori EXT2_FT 00085 //------------ tipo file --------------- 00086 #define EXT2_FT_UNKNOWN 0 00087 #define EXT2_FT_REG_FILE 1 00088 #define EXT2_FT_DIR 2 00089 #define EXT2_FT_CHRDEV 3 00090 #define EXT2_FT_BLKDEV 4 00091 #define EXT2_FT_FIFO 5 00092 #define EXT2_FT_SOCK 6 00093 #define EXT2_FT_SYMLINK 7 00094 #define EXT2_FT_MAX 8 00095 00096 00097 #define DIM_SUPER_BLOCK 1024 00098 #define START_SUPER_BLOCK 1024 00099 struct super_block{ 00100 dword s_inodes_count; //numero totale inode liberi e utilizzati 00101 dword s_blocks_count; //numero totale di blocchi liberi e utilizzati 00102 dword s_r_blocks_count; //numero totale di blocchi riservati al super user 00103 dword s_free_blocks_count; //numero di blocchi liberi compresi quelli riservati 00104 dword s_free_inodes_count; //numero totale di inode liberi 00105 dword s_first_data_block; /* id del blocco contenente la struttura del sb 00106 generalmente questo valore é 0 per i file system con con una dimensione del 00107 blocco maggiore di 1KB. Il super blocco inzia sempre al 1024 byte del disco 00108 che generalmente coincide con il primo byte del terzo settore */ 00109 dword s_log_block_size; /* la dimensione del blocco si calcola come il numero 00110 di bit che si ottiene shiftando 1024. Questo valore può essere solo positivo; 00111 block size = 1024 << s_log_block_size; */ 00112 dword s_log_frag_size; /* la dimensione del frammento si calcola come il numero 00113 di bit da shiftare dal valore 1024 00114 if (positive) 00115 fragment size = 1024 << s_log_frag_size; 00116 else 00117 fragment size = 1024 >> -s_log_frag_size; */ 00118 dword s_blocks_per_group; //numero totale blocchi del gruppo 00119 dword s_frags_per_group; //numero totale frammenti per gruppo 00120 dword s_inodes_per_group; //numero totale di inodes per gruppo 00121 dword s_mtime; // data ultimo montaggio del file system 00122 dword s_wtime; // ultimo accesso in scrittura al file system 00123 word s_mnt_count; // numero di volte che é stato montato dall'ultima volta 00124 // in cui é stata completamente verificata 00125 word s_max_mnt_count; //numero massimo di volte che un file system può essere 00126 //montato prima che sia eseguito un check completo 00127 word s_magic; // numero magico 00128 word s_state; /* stato del file system montato. Quando il fs é stato montato 00129 lo stato é posto a EXT2_ERROR_FS. Quando il file system non é stato ancora 00130 montato il valore può essere EXT2_VALID_FS oppure EXT2_ERROR_FS se non é stato 00131 completamente smontato */ 00132 word s_errors; //cosa fare in caso di errore 00133 word s_minor_rev_level; // 00134 dword s_lastcheck; // ultimo check del file system 00135 dword s_checkinterval; // massimo tempo di intervallamento tra due check 00136 dword s_creator_os; // identificativo so creatore del file system 00137 dword s_rev_level; // valore livello di revisione 00138 word s_def_resuid; // id user default per i blocchi riservati 00139 word s_def_resgid; // id group default per i blocchi riservati 00140 00141 dword s_first_ino; /* indice del primo inode utilizzabile per file standard. 00142 nella revisione non dinamica del file system questo valore é fissato a 11. Con 00143 quella dinamica é possibile modificare questo valore*/ 00144 word s_inode_size; /* dimensione della struttura inode. Nel caso non 00145 dinamico questo valore é 128*/ 00146 word s_block_group_nr; // numero dei gruppi nel superblocco 00147 dword s_feature_compact; // 00148 dword s_feature_incompact; // 00149 dword s_feature_ro_compact; // 00150 byte s_uuid[16]; // id del volume 128 bit 00151 word s_volume_name; // 00152 byte s_last_mounted[8]; // path directory dove é stato montato il fs 00153 dword s_algo_bitmap; /* usato da algoritmi di compressione per determinare i 00154 metodi utilizzati */ 00155 byte s_reserved[886]; // riservati al sistema operativo 00156 }; 00157 00158 /* Il descrittore di gruppo é un array della struttura group_desc ognuna delle 00159 quali definisce uno dei gruppi di blocchi dando la locazione della tabella 00160 degli inode, bitmap dei blocchi e inode, ed altre informazioni ancora. In 00161 generale é allocato consecutivamente al blocco del disco contenente il super 00162 blocco*/ 00163 00164 00165 struct group_descriptor{ 00166 dword bg_block_bitmap; // id primo blocco della bitmap dei blocchi del gruppo 00167 dword bg_inode_bitmap; // id primo blocco della bitmap degli inode 00168 dword bg_inode_table; //primo blocco della tabella degli inode 00169 word bg_free_blocks_count; //numero totale di blocchi liberi 00170 word bg_free_inodes_count; // numero totale inode liberi 00171 word bg_used_dirs_count; // numero inode allocati nelle directory 00172 word bg_pad; // valore usato per il padding della struttura 00173 dword bg_reserved[3]; // valori riservati per future implementazioni 00174 }; 00175 00176 00177 /* 00178 Il "block bitmap" é normalmente locato al primo blocco o al secondo blocco 00179 nel caso in cui si abbia il backup del super blocco. La sua locazione ufficiale 00180 si può ottenere leggendo il bg_block_bitmap nel descrittore di gruppo. Ogni 00181 bit rappresenta lo stato corrente del blocco, 1 indica usato, mentre 0 indica 00182 libero/disponibile. 00183 00184 L' "inode bitmap" lavora nello stesso modo della bitmap dei blocchi. Tale 00185 bitmap si determina a partire da bg_inode_bitmap. Quando si crea la tabella 00186 degli inode tutti gli inode riservati sono marcati come utilizzati. 00187 00188 La tabella degli inode é usata per tenere traccia di ogni file : locazione, 00189 dimensione, tipo, diritti di accesso sono tutti memorizzati negli inode. I nomi 00190 dei file non sono memorizzati qui, nella tabella degli inode tutti i file sono 00191 referenziati con il loro numero di inode. La tabella degli inode é referenziata 00192 da bg_inode_table e contiene s_inodes_per_group 00193 */ 00194 00195 00196 00197 struct i_node{ 00198 word i_mode; // formato del file e diritti di accesso 00199 word i_uid; // user id associato col file 00200 dword i_size; // dimensione in byte del file 00201 dword i_atime; // ultimo accesso in secondi a partire dal 1/1/1970 00202 dword i_ctime; // data di creazione in secondi dal 1/1/1970 00203 dword i_mtime; // data ultima modifica in secondi dal 1/1/1970 00204 dword i_dtime; // data della cancellazione del file a partire dal 1/1/1970 00205 word i_gid; // gruppo che ha accesso al file 00206 word i_links_count; // numero dei riferimenti all'inode 00207 dword i_blocks; /* ammontare dei blocchi associati al file quelli correntemente 00208 usati e quelli che verranno utilizzati nel caso di una crescita delle 00209 dimensioni del file. In qusto caso la dimensione dei blocchi é 512 kB e non 00210 quella specificata nel super blocco */ 00211 dword i_flags; // comportamento del file system quando accede ai dati 00212 dword i_osd1; // valore dipendendente dal SO 00213 dword i_block[15]; /* array utilizzato per individuare i blocchi del disco in 00214 cui si trova memorizzato il file. I primi 12 elementi servono per indirizzare 00215 direttamente i blocchi dati associati ai file, il 13-esimo é utilizzato per 00216 l'indirizzamento indiriretto singolo il 14-esimo per l'indirizzamento indiretto 00217 doppio e il 15-esimo per quello triplo */ 00218 dword i_generation; // indica versione del file (usato da NFS) 00219 dword i_file_acl; //numero el blocco contenenti gli attributi estesi 00220 dword i_dir_acl; // indica la high size del file 00221 dword i_faddr; // locazione dell'ultimo frammento del file 00222 /* inode osd2 structure Linux */ 00223 byte l_i_frag; //numero frammento 00224 byte l_i_fsize; // dimensione frammento 00225 word reserved1; // reserved 00226 word l_i_uid_high; // bit dell'user id 00227 word l_i_gid_high; // bit del group id 00228 dword reserved2; // reserved 00229 }; 00230 00231 /* 00232 Le directory sono memorizzate come file e si possono identificare guardando il 00233 valore dell'attributo i_mode dell'inode e verificando che sia uguale a 00234 EXT2_S_IFDIR. La directory radice é sempre memorizzata nella seconda posizione 00235 della tabella degli inode. Ogni sottodirectory si può ottenere guardando il 00236 contenuto della direcotry radice. 00237 */ 00238 00239 struct dir_ff{ 00240 dword inode; // numero entry del file. 0 indica che non é usata 00241 word rec_len; // spostamento all'elemento successivo della directory corrente 00242 byte name_len; // quanti caratteri contiene il nome 00243 byte file_type; // tipo del file 00244 char name[1]; // nome dell'entry 00245 }; 00246 00247 /* Utilizzare il formato standard delle liste linkate per le directory può 00248 divenire molto lento quando il numero dei file comincia a crescere. Così 00249 per incrementre le prestazioni si utilizza un indice hash che aiuta a 00250 incrementare le prestazioni di ricerca */ 00251 00252 /* STRUTTURA Dell'INDICE 00253 La radice dell'albero indice si trova nel blocco 0 del file. Spazio per il 00254 secondo livello dell'albero indiciato (per file system con blocchi da 4kB) 00255 si trova nei blocchi da 1 a 511. I blocchi foglia delle direcotry sono 00256 situati a partire dal blocco 512, così la coda del file delle directory 00257 assomiglia ad una direcotry standard EXT2 e può essere processata con 00258 ext2_readdir. Per direcotry con meno di 90K di file c'é un buco eseguendo dal 00259 blocco 1 al blocco 511, così una directory vuota ha giusto due blocchi, sebbene 00260 la sua dimensione sia all'incirca 2 mega nella lista della direcotry. 00261 */ 00262 00263 // --- Prototypes ----------------------------------------------------- // 00264 00265 bool init_ext2(); 00266 char *pwd_ext2(); 00267 void ls_ext2(); 00268 void cd_ext2(char *param); 00269 void cat_ext2(char *stringa); 00270 00271 /** @} */ // end of FSext2 00272 00273 #endif