[lkml]   [2000]   [Mar]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
Patch in this message
Subjectext2fs bug : files are disapeared, unable to delete, two files' contents are switched etc.

With small free memory and frequent file create/delete operations,
ext2 shows many problems.
Sometimes files are disapeared, unable to delete, two files' contents are
fsck finds inconsitencies in the properly unmounted filesystem etc.
I'm not sure if this patch fixes all the problems but I cannot see the
problems any more.

tested platform is UP2000, 1 CPU(EV67 750MHz), 256M, 2.2.14
While one process is creating a file, it can be switched to do disk I/O like
stack trace.

schedule+0x1b0 (AR:0xfffffc0005d0bd48)
sleep_on+0x5c (AR:0xfffffc0005d0bd68)
wakeup_bdflush+0x50 (AR:0xfffffc0005d0bd98)
refile_buffer+0x10c (AR:0xfffffc0005d0bda8) -> mark_buffer_dirty()
ext2_add_entry+0x3ac (AR:0xfffffc0005d0bdc8)
ext2_create+0xe4 (AR:0xfffffc0005d0be28)
open_namei+0x1c4 (AR:0xfffffc0005d0be78)
filp_open+0x80 (AR:0xfffffc0005d0beb8)
sys_open+0x6c (AR:0xfffffc0005d0bee8)
Exception frame:
entSys+0xa8 (AR:0xfffffc0005d0bf18)
At that time ext2_add_entry() found a empty directory entry and It's going
be used for the new file being created. but it's not locked or marked.
While it's sleeping, another process can steal the directory entry, because
there's no sign that it's being used.
After return from sleep, first process continues the file creation
But the directory entry is already being used for another file and
first process(in ext2_add_entry()) doesn't check it.
And all the problems starts here.
Mixed efforts with dcache, It makes many symptoms.

Supposing that ext2 is MP safe, my fix for this problem is removing
mark_buffer_dirty() in ext2_add_entry(), simple.
Every caller of ext2_add_entry() calls mark_buffer_dirty(), So it's
Then the first process would not sleep until the directory entry is marked
allocated inode.

--- fs/ext2/ Tue Mar 21 17:44:52 2000
+++ fs/ext2/namei.c Tue Mar 21 15:32:13 2000
@@ -302,7 +302,7 @@
dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL;
dir->i_version = ++global_event;
- mark_buffer_dirty(bh, 1);
+// mark_buffer_dirty(bh, 1);
*res_dir = de;
*err = 0;
return bh;

To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to
Please read the FAQ at

 \ /
  Last update: 2005-03-22 13:57    [from the cache]
©2003-2014 Jasper Spaans. hosted at Digital Ocean