vfat dentry handling fix (3/11)
PATCH 1/1 vfat dentry handling fix (3/11)
Intent of this fixes following case of 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 files changed, 12 insertions(+), 5 deletions(-)
fs/vfat/namei.c renamed from fs/vfat/namei.c~fat_dentry-handling-fix +12 -5
@@ -23,6 +23,7 @@#include <linux/slab.h> #include <linux/smp_lock.h> #include <linux/buffer_head.h> +#include <linux/namei.h> #define DEBUG_LEVEL 0#if (DEBUG_LEVEL >=1 )
@@ -70,14 +71,20 @@ static struct dentry_operations vfat_denstatic 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
_
Signature · 1 line
OGAWA Hirofumi <[email protected]>