|
@@ -465,12 +465,20 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, struct name
|
|
|
direntry->d_op = &cifs_dentry_ops;
|
|
|
d_add(direntry, newInode);
|
|
|
|
|
|
- /* since paths are not looked up by component - the parent directories are presumed to be good here */
|
|
|
+ /* since paths are not looked up by component - the parent
|
|
|
+ directories are presumed to be good here */
|
|
|
renew_parental_timestamps(direntry);
|
|
|
|
|
|
} else if (rc == -ENOENT) {
|
|
|
rc = 0;
|
|
|
+ direntry->d_time = jiffies;
|
|
|
+ if (pTcon->nocase)
|
|
|
+ direntry->d_op = &cifs_ci_dentry_ops;
|
|
|
+ else
|
|
|
+ direntry->d_op = &cifs_dentry_ops;
|
|
|
d_add(direntry, NULL);
|
|
|
+ /* if it was once a directory (but how can we tell?) we could do
|
|
|
+ shrink_dcache_parent(direntry); */
|
|
|
} else {
|
|
|
cERROR(1,("Error 0x%x on cifs_get_inode_info in lookup of %s",
|
|
|
rc,full_path));
|
|
@@ -489,21 +497,20 @@ cifs_d_revalidate(struct dentry *direntry, struct nameidata *nd)
|
|
|
{
|
|
|
int isValid = 1;
|
|
|
|
|
|
-/* lock_kernel(); *//* surely we do not want to lock the kernel for a whole network round trip which could take seconds */
|
|
|
-
|
|
|
if (direntry->d_inode) {
|
|
|
if (cifs_revalidate(direntry)) {
|
|
|
- /* unlock_kernel(); */
|
|
|
return 0;
|
|
|
}
|
|
|
} else {
|
|
|
- cFYI(1,
|
|
|
- ("In cifs_d_revalidate with no inode but name = %s and dentry 0x%p",
|
|
|
- direntry->d_name.name, direntry));
|
|
|
+ cFYI(1, ("neg dentry 0x%p name = %s",
|
|
|
+ direntry, direntry->d_name.name));
|
|
|
+ if(time_after(jiffies, direntry->d_time + HZ) ||
|
|
|
+ !lookupCacheEnabled) {
|
|
|
+ d_drop(direntry);
|
|
|
+ isValid = 0;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-/* unlock_kernel(); */
|
|
|
-
|
|
|
return isValid;
|
|
|
}
|
|
|
|