[SOS] Sur l'utilisation du systeme de fichier FAT
anthoine.bourgeois
anthoine.bourgeois at wanadoo.fr
Sam 5 Avr 12:00:06 CEST 2008
Bonjour,
Merci Guerineau pour tes 2 patchs sur l'ide et le fs fat.
Je vais essayer d'en intégrer et d'en corriger le plus
possible pour le prochain article de SOS.
Pour répondre à Edouard, l'article 10 sera mise en ligne
lorsque l'article suivant sera sorti dans linux mag.
J'y travaille mais je n'ai pas beaucoup de temps.
A+,
Anthoine
> Message du 08/03/08 18:12
> De : "guerineau" <chris.guer at wanadoo.fr>
> A : "SOS mailing-list" <sos at the-doors.enix.org>
> Copie à :
> Objet : [SOS] Sur l'utilisation du systeme de fichier FAT
>
>
> Problemes et corrections apportees sur le gestionnaire FAT.
> Toutes les corrections decrites impliquent le fichier drivers/fs_fat.c et seulement celui ci:
>
> 1. Syndrome de la traversee de cluster:
> Au cours de l'exploration d'un repertoire, il est incorrectement fait l'hypothese que la prochaine
> entree possible de repertoire est toujours situee apres l'entree courante. Cette hypothese est fausse
> si l'entree courante est la derniere du cluster.
> Fonctions impliquees:
> - fat_unlink
> - fat_dir_lookup
> - fat_readdir
> - fetch_node_from_disk
> - fat_mount
>
> La correction a consiste a introduire une fonction sos_fat_helper_get_following_directory_entry qui
> verifie la condition et qui provoque une commutation vers le cluster suivant, quand il existe. Cette
> fonction doit etre appelee en preliminaire a chaque utilisation de sos_fat_helper_get_next_directory_entry.
>
> 2. fonction sos_fat_helper_get_next_directory_entry
> probleme constate : bouclage de la fonction lors d'un franchissement de cluster.
> Le groupe de variables locales (sector_nr, sector_limit) n'est pas recalcule apres une
> commutation de cluster. Ceci provoque un cycle infini.
>
> 3. fonction sos_fat_helper_find_free_directory_entry
> 3.1: probleme de meme nature que celui decrit en (2)
> 3.2: En cas d'epuisement du stock d'entree (dans le dernier cluster) aucune extension n'est tentee
> sous forme de generation d'un nouveau cluster.
>
> 4. determination de la variable FirstRootDirSecNum:
> Il s'agit du premier secteur du repertoire racine. Elle est exprimee en unite de secteurs.
> Au moment du montage -fonction fat_mount- et dans le cas d'un systeme FAT 32, cette variable est
> exprimee en unite de cluster (au lieu d'unite de secteur).
>
> 5. Fonction fat_mount
> Recensement du repertoire racine:
> D'une part cette fonction est atteinte par le syndrome de la traversee de cluster, mais,
> d'autre part, l'operation de recensement des fichiers du repertoire racine est incorrectement
> initialisee: l'exploration du repertoire racine est lancee a partir d'une adresse incorrecte
> fixee a 32 octets AVANT le debut reel du repertoire (donc pointant sur la queue de la derniere FAT)
>
> 6. fonction fat_write
> Calage incorrect du buffer d'ecriture dans l'utilisatiuon de la fonction sos_blockdev_kernel_write.
> L'offset specifiant ce calage est improprement multiplie par 4.
>
> 7. Fonction sos_fat_helper_read
> Estimation incorrecte du nombre de clusters impliques dans l'operation de lecture.
> Dans le cas ou le debut de la lecture ne coincide pas avec une frontiere de cluster,
> la lecture est tronquee du contenu du dernier cluster.
>
> 8. Fonction sos_fat_helper_read
> Determination du volume de donnees dans la lecture du premier cluster.
> Dans le cas ou les notions de cluster et de secteurs ne sont pas geometriquement equivallentes,
> le volume de donnee de la premiere lecture, impliquant le premier cluster est incorrectement
> estime.
> Le determination du volume de donnee initiale doit etre calcule comme suit:
> len : cluster_size - (storage_location - first_data_sector_location) % cluster_size
> avec: first_data_sector_location: origine (adresse octet) du premier secteur de donnnees
> au lieu de:
> len : cluster_size - storage_location % cluster_size
> Ces deux formules divergent des que la taille d'un cluster est differente de celle d'un secteur.
>
> 9. Fonction sos_fat_helper_get_next_directory_entry
> Certaines entrees ne sont pas vues dans les conditions suivantes:
> - la taille du cluster est strictement superieure a 1 (c'est a dire qu'un cluster
> comprend au moins deux secteurs)
> - la recherche dans le repertoire commence a partir du debut du repertoire
> - l'entree du fichier cherche ne se situe pas dans le premier secteur du repertoire
> Le probleme vient de la variable "sector_rem" specifiant la premiere entree de repertoire a explorer:
> Elle est en fait relative a un secteur.
> Elle doit etre remise a zero des que l'exploration du premier secteur est terminee, sinon,
> les "sector_rem" entrees du secteur suivant sont occultees.
>
> 10. Fonction sos_fat_helper_find_free_directory_entry:
> Meme nature de probleme que celui evoque en (9)
> Ici, il ne s'agit pas a proprement parler d'un probleme, puisque les conditions necessaires
> a son apparition ne sont jamais remplies dans la realisation actuelle.
> Une correction a neanmoins ete apporte avec le patch joint.
>
> 11. Fonction sos_fat_helper_remove_all_cluster:
> Une operation excedentaire de mise a jour de FAT est declenchee.
> Le cluster implique, s'il etait licite, serait celui correpondant au code de fin de
> cluster (cluster numero 0xFFF8, dans le cas de FAT 16)
> Generalement cette operation provoque une alteration de la seconde FAT, ou des donnnes utiles ...
>
>
> Christian Guerineau
> Ci joint: patch corrigeant les problemes ci dessus evoques.
>
>
>
> [ sos_10_fat.pat (24.0 Ko) ]
> [ (pas de nom de fichier) (0.1 Ko) ]
Plus d'informations sur la liste de diffusion Sos