wandres.dev
CONTRIBUIR UPSTREAM · el proceso de parches

Los tags obligatorios: Signed-off-by, Fixes y Cc stable

El pie del mensaje de commit es un documento legal y técnico a la vez. Signed-off-by materializa el Developer Certificate of Origin, la cadena de custodia que el kernel adoptó tras el pleito de SCO. Fixes vincula tu parche con el commit que introdujo el bug. Cc stable pide el backport a las ramas de mantenimiento. Aprende por qué el linaje de un parche importa —legal y técnicamente— y cómo generar cada etiqueta con precisión.

⏱ 16 min

Bajo el cuerpo de cada mensaje de commit del kernel vive una zona de etiquetas —los trailers— que parece burocracia y es en realidad la infraestructura legal y técnica que sostiene el proyecto. Una de ellas, Signed-off-by, no es una firma cortés: es una declaración jurada sobre la procedencia del código, la respuesta que el kernel dio a un pleito que amenazó su existencia. Otras dicen qué bug arreglas y a qué ramas debe llegar. Omitir la que toca es motivo de rechazo inmediato. Entender estas etiquetas es entender cómo un proyecto sin contratos de cesión de derechos de autor se protege legalmente a la escala de miles de millones de dispositivos.

🎯 Al terminar esta lección sabrás
  • Comprender el Signed-off-by como el Developer Certificate of Origin (DCO).
  • Generar la etiqueta Fixes: con el formato canónico de 12 dígitos.
  • Solicitar el backport con Cc: stable@vger.kernel.org y sus matices de versión.
  • Entender por qué el linaje de un parche importa legalmente.

Signed-off-by y el Developer Certificate of Origin

git commit -s añade una línea al pie:

Signed-off-by: Nombre Apellido <tu@correo.org>

No es decorativa. Al ponerla certificas el Developer Certificate of Origin, un texto corto —vive en Documentation/process/submitting-patches.rst— cuyas cláusulas afirmas bajo tu responsabilidad:

  • (a) creaste el cambio y tienes derecho a enviarlo bajo la licencia del archivo; o
  • (b) se basa en trabajo previo con una licencia compatible que te permite reenviarlo; o
  • (c) te lo pasó alguien que ya certificó (a), (b) o (c) y no lo has modificado; y
  • (d) entiendes que la contribución es pública y que quedará registrada indefinidamente, con tu nombre y correo, y podrá redistribuirse.

Debes firmar con tu nombre legal real, no con un seudónimo: es una atestación jurídica. Y cuando un parche sube por la jerarquía, cada persona que lo maneja añade su propio Signed-off-by en orden cronológico, formando una cadena de custodia verificable desde el autor hasta Linus. Esa cadena es legible en cualquier commit del árbol:

git show -s --format='%(trailers)' HEAD    # el pie completo de trailers
git log --format='%an %ae' -1 HEAD         # autor frente a firmante
flowchart LR
A[Autor Signed-off-by] --> B[Mantenedor del subsistema Signed-off-by]
B --> C[Linus aplica al arbol principal]
C --> D[Cadena de custodia inmutable en git]

Fixes: el linaje del bug

Si tu parche corrige un error, debes decir qué commit lo introdujo. La etiqueta Fixes: tiene un formato canónico rígido: doce dígitos del hash seguidos del asunto original entre paréntesis y comillas.

# configura la abreviatura a 12 y genera la etiqueta exacta
git config --global core.abbrev 12
git show -s --format='Fixes: %h ("%s")' abc123def456
# -> Fixes: abc123def456 ("misc: midriver: registra el dispositivo")

# muchos lo guardan como alias reutilizable de por vida
git config --global alias.fixline "show -s --abbrev=12 --format='Fixes: %h (\"%s\")'"
git fixline abc123def456

Pégala en la zona de trailers, junto al Signed-off-by:

Signed-off-by: Nombre Apellido <tu@correo.org>
Fixes: abc123def456 ("misc: midriver: registra el dispositivo")
Reported-by: Bot de Pruebas <syzbot+deadbeef@syzkaller.appspotmail.com>
Closes: https://lore.kernel.org/all/000000@google.com

Fixes: no es cosmética: los equipos de las ramas estables escanean automáticamente esa etiqueta para decidir qué backportear. Un Fixes: bien puesto puede llevar tu arreglo a decenas de versiones de mantenimiento sin que hagas nada más. Y si un Reported-by acompaña, el kernel exige hoy un Closes: con el enlace al informe original.

Cc stable: pedir el backport

El Cc: stable es especial: es una etiqueta que va dentro del mensaje de commit, no una simple cabecera de correo, y por eso queda en la historia de git para siempre. Le dice al equipo estable “esto merece llegar a las ramas de mantenimiento”:

Cc: stable@vger.kernel.org
Cc: stable@vger.kernel.org # 6.6.x
Cc: stable@vger.kernel.org # 6.1+

Las reglas viven en Documentation/process/stable-kernel-rules.rst: solo para arreglos reales de bugs, nada de funcionalidades nuevas, cambios pequeños y contenidos. El sufijo tras la almohadilla acota a qué versiones aplica. Ponerlo cuando no corresponde molesta al equipo estable; omitirlo cuando un usuario en producción sufre el bug deja a medio mundo sin el arreglo.

Otras etiquetas del linaje

El pie del commit registra a todos los que dejaron huella en él, y cada atribución tiene su regla precisa:

Reported-by: Ana García <ana@example.org>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217654
Suggested-by: Li Wei <li@example.org>
Co-developed-by: Otra Persona <otra@example.org>
Signed-off-by: Otra Persona <otra@example.org>
Signed-off-by: Nombre Apellido <tu@correo.org>
Link: https://lore.kernel.org/all/20260714-midriver-fix@correo.org

Reported-by acredita a quien encontró el fallo y hoy va siempre acompañado de un Closes: con el enlace al informe. Suggested-by da crédito a quien propuso la idea. Co-developed-by marca la coautoría real del código y arrastra una regla estricta: debe ir inmediatamente seguido del Signed-off-by de esa misma persona, porque cada coautor certifica su propio DCO. El Link: apunta al hilo de la lista, cerrando el círculo entre el commit y la conversación que lo engendró. Y la ley que las gobierna a todas: nunca inventes una etiqueta ni pongas el nombre de nadie sin su permiso, porque cada una es una atribución jurídica con consecuencias reales.

📝
Firmas por ti o por tu empresa

Si desarrollas el parche como empleado, el copyright suele pertenecer a tu empresa, no a ti. El Signed-off-by con tu correo corporativo es precisamente lo que declara que tienes autorización para aportar ese código bajo la licencia del kernel: la cláusula (a) del DCO cubre “tengo el derecho de enviarlo”. Por eso muchas compañías tienen políticas internas sobre qué pueden firmar sus ingenieros y con qué dirección. Tu firma no es un gesto personal: es la empresa, a través de ti, certificando la procedencia ante el mundo.

⚠️
Cada etiqueta en su sitio y por su motivo

El orden importa y el motivo importa. Signed-off-by va al final de la cadena de firmas. Fixes: y Cc: stable van en el mismo bloque de trailers, sin líneas en blanco que los separen del Signed-off-by. No inventes un Reviewed-by: solo lo añade quien te lo dio explícitamente. Y jamás firmes en nombre de otro. checkpatch --strict verifica el formato de estas etiquetas; pásalo antes de enviar.

Por qué el linaje de un parche es un asunto legal

Para entender por qué el kernel trata una línea de texto como Signed-off-by con solemnidad jurídica, hay que viajar a 2003. Ese año la empresa SCO demandó a IBM y sostuvo, ante los tribunales y ante la prensa, que el kernel de Linux contenía código propietario copiado ilegalmente, y exigió regalías a cada usuario de Linux del planeta. El proyecto se enfrentó a una pregunta existencial que hasta entonces había respondido con un encogimiento de hombros: ¿de dónde viene, exactamente, cada línea de este código, y quién puede jurar que teníamos derecho a incorporarla? No había respuesta. Los parches llegaban por correo, se aplicaban, y la procedencia se disolvía en el olvido. La comunidad no quería la solución habitual —contratos de cesión de derechos de autor que asustan a los voluntarios y centralizan la propiedad en una fundación— así que Linus, en 2004, inventó una tercera vía: el Developer Certificate of Origin. En lugar de ceder tus derechos, atestiguas que tienes el derecho de aportar, y esa atestación queda grabada para siempre en el grafo de git con tu nombre. Cada Signed-off-by es un eslabón en una cadena de custodia criptográficamente inmutable que se extiende desde el teclado del autor original hasta el árbol de Linus, pasando por cada mantenedor que la tocó. Si algún día alguien vuelve a preguntar “¿de dónde salió esta línea y quién respondió por su legalidad?”, el kernel puede contestar con precisión de segundos y nombres propios, hacia atrás, durante veinte años. Por eso firmas con tu nombre legal y no con un alias: no estás decorando un commit, estás poniendo tu firma en un registro de procedencia que un tribunal podría leer. El genio del DCO es que convirtió un problema legal aparentemente irresoluble —¿cómo demostrar la limpieza de la procedencia en un proyecto de miles de contribuyentes anónimos?— en una disciplina ligera que cualquiera cumple con una bandera -s. La cadena de firmas es, literalmente, cómo el software libre más importante del mundo se defiende de quien afirme que no le pertenece.

⚔️ Firma y traza tu parche
  1. Rehaz un commit tuyo con git commit -s --amend y localiza la línea Signed-off-by; lee las cuatro cláusulas del DCO en Documentation/process/submitting-patches.rst.
  2. Elige un commit cualquiera del historial y genera su etiqueta con git show -s --format='Fixes: %h ("%s")' tras fijar core.abbrev 12.
  3. Redacta un bloque de trailers completo con Signed-off-by, Fixes: y Cc: stable@vger.kernel.org # 6.6+, en el orden correcto.
  4. Explica en tres líneas, con el pleito de SCO en mente, por qué el kernel prefirió el DCO a un contrato de cesión de derechos de autor.
  5. Investiga en stable-kernel-rules.rst qué tipos de cambio no deben llevar Cc: stable y por qué.