Problemas utilizando JFS en una partición raíz

Base de Datos de Soporte (grimmer_jfs)
Referido a

SuSE Linux: Versión 7.3

Síntoma:

Tiene formateada su partición raíz con IBM's journaled file system "JFS". Cuando montamos la partición raíz en el arranque, el sistema parece entra en un bucle sin fin, mostrando por pantalla los siguientes mensajes:

VFS: Mounted root (jfs filesystem) readonly.
change_root: old root has d_count=2
Trying to unmount old root ... okay
Freeing unused kernel memory: 124k freed
Adding Swap: 128480k swap-space (priority 42)
jfs_dirty inode called on read-only volume
Is remount racy?
jfs_dirty inode called on read-only volume
Is remount racy?
jfs_dirty inode called on read-only volume
Is remount racy?
jfs_dirty inode called on read-only volume
Is remount racy?
jfs_dirty inode called on read-only volume
Is remount racy?
jfs_dirty inode called on read-only volume
Is remount racy?

[...]

Nota: Esto no es un bucle sin fin - el sistema continuará y arrancará normalmente al cabo de un rato.

Causa:

IBM JFS es (al menos en Linux) un sistema de ficheros "joven" y todavia está en fase de desarrollo.

La versión 1.0.5 utilizada en el kernel 2.4.10 de SuSE Linux 7.3 tiene un "bug" que solamente afecta en el caso de que la partición raíz se monte en el arranque en modo solo-lectura. El problema es que si escribe en dispositivos de sólo-lectura causa que el kernel marque el inodo como como dirty. JFS asume que intentar marcar un inodo dirty en un volumen de sólo-lectura era un bug. Cuando el volumen es dirty, fsck.jfs escribe mucho en el volumen causando mensaje de aviso muchas veces. Utilizando un dispositivo de framebuffer la consola retrasará la salida de estos mensajes.

Solución:

Este error ha sido corregido en una versión posterior de JFS. Es posible, reemplazar el módulo del kernel JFS por uno más nuevo.

Alternativamente, este problema puede solucionar-se aplicando el parche para las fuentes del SuSE 2.4.10 (Paquete kernel-source.rpm y recompilar el módulo del kernel:

--- linux-2.4.10.SuSE/fs/jfs/inode.c	Fri Sep 28 10:30:19 2001
+++ linux-2.4.10-suse+/fs/jfs/inode.c	Sun Oct 28 15:27:52 2001
@@ -91,6 +91,9 @@
 	make_bad_inode(inode);
 }
 
+/* This define is from fs/open.c */
+#define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
+
 /*
  * Workhorse of both fsync & write_inode
  */
@@ -98,13 +101,20 @@
 {
 	int rc = 0;
 	int tid;
+	static int noisy = 5;
 
 	jFYI(1, ("In jfs_commit_inode, inode = 0x%p\n", inode));
 
 	if (isReadOnly(inode)) {
-		jERROR(1,("jfs_commit_inode(0x%p) called on read-only volume\n",
-			inode));
-		jERROR(1,("Is remount racy?\n"));
+		/* kernel allows writes to devices on read-only
+		 * partitions and may think inode is dirty
+		 */
+		if(!special_file(inode->i_mode) && noisy) {
+			jERROR(1,("jfs_commit_inode(0x%p) called on "
+				  "read-only volume\n", inode));
+			jERROR(1,("Is remount racy?\n"));
+			noisy--;
+		}
 		return 0;
 	}
 
@@ -176,9 +186,18 @@
 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,1)
 void jfs_dirty_inode(struct inode *inode)
 {
+	static int noisy = 5;
+
 	if (isReadOnly(inode)) {
-		jERROR(1,("jfs_dirty inode called on read-only volume\n"));
-		jERROR(1,("Is remount racy?\n"));
+		if(!special_file(inode->i_mode) && noisy) {
+			/* kernel allows writes to devices on read-only
+			 * partitions and may try to mark inode dirty
+			 */
+			jERROR(1,("jfs_dirty_inode called on "
+				  "read-only volume\n"));
+			jERROR(1,("Is remount racy?\n"));
+			noisy--;
+		}
 		return;
 	}
 	/*

Recomendamos no utilizar JFS en una partición raíz y utilizar un sistema de ficheros con journal alternativo (p.e. ReiserFS).


Palabras clave: JFS, ROOT PARTITION, BOOT, ENDLESS LOOP, JFS_DIRTY INODE, READ-ONLY VOLUME, IS REMOUNT RACY

Temas: Arrancar

SDB-grimmer_jfs, Copyright SuSE Linux AG, Nürnberg, Germany - Versión: 31. Okt 2001
SuSE Linux AG - : 06. Nov 2001 de grimmer (sdb_gen 1.40.0)