cred_t *credp = NULL;
struct vrequest treq;
int code, bad_dentry;
- struct vcache *vcp, *parentvcp;
+ struct vcache *vcp, *pvcp;
#ifdef AFS_LINUX24_ENV
lock_kernel();
AFS_GLOCK();
vcp = ITOAFS(dp->d_inode);
- parentvcp = ITOAFS(dp->d_parent->d_inode); /* dget_parent()? */
+ pvcp = ITOAFS(dp->d_parent->d_inode); /* dget_parent()? */
/* If it's a negative dentry, it's never valid */
- if (!vcp || !parentvcp) {
+ if (!vcp || !pvcp) {
bad_dentry = 1;
goto done;
}
+ /* parent's DataVersion changed? */
+ if (hgetlo(pvcp->m.DataVersion) > dp->d_time) {
+ bad_dentry = 11;
+ goto done;
+ }
+
/* If it's @sys, perhaps it has been changed */
if (!afs_ENameOK(dp->d_name.name)) {
bad_dentry = 10;
#endif
dp->d_op = &afs_dentry_operations;
+ dp->d_time = hgetlo(ITOAFS(dip)->m.DataVersion);
d_instantiate(dp, ip);
}
#endif
}
dp->d_op = &afs_dentry_operations;
+ dp->d_time = hgetlo(ITOAFS(dip)->m.DataVersion);
d_add(dp, AFSTOI(vcp));
#if defined(AFS_LINUX26_ENV)
}
AFS_GUNLOCK();
- if (!code)
+ if (!code) {
+ __dp->d_time = hgetlo(ITOAFS(dip)->m.DataVersion);
d_move(dp, __dp);
+ }
dput(__dp);
goto out;
tvcp->v.v_fop = &afs_dir_fops;
#endif
dp->d_op = &afs_dentry_operations;
+ dp->d_time = hgetlo(ITOAFS(dip)->m.DataVersion);
d_instantiate(dp, AFSTOI(tvcp));
}