Skip to contentSkip to conversation

2.5.46 ext3 errors

DISCUSSION Jens Axboe 4 participants 6 messages Nov 6, 2002 – Nov 7, 2002

lore
Share & tools
lore

Jens Axboe

author
#0 lore raw

Hi,

Doing a kernel compile, the file system suddenly turned read-only. Following messages appeared in log:

EXT3-fs error (device ide1(22,1)): ext3_new_inode: Free inodes count corrupted in group 688 Aborting journal on device ide1(22,1).
ext3_new_inode: aborting transaction: Journal has aborted in __ext3_journal_get_write_access<2>EXT3-fs error (device ide1(22,1)) in ext3_new_inode: Journal has aborted EXT3-fs error (device ide1(22,1)) in ext3_create: Journal has aborted ext3_abort called.
EXT3-fs abort (device ide1(22,1)): ext3_journal_start: Detected aborted journal
Remounting filesystem read-only

Signature · 1 line
Jens Axboe
author
#1 lore raw
Quoted 10 lines · Jens Axboe

Hi,

Doing a kernel compile, the file system suddenly turned read-only. Following messages appeared in log:

EXT3-fs error (device ide1(22,1)): ext3_new_inode: Free inodes count corrupted in group 688 Aborting journal on device ide1(22,1).
ext3_new_inode: aborting transaction: Journal has aborted in __ext3_journal_get_write_access<2>EXT3-fs error (device ide1(22,1)) in ext3_new_inode: Journal has aborted EXT3-fs error (device ide1(22,1)) in ext3_create: Journal has aborted ext3_abort called.
EXT3-fs abort (device ide1(22,1)): ext3_journal_start: Detected aborted journal
Remounting filesystem read-only

fsck gave, for that group:

Free inodes count wrong for group #688 (65534, counted=0)

I've got full fsck log if anyone wants to see it, it consists of wrong inode and directory counts only.

Signature · 1 line
Jens Axboe
#2 lore raw
Quoted 13 lines · On Wed, 6 Nov 2002 09:26:58 +0100 Jens Axboe <[email protected]> wrote:
Quoted 10 lines · Jens Axboe

Hi,

Doing a kernel compile, the file system suddenly turned read-only. Following messages appeared in log:

EXT3-fs error (device ide1(22,1)): ext3_new_inode: Free inodes count corrupted in group 688 Aborting journal on device ide1(22,1).
ext3_new_inode: aborting transaction: Journal has aborted in __ext3_journal_get_write_access<2>EXT3-fs error (device ide1(22,1)) in ext3_new_inode: Journal has aborted EXT3-fs error (device ide1(22,1)) in ext3_create: Journal has aborted ext3_abort called.
EXT3-fs abort (device ide1(22,1)): ext3_journal_start: Detected aborted journal
Remounting filesystem read-only

Quoted 3 lines

fsck gave, for that group:

Free inodes count wrong for group #688 (65534, counted=0)

I got the same error, but on reboot, the journal was played and then the fsck found no errors.

All I did on that filesystem was
log in
make modules_install in a kernel tree
edit a file in the kernel tree (this file had at least two links) make modules - which discovered the files system read only.

After the reboot, the file was as I had changed it, so I lost nothing.

Signature · 3 lines
Cheers,
Stephen Rothwell                    [email protected]
http://www.canb.auug.org.au/~sfr/
#3 lore raw
In reply to Jens Axboe

I got this same error while running "seq 1000000|xargs touch" in an otherwise empty directory. It got as far as about 20,000 files before the filesystem was remounted ro.

Quoted 19 lines · Jens Axboe

Hi,

Doing a kernel compile, the file system suddenly turned read-only. Following messages appeared in log:

EXT3-fs error (device ide1(22,1)): ext3_new_inode: Free inodes count corrupted in group 688 Aborting journal on device ide1(22,1).
ext3_new_inode: aborting transaction: Journal has aborted in __ext3_journal_get_write_access<2>EXT3-fs error (device ide1(22,1)) in ext3_new_inode: Journal has aborted EXT3-fs error (device ide1(22,1)) in ext3_create: Journal has aborted ext3_abort called.
EXT3-fs abort (device ide1(22,1)): ext3_journal_start: Detected aborted journal
Remounting filesystem read-only

Signature · 7 lines
Jens Axboe

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/
#4 lore raw
Quoted 5 lines · Maciej Babinski

I got this same error while running "seq 1000000|xargs touch" in an otherwise empty directory. It got as far as about 20,000 files before the filesystem was remounted ro.

Looks like we had some overeager cut-n-paste in the Orlov conversion.

The per-blockgroup inode and directory accounting is being double-accounted for, and we're not journalling the updates...

This should fix it up, but it is untested.

fs/ext3/ialloc.c renamed from fs/ext3/ialloc.c~ext3-inodes-count-fix +3 -16
@@ -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;

_

#5 lore raw

Since I've applied this patch, I can't reproduce the problem. Thanks!

Maciej

Quoted 69 lines

Looks like we had some overeager cut-n-paste in the Orlov conversion.

The per-blockgroup inode and directory accounting is being double-accounted for, and we're not journalling the updates...

This should fix it up, but it is untested.

fs/ext3/ialloc.c renamed from fs/ext3/ialloc.c~ext3-inodes-count-fix +3 -16
@@ -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;

_
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/