|
@@ -45,20 +45,20 @@
|
|
|
static int ecryptfs_d_revalidate(struct dentry *dentry, unsigned int flags)
|
|
|
{
|
|
|
struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);
|
|
|
- int rc;
|
|
|
-
|
|
|
- if (!(lower_dentry->d_flags & DCACHE_OP_REVALIDATE))
|
|
|
- return 1;
|
|
|
+ int rc = 1;
|
|
|
|
|
|
if (flags & LOOKUP_RCU)
|
|
|
return -ECHILD;
|
|
|
|
|
|
- rc = lower_dentry->d_op->d_revalidate(lower_dentry, flags);
|
|
|
+ if (lower_dentry->d_flags & DCACHE_OP_REVALIDATE)
|
|
|
+ rc = lower_dentry->d_op->d_revalidate(lower_dentry, flags);
|
|
|
+
|
|
|
if (d_really_is_positive(dentry)) {
|
|
|
- struct inode *lower_inode =
|
|
|
- ecryptfs_inode_to_lower(d_inode(dentry));
|
|
|
+ struct inode *inode = d_inode(dentry);
|
|
|
|
|
|
- fsstack_copy_attr_all(d_inode(dentry), lower_inode);
|
|
|
+ fsstack_copy_attr_all(inode, ecryptfs_inode_to_lower(inode));
|
|
|
+ if (!inode->i_nlink)
|
|
|
+ return 0;
|
|
|
}
|
|
|
return rc;
|
|
|
}
|