From 83bb8e189955419c3ee957875a4583899a32ed88 Mon Sep 17 00:00:00 2001 From: Hirofumi Ogawa Date: Fri, 25 Jul 2003 02:12:33 -0700 Subject: [PATCH] [PATCH] vfat dentry handling fix (3/11) This fixes filename case handling in vfat_revalidate(): before: # mount -t vfat /dev/hda6 /mnt -o shortname=winnt # cd /mnt # cat File.Txt # make negative dentry cat: File.Txt: No such file or directory # touch file.txt # match negative dentry # ls File.Txt after: # mount -t vfat /dev/hda6 /mnt -o shortname=winnt # cd /mnt # cat File.Txt # make negative dentry cat: File.Txt: No such file or directory # touch file.txt # match negative dentry # ls file.txt --- fs/vfat/namei.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/fs/vfat/namei.c b/fs/vfat/namei.c index 0a366b54e2c..c8b649e9434 100644 --- a/fs/vfat/namei.c +++ b/fs/vfat/namei.c @@ -23,6 +23,7 @@ #include #include #include +#include #define DEBUG_LEVEL 0 #if (DEBUG_LEVEL >= 1) @@ -70,14 +71,20 @@ static struct dentry_operations vfat_dentry_ops[4] = { static int vfat_revalidate(struct dentry *dentry, struct nameidata *nd) { + int ret = 1; PRINTK1(("vfat_revalidate: %s\n", dentry->d_name.name)); spin_lock(&dcache_lock); - if (dentry->d_time == dentry->d_parent->d_inode->i_version) { - spin_unlock(&dcache_lock); - return 1; - } + if (nd && !(nd->flags & LOOKUP_CONTINUE) && (nd->flags & LOOKUP_CREATE)) + /* + * negative dentry is dropped, in order to make sure + * to use the name which a user desires if this is + * create path. + */ + ret = 0; + else if (dentry->d_time != dentry->d_parent->d_inode->i_version) + ret = 0; spin_unlock(&dcache_lock); - return 0; + return ret; } static inline unsigned char -- 2.11.4.GIT