|
Kernel Traffic Latest | Archives | People | Topics |
Wine Latest | Archives | People | Topics |
GNUe Latest | Archives | People | Topics |
| Czech |
| Home | News | RSS Feeds | Mailing Lists | Authors Info | Mirrors | Stalled Traffic |
Table Of Contents
Introduction
Je serais en congé à Manhattan du 19 décembre au 5 janvier. Si quelqu'un a vent d'évènements geek à Manhattan pendant ce temps, faites-le moi savoir.
Ce numéro de Kernel Traffic est dédiée à Pat McGovern, dirigeant de SourceForge. Ainsi qu'a Cris Conrad, le mainteneur du code du site, et Adi Alurkar, administrateur de base de données de SourceForge. Ce sont des gens bien, et si vous aimez SourceForge, vous devriez leur faire savoir, ça les rendra heureux. Je voudrais aussi dédier ce numéro à Allan Cruse pour la soirée sympa que nous avons passée avec Pat.
Un remerciement particulier à Vadim Lebedev pour avoir écrit le script que j'utilise pour créer les liens Sujet de chaque sommaire vers chaque discussion dans la mailing list. Le script en tant que tel ressemble à:
#/bin/sh
SUBJ=$1
AUTHOR=$2
DAY=$3
MONTH=$4
YR=$5
SUBJ=`echo $SUBJ | sed -e "s/ /%20/g"`
AUTHOR=`echo $AUTHOR | sed -e "s/ /%20/g"`
P1="&as_uauthors=$AUTHOR&as_usubject=$SUBJ&as_drbb=b&as_mind=$DAY&as_minm=$MONTH&as_miny=$YR"
P2="&as_maxd=$DAY&as_maxm=$MONTH&as_maxy=$YR"
URL="http://www.google.com/groups?as_ugroup=linux.kernel$P1$P2"
URL=`echo $URL | sed -e "s/\\&/\\&/g"`
echo $URL
Le script n'est toujours pas parfait, bien que très pratique. Si vous essayez de le lancer sur certaines données des résumés ci-dessous, vous verrez que les liens que j'ai fini par utiliser sont différents des liens que le script m'a retourné Si quelqu'un voit un moyen de générer directement les URLs que j'ai utilisé (ou un équivalent), faites-le moi savoir. Ou encore, si vous êtes intéresse en travailler avec Vadim afin d'améliorer cette version, faites-le moi savoir, et je vous mettrai en contact avec lui.
Mailing List Stats For This Week
We looked at 1389 posts in 6841K.
There were 496 different contributors. 227 posted more than once. 162 posted last week too.
The top posters of the week were:
1. Statut du 2.4; Discussion Sur La Stabilité De L'Interface Dans Tous Les Kernels
1 Dec 2003 - 6 Dec 2003 (203 posts) Archive Link: "Linux 2.4 future"
Topics: Backward Compatibility, Binary-Only Modules, FS: XFS, FS: autofs, Networking, SMP
People: Marcelo Tosatti, David S. Miller, Christoph Hellwig, Ian Kent, Peter C. Morton, Arjan van de Ven, Haris Peco, Jan-Benedict Glaw, Linus Torvalds, Jan-Benedict
En relation avec les discussions que nous traités dans BROKEN KCREF et Issue #244, Section #7 (30 Nov 2003: Status Of XFS In 2.4; More Evidence Of 2.4 Deep Freeze) , Marcelo Tosatti annonça:
Le but de ce mail est de clarifier ma position pour le 2.4.x dans le futur.
Le 2.6 devient de plus en plus stable chaque jour, et nous espérons voir la sortie du 2.6.0 durant ce mois-ci ou en janvier.
Ceci étant dit, j'ai l'intention de:
David S. Miller répondit, "Ça me semble bon, le 2.4.x a vraiment besoin de passer en mode de super-maintenance pendant que le 2.6.x monte sur la scène."
Ian Kent demanda si ses patches AutoFS4 avaient une chance d'intégrer l'arbre 2.4. Christoph Hellwig demanda ce que concernaient ces patches, et remarqua, "si ils ne sont pas dans le 2.6 a l'heure actuelle, je ne pense pas que ça ait un sens de les mettre dans le 2.4." Ian le reconnut, et dit, "Je viens de finir de les porter en 2.6 et je vais essayer d'obtenir de l'aide de la liste autofs pour les tests initiaux qui seront faits dans les prochains jours." Peter C. Norton clarifia aussi, " Ian a pas mal de correctifs de bogues ainsi que des patches de fonctionnalité (comme les mounts directs) qui ont été sur la mailing list autofs. Autofs4 a toujours eu des problèmes de stabilité en 2.4.x et a manqué de fonctionnalités. Ceci fait que moi et d'autres tournons avec un mix bâtard d'amd, autofs et modifications dans /etc/fstab pour obtenir un fonctionnement proche de l'"automounter" de solaris. Ci ça pouvait aller dans le 2.4 qui sera p"stable" et en utilisation dans beaucoup d'endroits dans les années à venir, ça pourrait pousser les distributions à soutenir autofs4 (avis, avis, redhat)." Christoph répondit que c'était un peu tard pour être intégré au 2.4; et "En ce qui concerne Red Hat: je parie que leur prochain produit sera basé sur un kernel 2.6 tout comme l'est fedora, leur version de test destiné à la communauté." Arjan van de Ven renchérit, disant à Peter, "Je pense que vous aurez du mal à trouver UNE distrib quelconque qui voudra toujours développer activement ses produits sur une base 2.4."
Autre part, dans une autre discussion, Haris Peco demanda, "Y a-t-il un linux-abi pour le kernel 2.6?" Christoph dit, qu'il ne le pensait pas, et Jan-Benedict Glaw dit aussi "Personne ne s'inquiète vraiment de l'ABI (au moins pas assez pour en garder une stable) tant qu'il y a une bonne API. Ça nécessite les sources, bien sûr, mais c'est une bonne chose..." Linus Torvalds intervint à ce moment là en disant:
Les gens sont _profondément_ concernés sur une ABI du point de vue utilisateur. Je pense personnellement que la compatibilité descendante est _la_ chose la plus importante pour tout kernel, est casser les ABI coté utilisateur n'est pas fait.
Parfois on bidouille des choses visibles côté utilisateur (par exemple, en enlevant des appels système vraiment obsolètes), mais même là nous sommes extrêmement vigilants. Comme en affichant des messages d'avertissement pendant plusieurs _années_ avant d'enlever effectivement une fonctionnalité.
une exception concerne les ABI "gestion du système", c'est à dire des trucs que les programmes normaux n'utilisent pas. Les mises à jour de kernel ont dont parfois besoin de nouveaux utilitaires pour faire des choses comme la configuration de firewalls, configuration du matériel (utilitaires ethernet, ifconfig etc), où - dans le cas du 2.6 - chargement de modules et déchargement. Même cela est regardé avec suspicion, et doit être accompagné de bonnes raisons.
Parfois, nous avons modifié les sémantiques de comportements système existants de manière subtile: soit pour être conforme aux standards, soit pour des problèmes d'implémentation. Ça n'arrive pas souvent, et si ça casse les applications existantes, ce n'est pas fait du tout (et le problème est corrigé en ajoutant un nouvel appel système avec les sémantiques correctes, et en laissant l'ancien).
Vous avez, cependant, raison en ce qui concerne les interfaces internes du noyau: nous ne nous en soucions pas des ABI's, et même les API sont fluides et changent librement si il y a une raison technique pour cela. Mais c'est uniquement vrai pour ce qui est interne au kernel (où les sources sont obligatoires de toute façon).
Jan-Benedict répondit, "Lorsque la Question ABI (tm) arrive, ça semble concerner une interface (compatible au niveau binaire) - surtout pour les modules. Mais je pense qu'il est largement accepté qu'il n'y a pas beaucoup de travail a faire pour que ce soit vraiment compatible au niveau binaire (c'est a dire les spinlocks UP/SMP etc..." Linus répondit:
Absolument. Cela n'arrivera pas. Je suis _complètement_ ininteressé par le fait d'avoir une ABI stable pour les modules kernel, et je suis même fermement opposé a l'_essai_, je veux que les gens sachent que les mécanismes internes du kernel changent et que ça va continuer.
Il n'y a pas de bonne excuse pour les modules binaires. Certains peuvent être techniquement légaux (en n'étant pas des travaux dérivés) et permis, mais même lorsqu'ils sont légaux, ce sont des épines dans le pied et toujours, horriblement bogués.
Je reçois de temps à autre des plaintes de constructeurs sur mon non-intérêt à ne serais ce qu'essayer d'aider les modules binaires. C'est une route à double sens: si vous ne m'aidez pas, je ne vous aide pas. Les modules binaires n'aident pas Linux, à l'inverse. Comme tel, nous ne devrions pas avoir d'initiatives les rendant plus courants qu'ils ne le sont déjà.
2. Mutexes Temps-Réel Basés Sur Le Kernel
3 Dec 2003 - 6 Dec 2003 (12 posts) Archive Link: "[RFC/PATCH] FUSYN Realtime & Robust mutexes for Linux try 2"
People: Inaky Perez-Gonzalez, Jamie Lokier, Scott Wood
Inaky Perez-Gonzalez proposa, "Ce code propose une implémentation de mutexes basés sur le kernel, s'inspirant d'implémentations actuelles utilisant les futexes (nommément NPTL), et voulant résoudre ses limitations (voir la doc) et en ajoutant quelques fonctionnalités, comme le comportement temps-réel, l'héritage de priorités, et la protection, détection d'interblocages et robustesse. " il ajouta, "Nous avons un site sur http://developer.osdl.org/dev/robustmutexes avec des références à toutes les versions, codes de test, modifications de NPTL (rtnptl) pour utiliser ce code. Le patch est aussi disponible dans un seul fichier au cas ou vous ne voulez pas le coller manuellement." Jamie Loker répondit:
Voilà mes premières réflexions après la lecture de Documentation/fusyn.txt .
Inaky répondit:
C'est ce que j'ai pensé au début, et mes premiers essais (l'année dernière?) allaient dans ce sens, mais il y a pas mal de problèmes (si je ne me trompe pas). Par exemple:
Jamie indiqua d'autres choses dans sa réponse initiale à la proposition d'Inaky. Il dit, "L'héritage de la priorité est ok _quand_ vous la voulez. Parfois si la tâche A de haute priorité veut une ressource qui est lockée par la tâche B de priorité plus basse, ça devrait être une condition d'erreur: ça peut être dangereux de promouvoir la priorité de la tâche B, si la tâche B ne peut pas tourner en haute priorité. " Inaky répondit, "C'est pourquoi ce n'est activé qu'à la demande, que le fait de l'avoir force d'autres choses me gène, comme avoir à faire un wait_cancel de contextes d'interruption ou d'autres choses comme ça. Heureusement, chprio nécessite aussi cela, donc ça sert de justification pour l'avoir. Je dois toujours quantifier les effets globaux que ça induit d'ailleurs." Inaky indiqua aussi que c'était vraiment de la responsabilité du concepteur du système de permettre un partage de lock sûr. Il ajouta, "J'ai des demandes d'entreprises pour étendre ce comportement aux tâches SCHED_OTHER, afin qu'une tâche FIFO puisse le promouvoir en FIFO. Personnellement, j'en tremble, mais ça peut aller dans certains environnements (quelques tâches temps réel faisant des choses importantes et des tâches normales faisant du nettoyage de basse priorité par exemple)."
Dans sa réponse initiale au premier post d'Inaky, Jamie dit aussi "Les structures de données et callbacks de priorité qui sont utilisés pour implémenter l'héritage de priorités, la protection et les wakeup de haute priorité sont bons. Mais le wakeup de haute priorité (au moins) ne devraient pas être seulement pour les fuqueus: il devrait être implémenté à un niveau plus bas, directement dans les waitqueues du kernel. En bref: wake_up() devrait réveiller la tâche aillant la plus haute priorité, pas la première dans la file, si c'est approprié pour la file ou le réveilleur." Inaky répondit:
C'est la première chose à laquelle j'ai pensé; cependant, ce n'est pas une tâche facile --par exemple, vous devrez allouer un noeud central qui qui doit être actif pendant tout la durée de vie de la file (au contraire des futexes), et ça ne marche pas trop bien-- avec le code actuel, au contraire de mes essais précédents avec les rtfutexes, ce n'est pas un gros problème et ça pourrait être fait, mais je ne sais pas quelle partie de l'interface je pourrais émuler.
De même, supporter le changements de priorité pendant l'attente nécessite plus de travail...
C'est dans ma liste todo d'ajouter d'autres parties à la couche fuqueue pour qu'ils puissent faire tout ce que font les waitqueues avec une interface basée sur la priorité.
Il serait intéressant d'expérimenter dans un sous-système les fuqueues en remplaçant les fuqueus, pour voir ce qui arrive.
Jamie demanda ce à quoi servait un noeud central, à laquelle Inaky avait fait allusion dans son premier paragraphe, et Inaky mentionna:
Dans les futexes, chaque hash chain a tous les attendants, en ordre d'arrivée FIFO, et nous en réveillons autant que nécessaire. Dans les fuqueues, ce réveil doit se faire par priorité. Nous pourrions parcourir la chaîne d'avant en arrière pour les réveiller dans l'ordre correct, mais ça deviendrait tout sauf O(1), et être simili "temps réel", ou être prédictable, fait partie du cahier des charges.
Donc, la file d'attente a une tête, la fuqueue->wlist et les attendants sont ajoutés là dans la position correcte (donc l'addition est O(N) maintenant, et je compte la changer en 0(1), la suppression de celui avec la plus haute priorité est O(1)--le mettre en tête).
Aujourd'hui dans les ufuqueues (celles qui sont associées à des adresses en espace utilisateur, le véritable équivalent futex) ce qui veut dire que vous ne pouvez pas faire la bidouille avec les listes de chaînes futex, donc vous avez pour chaque chaîne une tête par ufuqueue/adresse en espace utilisateur. Cette ufuqueue ne peut pas être déclarée dans la pile d'un des attendants, puisqu'elle disparaîtrait lors de son réveil et pourrait laisser les autres dans le vide.
Nous devons donc l'allouer, lui ajouter les attendants, et la désallouer lorsque la file d'attente est vide. C'est ce qui complique l'affaire et ajoute le tas de code qui est vl_locate() [l'allocation et ajout à la liste, vérification de collisions quand les locks sont libérés]. Comme le tout est relativement coûteux, nous avons intérêt à le garder en cache quelques secondes, il y a des chances que nous ayons une localité temporelle (en fait, il s'avère que ça améliore de beaucoup la performance), donc ça ajoute plus de code encore pour faire le "garbage collector", ça nettoie les chaînes de hash de têtes de file inutilisées de temps à autres. Voilà tout ce que fait le code de vlocator.
Cependant, Scott Wood suggéra:
Malgré tout, au lieu d'allouer de la mémoire à la demande, vous pouvez garder un pool de files disponibles. Chaque fois qu'une tâche est crée, en allouer une et l'ajouter à la file; chaque fois qu'une tâche se finit, en récupérer une et la libérer. Puisqu'une tâche ne peut attendre que sur une file à un moment donné, vous ne manquerez pas de files (sauf si vous voulez implémenter une sorte de wait pour des objets multiples; mais, dans ce cas, vous pourriez allouer des files supplémentaires sur demande sans affecter le cas classique d'un objet unique).
Par conséquent, ce serait une opération sur une liste simplement chaînée plus un spinlock pour acquérir et libérer une file si quelque chose se bloque. Ce serait plus lent que l'implémentation actuelle de waitqueue, mais pas de beaucoup (et ça pourrait être rendu configurable pour ceux pour qui chaque cycle compte et qui ne veulent pas des files d'attente temps réel).
Ce serait bénéficiaire pour l'usage en espace utilisateur aussi, puisque bloquer sur une file ne se verrait plus retourner la valeur -ENOMEM (qui est généralement indésirable dans ce qui est censé est une application prédictible temps-réel).
Il ajouta, "Si le pool est maintenu comme une pile, vous conservez les bénéfices du cache, tout en permettant la ré-utilisation des files à travers différents locks." Inaky répondit:
J'aime l'idée, spécialement à cause des garanties, mais je ne sais comment ça sera accepter:
la file d'attente est juste le type de base, fulock se développe au dessus, donc un fulock est plus gros qu'une fuqueue. Donc, vous devez allouer pour chaque tâche pour que ça ait un sens (si nous ajoutons un jour des rwlocks, il pourrait se passer quelque chose de similaire).
Nous pourrions aussi dire: ok, nous les séparons, mais alors vous devrez allouer des trucs supplémentaires autre part et vous revenez à la case départ (sans mentionner toutes les complications induites).
Il faudra faire un choix: voulons nous faire avec l'espace gâché (2) et (3) pour éliminer le problème -ENOMEM?
Je pense implémenter un programme de test configurable pour voir comment ça marche.
Un autre point, la meilleure chose pour l'espace utilisateur serait de réessayer l'appel si il voit un -ENOMEM (quelque chose comme -EAGAIN).
D'un autre coté, nous devrions forcer des marques hi/lo dans le nombre des fulocks/fuqueues dans les caches kmem pour chacun.
Revenant à la réponse originelle de Jamie au premier post d'Inaky, Jamie demanda, "Y a-t-il une méthode pour passer l'état locké à une autre tâche? Comparer-et-échanger ancien-pid -> nouveau-pid marche quand il n'y a pas de contention, mais un appel kernel est nécessaire pour tous les états contrôlés par le kernel. " Inaky répondit, "Ceci peut être fait, parce que vous êtes en mode non-KCO (c'est à dire pid), le kernel ne sait par définition rien sur le mutex, donc faites le comparer et échanger en espace utilisateur et vous êtes prêt. Pas besoin d'ajouter du code supplémentaire." Jamie dit, " La question est que faire avec l'état KCO. C'est à dire quand vous voulez transférer un état locké et qu'il n'y a pas d'attendants." Inaky Répondit:
Ah, ah, ah ... je vois. Ok, donc c'est comme une opération unlock mais "unlock ce gars". Bien, même chose mais étendue. Vous devez l'essayer en espace utilisateur, si ça échoue parce que c'est KCO (locké et il y a des attendants), alors allez en kernel et lui demander de transferer la possession ici.
Facile à faire, plus ou moins, et peut-être fait en O(1) en vérifiant dest_task->fuqueue_wait. Quel en est l'intérêt? Je suis curieux de voir ce pourquoi c'est utilisé.
Je vais m'en occuper dès que j'ai une minute (sauf si votre question est purement académique et ne comporte pas d'application précise).
Dans la réponse initiale de Jamie au premier post d'Inaky, Jamie dit aussi, "C'est très embêtant que les rwlocks entrent dans le kernel lorsqu'il y a plus d'un lecteur. Les rwlocks hashés peuvent être implémentés en espace utilisateur pour réduire cela (les lecteurs prennent un rwlock d'un ensemble hashé; les producteurs les prennent tous dans l'ordre), mais ce n'est pas super." Inaky en convint, et dit qu'il le garderait à l'esprit, bien qu'il n'y avait pas beaucoup pensé pour l'instant.
De même dans la réponse initiale de Jamie à la proposition d'Inaky, Jamie dit "Pour les architectures qui ne peuvent pas faire comparer-et-échanger, un appel système faisant l'équivalent (c'est à dire désactive la préemption, fait le comparer-et-échanger, et réactive la préemption) serait très utile. Pas pour maximiser la performance , mais pour permettre un système de lock indépendant du système permettant une plus grande portabilité." Inaky répondit, "Mais au moment ou vous faites un appel système, vous feriez mieux d'appeler directement le kernel pour arbitrer le mutex en mode purement KCO. Je pense que l'économie d'overhead vaut bien un #ifdef dans le code source pour une opération de lock..." Et Jamie dit, "Si c'est aussi simple que juste garder le mutex en mode KCO tout le temps sur les architectures qui n'ont pas de comparer-et-échanger, ou ceux qui le font si une application n'a pas de code assembleur spécifique pour cette architecture, ce serait très pratique. Je n'ai pas réfléchi pour savoir si garder un mutex en mode KCO à cette possibilité. Peut-être avez vous et pouvez vous donner la réponse?" Inaky répondit:
D'abord, je vais faire une distinction qui cause bien trop de confusions, une chose est KCO pour le vfulock (dire à l'utilisateur que ça doit aller dans le kernel) et une autre est de toujours l'utiliser en mode KCO en passant un flags-devant-être-implémenté FULOCK_FL_KCO aux appels sys_ufulock_*() (donc on évite tout le laid code de synchronisation).
Ce FULOCK_FL_KCO est nécessaire pour la protection de priorité de toute façon, il sera donc présent; donc dans les architectures sans comparer-et-échanger atomique, ça devient un problème de oops-je-n'ai-pas -de-chemin-rapide, j'appelle donc juste le syscall avec le bit mis.
Aussi dans la première longue réponse de Jamie au post initial d'Inaky, Jamie dit, "C'est un patch énorme. Un bon truc sur futex.c c'est qu'il est relativement petit (votre patch est 9 fois plus gros). Le design original des futex était plus compliqué, écrit spécifiquement pour les mutexes. Il fut ensuite simplifié et je pense réduit par la même occasion. Peut-être que mettre certaines capacités de priorités temps réel directement dans les waitqueues du kernel pourrait aider pour cela." Inaky dit:
Je suis d'accord avec cela, mais pensez aux éléments. La seule partie qui est strictement équivalente aux futexes est celle des ufuqueues, c'est donc ufuqueue.c, fuqueue.c et vlocator.c. Cette séparation est nécessaire pour permettre aux différentes parties d'être partagées par les fulocks.
Commentaires mis à part, il ajoute la partie la plus complexe, le tri par priorité, le support chprio vs ne pas avoir de FUTEX_FD ou de support requeue...ça tend a être plus ou moins équivalent, si on prend en compte tout ce qui doit être changé pour les priorités pour travailler avec les sémantiques POSIX incroyablement stupides pour les temps de vie des mutex.
Jamie demanda, "Y a-t-il des sémantiques POSIX pour les priorités et l'interaction de mutex?" Inaky répondit, "Ouaip, ils disent différentes choses là-dessus, et comment vous ne devez pas forcément détruire les mutexes non-partagés (à l'opposé de ceux qui sont partagés) et quelques choses en plus qui m'ont rendu la vie un peu plus excitante...Je pense que je dois toujours bidouiller quelques trucs sur l'héritage de priorités pour correspondre complètement aux specs, mais ça devrait être relativement bon déjà."
Quelques autres points intéressants furent discutés, mais ce résumé est déjà trop complexe.
3. Statut Des Contributions VM D'Andrea en 2.4
3 Dec 2003 - 6 Dec 2003 (10 posts) Archive Link: "2.4.23 includes Andrea's VM?"
Topics: Big Memory Support, Virtual Memory
People: Mike Fedyk, Andrea Arcangeli, Stephan von Krawczynski, Ian Soboroff, Bill Davidsen
Ian Soboroff remarqua que dans le ChangeLog 2.4.23, au moins une partie du sous-système de mémoire virtuelle d'Andrea Arcangeli avaient été intégrés. Il demanda des explications là-dessus, et Mike Fedyk répondit, "Une bonne partie de la VM a été intégrée dans le 2.4.23-pre3, donc les patches -aa pour le pre6 devraient montrer ce qui manque." Andrea Arcangeli dit aussi " Je vous recommence cependant de continuer à utiliser mon arbre, les deux dernières pièces indispensables sont inode-highmem et related_bhs. Les deux manquent et vous en aurez sans doute besoin avec 12Go. Je vais sortir un 2.4.23aa1 d'ailleurs, ce sera le dernier 2.4-aa." Mike demanda si Andrea comptait sortir des branches 2.6-aa, mais il n'y eut pas de réponse. Stephan von Krawczynski et Bill Davidsen saisirent l'opportunité pour remercier Andrea pour son travail sur la VM.
4. Compression Et Cryptage Des Systèmes De Fichiers
3 Dec 2003 - 9 Dec 2003 (50 posts) Archive Link: "partially encrypted filesystem"
Topics: BSD, FS: ext2, Virtual Memory
People: Richard B. Johnson, Linus Torvalds, Phillip Lougher, Erez Zadok, Matthew Wilcox, David Woodhouse, Kallol Biswas, Joern Engel, Bill Davidsen
Kallol Biswas voulait un moyen pour un système de fichier de stocker certaines données cryptées et d'autres non-cryptées; Richard B. Johnson dit que ça devrait être géré par l'application, pas par le système de fichiers; et Bill Davidsen acquiesça. Comme le dit Richard, "Les systèmes de fichiers sont un tas d'inodes. Chaque fois que vous voulez lire ou écrire un inode, quelque chose doit décider si c'est crypté ou pas, et si ça l'est, comment l'encrypter ou la décrypter. Même la longueur de la lecture ou de l'écriture dépend du type d'encryption utilisé. Vous éviterez sans doute un algorithme où un chaîne de N octets est encodée sur N octets, parce que cela relève la longueur, ce que quelqu'un peut extrapoler pour découvrir le contenu. Donc, si vous avez besoin d'inodes de longueur variable --- quel bazar. Le résultat serait un des systèmes de fichiers les plus lents que vous puissiez imaginer."
Autre part, Joern Engel suggéra qu'il était possible d'ajouter un encryptage optionnel sur un système de fichiers existant comme JFFS2. Mais Linus Torvalds répondit:
Le cryptage n'est pas si facile à mettre en place au dessus d'un système de fichiers existant pour un raison simple: en raison de problèmes de performance (et taille mémoire), la plupart des systèmes de fichiers font de l'"IO in place". En d'autres mots, il font les E/S directement dans ou à partir du cache de pages.
Avec un système de fichiers encrypté, vous ne pouvez pas faire ça. Ou plutôt: vous pouvez le faire si le système de fichiers est en lecture seule, mais vous ne POUVEZ PAS le faire lors de l'écriture. Pour l'écriture vous devez traiter le buffer de sortie autre part (et franchement, c'est plus facile si vous le faites pour lire aussi).
Et cela rapporte des problèmes à son tour. Vous avez tout un tas de scénarios d'interblocage lorsque l'écriture nécessite plus de mémoire pour réussir. Vous devez être attentif. Lire finit par être bien plus facile (par les mêmes problèmes d'interblocage _et_ vous pourriez le faire sur place de toute façon).
Le cryptage en soi n'est pas difficile. Mais ajouter la couche de buffers indirects supplémentaires _peut_ s'avérer désagréable, et difficile a traiter par la suite.
** NOTE NOTE NOTE **
Si vous n'avez pas besoin de mmaper() les fichiers, écrire devient plus facile. Parce qu'alors vous pouvez instaurer des règles comme "les accès à la page cache arrivent toujours lorsque la page est lockée", ensuite la couche de cryptage peut crypter sur place.
Il est donc potentiellement bien plus facile de faire du cryptage un cas particulier, et interdire mmap dessus, ainsi que d'interdire les lectures/écritures concurrentes sur les fichiers cryptés. C'est acceptable pour bien des cas (la plupart des programmes marchent toujours sans mmap - mais vous ne pourrez pas crypter des binaires chargés à la demande par exemple).
Joern indiqua que quelques systèmes de fichiers géraient tous ces problèmes et fournissaient toujours la lecture/écriture. Et Linus répondit:
Oui, la compression et le cryptage sont la même chose du point de vue de l'implémentation du fs - ils ont juste de buts différents. Donc oui, tout système de fichiers compressé aura les mêmes problèmes pour une grande part.
La compression est difficile à traiter par la suite de la même manière.
Le cryptage a des problèmes supplémentaires, simplement par sont but. Dans un système de fichiers compressé, il est permis de dire "cette information est petite et difficile à compresser, ne le faisons pas" (les méta-données par exemple). Alors que dans un système de fichiers crypté, vous ne devriez pas laisser de côté des morceaux "difficiles".
(Les systèmes de fichiers cryptés ont aussi des problèmes de gestion de clés, compliquant un peu plus la chose, mais la complication tend a être à un niveau supérieur).
Joern répondit que dans ce cas, JFFS2 pourrait être la meilleure solution après tout; et Phillip lougher répondit, "Si on considère que Jffs2 est le seul système de fichiers compressé que l'on peut écrire, oui. Ce qui doit être gardé à l'esprit c'est que les systèmes de fichiers compressés ne veulent pas que les données après la compression soient plus plus grandes que les données originales. Si elles le sont, les données originales sont utilisées à la place, ce qui n'est pas l'idéal pour un système de fichiers compressé, par conséquent, on a besoin de plus qu'une simple substitution de la fonction de compression par une fonction de cryptage - ceci n'est vrai que si l'algorithme peut renvoyer plus de données..." Erez Zadok répondit:
Une partie de notre projet de fs empilable (FiST) inclut un étage Gzipfs de compression. Il y eut un article dessus dans Usenix 2001, et il y a du code dans le dernier package fistgen. Voir http://www1.cs.columbia.edu/~ezk/research/fist/
La performance de Gzipfs est un autre problème, particulièrement pour les écritures au milieu du fichier. :-).
Quelques posts plus tard, il ajouta:
Nous compressons chaque morceau séparément; en ce moment chunk==PAGE_CACHE_SIZE. Pour chaque fichier foo, nous conservons un fichier index foo.idx qui enregistre les offsets dans le fichier principal où vous pourriez trouver les données compressés pour la page N. Nous l'accrochons ensuite dans les opérations de lecture/écriture de pages du VFS. Ça marche bien pour les modes d'accès aux fichiers les plus communs: petits fichiers, accès aléatoire/séquentiel en lecture, écriture séquentielle. Mais ça marche mal pour les écritures aléatoires dans de gros fichiers, parce que nous devons décompresser et recompresser les données après avoir écrit. Notre article donne un grand nombre de résultats de benchmarks montrant la performance et l'utilisation de l'espace selon différents scénarios.
Nous avons quelques idées sur comment améliorer la performance d'écritures-au-milieu, mais ça pourrait amoindrir la performance dans les cas courants. En résumé, nous devons alors vers des structures de données O(log n), ce qui rendrait les écritures aléatoires bien meilleures. Mais puisque ça pourrait impacter les performances d'autres modes d'accès, nous avons réfléchi à un moyen de supporter les deux modes et d'être capable de passer de l'un à l'autre à la volée (ou au moins de laisser les utilisateurs "marquer" un fichier comme étant destiné a être écrit de manière aléatoire).
Si quelqu'un a des commentaires ou suggestions, nous serions heureux de les entendre.
Et Matthew Wilcox dit:
C'est sur. Je l'ai décrit avant à cette liste, mais voila comment ça marche:
Ce qu'a fait Acorn pour leur produit RISCiX (basé sur 4.3BSD, tournant sur une machine ARM dans la fin des années 80/début 90), était de compresser chaque page de 30Ko individuellement et de l'écrire sur un système de fichiers de taille block 1Ko (les disques faisaient atour de 50Mo à l'époque, 1Ko était la bonne taille). Ceci laissait le fichier plein de trous, et faisait perdre en moyenne 512/32Ko = 1/64 de la compression qui pouvait être atteinte, mais c'était très rapide de retrouver le bon endroit.
Aujourd'hui, les systèmes de fichiers avec une taille de block à 4Ko sont la règle, et la taille de page est aussi de 4Ko, donc vous ne devez pas forcément être plus futé pour obtenir le même effet. Compresser des morceaux de 256Ko a un moment donné vous donnera la même perte, mais je ne pense pas que Linux ait un bon support pour les systèmes de fichiers qui veulent larguer 64 pages dans le cache de pages alors que la VM/VFS n'en ont demandé qu'une.
Si il l'avait, ça pourrait permettre à ext2/3 d'agrandir les tailles de blocks au delà de la limite des 4Ko sur i386, ce qui serait une bonne chose à faire. Ou peut-être nous devons prendre le taureau par les cornes et augmenter le PAGE_CACHE_SIZE à quelque chose de plus gros comme 64Ko. Les gens voudront cela sur leurs systèmes 32 bits bientôt de toute façon.
Peu après, Phillip dit, "Les idées d'Acorn sont dans "Les Exécutables Compressés Un Exercice Pour Penser Petit" de Mark Taunton, dans la conférence Usenix Spring '91, ça ne semble pas être ne ligne, mais une recherche sur google groups sur "group:comp.unix. internals taunton compressed executables" apporte une description. J'ai travaillé avec Mark Taunton chez Acorn."
Erez répondit à Matthew, "Merci pour l'info, Matthew. Oui, clairement une politique qui garde des "trous" dans les fichiers compressés peut aider; une de nous idées était de garder des trous tous les N blocks, exactement pour ce type d'expansion, ainsi que de mettre à jour le format du fichier d'index pour enregistrer l'endroit où se trouvent les espaces (afin de pouvoir calculer de manière efficiente combien de trous nous devons consommer lors d'une nouvelle écriture)." Et Matthew dit, "Mais le truc génial, c'est que vous ne devez pas calculer quoi que ce soit. Si le block de données se trouve être incompressible (maudits .tar.bz2!), vous écrivez simplement le block sur place. Si c'est compressible, vous écrivez autant que nécessaire et vous laissez un espace. Le système de fichiers sous-jacent n'écrit pas de données là. Il n'y pas besoin de fichier index -- vous savez exactement où commencer à lire chaque block." Phillip répondit:
Bien sur tout cela est fait au niveau fichier, qui s'appuie sur le support approprié des trous dans le système de fichiers sous-jacent (ce qui était le cas dans le BSD FFS d'Acorn). La politique de FiST est de considérer un implémentation sans le support de trous, où vous *devez* rassembler les données, autrement l'espace "inutilisé" consommerait physiquement des blocs disque. Dans ce cas un index pour trouvez le début de chaque block compressé est essentiel.
Je suppose que FiST n'a pas de support de trous ou d'insertion de données dans le modèle du système de fichiers, ce qui explique pourquoi lors de l'écriture au milieu d'un fichier le fichier complet à partir de ce point doit être réécrit.
Bien sûr, tout ceci se passe au niveau fichier logique, et ignore les blocs physiques sur le disque. Tous les systèmes de fichiers assument que les blocs de données physiques peuvent être mis à jour sur place. Avec la compression si c'est possible, un nouveau block physique doit être trouvé, surtout sil les blocks sont rassemblés et non-alignés sur les limites de blocks. Je pense que c'est pourquoi JFFS2 est un système de fichiers structuré autour d'un log.
David Woodhouse répondit:
Pas vraiment. JFFS2 est un système de fichiers structuré autour du log parce qu'il est fait pour marcher sur du _flash_, pas sur des périphériques block. Vous avez une taille d'eraseblock typique de 64Ko, vous pouvez supprimer des bits dans ce 'block' autant que vous voulez jusqu'à ce qu'ils soient tous supprimés ou que vous vous en lassiez, alors vous devrez l'effacer à OxFF et recommencer.
Même si vous admettiez d'avoir une taille de block de 64Ko pour les couches au dessus de vous, pour ne pouvez pas _faire_ un remplacement atomique de blocs, ce qui est nécessaire pour les systèmes de fichiers normaux afin de marcher correctement.
Ces caractéristiques de flash ont souvent été gérées en implémentant une 'couche de traduction' -- une sorte de pseudo système de fichiers -- qui imite un périphérique block avec un comportement écrasement-atomique de 512 octets normal. Vous utilisez ensuite un système de fichiers traditionnel au dessus de ce périphérique bloc émulé.
JFFS2 a été conçu pour éviter cette couche supplémentaire inéfficiente, et pour travailler directement avec le flash. Puisque réécrire des trucs sur place est si difficile, ou nécessite une couche de translation pour mapper les adresses 'logiques' en adresses physiques, nous avons abandonné l'idée que la location physique veut dire _quoi que ce soit_.
A partir de là, la compression fit son apparition; ce fut trivial.
5. Statut De L'enregistrement Du .Config Dans Le Kernel Compilé
4 Dec 2003 - 5 Dec 2003 (8 posts) Archive Link: "Where'd the .config go?"
People: Randy Dunlap, Robert L. Harris
Robert L. Harris remarqua que l'option permettant de sauvegarder les données du .config dans le kernel n'était pas présente dans le 2.4.23-bk3; il demanda si cette fonctionnalité avait été supprimée. Randy Dunlap répondit, "Ça n'a jamais été intégré en 2.4.x. Marcelo n'en voulait pas. C'est dans le 2.6.x. Il y a un patch 2.4.22-pre dans ce répertoire que vous pouvez essayer: http://www.xenotime.net/linux/ikconfig/" Lucio Maciel suggéra d'inclure cette fonctionnalité dans le 2.4, mais Randy dit "C'est a Marcelo" [Tossatti] "de décider et il essaye de diminuer les patches 2.4.x."
6. Statut Du OOM Killer En 2.4
4 Dec 2003 - 9 Dec 2003 (19 posts) Archive Link: "oom killer in 2.4.23"
Topics: OOM Killer, Virtual Memory
People: Guillermo Menguez Alvarez, Andrea Arcangeli, Maciej Zenczykowski
Peter Bergmann remarqua que le out-of-memory killer (OOM) avait été supprimé du 2.4.23; il dit que les résultats était très mauvais. Maciej Zenczykowski suggéra aussi de le remettre, mais en en faisant une option de configuration. Guillermo Menguez Alvarez dit:
Comme je le lis dans le ChangeLog:
aa VM inclusion: page réclame des changements, on tue l'oom killer
L'OOM Killer a été supprimé a cause des changements AA VM, ça ne peut donc peut-être pas être réactivé simplement.
Andrea Arcangeli dit:
ça peut être réactivé sans trop de difficultés si vous acceptez le comportement ordinateur de bureau de 2.4.22 et avant, qui n'est pas adapté aux serveurs.
L'oom killer avait des interblocages, et reposait sur une comptabilité inexacte, il y avait donc un certain nombre de cas où il terminait des tâches par erreur (il est trompé par shm/mlock/noswap etc..), j'ai aussi lu des rapports de bogues pour 2.4.22 avec des tâches étant terminées parce qu'il n'y avait pas de swap sur la machine (vous essayez de lancer une machine sans swap, la swap n'est pas obligatoire, c'est un souhait). Résoudre cela en 2.4 semble trop compliqué, et il est maintenant trop tard pour espérer faire un oom killer correct pour 2.4.
Pour mémoire 2.2 était capable de vérifier iopl pour retarder quelque temps la terminaison du serveur X, ça n'a pas été porté en 2.4. Pour le 2.6 nous pouvons faire quelque chose de mieux que tous les oom killers passés. 2.6 se fait tromper par mlock aussi d'ailleurs, termine aléatoirement des tâches etc... il n'est donc pas bien meilleurs que 2.4.22 sur la question de l'oom killer.
Plus tard, Andrea dit aussi:
c'est simple a réactiver en 2.4.22, si vous êtes d'accord pour avoir des situations d'interblocage. Le 2.4.23 ne peut pas s'interbloquer, il peut faire un livelock si vous êtes malchanceux avec les timings (imaginez ajouter 32Go de swap et votre ram tourne à 1k/sec au lieu d'1G/sec), mais pas s'interbloquer et il ne tuera pas des tâches aléatoirement même si il ne devrait pas le faire. L'interblocage est un bogue, terminer une tâche alors qu'il y a de la ram libre est un bogue, le livelock est évitable si vous laissez tomber tout le swap. Si vous laissez tomber tout le swap en 2.4.22 il deviendra fou en terminant des tâches (voir les rapports de bogue).
Puisque le faire correctement n'était pas possible en 2.4, je l'ai laisser tomber il y a des années, les utilisateurs -aa n'ont pas d'oom killer depuis des années et je n'ai jamais entendu une plainte. certains ont demandé pourquoi, oui, mais étaient heureux par la suite. Je ne pense pas avoir demandé à Marcelo de l'intégrer, j'ai expliqué pourquoi je l'avais abandonné, certains lui envoyaient des rapports de bogues sur l'oom killer devenant fou, et il accepta que ma solution était la meilleure à court terme sans induire trop d'efforts pour faire marcher l'oom killer. Notez que l'oom killer devient fou en 2.6 aussi, personne ne l'a fait correctement à ce jour, c'est pourquoi je ne pense pas que ce soit un problème 2.4
Marcelo m'a demandé de le rendre configurable au runtime pour que vous puissiez aller dans le mode susceptible d'interblocage du 2.4.22 à la demande, mais je n'ajouterais pas plus de fonctionnalités au 2.4 aujourd'hui sauf si il y a des bogues bloquants (même si c'était simple a implémenter), en fait ce n'est même pas de mon ressort, donc ne me demandez pas de le faire, désolé.
7. Brevets Affectant Le Support FAT
5 Dec 2003 - 8 Dec 2003 (17 posts) Archive Link: "Large-FAT32-Filesystem Bug"
Topics: FS: FAT, FS: VFAT, Microsoft, Patents
People: Joanne Dow, Helge Hafting, Tomasz Torcz
Torsten Scheck rapporta un problème avec le système de fichiers VFAT, mais Joanne Dow répondit "Tout cela pourrait être incertain. Microsoft va faire payer une royaltie pour l'utilisation du système de fichiers FAT. http://www.microsoft.com/mscorp/ip/tech/fat.asp Les brevets logiciels sont la mort de l'innovation et de la compétition. " Helge Hafting dit, "Ils revendiquent certains brevets mais la FAT n'est-t-elle pas si ancienne qu'ils aient expirés?" Tomasz Torcz répondit, "Les brevets pour sauvegarder des noms longs de fichiers (ce que fait payer Microsoft) datent de 1995 environ."
8. Passage De Relais 2.6 À Andrew
5 Dec 2003 (3 posts) Archive Link: "[BK PATCHES] libata fixes"
People: Linus Torvalds, Jeff Garzik
Jeff Garzik posta quelques correctifs, et Linus Torvalds dit, "Aujourd'hui j'accepte des une-ligne que je pense être "évidents" mais aussi "très importants" (c'est à dire les correctifs pour les oops que tout le monde peut déclencher, plutôt que des mises à jour pour un driver particulier). Donc on dirait que je pourrais accepter l'_un_ d'eux." Il ajouta, "Andrew toujours en congé, et il peut faire une décision indépendante, mais en ce moment je ne vais pas ajouter quoi que ce soit de plus gros."
9. Statut D'XFS En 2.4
8 Dec 2003 (6 posts) Archive Link: "XFS merged in 2.4"
Topics: FS: XFS
People: Marcelo Tosatti, Dan Yocum
Marcelo Tosatti dit, "Christoph a révisé le patch XFS qui changeait du code générique, et il a été réduit par la suite à un ensemble de changements qui ne modifient pas le comportement du code (à part de quelques correctifs de bogues qui devraient avoir été inclus séparément de toute façon) et qui sont plutôt évidents. Ça a donc été intégré dans fs/xfs/." Dan Yocum le remercia chaleureusement pour cela, les réactions furent généralement positives.
10. Sortie De kgdb 1.7
9 Dec 2003 (1 post) Archive Link: "kgdb 1.7"
People: Amit S. Kale
Amit S. Kale dit:
J'ai intégré quelques unes des diverses améliorations soumises par TimeSys Corporation dans le kgdb principal sur http://kgdb.sourceforge.net/ La version de kgdb contenant ces fonctionnalités est la 1.7. Elle est disponible pour le kernel 2.4.23. Voici une brève description des améliorations.
11. Le Code Freeze Linux 2.6 En Action
9 Dec 2003 (4 posts) Archive Link: "[PATCH 2.4.23, 2.6.0-test11] fix d_type in readdir in isofs"
Topics: Code Freeze
People: Linus Torvalds
Domen Puncer posta un correctifs pour ISOFS, et Linus Torvalds répondit, "Ça me semble ok, mais je ne peux pas me convaincre de l'appliquer en ce moment: je n'arriver pas l'appeler correctif majeur de stabilité ;). Quelqu'un peut-il garder ceci pour plus tard?"
12. Nouvel Endroit Pour Le Post Halloween Document
9 Dec 2003 (1 post) Archive Link: "post halloween document moved.."
People: Dave Jones
Dave Jones dit, "La machine hébergeant www.codemonkey.org.uk est morte de manière dramatique, résultant dans la mise hors ligne du halloween document 2.6. J'ai eu quelques demandes pour le mettre ailleurs pendant que je corrige les trucs, donc pour l'instant vous pouvez trouver la dernière version que j'ai pu trouver dans les sauvegardes sur http://www.linux.org.uk/~davej/docs/"
13. Software Suspend 2.0rc3 Pour 2.4 Et 2.6
9 Dec 2003 - 11 Dec 2003 (3 posts) Archive Link: "Announce: Software Suspend 2.0rc3 for 2.4 and 2.6."
Topics: FS: NFS, FS: sysfs, SMP, Software Suspend
People: Nigel Cunningham
Nigel Cunningham annonça:
Ceci pour annoncer la 2.0-rc3, est uploadé sur swsusp.sf.net.
Un nombre de petits mais conséquents changements visibles par l'utilisateur ont été faits lors de cette version, lisez attentivement les notes s'il vous plaît.
Nouveau format. Il y a maintenant un patch 'principal' qui devrait être appliqué quelle que soit la version du kernel. En addition au patch principal, un patch dépendant de la version devrait être appliqué. Ceux-ci sont disponibles pour les familles 2.4 et 2.6 de kernels. Les patches principaux et dépendant de la version devraient pouvoir être mis à jour indépendamment.
SPÉCIFIQUEMENT DANS LE CAS 2.6, LE PATCH DÉPENDANT DE LA VERSION DEVRAIT ÊTRE APPLIQUÉ EN PREMIER. Autrement des rejets arriveront.
Changement des paramètres de la ligne de commande du kernel. A la place de resume=, resume_block= et resume_blocksize=, il y a maintenant un simple paramètre resume2=. Notez que c'est RESUME2, pas RESUME. Le format pour ce paramètre est:
resume2=[writer]:[writer-specific-parameters]
Pour le moment, il n'y a qu'une méthode pour sauvegarder les images - le swapwriter. Il est envisagé d'implémenter le support NFS a un moment dans le futur. (Après que je fasse le travail d'intégration avec Patrick). Pour l'instant, alors, vous remplacerez
resume=/dev/hda1 resume_block=0x560 resume_blocksize=1024
par
resume2=swap:/dev/hda1:0x560@1024
Plus tard vous serez peut-être capable de faire
resume2=nfs:192.168.1.1/images/laptop.
/proc/sys/kernel/swsusp est maintenant obsolète. Il est toujours présent dans cette version mais j'aimerais que les scripts soient changés pour utiliser la nouvelle entrée /proc/swsusp/all_settings à la place. Les fonctionnalités sont exactement les mêmes. Seul l'endroit à changé.
En plus, une tonne de changements visibles par l'utilisateur ont été faits. Ceci explique la taille du patch. Une nouvelle API interne implémente deux types de 'plugins', conçue pour ajouter de nouvelles méthodes pour transformer les données à stocker ('transformer') et pour sauvegarder les données ('writers') plus facile à implémenter. Ceci m'a permis de séparer le code spécifique swap et le code de compression comme part du grand nettoyage que j'ai aussi fait. Le code /proc a été amélioré, afin que les plugins puissent dynamiquement enregistrer de nouvelles entrées. Ceci formera aussi les fondations pour le support de kobject dans le kernel 2.6. (C'est à dire que le swsusp 2.6 cessera bientôt d'utiliser proc et utilisera sysfs à la place.
Cette version devrait marcher correctement avec les implémentations de software suspend dans le kernel 2.6. L'implémentation pmdisk de Patrick peut être activée comme toujours en utilisant l'interface sysfs, et celle de Pavel utilisant echo 4 > /proc/acpi/sleep. Ce patch remplace l'implémentation freezer qu'utilisent ces versions, et le suspend de Pavel s'initialisera mais n'utilisera pas le véritable affichage. Mis à part ces changements mineurs, aucune différence ne devrait être vue.
Pour ceux qui veulent simplement se mettre à jour à partir d'une rc2, un patch incrémental est aussi disponible sur Sourceforge. Je l'ai mis là-bas plutôt que de l'attacher à cause de sa taille.
Mis à part les changements kobject mentionnés ci-dessus, ceci devrait être le dernier ensemble de gros changements au code. Sauf si quelque chose m'a échappé, je crois que j'ai implémenté toutes les fonctionnalités donc on a besoin. A partir de maintenant, je travaillerai donc sur la mise à jour/amélioration de la documentation et le nettoyage et le commentaire du code, l'implémentation du support de kobject et peut-être aussi le support SMP. (ce qui devrait être un changement mineur).
14. MIses À Jour XFS Pour 2.4
11 Dec 2003 (1 post) Archive Link: "Announce: XFS split patches for 2.4.24-pre1"
Topics: Access Control Lists, FS: XFS
People: Keith Owens
Keith Owens dit:
ftp://oss.sgi.com/projects/xfs/download/patches/2.4.24-pre1.
Le 2.4.24-pre1 contient maintenant le gros du code XFS. Ces patches en morceau ne contiennent que des mises à jour XFS du 2.4.24-pre1, plus du code comme les ACL, DMAPI et KDB, si vous n'avez pas besoin de ces fonctionnalités et que vous ne voyez pas de bogues dans le code XFS du 2.4.24-pre1 vous n'avez alors pas besoin d'appliquer ces patches.
Voir le README dans chaque répertoire attentivement, le format du patch en morceaux a changé depuis quelques sorties du kernel. Toutes les questions traités par le README seront ignorées. Il y a même un 2.4.24/README pour les incurables impatients :).
Sharon And Joy
Kernel Traffic is grateful to be developed on a computer donated by Professor Greg Benson and Professor Allan Cruse in the Department of Computer Science at the University of San Francisco. This is the same department that invented FlashMob Computing. Kernel Traffic is hosted by the generous folks at kernel.org. All pages on this site are copyright their original authors, and distributed under the terms of the GNU General Public License version 2.0. |