162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * eCryptfs: Linux filesystem encryption layer 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 1997-2003 Erez Zadok 662306a36Sopenharmony_ci * Copyright (C) 2001-2003 Stony Brook University 762306a36Sopenharmony_ci * Copyright (C) 2004-2006 International Business Machines Corp. 862306a36Sopenharmony_ci * Author(s): Michael A. Halcrow <mahalcro@us.ibm.com> 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/dcache.h> 1262306a36Sopenharmony_ci#include <linux/namei.h> 1362306a36Sopenharmony_ci#include <linux/mount.h> 1462306a36Sopenharmony_ci#include <linux/fs_stack.h> 1562306a36Sopenharmony_ci#include <linux/slab.h> 1662306a36Sopenharmony_ci#include "ecryptfs_kernel.h" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci/** 1962306a36Sopenharmony_ci * ecryptfs_d_revalidate - revalidate an ecryptfs dentry 2062306a36Sopenharmony_ci * @dentry: The ecryptfs dentry 2162306a36Sopenharmony_ci * @flags: lookup flags 2262306a36Sopenharmony_ci * 2362306a36Sopenharmony_ci * Called when the VFS needs to revalidate a dentry. This 2462306a36Sopenharmony_ci * is called whenever a name lookup finds a dentry in the 2562306a36Sopenharmony_ci * dcache. Most filesystems leave this as NULL, because all their 2662306a36Sopenharmony_ci * dentries in the dcache are valid. 2762306a36Sopenharmony_ci * 2862306a36Sopenharmony_ci * Returns 1 if valid, 0 otherwise. 2962306a36Sopenharmony_ci * 3062306a36Sopenharmony_ci */ 3162306a36Sopenharmony_cistatic int ecryptfs_d_revalidate(struct dentry *dentry, unsigned int flags) 3262306a36Sopenharmony_ci{ 3362306a36Sopenharmony_ci struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry); 3462306a36Sopenharmony_ci int rc = 1; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci if (flags & LOOKUP_RCU) 3762306a36Sopenharmony_ci return -ECHILD; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci if (lower_dentry->d_flags & DCACHE_OP_REVALIDATE) 4062306a36Sopenharmony_ci rc = lower_dentry->d_op->d_revalidate(lower_dentry, flags); 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci if (d_really_is_positive(dentry)) { 4362306a36Sopenharmony_ci struct inode *inode = d_inode(dentry); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci fsstack_copy_attr_all(inode, ecryptfs_inode_to_lower(inode)); 4662306a36Sopenharmony_ci if (!inode->i_nlink) 4762306a36Sopenharmony_ci return 0; 4862306a36Sopenharmony_ci } 4962306a36Sopenharmony_ci return rc; 5062306a36Sopenharmony_ci} 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistruct kmem_cache *ecryptfs_dentry_info_cache; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistatic void ecryptfs_dentry_free_rcu(struct rcu_head *head) 5562306a36Sopenharmony_ci{ 5662306a36Sopenharmony_ci kmem_cache_free(ecryptfs_dentry_info_cache, 5762306a36Sopenharmony_ci container_of(head, struct ecryptfs_dentry_info, rcu)); 5862306a36Sopenharmony_ci} 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci/** 6162306a36Sopenharmony_ci * ecryptfs_d_release 6262306a36Sopenharmony_ci * @dentry: The ecryptfs dentry 6362306a36Sopenharmony_ci * 6462306a36Sopenharmony_ci * Called when a dentry is really deallocated. 6562306a36Sopenharmony_ci */ 6662306a36Sopenharmony_cistatic void ecryptfs_d_release(struct dentry *dentry) 6762306a36Sopenharmony_ci{ 6862306a36Sopenharmony_ci struct ecryptfs_dentry_info *p = dentry->d_fsdata; 6962306a36Sopenharmony_ci if (p) { 7062306a36Sopenharmony_ci path_put(&p->lower_path); 7162306a36Sopenharmony_ci call_rcu(&p->rcu, ecryptfs_dentry_free_rcu); 7262306a36Sopenharmony_ci } 7362306a36Sopenharmony_ci} 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ciconst struct dentry_operations ecryptfs_dops = { 7662306a36Sopenharmony_ci .d_revalidate = ecryptfs_d_revalidate, 7762306a36Sopenharmony_ci .d_release = ecryptfs_d_release, 7862306a36Sopenharmony_ci}; 79