All of lore.kernel.org
 help / color / mirror / Atom feed
* [patch] ext3 inode accounting fix
@ 2002-11-07  3:23 Andrew Morton
  0 siblings, 0 replies; only message in thread
From: Andrew Morton @ 2002-11-07  3:23 UTC (permalink / raw)
  To: Linus Torvalds, lkml


ext3 in the 2.5.46 kernel is double-counting inodes in the per-blockgroup
accounting structures.  When a blockgroup fills up this triggers a
consistency check and the filesystem is remounted read-only.

There is no data loss, but all ext3 filesystems which have been mounted
read/write under the 2.5.46 kernel will have incorrect accounting.   They
must be fixed with a fsck.  If this is not done, the filesystem will
be remounted read-only at some time in the future - when a blockgroup
runs out of inodes and the consistency check detects the error.

Step 1: patch the 2.5.46 kernel with the below fix

Step 2: reboot into the new kernel, forcing a fsck against all ext3
        filesystems.

Alternatively, wait for 2.5.47 and then fsck all filesystems.  The problem
only manifests if all of a blockgroup's inodes are consumed, and that is
rare.


--- 25/fs/ext3/ialloc.c~ext3-inodes-count-fix	Wed Nov  6 16:16:55 2002
+++ 25-akpm/fs/ext3/ialloc.c	Wed Nov  6 16:24:20 2002
@@ -227,11 +227,6 @@ static int find_group_dir(struct super_b
 	}
 	if (!best_desc)
 		return -1;
-	best_desc->bg_free_inodes_count =
-		cpu_to_le16(le16_to_cpu(best_desc->bg_free_inodes_count) - 1);
-	best_desc->bg_used_dirs_count =
-		cpu_to_le16(le16_to_cpu(best_desc->bg_used_dirs_count) + 1);
-	mark_buffer_dirty(best_bh);
 	return best_group;
 }
 
@@ -355,14 +350,7 @@ fallback:
 	}
 
 	return -1;
-
 found:
-	desc->bg_free_inodes_count =
-		cpu_to_le16(le16_to_cpu(desc->bg_free_inodes_count) - 1);
-	desc->bg_used_dirs_count =
-		cpu_to_le16(le16_to_cpu(desc->bg_used_dirs_count) + 1);
-	sbi->s_dir_count++;
-	mark_buffer_dirty(bh);
 	return group;
 }
 
@@ -410,9 +398,6 @@ static int find_group_other(struct super
 	return -1;
 
 found:
-	desc->bg_free_inodes_count =
-		cpu_to_le16(le16_to_cpu(desc->bg_free_inodes_count) - 1);
-	mark_buffer_dirty(bh);
 	return group;
 }
 
@@ -521,9 +506,11 @@ repeat:
 	if (err) goto fail;
 	gdp->bg_free_inodes_count =
 		cpu_to_le16(le16_to_cpu(gdp->bg_free_inodes_count) - 1);
-	if (S_ISDIR(mode))
+	if (S_ISDIR(mode)) {
 		gdp->bg_used_dirs_count =
 			cpu_to_le16(le16_to_cpu(gdp->bg_used_dirs_count) + 1);
+		EXT3_SB(sb)->s_dir_count++;
+	}
 	BUFFER_TRACE(bh2, "call ext3_journal_dirty_metadata");
 	err = ext3_journal_dirty_metadata(handle, bh2);
 	if (err) goto fail;

_

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2002-11-07  3:16 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-11-07  3:23 [patch] ext3 inode accounting fix Andrew Morton

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.