Probleme mit JFS auf der root-Partition

Supportdatenbank (grimmer_jfs)
Bezieht sich auf

SuSE Linux: Version 7.3

Symptom

Sie haben Ihre root-Partition mit dem Journaling File System "JFS" von IBM formatiert. Beim mounten der root-Partition scheint das System stehen zu bleiben und die folgenden Meldungen werden in wiederholter Folge ausgegeben:

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?

[...]

Hinweis: Das System ist nicht in einer Endlosschleife! Der Bootvorgang wird nach einiger Zeit normal fortgeführt, dies kann u.U. jedoch recht lange dauern.

Ursache

IBM JFS ist (zumindest auf Linux) ein recht "junges" Dateisystem und befindet sich immer noch in der Entwicklungsphase.

Die in Kernel 2.4.10 von SuSE Linux 7.3 verwendete JFS Version 1.0.5 enthält noch einen Bug in der Behandlung des Spezialfalls, daß die root-Partition beim Systemstart zuerst read-only gemounted wird. Der Linux-Kernel markiert device-inodes als "dirty", wenn auf diese schreibend zugegriffen wird. JFS nimmt an, daß der Versuch, einen inode auf einem schreibgeschützten Gerät als "dirty" zu markieren ein Fehler ist. Wenn das Dateisystem nicht sauber abgemeldet wurde, schreibt fsck.jfs beim nächsten mount-Vorgang sehr viele Daten auf das Dateisystem, was die oben genannte Warnmeldung verursacht. Da diese Zeilen für jede einzelnen inode ausgegeben werden, kann dieser Vorgang sehr lange dauern (besonders auf einer Framebuffer-Console).

Lösung

Dieses Problem ist mit späteren Versionen des JFS-Moduls behoben worden. Prinzipiell ist es also möglich, dieses Kernelmodul direkt nach der Erstinstallation durch eine selbstkompilierte, neuere Version auszutauschen.

Alternativ kann dieser spezielle Fehler durch Anwenden des folgenden Patches auf die SuSE 2.4.10 Kernelquellen (Paket kernel-source.rpm behoben werden.

--- 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;
 	}
 	/*

Im Moment empfehlen wir als Workaround, JFS nicht für die root-Partition zu verwenden (s. auch "Fehlermeldung beim Zwischenbooten bei der Installation (JFS)" (http://sdb.suse.de/de/sdb/html/jfs_root_73.html) und stattdessen auf alternative Journaling File Systeme (z.B. ReiserFS) auszuweichen.


Stichwörter: JFS, ROOT PARTITION, IS REMOUNT RACY, JFS_DIRTY INODE CALLED ON READ-ONLY VOLUME

Kategorien: Booten

SDB-grimmer_jfs, Copyright SuSE Linux AG, Nürnberg, Germany - Version: 31. Okt 2001
SuSE Linux AG - Zuletzt generiert: 06. Nov 2001 von grimmer (sdb_gen 1.40.0)