|
@@ -38,7 +38,6 @@
|
|
#include "delegation.h"
|
|
#include "delegation.h"
|
|
#include "iostat.h"
|
|
#include "iostat.h"
|
|
|
|
|
|
-#define NFS_PARANOIA 1
|
|
|
|
/* #define NFS_DEBUG_VERBOSE 1 */
|
|
/* #define NFS_DEBUG_VERBOSE 1 */
|
|
|
|
|
|
static int nfs_opendir(struct inode *, struct file *);
|
|
static int nfs_opendir(struct inode *, struct file *);
|
|
@@ -650,12 +649,15 @@ int nfs_fsync_dir(struct file *filp, struct dentry *dentry, int datasync)
|
|
*/
|
|
*/
|
|
static int nfs_check_verifier(struct inode *dir, struct dentry *dentry)
|
|
static int nfs_check_verifier(struct inode *dir, struct dentry *dentry)
|
|
{
|
|
{
|
|
|
|
+ unsigned long verf;
|
|
|
|
+
|
|
if (IS_ROOT(dentry))
|
|
if (IS_ROOT(dentry))
|
|
return 1;
|
|
return 1;
|
|
- if ((NFS_I(dir)->cache_validity & NFS_INO_INVALID_ATTR) != 0
|
|
|
|
- || nfs_attribute_timeout(dir))
|
|
|
|
|
|
+ verf = (unsigned long)dentry->d_fsdata;
|
|
|
|
+ if (nfs_caches_unstable(dir)
|
|
|
|
+ || verf != NFS_I(dir)->cache_change_attribute)
|
|
return 0;
|
|
return 0;
|
|
- return nfs_verify_change_attribute(dir, (unsigned long)dentry->d_fsdata);
|
|
|
|
|
|
+ return 1;
|
|
}
|
|
}
|
|
|
|
|
|
static inline void nfs_set_verifier(struct dentry * dentry, unsigned long verf)
|
|
static inline void nfs_set_verifier(struct dentry * dentry, unsigned long verf)
|
|
@@ -665,8 +667,7 @@ static inline void nfs_set_verifier(struct dentry * dentry, unsigned long verf)
|
|
|
|
|
|
static void nfs_refresh_verifier(struct dentry * dentry, unsigned long verf)
|
|
static void nfs_refresh_verifier(struct dentry * dentry, unsigned long verf)
|
|
{
|
|
{
|
|
- if (time_after(verf, (unsigned long)dentry->d_fsdata))
|
|
|
|
- nfs_set_verifier(dentry, verf);
|
|
|
|
|
|
+ nfs_set_verifier(dentry, verf);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -765,6 +766,10 @@ static int nfs_lookup_revalidate(struct dentry * dentry, struct nameidata *nd)
|
|
nfs_inc_stats(dir, NFSIOS_DENTRYREVALIDATE);
|
|
nfs_inc_stats(dir, NFSIOS_DENTRYREVALIDATE);
|
|
inode = dentry->d_inode;
|
|
inode = dentry->d_inode;
|
|
|
|
|
|
|
|
+ /* Revalidate parent directory attribute cache */
|
|
|
|
+ if (nfs_revalidate_inode(NFS_SERVER(dir), dir) < 0)
|
|
|
|
+ goto out_zap_parent;
|
|
|
|
+
|
|
if (!inode) {
|
|
if (!inode) {
|
|
if (nfs_neg_need_reval(dir, dentry, nd))
|
|
if (nfs_neg_need_reval(dir, dentry, nd))
|
|
goto out_bad;
|
|
goto out_bad;
|
|
@@ -778,10 +783,6 @@ static int nfs_lookup_revalidate(struct dentry * dentry, struct nameidata *nd)
|
|
goto out_bad;
|
|
goto out_bad;
|
|
}
|
|
}
|
|
|
|
|
|
- /* Revalidate parent directory attribute cache */
|
|
|
|
- if (nfs_revalidate_inode(NFS_SERVER(dir), dir) < 0)
|
|
|
|
- goto out_zap_parent;
|
|
|
|
-
|
|
|
|
/* Force a full look up iff the parent directory has changed */
|
|
/* Force a full look up iff the parent directory has changed */
|
|
if (nfs_check_verifier(dir, dentry)) {
|
|
if (nfs_check_verifier(dir, dentry)) {
|
|
if (nfs_lookup_verify_inode(inode, nd))
|
|
if (nfs_lookup_verify_inode(inode, nd))
|
|
@@ -1360,11 +1361,6 @@ static int nfs_sillyrename(struct inode *dir, struct dentry *dentry)
|
|
atomic_read(&dentry->d_count));
|
|
atomic_read(&dentry->d_count));
|
|
nfs_inc_stats(dir, NFSIOS_SILLYRENAME);
|
|
nfs_inc_stats(dir, NFSIOS_SILLYRENAME);
|
|
|
|
|
|
-#ifdef NFS_PARANOIA
|
|
|
|
-if (!dentry->d_inode)
|
|
|
|
-printk("NFS: silly-renaming %s/%s, negative dentry??\n",
|
|
|
|
-dentry->d_parent->d_name.name, dentry->d_name.name);
|
|
|
|
-#endif
|
|
|
|
/*
|
|
/*
|
|
* We don't allow a dentry to be silly-renamed twice.
|
|
* We don't allow a dentry to be silly-renamed twice.
|
|
*/
|
|
*/
|
|
@@ -1681,16 +1677,9 @@ static int nfs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|
new_inode = NULL;
|
|
new_inode = NULL;
|
|
/* instantiate the replacement target */
|
|
/* instantiate the replacement target */
|
|
d_instantiate(new_dentry, NULL);
|
|
d_instantiate(new_dentry, NULL);
|
|
- } else if (atomic_read(&new_dentry->d_count) > 1) {
|
|
|
|
- /* dentry still busy? */
|
|
|
|
-#ifdef NFS_PARANOIA
|
|
|
|
- printk("nfs_rename: target %s/%s busy, d_count=%d\n",
|
|
|
|
- new_dentry->d_parent->d_name.name,
|
|
|
|
- new_dentry->d_name.name,
|
|
|
|
- atomic_read(&new_dentry->d_count));
|
|
|
|
-#endif
|
|
|
|
|
|
+ } else if (atomic_read(&new_dentry->d_count) > 1)
|
|
|
|
+ /* dentry still busy? */
|
|
goto out;
|
|
goto out;
|
|
- }
|
|
|
|
} else
|
|
} else
|
|
drop_nlink(new_inode);
|
|
drop_nlink(new_inode);
|
|
|
|
|