aboutsummaryrefslogtreecommitdiff
path: root/documentation/content/es/articles/geom-class/_index.po
diff options
context:
space:
mode:
Diffstat (limited to 'documentation/content/es/articles/geom-class/_index.po')
-rw-r--r--documentation/content/es/articles/geom-class/_index.po1396
1 files changed, 1396 insertions, 0 deletions
diff --git a/documentation/content/es/articles/geom-class/_index.po b/documentation/content/es/articles/geom-class/_index.po
new file mode 100644
index 0000000000..918425f609
--- /dev/null
+++ b/documentation/content/es/articles/geom-class/_index.po
@@ -0,0 +1,1396 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Fernando Apesteguía <fernando.apesteguia@gmail.com>, 2021, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2022-02-01 09:21-0300\n"
+"PO-Revision-Date: 2022-08-24 14:08+0000\n"
+"Last-Translator: Fernando Apesteguía <fernando.apesteguia@gmail.com>\n"
+"Language-Team: Spanish <https://translate-dev.freebsd.org/projects/"
+"documentation/articlesgeom-class_index/es/>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.10.1\n"
+
+#. type: YAML Front Matter: description
+#: documentation/content/en/articles/geom-class/_index.adoc:1
+#, no-wrap
+msgid "A guide to GEOM internals, and writing your own GEOM class"
+msgstr ""
+"Una guía sobre los detalles de GEOM y cómo escribir tu propia clase GEOM"
+
+#. type: Title =
+#: documentation/content/en/articles/geom-class/_index.adoc:1
+#: documentation/content/en/articles/geom-class/_index.adoc:11
+#, no-wrap
+msgid "Writing a GEOM Class"
+msgstr "Escribiendo una clase GEOM"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:44
+msgid "Abstract"
+msgstr "Resumen"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:47
+msgid ""
+"This text documents some starting points in developing GEOM classes, and "
+"kernel modules in general. It is assumed that the reader is familiar with C "
+"userland programming."
+msgstr ""
+"Este texto documenta algunos puntos de partida en el desarrollo de clases "
+"GEOM y módulos del kernel en general. Se asume que el lector está "
+"familiarizado con la programación en C en modo usuario."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:49
+msgid "'''"
+msgstr "'''"
+
+#. type: Title ==
+#: documentation/content/en/articles/geom-class/_index.adoc:53
+#, no-wrap
+msgid "Introduction"
+msgstr "Introducción"
+
+#. type: Title ===
+#: documentation/content/en/articles/geom-class/_index.adoc:56
+#, no-wrap
+msgid "Documentation"
+msgstr "Documentación"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:60
+msgid ""
+"Documentation on kernel programming is scarce - it is one of few areas where "
+"there is nearly nothing in the way of friendly tutorials, and the phrase "
+"\"use the source!\" really holds true. However, there are some bits and "
+"pieces (some of them seriously outdated) floating around that should be "
+"studied before beginning to code:"
+msgstr ""
+"La documentación sobre la programación del kernel es escasa - es una de las "
+"pocas áreas donde casi no hay tutoriales amigables, y la frase, \"¡usa el "
+"código fuente!\", realmente es cierta. Sin embargo, hay algunos trozos ("
+"algunos de ellos muy desactualizados) flotando alrededor que deben "
+"estudiarse antes de comenzar a programar:"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:62
+msgid ""
+"The extref:{developers-handbook}[FreeBSD Developer's Handbook] - part of the "
+"documentation project, it does not contain anything specific to kernel "
+"programming, but rather some general useful information."
+msgstr ""
+"El extref:{developers-handbook}[FreeBSD Developer's Handbook] - parte del "
+"proyecto de documentación, no contiene nada específico a la programación del "
+"kernel sino más bien algo de información útil en general."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:63
+msgid ""
+"The extref:{arch-handbook}[FreeBSD Architecture Handbook] - also from the "
+"documentation project, contains descriptions of several low-level facilities "
+"and procedures. The most important chapter is 13, extref:{arch-handbook}"
+"[Writing FreeBSD device drivers, driverbasics]."
+msgstr ""
+"El extref:{arch-handbook}[FreeBSD Architecture Handbook] - también parte del "
+"proyecto de documentación, contiene descripciones de varios servicios y "
+"procedimientos de bajo nivel. El capítulo más importante es el 13, extref"
+":{arch-handbook}[Writing FreeBSD device drivers, driverbasics]."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:64
+msgid ""
+"The Blueprints section of http://www.freebsddiary.org[FreeBSD Diary] web "
+"site - contains several interesting articles on kernel facilities."
+msgstr ""
+"La sección Blueprints del sitio web http://www.freebsddiary.org[FreeBSD "
+"Diary] - contiene varios artículos interesantes sobre servicios del kernel."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:65
+msgid ""
+"The man pages in section 9 - for important documentation on kernel functions."
+msgstr ""
+"Las páginas del manual en la sección 9 — para documentación importante sobre "
+"las funciones del kernel."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:66
+msgid ""
+"The man:geom[4] man page and http://phk.freebsd.dk/pubs/[PHK's GEOM slides] "
+"- for general introduction of the GEOM subsystem."
+msgstr ""
+"La página de manual man:geom[4] y http://phk.freebsd.dk/pubs/[PHK's GEOM "
+"slides] - para una introducción general al subsistema GEOM."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:67
+msgid ""
+"Man pages man:g_bio[9], man:g_event[9], man:g_data[9], man:g_geom[9], man:"
+"g_provider[9], man:g_consumer[9], man:g_access[9] & others linked from "
+"those, for documentation on specific functionalities."
+msgstr ""
+"Las páginas del manual man:g_bio[9], man:g_event[9], man:g_data[9], "
+"man:g_geom[9], man:g_provider[9], man:g_consumer[9], man:g_access[9] y otras "
+"enlazadas desde estas, para documentación sobre funcionalidades específicas."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:68
+msgid ""
+"The man:style[9] man page - for documentation on the coding-style "
+"conventions which must be followed for any code which is to be committed to "
+"the FreeBSD tree."
+msgstr ""
+"La página del manual man:style[9] - para documentación sobre las "
+"convenciones que debe seguir el estilo del código para todo aquel que se va "
+"a añadir al árbol de FreeBSD."
+
+#. type: Title ==
+#: documentation/content/en/articles/geom-class/_index.adoc:70
+#, no-wrap
+msgid "Preliminaries"
+msgstr "Preliminares"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:77
+msgid ""
+"The best way to do kernel development is to have (at least) two separate "
+"computers. One of these would contain the development environment and "
+"sources, and the other would be used to test the newly written code by "
+"network-booting and network-mounting filesystems from the first one. This "
+"way if the new code contains bugs and crashes the machine, it will not mess "
+"up the sources (and other \"live\" data). The second system does not even "
+"require a proper display. Instead, it could be connected with a serial "
+"cable or KVM to the first one."
+msgstr ""
+"La mejor forma de hacer desarrollo del kernel es tener (al menos) dos "
+"ordenadores separados. Uno de ellos debería de tener el entorno de "
+"desarrollo y el código fuente, y el otro sería usado para probar el código "
+"recién escrito, inicializando y montando su sistema de archivos a través de "
+"la red desde el primer ordenador. De esta forma, si el nuevo código contiene "
+"errores y bloquea el ordenador, esto no dañará el código fuente (ni ningún "
+"otro dato que este ejecutándose en \"caliente\"). El segundo sistema ni "
+"siquiera necesita un monitor adecuado. En su lugar, podría estar conectado "
+"con un cable serie o KVM al primer ordenador."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:80
+msgid ""
+"But, since not everybody has two or more computers handy, there are a few "
+"things that can be done to prepare an otherwise \"live\" system for "
+"developing kernel code. This setup is also applicable for developing in a "
+"http://www.vmware.com/[VMWare] or http://www.qemu.org/[QEmu] virtual machine "
+"(the next best thing after a dedicated development machine)."
+msgstr ""
+"Pero como no todo el mundo tiene dos o más ordenadores a mano, hay unas "
+"pocas cosas que se pueden hacer para preparar un entorno \"en caliente\" "
+"para desarrollar código del kernel. Esta configuración también se puede "
+"aplicar para desarrollar en una máquina virtual http://www.vmware.com/"
+"[VMWare] o http://www.qemu.org/[QEmu] (lo siguiente mejor después de tener "
+"una máquina como entorno dedicado)."
+
+#. type: Title ===
+#: documentation/content/en/articles/geom-class/_index.adoc:82
+#, no-wrap
+msgid "Modifying a System for Development"
+msgstr "Modificar un sistema para el desarrollo"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:85
+msgid ""
+"For any kernel programming a kernel with `INVARIANTS` enabled is a must-"
+"have. So enter these in your kernel configuration file:"
+msgstr ""
+"Para cualquier programación del kernel, es obligatoria tener activada la "
+"opción `INVARIANTS`. Así que añade estas líneas a tu archivo de "
+"configuración del kernel:"
+
+#. type: delimited block . 4
+#: documentation/content/en/articles/geom-class/_index.adoc:90
+#, no-wrap
+msgid ""
+"options INVARIANT_SUPPORT\n"
+"options INVARIANTS\n"
+msgstr ""
+"options INVARIANT_SUPPORT\n"
+"options INVARIANTS\n"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:93
+msgid ""
+"For more debugging you should also include WITNESS support, which will alert "
+"you of mistakes in locking:"
+msgstr ""
+"Para tener un mayor nivel de depuración, también debes incluir el soporte de "
+"WITNESS, que te advertirá sobre errores relacionados con los bloqueos:"
+
+#. type: delimited block . 4
+#: documentation/content/en/articles/geom-class/_index.adoc:98
+#, no-wrap
+msgid ""
+"options WITNESS_SUPPORT\n"
+"options WITNESS\n"
+msgstr ""
+"options WITNESS_SUPPORT\n"
+"options WITNESS\n"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:101
+msgid "For debugging crash dumps, a kernel with debug symbols is needed:"
+msgstr ""
+"Para depurar los volcados de memoria, se necesita un kernel con símbolos de "
+"depuración:"
+
+#. type: delimited block . 4
+#: documentation/content/en/articles/geom-class/_index.adoc:105
+#, no-wrap
+msgid " makeoptions DEBUG=-g\n"
+msgstr " makeoptions DEBUG=-g\n"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:110
+msgid ""
+"With the usual way of installing the kernel (`make installkernel`) the debug "
+"kernel will not be automatically installed. It is called [.filename]#kernel."
+"debug# and located in [.filename]#/usr/obj/usr/src/sys/KERNELNAME/#. For "
+"convenience it should be copied to [.filename]#/boot/kernel/#."
+msgstr ""
+"Con la forma habitual de instalar el kernel (`make installkernel`) no se "
+"instala el kernel de depuración de forma automática. Se llama [."
+"filename]#kernel.debug# y se encuentra en [.filename]#/usr/obj/usr/src/sys/"
+"KERNELNAME/#. Por comodidad se debería copiar a [.filename]#/boot/kernel/#."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:113
+msgid ""
+"Another convenience is enabling the kernel debugger so you can examine a "
+"kernel panic when it happens. For this, enter the following lines in your "
+"kernel configuration file:"
+msgstr ""
+"Otra cosa útil es habilitar la depuración del kernel para que puedas "
+"examinar el kernel panic cuando suceda. Para esto, introduce las siguientes "
+"líneas en su archivo de configuración del kernel:"
+
+#. type: delimited block . 4
+#: documentation/content/en/articles/geom-class/_index.adoc:119
+#, no-wrap
+msgid ""
+"options KDB\n"
+"options DDB\n"
+"options KDB_TRACE\n"
+msgstr ""
+"options KDB\n"
+"options DDB\n"
+"options KDB_TRACE\n"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:122
+msgid ""
+"For this to work you might need to set a sysctl (if it is not on by default):"
+msgstr ""
+"Para que esto funcione, es posible que necesites establecer un sysctl (si no "
+"está activado de forma predeterminada):"
+
+#. type: delimited block . 4
+#: documentation/content/en/articles/geom-class/_index.adoc:126
+#, no-wrap
+msgid " debug.debugger_on_panic=1\n"
+msgstr " debug.debugger_on_panic=1\n"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:134
+msgid ""
+"Kernel panics will happen, so care should be taken with the filesystem "
+"cache. In particular, having softupdates might mean the latest file version "
+"could be lost if a panic occurs before it is committed to storage. "
+"Disabling softupdates yields a great performance hit, and still does not "
+"guarantee data consistency. Mounting filesystem with the \"sync\" option is "
+"needed for that. For a compromise, the softupdates cache delays can be "
+"shortened. There are three sysctl's that are useful for this (best to be "
+"set in [.filename]#/etc/sysctl.conf#):"
+msgstr ""
+"Ocurrirán kernel panics, por lo que se debe tener cuidado con la cache del "
+"sistema de archivos. En particular, tener habilitadas las softupdates puede "
+"significar que la última versión del archivo podría perderse si se produce "
+"un kernel panic antes de que se haya hecho commit al almacenamiento. "
+"Deshabilitar las softupdates produce un gran impacto en el rendimiento, y no "
+"garantiza la consistencia de los datos. Para eso es necesario montar el "
+"sistema de archivos con la opción \"sync\". Como solución de compromiso, se "
+"pueden acortar los tiempos de espera de la cache de softupdates. Hay tres "
+"sysctls que son útiles para esto (lo mejor es establecerlas en [.filename]#/"
+"etc/sysctl.conf#):"
+
+#. type: delimited block . 4
+#: documentation/content/en/articles/geom-class/_index.adoc:140
+#, no-wrap
+msgid ""
+"kern.filedelay=5\n"
+"kern.dirdelay=4\n"
+"kern.metadelay=3\n"
+msgstr ""
+"kern.filedelay=5\n"
+"kern.dirdelay=4\n"
+"kern.metadelay=3\n"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:143
+msgid "The numbers represent seconds."
+msgstr "Los números representan segundos."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:151
+msgid ""
+"For debugging kernel panics, kernel core dumps are required. Since a kernel "
+"panic might make filesystems unusable, this crash dump is first written to a "
+"raw partition. Usually, this is the swap partition. This partition must be "
+"at least as large as the physical RAM in the machine. On the next boot, the "
+"dump is copied to a regular file. This happens after filesystems are "
+"checked and mounted, and before swap is enabled. This is controlled with "
+"two [.filename]#/etc/rc.conf# variables:"
+msgstr ""
+"Para depurar los kernel panics, los volcados del kernel (core dumps) son "
+"necesarios. Dado que un kernel panic podría inutilizar los sistemas de "
+"archivos, este volcado de memoria se graba primero en una partición sin "
+"formato (raw). Por lo general, ésta es la partición swap. Esta partición "
+"debe ser al menos tan grande como la RAM física del ordenador. En el "
+"siguiente arranque, el volcado se copia en un archivo normal. Esto sucede "
+"después de que los sistemas de archivos se verifiquen y monten, y antes de "
+"habilitar la swap. Este proceso se controla con dos variables en [."
+"filename]#/etc/rc.conf#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/articles/geom-class/_index.adoc:156
+#, no-wrap
+msgid ""
+"dumpdev=\"/dev/ad0s4b\"\n"
+"dumpdir=\"/usr/core\n"
+msgstr ""
+"dumpdev=\"/dev/ad0s4b\"\n"
+"dumpdir=\"/usr/core\n"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:159
+msgid ""
+"The `dumpdev` variable specifies the swap partition and `dumpdir` tells the "
+"system where in the filesystem to relocate the core dump on reboot."
+msgstr ""
+"La variable `dumpdev` especifica la partición swap y `dumpdir` le indica al "
+"sistema dónde copiar el dore dump al reiniciar."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:162
+msgid ""
+"Writing kernel core dumps is slow and takes a long time so if you have lots "
+"of memory (>256M) and lots of panics it could be frustrating to sit and wait "
+"while it is done (twice - first to write it to swap, then to relocate it to "
+"filesystem). It is convenient then to limit the amount of RAM the system "
+"will use via a [.filename]#/boot/loader.conf# tunable:"
+msgstr ""
+"Escribir volcados del kernel es lento y lleva mucho tiempo, por lo que si "
+"tienes mucha memoria (>256M) y muchos kernel panics, puede ser frustrante "
+"sentarse y esperar mientras se hace (dos veces — primero escribirlo en el "
+"swap, luego reubicarlo al sistema de archivos). Es conveniente limitar la "
+"cantidad de RAM que utilizará el sistema a través de una variable en [."
+"filename]#/boot/loader.conf#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/articles/geom-class/_index.adoc:166
+#, no-wrap
+msgid " hw.physmem=\"256M\"\n"
+msgstr " hw.physmem=\"256M\"\n"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:169
+msgid ""
+"If the panics are frequent and filesystems large (or you simply do not trust "
+"softupdates+background fsck) it is advisable to turn background fsck off via "
+"[.filename]#/etc/rc.conf# variable:"
+msgstr ""
+"Si los kernel panics son frecuentes y los sistemas de archivos son grandes ("
+"o simplemente no confías en softupdates + fsck en segundo plano), es "
+"aconsejable desactivar fsck en segundo plano mediante la siguiente variable "
+"en [.filename]#/etc/rc.conf#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/articles/geom-class/_index.adoc:173
+#, no-wrap
+msgid " background_fsck=\"NO\"\n"
+msgstr " background_fsck=\"NO\"\n"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:178
+msgid ""
+"This way, the filesystems will always get checked when needed. Note that "
+"with background fsck, a new panic could happen while it is checking the "
+"disks. Again, the safest way is not to have many local filesystems by using "
+"another computer as an NFS server."
+msgstr ""
+"De esta forma, los sistemas de archivos siempre serán verificados cuando sea "
+"necesario. Ten en cuenta que con fsck en segundo plano, podría producirse un "
+"nuevo kernel panic mientras comprueba los discos. Una vez más, la forma más "
+"segura es no tener muchos sistemas de archivos sino utilizar otro ordenador "
+"como servidor NFS."
+
+#. type: Title ===
+#: documentation/content/en/articles/geom-class/_index.adoc:180
+#, no-wrap
+msgid "Starting the Project"
+msgstr "Empezando el proyecto"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:184
+msgid ""
+"For the purpose of creating a new GEOM class, an empty subdirectory has to "
+"be created under an arbitrary user-accessible directory. You do not have to "
+"create the module directory under [.filename]#/usr/src#."
+msgstr ""
+"Con el fin de crear una nueva clase GEOM, se debe crear un subdirectorio "
+"vacío bajo un directorio arbitrario que sea accesible por el usuario. No es "
+"necesario crear el directorio del módulo en [.filename]#/usr/src#."
+
+#. type: Title ===
+#: documentation/content/en/articles/geom-class/_index.adoc:186
+#, no-wrap
+msgid "The Makefile"
+msgstr "El Makefile"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:189
+msgid ""
+"It is good practice to create [.filename]#Makefiles# for every nontrivial "
+"coding project, which of course includes kernel modules."
+msgstr ""
+"Es una buena práctica crear [.filename]#Makefiles# para cada proyecto de "
+"programación que no sea trivial, lo que incluye obviamente módulos del "
+"kernel."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:192
+msgid ""
+"Creating the [.filename]#Makefile# is simple thanks to an extensive set of "
+"helper routines provided by the system. In short, here is how a minimal [."
+"filename]#Makefile# looks for a kernel module:"
+msgstr ""
+"Crear el archivo [.filename]#Makefile# es sencillo gracias a un extenso "
+"conjunto de rutinas de ayuda proporcionadas por el sistema. En resumen, aquí "
+"hay un ejemplo de cómo es un [.filename]#Makefile# mínimo para un módulo del "
+"kernel:"
+
+#. type: delimited block . 4
+#: documentation/content/en/articles/geom-class/_index.adoc:197
+#, no-wrap
+msgid ""
+"SRCS=g_journal.c\n"
+"KMOD=geom_journal\n"
+msgstr ""
+"SRCS=g_journal.c\n"
+"KMOD=geom_journal\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/articles/geom-class/_index.adoc:199
+#, no-wrap
+msgid ".include <bsd.kmod.mk>\n"
+msgstr ".include <bsd.kmod.mk>\n"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:203
+msgid ""
+"This [.filename]#Makefile# (with changed filenames) will do for any kernel "
+"module, and a GEOM class can reside in just one kernel module. If more than "
+"one file is required, list it in the `SRCS` variable, separated with "
+"whitespace from other filenames."
+msgstr ""
+"Este [.filename]#Makefile# (con nombres de archivo modificados) funcionará "
+"para cualquier módulo del kernel, y una clase GEOM puede residir en un solo "
+"módulo del kernel. Si se necesita más de un archivo, añadelo a la variable "
+"`SRCS`, separado con espacios en blanco de los otros nombres de archivos."
+
+#. type: Title ==
+#: documentation/content/en/articles/geom-class/_index.adoc:205
+#, no-wrap
+msgid "On FreeBSD Kernel Programming"
+msgstr "Programación del kernel de FreeBSD"
+
+#. type: Title ===
+#: documentation/content/en/articles/geom-class/_index.adoc:208
+#, no-wrap
+msgid "Memory Allocation"
+msgstr "Asignación de memoria"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:213
+msgid ""
+"See man:malloc[9]. Basic memory allocation is only slightly different than "
+"its userland equivalent. Most notably, `malloc`() and `free`() accept "
+"additional parameters as is described in the man page."
+msgstr ""
+"Lee man:malloc[9]. La asignación básica de memoria sólo es un poco diferente "
+"de su equivalente en espacio de usuario. Lo más llamativo es que `malloc`() "
+"y `free`() aceptan parámetros adicionales como se describe en la página del "
+"manual."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:215
+msgid ""
+"A \"malloc type\" must be declared in the declaration section of a source "
+"file, like this:"
+msgstr ""
+"Se tiene que declarar un \"malloc type\" en la sección de declaraciones de "
+"un fichero de código de este modo:"
+
+#. type: delimited block . 4
+#: documentation/content/en/articles/geom-class/_index.adoc:219
+#, no-wrap
+msgid " static MALLOC_DEFINE(M_GJOURNAL, \"gjournal data\", \"GEOM_JOURNAL Data\");\n"
+msgstr ""
+" static MALLOC_DEFINE(M_GJOURNAL, \"gjournal data\", \"GEOM_JOURNAL Data\");"
+"\n"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:222
+msgid ""
+"To use this macro, [.filename]#sys/param.h#, [.filename]#sys/kernel.h# and [."
+"filename]#sys/malloc.h# headers must be included."
+msgstr ""
+"Para usar esta macro se tienen que incluir los ficheros de cabecera [."
+"filename]#sys/param.h#, [.filename]#sys/kernel.h# y [.filename]#sys/malloc."
+"h#."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:225
+msgid ""
+"There is another mechanism for allocating memory, the UMA (Universal Memory "
+"Allocator). See man:uma[9] for details, but it is a special type of "
+"allocator mainly used for speedy allocation of lists comprised of same-sized "
+"items (for example, dynamic arrays of structs)."
+msgstr ""
+"Hay otro mecanismo para reservar memoria, el UMA (Universal Memory Allocator)"
+". Lee man:uma[9] para obtener detalles, pero es un tipo especial de gestor "
+"que se utiliza principalmente para acelerar la reserva de listas compuestas "
+"de elementos del mismo tamaño (por ejemplo, arrays dinámicos de estructuras)."
+
+#. type: Title ===
+#: documentation/content/en/articles/geom-class/_index.adoc:227
+#, no-wrap
+msgid "Lists and Queues"
+msgstr "Listas y colas"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:234
+msgid ""
+"See man:queue[3]. There are a LOT of cases when a list of things needs to "
+"be maintained. Fortunately, this data structure is implemented (in several "
+"ways) by C macros included in the system. The most used list type is TAILQ "
+"because it is the most flexible. It is also the one with largest memory "
+"requirements (its elements are doubly-linked) and also the slowest (although "
+"the speed variation is on the order of several CPU instructions more, so it "
+"should not be taken seriously)."
+msgstr ""
+"Lee man:queue[3]. Hay MUCHOS casos en los que se necesita mantener una lista "
+"de cosas. Afortunadamente esta estructura de datos se implementa (de muchas "
+"formas) mediante macros de C incluidas en el sistema. El tipo de lista más "
+"utilizado es TAILQ porque es el más flexible. También es el que requiere más "
+"memoria (sus elementos están doblemente enlazados) y también el más lento ("
+"aunque la variación de velocidad está en el orden de varias instrucciones de "
+"CPU, así que esto no se debería tomar en serio)."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:236
+msgid ""
+"If data retrieval speed is very important, see man:tree[3] and man:"
+"hashinit[9]."
+msgstr ""
+"Si la velocidad de recuperación de los datos es importante, consulta "
+"man:tree[3] y man:hashinit[9]."
+
+#. type: Title ===
+#: documentation/content/en/articles/geom-class/_index.adoc:238
+#, no-wrap
+msgid "BIOs"
+msgstr "BIOs"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:242
+msgid ""
+"Structure `bio` is used for any and all Input/Output operations concerning "
+"GEOM. It basically contains information about what device ('provider') "
+"should satisfy the request, request type, offset, length, pointer to a "
+"buffer, and a bunch of \"user-specific\" flags and fields that can help "
+"implement various hacks."
+msgstr ""
+"La estructura `bio` se utiliza para todas las operaciones de Entrada/Salida "
+"que tengan que ver con GEOM. Básicamente contiene información acerca de qué "
+"dispositivo ('provider') debería satisfacer la petición, el tipo de "
+"petición, el desplazamiento, la longitud, el puntero al buffer, y un montón "
+"de flags y campos \"específicos de usuario\" que pueden ayudar a implementar "
+"varios hacks."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:246
+msgid ""
+"The important thing here is that ``bio``s are handled asynchronously. That "
+"means that, in most parts of the code, there is no analogue to userland's "
+"man:read[2] and man:write[2] calls that do not return until a request is "
+"done. Rather, a developer-supplied function is called as a notification "
+"when the request gets completed (or results in error)."
+msgstr ""
+"Lo importante aquí es que los `bio` se manejan de forma asíncrona. Esto "
+"quiere decir que en la mayor parte del código no hay un análogo a las "
+"llamadas man:read[2] y man:write[2] de espacio de usuario que no retornan "
+"hasta que la petición ha terminado. En su lugar se utiliza una función "
+"proporcionada por el desarrollador que es invocada como una notificación "
+"cuando la solicitud se ha completado (o ha terminado en error)."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:250
+msgid ""
+"The asynchronous programming model (also called \"event-driven\") is "
+"somewhat harder than the much more used imperative one used in userland (at "
+"least it takes a while to get used to it). In some cases the helper "
+"routines `g_write_data`() and `g_read_data`() can be used, but __not "
+"always__. In particular, they cannot be used when a mutex is held; for "
+"example, the GEOM topology mutex or the internal mutex held during the `."
+"start`() and `.stop`() functions."
+msgstr ""
+"El modelo asíncrono de programación (también llamado orientado a eventos, o "
+"\"event-driven\") es algo más difícil que el modo imperativo que se usa "
+"mucho más en espacio de usuario (al menos lleva un tiempo acostumbrarse). En "
+"algunos casos se pueden usar las rutinas de soporte `g_write_data`() y "
+"`g_read_data`() pero __no siempre__. En concreto, no se pueden usar cuando "
+"se está bloqueando en un mutex; por ejemplo, el mutex para la topología de "
+"GEOM o el mutex interno que se adquiere en las funciones `.start`() y `."
+"stop`()."
+
+#. type: Title ==
+#: documentation/content/en/articles/geom-class/_index.adoc:252
+#, no-wrap
+msgid "On GEOM Programming"
+msgstr "Programación GEOM"
+
+#. type: Title ===
+#: documentation/content/en/articles/geom-class/_index.adoc:255
+#, no-wrap
+msgid "Ggate"
+msgstr "Ggate"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:259
+msgid ""
+"If maximum performance is not needed, a much simpler way of making a data "
+"transformation is to implement it in userland via the ggate (GEOM gate) "
+"facility. Unfortunately, there is no easy way to convert between, or even "
+"share code between the two approaches."
+msgstr ""
+"Si no se necesita el máximo rendimiento, una forma mucho más sencilla de "
+"realizar una transformación de datos es implementarla en el espacio de "
+"usuario a través del servicio ggate (GEOM gate). Desafortunadamente, no hay "
+"una manera fácil de convertir o incluso compartir código entre las dos "
+"aproximaciones."
+
+#. type: Title ===
+#: documentation/content/en/articles/geom-class/_index.adoc:261
+#, no-wrap
+msgid "GEOM Class"
+msgstr "Clase GEOM"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:266
+msgid ""
+"GEOM classes are transformations on the data. These transformations can be "
+"combined in a tree-like fashion. Instances of GEOM classes are called "
+"__geoms__."
+msgstr ""
+"Las clases GEOM son transformaciones sobre los datos. Estas transformaciones "
+"se pueden combinar en forma de árbol. Las instancias de las clases GEOM se "
+"llaman __geoms__."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:268
+msgid ""
+"Each GEOM class has several \"class methods\" that get called when there is "
+"no geom instance available (or they are simply not bound to a single "
+"instance):"
+msgstr ""
+"Cada clase GEOM tiene varios \"métodos de clase\" que son invocados cuando "
+"no se dispone de una instancia geom (o simplemente no están ligadas a una "
+"única instancia):"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:270
+msgid ""
+"`.init` is called when GEOM becomes aware of a GEOM class (when the kernel "
+"module gets loaded.)"
+msgstr ""
+"`.init` se llama cuando GEOM se entera de una nueva clase GEOM (cuando se "
+"carga el módulo del kernel.)"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:271
+msgid ""
+"`.fini` gets called when GEOM abandons the class (when the module gets "
+"unloaded)"
+msgstr ""
+"`.fini` se llama cuando GEOM abandona la clase (cuando se descarga el módulo)"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:272
+msgid ""
+"`.taste` is called next, once for each provider the system has available. If "
+"applicable, this function will usually create and start a geom instance."
+msgstr ""
+"A continuación se llama a `.taste`, una vez por cada proveedor que el "
+"sistema tenga disponible. Si corresponde, esta función generalmente creará e "
+"iniciará una instancia geom."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:273
+msgid "`.destroy_geom` is called when the geom should be disbanded"
+msgstr "`.destroy_geom` se llama cuando se debe desmantelar el geom"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:274
+msgid ""
+"`.ctlconf` is called when user requests reconfiguration of existing geom"
+msgstr ""
+"`.ctlconf` se invoca cuando el usuario solicita la reconfiguración de un "
+"geom existente"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:276
+msgid ""
+"Also defined are the GEOM event functions, which will get copied to the geom "
+"instance."
+msgstr ""
+"También se definen las funciones de eventos GEOM, que se copiarán en la "
+"instancia de geom."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:278
+msgid ""
+"Field `.geom` in the `g_class` structure is a LIST of geoms instantiated "
+"from the class."
+msgstr ""
+"El campo `.geom` en la estructura `g_class` es una lista (LIST) de los geoms "
+"instanciados a partir de la clase."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:280
+msgid "These functions are called from the g_event kernel thread."
+msgstr "Estas funciones son llamadas desde el hilo del kernel g_event."
+
+#. type: Title ===
+#: documentation/content/en/articles/geom-class/_index.adoc:282
+#, no-wrap
+msgid "Softc"
+msgstr "Softc"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:288
+msgid ""
+"The name \"softc\" is a legacy term for \"driver private data\". The name "
+"most probably comes from the archaic term \"software control block\". In "
+"GEOM, it is a structure (more precise: pointer to a structure) that can be "
+"attached to a geom instance to hold whatever data is private to the geom "
+"instance. Most GEOM classes have the following members:"
+msgstr ""
+"El nombre \"softc\" es un término heredado para\"driver private data\" ("
+"datos privados del controlador). El nombre probablemente proviene del "
+"término arcaico \"software control block\" (bloque de control software). En "
+"GEOM, es una estructura (para ser más precisos: un puntero a una estructura) "
+"que se puede adjuntar a una instancia de geom para mantener cualquier "
+"información que sea privada para dicha instancia. La mayoría de las clases "
+"de GEOM tienen los siguientes elementos:"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:290
+msgid "`struct g_provider *provider` : The \"provider\" this geom instantiates"
+msgstr "`struct g_provider *provider` : El \"provider\" que instancia este geom"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:291
+msgid "`uint16_t n_disks` : Number of consumer this geom consumes"
+msgstr "`uint16_t n_disks` : Número de consumidores que consume este geom"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:292
+msgid ""
+"`struct g_consumer \\**disks` : Array of `struct g_consumer*`. (It is not "
+"possible to use just single indirection because struct g_consumer* are "
+"created on our behalf by GEOM)."
+msgstr ""
+"`struct g_consumer \\**disks` : Array de `struct g_consumer*`. (No es "
+"posible utilizar un sólo nivel de indirección porque los struct g_consumer* "
+"los crea GEOM en nuestro nombre)."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:295
+msgid ""
+"The `softc` structure contains all the state of geom instance. Every geom "
+"instance has its own softc."
+msgstr ""
+"La estructura `softc` contiene el estado completo de la instancia geom. Cada "
+"instancia geom tiene su propio softc."
+
+#. type: Title ===
+#: documentation/content/en/articles/geom-class/_index.adoc:297
+#, no-wrap
+msgid "Metadata"
+msgstr "Metadatos"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:300
+msgid ""
+"Format of metadata is more-or-less class-dependent, but MUST start with:"
+msgstr ""
+"El formato de los metadatos es más o menos dependiente de la clase, pero "
+"DEBE comenzar por:"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:302
+msgid "16 byte buffer for null-terminated signature (usually the class name)"
+msgstr ""
+"Un buffer de 16 bytes para la firma terminada en null (normalmente el nombre "
+"de la clase)"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:303
+msgid "uint32 version ID"
+msgstr "ID de la versión del tipo uint32"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:305
+msgid ""
+"It is assumed that geom classes know how to handle metadata with version "
+"ID's lower than theirs."
+msgstr ""
+"Se supone que las clases de geom saben cómo manejar los metadatos con ID de "
+"versión menores que los suyos."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:307
+msgid ""
+"Metadata is located in the last sector of the provider (and thus must fit in "
+"it)."
+msgstr ""
+"Los metadatos se encuentran en el último sector del proveedor (y, por lo "
+"tanto, deben encajar en él)."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:309
+msgid ""
+"(All this is implementation-dependent but all existing code works like that, "
+"and it is supported by libraries.)"
+msgstr ""
+"(Todo depende de la implementación, pero todo el código existente funciona "
+"así, y es compatible con las bibliotecas.)"
+
+#. type: Title ===
+#: documentation/content/en/articles/geom-class/_index.adoc:311
+#, no-wrap
+msgid "Labeling/creating a GEOM"
+msgstr "Etiquetar/crear un GEOM"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:314
+msgid "The sequence of events is:"
+msgstr "La secuencia de eventos es:"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:316
+msgid "user calls man:geom[8] utility (or one of its hardlinked friends)"
+msgstr ""
+"El usuario invoca la utilidad man:geom[8] (o alguno de sus amigos que están "
+"enlazados)"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:317
+msgid ""
+"the utility figures out which geom class it is supposed to handle and "
+"searches for [.filename]#geom_CLASSNAME.so# library (usually in [.filename]#/"
+"lib/geom#)."
+msgstr ""
+"la utilidad averigua qué clase geom se supone que tiene que manejar y busca "
+"la librería [.filename]#geom_CLASSNAME.so# (que está normalmente en [."
+"filename]#/lib/geom#)."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:318
+msgid ""
+"it man:dlopen[3]-s the library, extracts the definitions of command-line "
+"parameters and helper functions."
+msgstr ""
+"usa man:dlopen[3] para cargar la librería y extrae las definiciones de los "
+"parámetros de línea de comandos y de las funciones de apoyo."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:320
+msgid "In the case of creating/labeling a new geom, this is what happens:"
+msgstr "En el caso de crear/etiquetar un nuevo geom, esto es lo que sucede:"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:322
+msgid ""
+"man:geom[8] looks in the command-line argument for the command (usually "
+"`label`), and calls a helper function."
+msgstr ""
+"man:geom[8] busca el comando (normalmente `label`) en los argumentos de "
+"línea de comando y llama a la función de apoyo."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:323
+msgid ""
+"The helper function checks parameters and gathers metadata, which it "
+"proceeds to write to all concerned providers."
+msgstr ""
+"La función auxiliar comprueba los parámetros y recopila los metadatos, que "
+"procede a escribir a todos los proveedores interesados."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:324
+msgid ""
+"This \"spoils\" existing geoms (if any) and initializes a new round of "
+"\"tasting\" of the providers. The intended geom class recognizes the "
+"metadata and brings the geom up."
+msgstr ""
+"Esto \"echa a perder\" los geoms existentes (si los hubiera) e inicializa "
+"una nueva ronda de \"pruebas\" de los proveedores. La clase geom reconoce "
+"los metadatos y levanta el geom."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:326
+msgid ""
+"(The above sequence of events is implementation-dependent but all existing "
+"code works like that, and it is supported by libraries.)"
+msgstr ""
+"(La secuencia de eventos anterior depende de la implementación, pero todo el "
+"código existente funciona así, y es compatible con las bibliotecas.)"
+
+#. type: Title ===
+#: documentation/content/en/articles/geom-class/_index.adoc:328
+#, no-wrap
+msgid "GEOM Command Structure"
+msgstr "Estructura del comando GEOM"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:332
+msgid ""
+"The helper [.filename]#geom_CLASSNAME.so# library exports `class_commands` "
+"structure, which is an array of `struct g_command` elements. Commands are "
+"of uniform format and look like:"
+msgstr ""
+"La librería de apoyo [.filename]#geom_CLASSNAME.so# exporta la estructura "
+"`class_commands` que es un array de elementos de tipo `struct g_command`. "
+"Los comandos tienen un formato uniforme que se parece a:"
+
+#. type: delimited block . 4
+#: documentation/content/en/articles/geom-class/_index.adoc:336
+#, no-wrap
+msgid " verb [-options] geomname [other]\n"
+msgstr " verb [-options] geomname [other]\n"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:339
+msgid "Common verbs are:"
+msgstr "Los verbos comunes son:"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:341
+msgid ""
+"label - to write metadata to devices so they can be recognized at tasting "
+"and brought up in geoms"
+msgstr ""
+"label — para escribir metadatos en los dispositivos para que puedan ser "
+"reconocidos en la prueba y creados en geoms"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:342
+msgid "destroy - to destroy metadata, so the geoms get destroyed"
+msgstr ""
+"destroy — para destruir los metadatos, de forma que se destruyen los geoms"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:344
+msgid "Common options are:"
+msgstr "Las opciones comunes son:"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:346
+msgid "`-v` : be verbose"
+msgstr "`-v` : sé verboso"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:347
+msgid "`-f` : force"
+msgstr "`-f` : forzar"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:351
+msgid ""
+"Many actions, such as labeling and destroying metadata can be performed in "
+"userland. For this, `struct g_command` provides field `gc_func` that can be "
+"set to a function (in the same [.filename]#.so#) that will be called to "
+"process a verb. If `gc_func` is NULL, the command will be passed to kernel "
+"module, to `.ctlreq` function of the geom class."
+msgstr ""
+"Muchas acciones, como etiquetar y destruir los metadatos, se pueden hacer en "
+"espacio de usuario. Para esto, `struct g_command` proporciona el campo "
+"`gc_func` al que se puede asignar una función (en el mismo [.filename]#.so#) "
+"que será llamada para procesar un verbo. Si `gc_func` es NULL, el comando se "
+"pasará al módulo del kernel, a la función `.ctlreq` de la clase geom."
+
+#. type: Title ===
+#: documentation/content/en/articles/geom-class/_index.adoc:353
+#, no-wrap
+msgid "Geoms"
+msgstr "Geoms"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:357
+msgid ""
+"Geoms are instances of GEOM classes. They have internal data (a softc "
+"structure) and some functions with which they respond to external events."
+msgstr ""
+"Los geoms son instancias de clases GEOM. Tienen datos internos (una "
+"estructura softc) y algunas funciones con las que responden a eventos "
+"externos."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:359
+msgid "The event functions are:"
+msgstr "Las funciones del evento son:"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:361
+msgid "`.access` : calculates permissions (read/write/exclusive)"
+msgstr "`.access` : calcula permisos (read/write/exclusive)"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:362
+msgid "`.dumpconf` : returns XML-formatted information about the geom"
+msgstr "`.dumpconf` : devuelve información sobre el geom en formato XML"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:363
+msgid "`.orphan` : called when some underlying provider gets disconnected"
+msgstr "`.orphan` : llamada cuando algún proveedor subyacente se desconecta"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:364
+msgid "`.spoiled` : called when some underlying provider gets written to"
+msgstr "`.spoiled` : llamada cuando se escribe en algún proveedor subyacente"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:365
+msgid "`.start` : handles I/O"
+msgstr "`.start` : maneja E/S (I/O)"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:367
+msgid ""
+"These functions are called from the `g_down` kernel thread and there can be "
+"no sleeping in this context, (see definition of sleeping elsewhere) which "
+"limits what can be done quite a bit, but forces the handling to be fast."
+msgstr ""
+"Estas funciones se llaman desde el hilo `g_down` del kernel y no puede haber "
+"inactividad en este contexto, (consulta la definición de inactividad en otra "
+"parte) lo que limita un poco lo que se puede hacer, pero obliga a que el "
+"manejo sea rápido."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:369
+msgid ""
+"Of these, the most important function for doing actual useful work is the `."
+"start`() function, which is called when a BIO request arrives for a provider "
+"managed by a instance of geom class."
+msgstr ""
+"De estas funciones, la más importante para realizar un trabajo útil real es "
+"la función `.start`() , que se llama cuando una solicitud BIO llega a un "
+"proveedor administrado por una instancia de la clase geom."
+
+#. type: Title ===
+#: documentation/content/en/articles/geom-class/_index.adoc:371
+#, no-wrap
+msgid "GEOM Threads"
+msgstr "Hilos de GEOM"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:374
+msgid "There are three kernel threads created and run by the GEOM framework:"
+msgstr "Hay tres hilos del kernel creados y ejecutados por el framework GEOM:"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:376
+msgid ""
+"`g_down` : Handles requests coming from high-level entities (such as a "
+"userland request) on the way to physical devices"
+msgstr ""
+"`g_down` : Maneja las peticiones que vienen de entidades de nivel superior ("
+"como una petición de espacio de usuario) hacia los dispositivos físicos"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:377
+msgid ""
+"`g_up` : Handles responses from device drivers to requests made by higher-"
+"level entities"
+msgstr ""
+"`g_up` : Maneja respuestas de los controladores de dispositivos a las "
+"peticiones hechas por entidades de nivel superior"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:378
+msgid ""
+"`g_event` : Handles all other cases: creation of geom instances, access "
+"counting, \"spoil\" events, etc."
+msgstr ""
+"`g_event` : Maneja los demás casos: creación de instancias geom, contadores "
+"de acceso, eventos \"spoil\", etc."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:380
+msgid ""
+"When a user process issues \"read data X at offset Y of a file\" request, "
+"this is what happens:"
+msgstr ""
+"Cuando un proceso de usuario realiza una petición de tipo \"lee el dato X en "
+"el offset Y de un fichero\", esto es lo que sucede:"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:382
+msgid ""
+"The filesystem converts the request into a struct bio instance and passes it "
+"to the GEOM subsystem. It knows what geom instance should handle it because "
+"filesystems are hosted directly on a geom instance."
+msgstr ""
+"El sistema de archivos convierte la solicitud en una instancia de struct bio "
+"y lo transmite al subsistema GEOM. Sabe qué instancia geom debería "
+"encargarse porque los sistemas de archivos se alojan directamente en una "
+"instancia geom."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:383
+msgid ""
+"The request ends up as a call to the `.start`() function made on the g_down "
+"thread and reaches the top-level geom instance."
+msgstr ""
+"La solicitud termina como una llamada a la función `.start`() realizada en "
+"el hilo g_down y llega a la instancia de geom de nivel superior."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:384
+msgid ""
+"This top-level geom instance (for example the partition slicer) determines "
+"that the request should be routed to a lower-level instance (for example the "
+"disk driver). It makes a copy of the bio request (bio requests _ALWAYS_ need "
+"to be copied between instances, with `g_clone_bio`()!), modifies the data "
+"offset and target provider fields and executes the copy with `g_io_request`()"
+msgstr ""
+"Esta instancia de nivel superior (por ejemplo el particionador) determina "
+"que la petición se debería dirigir a una instancia de nivel inferior (por "
+"ejemplo el controlador del disco). Hace una copia de la petición bio (¡las "
+"peticiones bio _SIEMPRE_ se tienen que copiar entre instancias, con "
+"`g_clone_bio`()!), modifica los campos para el offset de los datos y el "
+"proveedor objetivo y ejecuta la copia con `g_io_request`()"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:385
+msgid ""
+"The disk driver gets the bio request also as a call to `.start`() on the "
+"`g_down` thread. It talks to hardware, gets the data back, and calls "
+"`g_io_deliver`() on the bio."
+msgstr ""
+"El controlador de disco también obtiene la petición bio al llamar a la "
+"función `.start`() del hilo `g_down`. Habla con el hardware, obtiene los "
+"datos y llama a `g_io_deliver`() en el bio."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:386
+msgid ""
+"Now, the notification of bio completion \"bubbles up\" in the `g_up` thread. "
+"First the partition slicer gets `.done`() called in the `g_up` thread, it "
+"uses information stored in the bio to free the cloned `bio` structure (with "
+"`g_destroy_bio`()) and calls `g_io_deliver`() on the original request."
+msgstr ""
+"Ahora, la notificación de bio completada \"sube\" en el hilo `g_up`. Primero "
+"se llama a `.done`() del particionador en el hilo `g_up`, usa la información "
+"almacenada en el bio para liberar la estructura `bio` clonada (con "
+"`g_destroy_bio`()) y llama a `g_io_deliver`() en la petición original."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:387
+msgid "The filesystem gets the data and transfers it to userland."
+msgstr ""
+"El sistema de archivos obtiene los datos y los transfiere al espacio de "
+"usuario."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:389
+msgid ""
+"See man:g_bio[9] man page for information how the data is passed back and "
+"forth in the `bio` structure (note in particular the `bio_parent` and "
+"`bio_children` fields and how they are handled)."
+msgstr ""
+"Consulta la página de manual man:g_bio[9] para obtener información sobre "
+"cómo se pasan los datos de un lado para otro en la estructura `bio` (en "
+"particular date cuenta cómo se manejan los campos `bio_parent` y "
+"`bio_children`)."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:392
+msgid ""
+"One important feature is: __THERE CAN BE NO SLEEPING IN G_UP AND G_DOWN "
+"THREADS__. This means that none of the following things can be done in "
+"those threads (the list is of course not complete, but only informative):"
+msgstr ""
+"Una característica importante es que: __NO PUEDE HABER HILOS G_UP Y G_DOWN "
+"QUE SE VAYAN A DORMIR__. Esto significa que en esos hilos no se puede hacer "
+"ninguna de las siguientes cosas (la lista por supuesto no está completa, es "
+"sólo informativa):"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:394
+msgid "Calls to `msleep`() and `tsleep`(), obviously."
+msgstr "Llamadas a `msleep`() y `tsleep`(), evidentemente."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:395
+msgid ""
+"Calls to `g_write_data`() and `g_read_data`(), because these sleep between "
+"passing the data to consumers and returning."
+msgstr ""
+"Llamadas a `g_write_data`() y `g_read_data`(), porque estas duermen entre el "
+"paso de datos hacia los consumidores y la vuelta."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:396
+msgid "Waiting for I/O."
+msgstr "Esperar por la E/S."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:397
+msgid "Calls to man:malloc[9] and `uma_zalloc`() with `M_WAITOK` flag set"
+msgstr ""
+"Llamadas a man:malloc[9] y `uma_zalloc`() con el flag `M_WAITOK` establecido"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:398
+msgid "sx and other sleepable locks"
+msgstr "sx y otros sleepable locks"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:402
+msgid ""
+"This restriction is here to stop GEOM code clogging the I/O request path, "
+"since sleeping is usually not time-bound and there can be no guarantees on "
+"how long will it take (there are some other, more technical reasons also). "
+"It also means that there is not much that can be done in those threads; for "
+"example, almost any complex thing requires memory allocation. Fortunately, "
+"there is a way out: creating additional kernel threads."
+msgstr ""
+"Esta restricción está aquí para impedir que el código GEOM obstruya la ruta "
+"de las solicitudes de E/S, ya que el dormir no tiene limite de tiempo y "
+"puede no haber garantías sobre cuánto tiempo tardará (también hay algunas "
+"otras razones más técnicas). También significa que no hay mucho que se pueda "
+"hacer en estos hilos; por ejemplo, prácticamente cualquier cosa compleja "
+"requiere asignación de memoria. Afortunadamente, hay una salida: crear hilos "
+"adicionales en el kernel."
+
+#. type: Title ===
+#: documentation/content/en/articles/geom-class/_index.adoc:404
+#, no-wrap
+msgid "Kernel Threads for Use in GEOM Code"
+msgstr "Hilos del kernel para usar en el código GEOM"
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:407
+msgid ""
+"Kernel threads are created with man:kthread_create[9] function, and they are "
+"sort of similar to userland threads in behavior, only they cannot return to "
+"caller to signify termination, but must call man:kthread_exit[9]."
+msgstr ""
+"Los hilos del kernel se crean con la función man:kthread_create[9] y se "
+"comportan de una forma similar a los hilos en espacio de usuario, sólo que "
+"no pueden volver al llamante para indicarles que han terminado sino que "
+"tienen que invocar man:kthread_exit[9]."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:410
+msgid ""
+"In GEOM code, the usual use of threads is to offload processing of requests "
+"from `g_down` thread (the `.start`() function). These threads look like "
+"\"event handlers\": they have a linked list of event associated with them "
+"(on which events can be posted by various functions in various threads so it "
+"must be protected by a mutex), take the events from the list one by one and "
+"process them in a big `switch`() statement."
+msgstr ""
+"En el código GEOM, el uso habitual de los hilos es para descargar el "
+"procesamiento de peticiones del hilo `g_down`(la función `.start`()). Estos "
+"hilos parecen \"manejadores de eventos\": tienen vinculada una lista de "
+"eventos asociados a ellos (en los cuales los eventos pueden publicarse "
+"mediante varias funciones en varios hilos, por lo que deben estar protegidos "
+"por un mutex), toma los eventos de la lista, uno por uno, y los procesa en "
+"una gran instrucción `switch`()."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:415
+msgid ""
+"The main benefit of using a thread to handle I/O requests is that it can "
+"sleep when needed. Now, this sounds good, but should be carefully thought "
+"out. Sleeping is well and very convenient but can very effectively destroy "
+"performance of the geom transformation. Extremely performance-sensitive "
+"classes probably should do all the work in `.start`() function call, taking "
+"great care to handle out-of-memory and similar errors."
+msgstr ""
+"La principal ventaja de utilizar un hilo para manejar las solicitudes de E/S "
+"es que pueden dormir (sleep) cuando sea necesario. Ahora, esto suena bien, "
+"pero se debe pensar cuidadosamente. Dormir (sleeping) es bueno y muy "
+"conveniente, pero puede ser muy efectivo destruyendo el rendimiento de la "
+"transformación de geom. Las clases extremadamente sensibles al rendimiento "
+"probablemente deberían hacer todo el trabajo en la llamada a la función `."
+"start`(), teniendo mucho cuidado de manejar los errores de falta de memoria "
+"y similares."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:419
+msgid ""
+"The other benefit of having a event-handler thread like that is to serialize "
+"all the requests and responses coming from different geom threads into one "
+"thread. This is also very convenient but can be slow. In most cases, "
+"handling of `.done`() requests can be left to the `g_up` thread."
+msgstr ""
+"El otro beneficio de tener un hilo manejador de eventos como este es "
+"serializar en un sólo hilo todas las peticiones y respuestas que vienen de "
+"los distintos hilos de geom. Esto también es muy cómodo pero puede ser "
+"lento. En la mayoría de los casos, el manejo de las peticiones de `.done`() "
+"se puede dejar en manos del hilo `g_up`."
+
+#. type: Plain text
+#: documentation/content/en/articles/geom-class/_index.adoc:422
+msgid ""
+"Mutexes in FreeBSD kernel (see man:mutex[9]) have one distinction from their "
+"more common userland cousins - the code cannot sleep while holding a "
+"mutex). If the code needs to sleep a lot, man:sx[9] locks may be more "
+"appropriate. On the other hand, if you do almost everything in a single "
+"thread, you may get away with no mutexes at all."
+msgstr ""
+"Los mutex en el kernel de FreeBSD (consulta man:mutex[9]) tienen una "
+"característica distintiva respecto de sus primos en espacio de usuario - el "
+"código no puede dormir mientras se tiene un mutex cogido. Si el código "
+"necesita dormir a menudo, los locks man:sx[9] podrían ser más apropiados. "
+"Por otro lado, si haces casi todo en un solo hilo, podrías no necesitar "
+"mutex en absoluto."
+
+#~ msgid ""
+#~ "include::shared/attributes/attributes-{{% lang %}}.adoc[] include::shared/"
+#~ "{{% lang %}}/teams.adoc[] include::shared/{{% lang %}}/mailing-lists."
+#~ "adoc[] include::shared/{{% lang %}}/urls.adoc[]"
+#~ msgstr ""
+#~ "include::shared/attributes/attributes-{{% lang %}}.adoc[]\n"
+#~ "include::shared/{{% lang %}}/teams.adoc[]\n"
+#~ "include::shared/{{% lang %}}/mailing-lists.adoc[]\n"
+#~ "include::shared/{{% lang %}}/urls.adoc[]"