The adds deferred mkdir. After the mkdir, "." and ".." have not been
assigned yet, until the parent directory is flushed. So in a full
implementation, opening a directory that is still deferred should wait
for the parent directory to be flushed, in addition to waiting for the
directory itself to be flushed.
Regards,
Daniel
diff --git a/fs/ext2/dir.c b/fs/ext2/dir.c
index 9dd7658..e8a31ca 100644
--- a/fs/ext2/dir.c
+++ b/fs/ext2/dir.c
@@ -313,8 +313,10 @@ int ext2_flush_dir(struct dentry *dir)
struct page *page;
struct ext2_dir_entry_2 *dirent = ext2_dotdot(dentry->d_inode, &page);
show_dentry("link directory", dentry);
- if (dirent)
+ if (dirent) {
+ ((ext2_dirent *)page_address(page))->inode = cpu_to_le32(dentry->d_inode->i_ino);
ext2_set_link(dentry->d_inode, dirent, page, dir->d_inode);
+ }
}
dput(dentry);
diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c
index ab8d17f..aa4b46b 100644
--- a/fs/ext2/namei.c
+++ b/fs/ext2/namei.c
@@ -329,12 +327,11 @@ static int ext2_mkdir(struct inode * dir, struct dentry * dentry, int mode)
if (err)
goto out_fail;
- err = ext2_add_link(dentry, inode);
- if (err)
- goto out_fail;
-
+ if (!(dentry->d_flags & DCACHE_STALE)) /* already deferred? */
+ dget(dentry);
dentry->d_op = &ext2_dentry_operations;
d_instantiate(dentry, inode);
+ show_dentry("defer mkdir", dentry);
out:
return err;
_______________________________________________
Tux3 mailing list
[email protected]
http://mailman.tux3.org/cgi-bin/mailman/listinfo/tux3