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

Reply via email to