Main Page   Modules   Alphabetical List   Data Structures   File List   Data Fields   Globals   Related Pages  

ext2.h

Go to the documentation of this file.
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

Generated on Fri Feb 20 15:32:15 2004 for Minirighi by doxygen1.2.18