}
static afs_uint32
-parent_vcache_dv(struct inode *inode, cred_t *credp)
+parent_vcache_dv(struct inode *inode, cred_t *credp, int locked)
{
int free_cred = 0;
struct vcache *pvcp;
struct vrequest treq;
struct afs_fakestat_state fakestate;
+ if (!locked) {
+ AFS_GLOCK();
+ }
if (!credp) {
credp = crref();
free_cred = 1;
if (free_cred)
crfree(credp);
afs_PutFakeStat(&fakestate);
+ if (!locked) {
+ AFS_GUNLOCK();
+ }
}
return hgetlo(pvcp->f.m.DataVersion);
}
}
#endif
- parent_dv = parent_vcache_dv(parent->d_inode, credp);
+ parent_dv = parent_vcache_dv(parent->d_inode, credp, locked);
/* If the parent's DataVersion has changed or the vnode
* is longer valid, we need to do a full lookup. VerifyVCache
parent = dget_parent(dp);
pvcp = VTOAFS(parent->d_inode);
- parent_dv = parent_vcache_dv(parent->d_inode, credp);
+ parent_dv = parent_vcache_dv(parent->d_inode, credp, locked);
if (parent_dv > dp->d_time || !(pvcp->f.states & CStatd)) {
dput(parent);
#if !defined(STRUCT_SUPER_BLOCK_HAS_S_D_OP)
dp->d_op = &afs_dentry_operations;
#endif
- dp->d_time = parent_vcache_dv(dip, credp);
+ dp->d_time = parent_vcache_dv(dip, credp, 1);
d_instantiate(dp, ip);
}
#if !defined(STRUCT_SUPER_BLOCK_HAS_S_D_OP)
dp->d_op = &afs_dentry_operations;
#endif
- dp->d_time = parent_vcache_dv(dip, credp);
+ dp->d_time = parent_vcache_dv(dip, credp, 1);
AFS_GUNLOCK();