162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * fs/dcache.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Complete reimplementation 662306a36Sopenharmony_ci * (C) 1997 Thomas Schoebel-Theuer, 762306a36Sopenharmony_ci * with heavy changes by Linus Torvalds 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* 1162306a36Sopenharmony_ci * Notes on the allocation strategy: 1262306a36Sopenharmony_ci * 1362306a36Sopenharmony_ci * The dcache is a master of the icache - whenever a dcache entry 1462306a36Sopenharmony_ci * exists, the inode will always exist. "iput()" is done either when 1562306a36Sopenharmony_ci * the dcache entry is deleted or garbage collected. 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include <linux/ratelimit.h> 1962306a36Sopenharmony_ci#include <linux/string.h> 2062306a36Sopenharmony_ci#include <linux/mm.h> 2162306a36Sopenharmony_ci#include <linux/fs.h> 2262306a36Sopenharmony_ci#include <linux/fscrypt.h> 2362306a36Sopenharmony_ci#include <linux/fsnotify.h> 2462306a36Sopenharmony_ci#include <linux/slab.h> 2562306a36Sopenharmony_ci#include <linux/init.h> 2662306a36Sopenharmony_ci#include <linux/hash.h> 2762306a36Sopenharmony_ci#include <linux/cache.h> 2862306a36Sopenharmony_ci#include <linux/export.h> 2962306a36Sopenharmony_ci#include <linux/security.h> 3062306a36Sopenharmony_ci#include <linux/seqlock.h> 3162306a36Sopenharmony_ci#include <linux/memblock.h> 3262306a36Sopenharmony_ci#include <linux/bit_spinlock.h> 3362306a36Sopenharmony_ci#include <linux/rculist_bl.h> 3462306a36Sopenharmony_ci#include <linux/list_lru.h> 3562306a36Sopenharmony_ci#include "internal.h" 3662306a36Sopenharmony_ci#include "mount.h" 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* 3962306a36Sopenharmony_ci * Usage: 4062306a36Sopenharmony_ci * dcache->d_inode->i_lock protects: 4162306a36Sopenharmony_ci * - i_dentry, d_u.d_alias, d_inode of aliases 4262306a36Sopenharmony_ci * dcache_hash_bucket lock protects: 4362306a36Sopenharmony_ci * - the dcache hash table 4462306a36Sopenharmony_ci * s_roots bl list spinlock protects: 4562306a36Sopenharmony_ci * - the s_roots list (see __d_drop) 4662306a36Sopenharmony_ci * dentry->d_sb->s_dentry_lru_lock protects: 4762306a36Sopenharmony_ci * - the dcache lru lists and counters 4862306a36Sopenharmony_ci * d_lock protects: 4962306a36Sopenharmony_ci * - d_flags 5062306a36Sopenharmony_ci * - d_name 5162306a36Sopenharmony_ci * - d_lru 5262306a36Sopenharmony_ci * - d_count 5362306a36Sopenharmony_ci * - d_unhashed() 5462306a36Sopenharmony_ci * - d_parent and d_subdirs 5562306a36Sopenharmony_ci * - childrens' d_child and d_parent 5662306a36Sopenharmony_ci * - d_u.d_alias, d_inode 5762306a36Sopenharmony_ci * 5862306a36Sopenharmony_ci * Ordering: 5962306a36Sopenharmony_ci * dentry->d_inode->i_lock 6062306a36Sopenharmony_ci * dentry->d_lock 6162306a36Sopenharmony_ci * dentry->d_sb->s_dentry_lru_lock 6262306a36Sopenharmony_ci * dcache_hash_bucket lock 6362306a36Sopenharmony_ci * s_roots lock 6462306a36Sopenharmony_ci * 6562306a36Sopenharmony_ci * If there is an ancestor relationship: 6662306a36Sopenharmony_ci * dentry->d_parent->...->d_parent->d_lock 6762306a36Sopenharmony_ci * ... 6862306a36Sopenharmony_ci * dentry->d_parent->d_lock 6962306a36Sopenharmony_ci * dentry->d_lock 7062306a36Sopenharmony_ci * 7162306a36Sopenharmony_ci * If no ancestor relationship: 7262306a36Sopenharmony_ci * arbitrary, since it's serialized on rename_lock 7362306a36Sopenharmony_ci */ 7462306a36Sopenharmony_ciint sysctl_vfs_cache_pressure __read_mostly = 100; 7562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(sysctl_vfs_cache_pressure); 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci__cacheline_aligned_in_smp DEFINE_SEQLOCK(rename_lock); 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ciEXPORT_SYMBOL(rename_lock); 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistatic struct kmem_cache *dentry_cache __read_mostly; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ciconst struct qstr empty_name = QSTR_INIT("", 0); 8462306a36Sopenharmony_ciEXPORT_SYMBOL(empty_name); 8562306a36Sopenharmony_ciconst struct qstr slash_name = QSTR_INIT("/", 1); 8662306a36Sopenharmony_ciEXPORT_SYMBOL(slash_name); 8762306a36Sopenharmony_ciconst struct qstr dotdot_name = QSTR_INIT("..", 2); 8862306a36Sopenharmony_ciEXPORT_SYMBOL(dotdot_name); 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci/* 9162306a36Sopenharmony_ci * This is the single most critical data structure when it comes 9262306a36Sopenharmony_ci * to the dcache: the hashtable for lookups. Somebody should try 9362306a36Sopenharmony_ci * to make this good - I've just made it work. 9462306a36Sopenharmony_ci * 9562306a36Sopenharmony_ci * This hash-function tries to avoid losing too many bits of hash 9662306a36Sopenharmony_ci * information, yet avoid using a prime hash-size or similar. 9762306a36Sopenharmony_ci */ 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_cistatic unsigned int d_hash_shift __read_mostly; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_cistatic struct hlist_bl_head *dentry_hashtable __read_mostly; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_cistatic inline struct hlist_bl_head *d_hash(unsigned int hash) 10462306a36Sopenharmony_ci{ 10562306a36Sopenharmony_ci return dentry_hashtable + (hash >> d_hash_shift); 10662306a36Sopenharmony_ci} 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci#define IN_LOOKUP_SHIFT 10 10962306a36Sopenharmony_cistatic struct hlist_bl_head in_lookup_hashtable[1 << IN_LOOKUP_SHIFT]; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistatic inline struct hlist_bl_head *in_lookup_hash(const struct dentry *parent, 11262306a36Sopenharmony_ci unsigned int hash) 11362306a36Sopenharmony_ci{ 11462306a36Sopenharmony_ci hash += (unsigned long) parent / L1_CACHE_BYTES; 11562306a36Sopenharmony_ci return in_lookup_hashtable + hash_32(hash, IN_LOOKUP_SHIFT); 11662306a36Sopenharmony_ci} 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cistruct dentry_stat_t { 11962306a36Sopenharmony_ci long nr_dentry; 12062306a36Sopenharmony_ci long nr_unused; 12162306a36Sopenharmony_ci long age_limit; /* age in seconds */ 12262306a36Sopenharmony_ci long want_pages; /* pages requested by system */ 12362306a36Sopenharmony_ci long nr_negative; /* # of unused negative dentries */ 12462306a36Sopenharmony_ci long dummy; /* Reserved for future use */ 12562306a36Sopenharmony_ci}; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_cistatic DEFINE_PER_CPU(long, nr_dentry); 12862306a36Sopenharmony_cistatic DEFINE_PER_CPU(long, nr_dentry_unused); 12962306a36Sopenharmony_cistatic DEFINE_PER_CPU(long, nr_dentry_negative); 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci#if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS) 13262306a36Sopenharmony_ci/* Statistics gathering. */ 13362306a36Sopenharmony_cistatic struct dentry_stat_t dentry_stat = { 13462306a36Sopenharmony_ci .age_limit = 45, 13562306a36Sopenharmony_ci}; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci/* 13862306a36Sopenharmony_ci * Here we resort to our own counters instead of using generic per-cpu counters 13962306a36Sopenharmony_ci * for consistency with what the vfs inode code does. We are expected to harvest 14062306a36Sopenharmony_ci * better code and performance by having our own specialized counters. 14162306a36Sopenharmony_ci * 14262306a36Sopenharmony_ci * Please note that the loop is done over all possible CPUs, not over all online 14362306a36Sopenharmony_ci * CPUs. The reason for this is that we don't want to play games with CPUs going 14462306a36Sopenharmony_ci * on and off. If one of them goes off, we will just keep their counters. 14562306a36Sopenharmony_ci * 14662306a36Sopenharmony_ci * glommer: See cffbc8a for details, and if you ever intend to change this, 14762306a36Sopenharmony_ci * please update all vfs counters to match. 14862306a36Sopenharmony_ci */ 14962306a36Sopenharmony_cistatic long get_nr_dentry(void) 15062306a36Sopenharmony_ci{ 15162306a36Sopenharmony_ci int i; 15262306a36Sopenharmony_ci long sum = 0; 15362306a36Sopenharmony_ci for_each_possible_cpu(i) 15462306a36Sopenharmony_ci sum += per_cpu(nr_dentry, i); 15562306a36Sopenharmony_ci return sum < 0 ? 0 : sum; 15662306a36Sopenharmony_ci} 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_cistatic long get_nr_dentry_unused(void) 15962306a36Sopenharmony_ci{ 16062306a36Sopenharmony_ci int i; 16162306a36Sopenharmony_ci long sum = 0; 16262306a36Sopenharmony_ci for_each_possible_cpu(i) 16362306a36Sopenharmony_ci sum += per_cpu(nr_dentry_unused, i); 16462306a36Sopenharmony_ci return sum < 0 ? 0 : sum; 16562306a36Sopenharmony_ci} 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_cistatic long get_nr_dentry_negative(void) 16862306a36Sopenharmony_ci{ 16962306a36Sopenharmony_ci int i; 17062306a36Sopenharmony_ci long sum = 0; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci for_each_possible_cpu(i) 17362306a36Sopenharmony_ci sum += per_cpu(nr_dentry_negative, i); 17462306a36Sopenharmony_ci return sum < 0 ? 0 : sum; 17562306a36Sopenharmony_ci} 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_cistatic int proc_nr_dentry(struct ctl_table *table, int write, void *buffer, 17862306a36Sopenharmony_ci size_t *lenp, loff_t *ppos) 17962306a36Sopenharmony_ci{ 18062306a36Sopenharmony_ci dentry_stat.nr_dentry = get_nr_dentry(); 18162306a36Sopenharmony_ci dentry_stat.nr_unused = get_nr_dentry_unused(); 18262306a36Sopenharmony_ci dentry_stat.nr_negative = get_nr_dentry_negative(); 18362306a36Sopenharmony_ci return proc_doulongvec_minmax(table, write, buffer, lenp, ppos); 18462306a36Sopenharmony_ci} 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cistatic struct ctl_table fs_dcache_sysctls[] = { 18762306a36Sopenharmony_ci { 18862306a36Sopenharmony_ci .procname = "dentry-state", 18962306a36Sopenharmony_ci .data = &dentry_stat, 19062306a36Sopenharmony_ci .maxlen = 6*sizeof(long), 19162306a36Sopenharmony_ci .mode = 0444, 19262306a36Sopenharmony_ci .proc_handler = proc_nr_dentry, 19362306a36Sopenharmony_ci }, 19462306a36Sopenharmony_ci { } 19562306a36Sopenharmony_ci}; 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_cistatic int __init init_fs_dcache_sysctls(void) 19862306a36Sopenharmony_ci{ 19962306a36Sopenharmony_ci register_sysctl_init("fs", fs_dcache_sysctls); 20062306a36Sopenharmony_ci return 0; 20162306a36Sopenharmony_ci} 20262306a36Sopenharmony_cifs_initcall(init_fs_dcache_sysctls); 20362306a36Sopenharmony_ci#endif 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci/* 20662306a36Sopenharmony_ci * Compare 2 name strings, return 0 if they match, otherwise non-zero. 20762306a36Sopenharmony_ci * The strings are both count bytes long, and count is non-zero. 20862306a36Sopenharmony_ci */ 20962306a36Sopenharmony_ci#ifdef CONFIG_DCACHE_WORD_ACCESS 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci#include <asm/word-at-a-time.h> 21262306a36Sopenharmony_ci/* 21362306a36Sopenharmony_ci * NOTE! 'cs' and 'scount' come from a dentry, so it has a 21462306a36Sopenharmony_ci * aligned allocation for this particular component. We don't 21562306a36Sopenharmony_ci * strictly need the load_unaligned_zeropad() safety, but it 21662306a36Sopenharmony_ci * doesn't hurt either. 21762306a36Sopenharmony_ci * 21862306a36Sopenharmony_ci * In contrast, 'ct' and 'tcount' can be from a pathname, and do 21962306a36Sopenharmony_ci * need the careful unaligned handling. 22062306a36Sopenharmony_ci */ 22162306a36Sopenharmony_cistatic inline int dentry_string_cmp(const unsigned char *cs, const unsigned char *ct, unsigned tcount) 22262306a36Sopenharmony_ci{ 22362306a36Sopenharmony_ci unsigned long a,b,mask; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci for (;;) { 22662306a36Sopenharmony_ci a = read_word_at_a_time(cs); 22762306a36Sopenharmony_ci b = load_unaligned_zeropad(ct); 22862306a36Sopenharmony_ci if (tcount < sizeof(unsigned long)) 22962306a36Sopenharmony_ci break; 23062306a36Sopenharmony_ci if (unlikely(a != b)) 23162306a36Sopenharmony_ci return 1; 23262306a36Sopenharmony_ci cs += sizeof(unsigned long); 23362306a36Sopenharmony_ci ct += sizeof(unsigned long); 23462306a36Sopenharmony_ci tcount -= sizeof(unsigned long); 23562306a36Sopenharmony_ci if (!tcount) 23662306a36Sopenharmony_ci return 0; 23762306a36Sopenharmony_ci } 23862306a36Sopenharmony_ci mask = bytemask_from_count(tcount); 23962306a36Sopenharmony_ci return unlikely(!!((a ^ b) & mask)); 24062306a36Sopenharmony_ci} 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci#else 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_cistatic inline int dentry_string_cmp(const unsigned char *cs, const unsigned char *ct, unsigned tcount) 24562306a36Sopenharmony_ci{ 24662306a36Sopenharmony_ci do { 24762306a36Sopenharmony_ci if (*cs != *ct) 24862306a36Sopenharmony_ci return 1; 24962306a36Sopenharmony_ci cs++; 25062306a36Sopenharmony_ci ct++; 25162306a36Sopenharmony_ci tcount--; 25262306a36Sopenharmony_ci } while (tcount); 25362306a36Sopenharmony_ci return 0; 25462306a36Sopenharmony_ci} 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci#endif 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_cistatic inline int dentry_cmp(const struct dentry *dentry, const unsigned char *ct, unsigned tcount) 25962306a36Sopenharmony_ci{ 26062306a36Sopenharmony_ci /* 26162306a36Sopenharmony_ci * Be careful about RCU walk racing with rename: 26262306a36Sopenharmony_ci * use 'READ_ONCE' to fetch the name pointer. 26362306a36Sopenharmony_ci * 26462306a36Sopenharmony_ci * NOTE! Even if a rename will mean that the length 26562306a36Sopenharmony_ci * was not loaded atomically, we don't care. The 26662306a36Sopenharmony_ci * RCU walk will check the sequence count eventually, 26762306a36Sopenharmony_ci * and catch it. And we won't overrun the buffer, 26862306a36Sopenharmony_ci * because we're reading the name pointer atomically, 26962306a36Sopenharmony_ci * and a dentry name is guaranteed to be properly 27062306a36Sopenharmony_ci * terminated with a NUL byte. 27162306a36Sopenharmony_ci * 27262306a36Sopenharmony_ci * End result: even if 'len' is wrong, we'll exit 27362306a36Sopenharmony_ci * early because the data cannot match (there can 27462306a36Sopenharmony_ci * be no NUL in the ct/tcount data) 27562306a36Sopenharmony_ci */ 27662306a36Sopenharmony_ci const unsigned char *cs = READ_ONCE(dentry->d_name.name); 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci return dentry_string_cmp(cs, ct, tcount); 27962306a36Sopenharmony_ci} 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_cistruct external_name { 28262306a36Sopenharmony_ci union { 28362306a36Sopenharmony_ci atomic_t count; 28462306a36Sopenharmony_ci struct rcu_head head; 28562306a36Sopenharmony_ci } u; 28662306a36Sopenharmony_ci unsigned char name[]; 28762306a36Sopenharmony_ci}; 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_cistatic inline struct external_name *external_name(struct dentry *dentry) 29062306a36Sopenharmony_ci{ 29162306a36Sopenharmony_ci return container_of(dentry->d_name.name, struct external_name, name[0]); 29262306a36Sopenharmony_ci} 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_cistatic void __d_free(struct rcu_head *head) 29562306a36Sopenharmony_ci{ 29662306a36Sopenharmony_ci struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu); 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci kmem_cache_free(dentry_cache, dentry); 29962306a36Sopenharmony_ci} 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_cistatic void __d_free_external(struct rcu_head *head) 30262306a36Sopenharmony_ci{ 30362306a36Sopenharmony_ci struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu); 30462306a36Sopenharmony_ci kfree(external_name(dentry)); 30562306a36Sopenharmony_ci kmem_cache_free(dentry_cache, dentry); 30662306a36Sopenharmony_ci} 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_cistatic inline int dname_external(const struct dentry *dentry) 30962306a36Sopenharmony_ci{ 31062306a36Sopenharmony_ci return dentry->d_name.name != dentry->d_iname; 31162306a36Sopenharmony_ci} 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_civoid take_dentry_name_snapshot(struct name_snapshot *name, struct dentry *dentry) 31462306a36Sopenharmony_ci{ 31562306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 31662306a36Sopenharmony_ci name->name = dentry->d_name; 31762306a36Sopenharmony_ci if (unlikely(dname_external(dentry))) { 31862306a36Sopenharmony_ci atomic_inc(&external_name(dentry)->u.count); 31962306a36Sopenharmony_ci } else { 32062306a36Sopenharmony_ci memcpy(name->inline_name, dentry->d_iname, 32162306a36Sopenharmony_ci dentry->d_name.len + 1); 32262306a36Sopenharmony_ci name->name.name = name->inline_name; 32362306a36Sopenharmony_ci } 32462306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 32562306a36Sopenharmony_ci} 32662306a36Sopenharmony_ciEXPORT_SYMBOL(take_dentry_name_snapshot); 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_civoid release_dentry_name_snapshot(struct name_snapshot *name) 32962306a36Sopenharmony_ci{ 33062306a36Sopenharmony_ci if (unlikely(name->name.name != name->inline_name)) { 33162306a36Sopenharmony_ci struct external_name *p; 33262306a36Sopenharmony_ci p = container_of(name->name.name, struct external_name, name[0]); 33362306a36Sopenharmony_ci if (unlikely(atomic_dec_and_test(&p->u.count))) 33462306a36Sopenharmony_ci kfree_rcu(p, u.head); 33562306a36Sopenharmony_ci } 33662306a36Sopenharmony_ci} 33762306a36Sopenharmony_ciEXPORT_SYMBOL(release_dentry_name_snapshot); 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_cistatic inline void __d_set_inode_and_type(struct dentry *dentry, 34062306a36Sopenharmony_ci struct inode *inode, 34162306a36Sopenharmony_ci unsigned type_flags) 34262306a36Sopenharmony_ci{ 34362306a36Sopenharmony_ci unsigned flags; 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci dentry->d_inode = inode; 34662306a36Sopenharmony_ci flags = READ_ONCE(dentry->d_flags); 34762306a36Sopenharmony_ci flags &= ~(DCACHE_ENTRY_TYPE | DCACHE_FALLTHRU); 34862306a36Sopenharmony_ci flags |= type_flags; 34962306a36Sopenharmony_ci smp_store_release(&dentry->d_flags, flags); 35062306a36Sopenharmony_ci} 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_cistatic inline void __d_clear_type_and_inode(struct dentry *dentry) 35362306a36Sopenharmony_ci{ 35462306a36Sopenharmony_ci unsigned flags = READ_ONCE(dentry->d_flags); 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci flags &= ~(DCACHE_ENTRY_TYPE | DCACHE_FALLTHRU); 35762306a36Sopenharmony_ci WRITE_ONCE(dentry->d_flags, flags); 35862306a36Sopenharmony_ci dentry->d_inode = NULL; 35962306a36Sopenharmony_ci if (dentry->d_flags & DCACHE_LRU_LIST) 36062306a36Sopenharmony_ci this_cpu_inc(nr_dentry_negative); 36162306a36Sopenharmony_ci} 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_cistatic void dentry_free(struct dentry *dentry) 36462306a36Sopenharmony_ci{ 36562306a36Sopenharmony_ci WARN_ON(!hlist_unhashed(&dentry->d_u.d_alias)); 36662306a36Sopenharmony_ci if (unlikely(dname_external(dentry))) { 36762306a36Sopenharmony_ci struct external_name *p = external_name(dentry); 36862306a36Sopenharmony_ci if (likely(atomic_dec_and_test(&p->u.count))) { 36962306a36Sopenharmony_ci call_rcu(&dentry->d_u.d_rcu, __d_free_external); 37062306a36Sopenharmony_ci return; 37162306a36Sopenharmony_ci } 37262306a36Sopenharmony_ci } 37362306a36Sopenharmony_ci /* if dentry was never visible to RCU, immediate free is OK */ 37462306a36Sopenharmony_ci if (dentry->d_flags & DCACHE_NORCU) 37562306a36Sopenharmony_ci __d_free(&dentry->d_u.d_rcu); 37662306a36Sopenharmony_ci else 37762306a36Sopenharmony_ci call_rcu(&dentry->d_u.d_rcu, __d_free); 37862306a36Sopenharmony_ci} 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci/* 38162306a36Sopenharmony_ci * Release the dentry's inode, using the filesystem 38262306a36Sopenharmony_ci * d_iput() operation if defined. 38362306a36Sopenharmony_ci */ 38462306a36Sopenharmony_cistatic void dentry_unlink_inode(struct dentry * dentry) 38562306a36Sopenharmony_ci __releases(dentry->d_lock) 38662306a36Sopenharmony_ci __releases(dentry->d_inode->i_lock) 38762306a36Sopenharmony_ci{ 38862306a36Sopenharmony_ci struct inode *inode = dentry->d_inode; 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci raw_write_seqcount_begin(&dentry->d_seq); 39162306a36Sopenharmony_ci __d_clear_type_and_inode(dentry); 39262306a36Sopenharmony_ci hlist_del_init(&dentry->d_u.d_alias); 39362306a36Sopenharmony_ci raw_write_seqcount_end(&dentry->d_seq); 39462306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 39562306a36Sopenharmony_ci spin_unlock(&inode->i_lock); 39662306a36Sopenharmony_ci if (!inode->i_nlink) 39762306a36Sopenharmony_ci fsnotify_inoderemove(inode); 39862306a36Sopenharmony_ci if (dentry->d_op && dentry->d_op->d_iput) 39962306a36Sopenharmony_ci dentry->d_op->d_iput(dentry, inode); 40062306a36Sopenharmony_ci else 40162306a36Sopenharmony_ci iput(inode); 40262306a36Sopenharmony_ci} 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci/* 40562306a36Sopenharmony_ci * The DCACHE_LRU_LIST bit is set whenever the 'd_lru' entry 40662306a36Sopenharmony_ci * is in use - which includes both the "real" per-superblock 40762306a36Sopenharmony_ci * LRU list _and_ the DCACHE_SHRINK_LIST use. 40862306a36Sopenharmony_ci * 40962306a36Sopenharmony_ci * The DCACHE_SHRINK_LIST bit is set whenever the dentry is 41062306a36Sopenharmony_ci * on the shrink list (ie not on the superblock LRU list). 41162306a36Sopenharmony_ci * 41262306a36Sopenharmony_ci * The per-cpu "nr_dentry_unused" counters are updated with 41362306a36Sopenharmony_ci * the DCACHE_LRU_LIST bit. 41462306a36Sopenharmony_ci * 41562306a36Sopenharmony_ci * The per-cpu "nr_dentry_negative" counters are only updated 41662306a36Sopenharmony_ci * when deleted from or added to the per-superblock LRU list, not 41762306a36Sopenharmony_ci * from/to the shrink list. That is to avoid an unneeded dec/inc 41862306a36Sopenharmony_ci * pair when moving from LRU to shrink list in select_collect(). 41962306a36Sopenharmony_ci * 42062306a36Sopenharmony_ci * These helper functions make sure we always follow the 42162306a36Sopenharmony_ci * rules. d_lock must be held by the caller. 42262306a36Sopenharmony_ci */ 42362306a36Sopenharmony_ci#define D_FLAG_VERIFY(dentry,x) WARN_ON_ONCE(((dentry)->d_flags & (DCACHE_LRU_LIST | DCACHE_SHRINK_LIST)) != (x)) 42462306a36Sopenharmony_cistatic void d_lru_add(struct dentry *dentry) 42562306a36Sopenharmony_ci{ 42662306a36Sopenharmony_ci D_FLAG_VERIFY(dentry, 0); 42762306a36Sopenharmony_ci dentry->d_flags |= DCACHE_LRU_LIST; 42862306a36Sopenharmony_ci this_cpu_inc(nr_dentry_unused); 42962306a36Sopenharmony_ci if (d_is_negative(dentry)) 43062306a36Sopenharmony_ci this_cpu_inc(nr_dentry_negative); 43162306a36Sopenharmony_ci WARN_ON_ONCE(!list_lru_add(&dentry->d_sb->s_dentry_lru, &dentry->d_lru)); 43262306a36Sopenharmony_ci} 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_cistatic void d_lru_del(struct dentry *dentry) 43562306a36Sopenharmony_ci{ 43662306a36Sopenharmony_ci D_FLAG_VERIFY(dentry, DCACHE_LRU_LIST); 43762306a36Sopenharmony_ci dentry->d_flags &= ~DCACHE_LRU_LIST; 43862306a36Sopenharmony_ci this_cpu_dec(nr_dentry_unused); 43962306a36Sopenharmony_ci if (d_is_negative(dentry)) 44062306a36Sopenharmony_ci this_cpu_dec(nr_dentry_negative); 44162306a36Sopenharmony_ci WARN_ON_ONCE(!list_lru_del(&dentry->d_sb->s_dentry_lru, &dentry->d_lru)); 44262306a36Sopenharmony_ci} 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_cistatic void d_shrink_del(struct dentry *dentry) 44562306a36Sopenharmony_ci{ 44662306a36Sopenharmony_ci D_FLAG_VERIFY(dentry, DCACHE_SHRINK_LIST | DCACHE_LRU_LIST); 44762306a36Sopenharmony_ci list_del_init(&dentry->d_lru); 44862306a36Sopenharmony_ci dentry->d_flags &= ~(DCACHE_SHRINK_LIST | DCACHE_LRU_LIST); 44962306a36Sopenharmony_ci this_cpu_dec(nr_dentry_unused); 45062306a36Sopenharmony_ci} 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_cistatic void d_shrink_add(struct dentry *dentry, struct list_head *list) 45362306a36Sopenharmony_ci{ 45462306a36Sopenharmony_ci D_FLAG_VERIFY(dentry, 0); 45562306a36Sopenharmony_ci list_add(&dentry->d_lru, list); 45662306a36Sopenharmony_ci dentry->d_flags |= DCACHE_SHRINK_LIST | DCACHE_LRU_LIST; 45762306a36Sopenharmony_ci this_cpu_inc(nr_dentry_unused); 45862306a36Sopenharmony_ci} 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_ci/* 46162306a36Sopenharmony_ci * These can only be called under the global LRU lock, ie during the 46262306a36Sopenharmony_ci * callback for freeing the LRU list. "isolate" removes it from the 46362306a36Sopenharmony_ci * LRU lists entirely, while shrink_move moves it to the indicated 46462306a36Sopenharmony_ci * private list. 46562306a36Sopenharmony_ci */ 46662306a36Sopenharmony_cistatic void d_lru_isolate(struct list_lru_one *lru, struct dentry *dentry) 46762306a36Sopenharmony_ci{ 46862306a36Sopenharmony_ci D_FLAG_VERIFY(dentry, DCACHE_LRU_LIST); 46962306a36Sopenharmony_ci dentry->d_flags &= ~DCACHE_LRU_LIST; 47062306a36Sopenharmony_ci this_cpu_dec(nr_dentry_unused); 47162306a36Sopenharmony_ci if (d_is_negative(dentry)) 47262306a36Sopenharmony_ci this_cpu_dec(nr_dentry_negative); 47362306a36Sopenharmony_ci list_lru_isolate(lru, &dentry->d_lru); 47462306a36Sopenharmony_ci} 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_cistatic void d_lru_shrink_move(struct list_lru_one *lru, struct dentry *dentry, 47762306a36Sopenharmony_ci struct list_head *list) 47862306a36Sopenharmony_ci{ 47962306a36Sopenharmony_ci D_FLAG_VERIFY(dentry, DCACHE_LRU_LIST); 48062306a36Sopenharmony_ci dentry->d_flags |= DCACHE_SHRINK_LIST; 48162306a36Sopenharmony_ci if (d_is_negative(dentry)) 48262306a36Sopenharmony_ci this_cpu_dec(nr_dentry_negative); 48362306a36Sopenharmony_ci list_lru_isolate_move(lru, &dentry->d_lru, list); 48462306a36Sopenharmony_ci} 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_cistatic void ___d_drop(struct dentry *dentry) 48762306a36Sopenharmony_ci{ 48862306a36Sopenharmony_ci struct hlist_bl_head *b; 48962306a36Sopenharmony_ci /* 49062306a36Sopenharmony_ci * Hashed dentries are normally on the dentry hashtable, 49162306a36Sopenharmony_ci * with the exception of those newly allocated by 49262306a36Sopenharmony_ci * d_obtain_root, which are always IS_ROOT: 49362306a36Sopenharmony_ci */ 49462306a36Sopenharmony_ci if (unlikely(IS_ROOT(dentry))) 49562306a36Sopenharmony_ci b = &dentry->d_sb->s_roots; 49662306a36Sopenharmony_ci else 49762306a36Sopenharmony_ci b = d_hash(dentry->d_name.hash); 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_ci hlist_bl_lock(b); 50062306a36Sopenharmony_ci __hlist_bl_del(&dentry->d_hash); 50162306a36Sopenharmony_ci hlist_bl_unlock(b); 50262306a36Sopenharmony_ci} 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_civoid __d_drop(struct dentry *dentry) 50562306a36Sopenharmony_ci{ 50662306a36Sopenharmony_ci if (!d_unhashed(dentry)) { 50762306a36Sopenharmony_ci ___d_drop(dentry); 50862306a36Sopenharmony_ci dentry->d_hash.pprev = NULL; 50962306a36Sopenharmony_ci write_seqcount_invalidate(&dentry->d_seq); 51062306a36Sopenharmony_ci } 51162306a36Sopenharmony_ci} 51262306a36Sopenharmony_ciEXPORT_SYMBOL(__d_drop); 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_ci/** 51562306a36Sopenharmony_ci * d_drop - drop a dentry 51662306a36Sopenharmony_ci * @dentry: dentry to drop 51762306a36Sopenharmony_ci * 51862306a36Sopenharmony_ci * d_drop() unhashes the entry from the parent dentry hashes, so that it won't 51962306a36Sopenharmony_ci * be found through a VFS lookup any more. Note that this is different from 52062306a36Sopenharmony_ci * deleting the dentry - d_delete will try to mark the dentry negative if 52162306a36Sopenharmony_ci * possible, giving a successful _negative_ lookup, while d_drop will 52262306a36Sopenharmony_ci * just make the cache lookup fail. 52362306a36Sopenharmony_ci * 52462306a36Sopenharmony_ci * d_drop() is used mainly for stuff that wants to invalidate a dentry for some 52562306a36Sopenharmony_ci * reason (NFS timeouts or autofs deletes). 52662306a36Sopenharmony_ci * 52762306a36Sopenharmony_ci * __d_drop requires dentry->d_lock 52862306a36Sopenharmony_ci * 52962306a36Sopenharmony_ci * ___d_drop doesn't mark dentry as "unhashed" 53062306a36Sopenharmony_ci * (dentry->d_hash.pprev will be LIST_POISON2, not NULL). 53162306a36Sopenharmony_ci */ 53262306a36Sopenharmony_civoid d_drop(struct dentry *dentry) 53362306a36Sopenharmony_ci{ 53462306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 53562306a36Sopenharmony_ci __d_drop(dentry); 53662306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 53762306a36Sopenharmony_ci} 53862306a36Sopenharmony_ciEXPORT_SYMBOL(d_drop); 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_cistatic inline void dentry_unlist(struct dentry *dentry, struct dentry *parent) 54162306a36Sopenharmony_ci{ 54262306a36Sopenharmony_ci struct dentry *next; 54362306a36Sopenharmony_ci /* 54462306a36Sopenharmony_ci * Inform d_walk() and shrink_dentry_list() that we are no longer 54562306a36Sopenharmony_ci * attached to the dentry tree 54662306a36Sopenharmony_ci */ 54762306a36Sopenharmony_ci dentry->d_flags |= DCACHE_DENTRY_KILLED; 54862306a36Sopenharmony_ci if (unlikely(list_empty(&dentry->d_child))) 54962306a36Sopenharmony_ci return; 55062306a36Sopenharmony_ci __list_del_entry(&dentry->d_child); 55162306a36Sopenharmony_ci /* 55262306a36Sopenharmony_ci * Cursors can move around the list of children. While we'd been 55362306a36Sopenharmony_ci * a normal list member, it didn't matter - ->d_child.next would've 55462306a36Sopenharmony_ci * been updated. However, from now on it won't be and for the 55562306a36Sopenharmony_ci * things like d_walk() it might end up with a nasty surprise. 55662306a36Sopenharmony_ci * Normally d_walk() doesn't care about cursors moving around - 55762306a36Sopenharmony_ci * ->d_lock on parent prevents that and since a cursor has no children 55862306a36Sopenharmony_ci * of its own, we get through it without ever unlocking the parent. 55962306a36Sopenharmony_ci * There is one exception, though - if we ascend from a child that 56062306a36Sopenharmony_ci * gets killed as soon as we unlock it, the next sibling is found 56162306a36Sopenharmony_ci * using the value left in its ->d_child.next. And if _that_ 56262306a36Sopenharmony_ci * pointed to a cursor, and cursor got moved (e.g. by lseek()) 56362306a36Sopenharmony_ci * before d_walk() regains parent->d_lock, we'll end up skipping 56462306a36Sopenharmony_ci * everything the cursor had been moved past. 56562306a36Sopenharmony_ci * 56662306a36Sopenharmony_ci * Solution: make sure that the pointer left behind in ->d_child.next 56762306a36Sopenharmony_ci * points to something that won't be moving around. I.e. skip the 56862306a36Sopenharmony_ci * cursors. 56962306a36Sopenharmony_ci */ 57062306a36Sopenharmony_ci while (dentry->d_child.next != &parent->d_subdirs) { 57162306a36Sopenharmony_ci next = list_entry(dentry->d_child.next, struct dentry, d_child); 57262306a36Sopenharmony_ci if (likely(!(next->d_flags & DCACHE_DENTRY_CURSOR))) 57362306a36Sopenharmony_ci break; 57462306a36Sopenharmony_ci dentry->d_child.next = next->d_child.next; 57562306a36Sopenharmony_ci } 57662306a36Sopenharmony_ci} 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_cistatic void __dentry_kill(struct dentry *dentry) 57962306a36Sopenharmony_ci{ 58062306a36Sopenharmony_ci struct dentry *parent = NULL; 58162306a36Sopenharmony_ci bool can_free = true; 58262306a36Sopenharmony_ci if (!IS_ROOT(dentry)) 58362306a36Sopenharmony_ci parent = dentry->d_parent; 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_ci /* 58662306a36Sopenharmony_ci * The dentry is now unrecoverably dead to the world. 58762306a36Sopenharmony_ci */ 58862306a36Sopenharmony_ci lockref_mark_dead(&dentry->d_lockref); 58962306a36Sopenharmony_ci 59062306a36Sopenharmony_ci /* 59162306a36Sopenharmony_ci * inform the fs via d_prune that this dentry is about to be 59262306a36Sopenharmony_ci * unhashed and destroyed. 59362306a36Sopenharmony_ci */ 59462306a36Sopenharmony_ci if (dentry->d_flags & DCACHE_OP_PRUNE) 59562306a36Sopenharmony_ci dentry->d_op->d_prune(dentry); 59662306a36Sopenharmony_ci 59762306a36Sopenharmony_ci if (dentry->d_flags & DCACHE_LRU_LIST) { 59862306a36Sopenharmony_ci if (!(dentry->d_flags & DCACHE_SHRINK_LIST)) 59962306a36Sopenharmony_ci d_lru_del(dentry); 60062306a36Sopenharmony_ci } 60162306a36Sopenharmony_ci /* if it was on the hash then remove it */ 60262306a36Sopenharmony_ci __d_drop(dentry); 60362306a36Sopenharmony_ci dentry_unlist(dentry, parent); 60462306a36Sopenharmony_ci if (parent) 60562306a36Sopenharmony_ci spin_unlock(&parent->d_lock); 60662306a36Sopenharmony_ci if (dentry->d_inode) 60762306a36Sopenharmony_ci dentry_unlink_inode(dentry); 60862306a36Sopenharmony_ci else 60962306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 61062306a36Sopenharmony_ci this_cpu_dec(nr_dentry); 61162306a36Sopenharmony_ci if (dentry->d_op && dentry->d_op->d_release) 61262306a36Sopenharmony_ci dentry->d_op->d_release(dentry); 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 61562306a36Sopenharmony_ci if (dentry->d_flags & DCACHE_SHRINK_LIST) { 61662306a36Sopenharmony_ci dentry->d_flags |= DCACHE_MAY_FREE; 61762306a36Sopenharmony_ci can_free = false; 61862306a36Sopenharmony_ci } 61962306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 62062306a36Sopenharmony_ci if (likely(can_free)) 62162306a36Sopenharmony_ci dentry_free(dentry); 62262306a36Sopenharmony_ci cond_resched(); 62362306a36Sopenharmony_ci} 62462306a36Sopenharmony_ci 62562306a36Sopenharmony_cistatic struct dentry *__lock_parent(struct dentry *dentry) 62662306a36Sopenharmony_ci{ 62762306a36Sopenharmony_ci struct dentry *parent; 62862306a36Sopenharmony_ci rcu_read_lock(); 62962306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 63062306a36Sopenharmony_ciagain: 63162306a36Sopenharmony_ci parent = READ_ONCE(dentry->d_parent); 63262306a36Sopenharmony_ci spin_lock(&parent->d_lock); 63362306a36Sopenharmony_ci /* 63462306a36Sopenharmony_ci * We can't blindly lock dentry until we are sure 63562306a36Sopenharmony_ci * that we won't violate the locking order. 63662306a36Sopenharmony_ci * Any changes of dentry->d_parent must have 63762306a36Sopenharmony_ci * been done with parent->d_lock held, so 63862306a36Sopenharmony_ci * spin_lock() above is enough of a barrier 63962306a36Sopenharmony_ci * for checking if it's still our child. 64062306a36Sopenharmony_ci */ 64162306a36Sopenharmony_ci if (unlikely(parent != dentry->d_parent)) { 64262306a36Sopenharmony_ci spin_unlock(&parent->d_lock); 64362306a36Sopenharmony_ci goto again; 64462306a36Sopenharmony_ci } 64562306a36Sopenharmony_ci rcu_read_unlock(); 64662306a36Sopenharmony_ci if (parent != dentry) 64762306a36Sopenharmony_ci spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED); 64862306a36Sopenharmony_ci else 64962306a36Sopenharmony_ci parent = NULL; 65062306a36Sopenharmony_ci return parent; 65162306a36Sopenharmony_ci} 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_cistatic inline struct dentry *lock_parent(struct dentry *dentry) 65462306a36Sopenharmony_ci{ 65562306a36Sopenharmony_ci struct dentry *parent = dentry->d_parent; 65662306a36Sopenharmony_ci if (IS_ROOT(dentry)) 65762306a36Sopenharmony_ci return NULL; 65862306a36Sopenharmony_ci if (likely(spin_trylock(&parent->d_lock))) 65962306a36Sopenharmony_ci return parent; 66062306a36Sopenharmony_ci return __lock_parent(dentry); 66162306a36Sopenharmony_ci} 66262306a36Sopenharmony_ci 66362306a36Sopenharmony_cistatic inline bool retain_dentry(struct dentry *dentry) 66462306a36Sopenharmony_ci{ 66562306a36Sopenharmony_ci WARN_ON(d_in_lookup(dentry)); 66662306a36Sopenharmony_ci 66762306a36Sopenharmony_ci /* Unreachable? Get rid of it */ 66862306a36Sopenharmony_ci if (unlikely(d_unhashed(dentry))) 66962306a36Sopenharmony_ci return false; 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_ci if (unlikely(dentry->d_flags & DCACHE_DISCONNECTED)) 67262306a36Sopenharmony_ci return false; 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_ci if (unlikely(dentry->d_flags & DCACHE_OP_DELETE)) { 67562306a36Sopenharmony_ci if (dentry->d_op->d_delete(dentry)) 67662306a36Sopenharmony_ci return false; 67762306a36Sopenharmony_ci } 67862306a36Sopenharmony_ci 67962306a36Sopenharmony_ci if (unlikely(dentry->d_flags & DCACHE_DONTCACHE)) 68062306a36Sopenharmony_ci return false; 68162306a36Sopenharmony_ci 68262306a36Sopenharmony_ci /* retain; LRU fodder */ 68362306a36Sopenharmony_ci dentry->d_lockref.count--; 68462306a36Sopenharmony_ci if (unlikely(!(dentry->d_flags & DCACHE_LRU_LIST))) 68562306a36Sopenharmony_ci d_lru_add(dentry); 68662306a36Sopenharmony_ci else if (unlikely(!(dentry->d_flags & DCACHE_REFERENCED))) 68762306a36Sopenharmony_ci dentry->d_flags |= DCACHE_REFERENCED; 68862306a36Sopenharmony_ci return true; 68962306a36Sopenharmony_ci} 69062306a36Sopenharmony_ci 69162306a36Sopenharmony_civoid d_mark_dontcache(struct inode *inode) 69262306a36Sopenharmony_ci{ 69362306a36Sopenharmony_ci struct dentry *de; 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_ci spin_lock(&inode->i_lock); 69662306a36Sopenharmony_ci hlist_for_each_entry(de, &inode->i_dentry, d_u.d_alias) { 69762306a36Sopenharmony_ci spin_lock(&de->d_lock); 69862306a36Sopenharmony_ci de->d_flags |= DCACHE_DONTCACHE; 69962306a36Sopenharmony_ci spin_unlock(&de->d_lock); 70062306a36Sopenharmony_ci } 70162306a36Sopenharmony_ci inode->i_state |= I_DONTCACHE; 70262306a36Sopenharmony_ci spin_unlock(&inode->i_lock); 70362306a36Sopenharmony_ci} 70462306a36Sopenharmony_ciEXPORT_SYMBOL(d_mark_dontcache); 70562306a36Sopenharmony_ci 70662306a36Sopenharmony_ci/* 70762306a36Sopenharmony_ci * Finish off a dentry we've decided to kill. 70862306a36Sopenharmony_ci * dentry->d_lock must be held, returns with it unlocked. 70962306a36Sopenharmony_ci * Returns dentry requiring refcount drop, or NULL if we're done. 71062306a36Sopenharmony_ci */ 71162306a36Sopenharmony_cistatic struct dentry *dentry_kill(struct dentry *dentry) 71262306a36Sopenharmony_ci __releases(dentry->d_lock) 71362306a36Sopenharmony_ci{ 71462306a36Sopenharmony_ci struct inode *inode = dentry->d_inode; 71562306a36Sopenharmony_ci struct dentry *parent = NULL; 71662306a36Sopenharmony_ci 71762306a36Sopenharmony_ci if (inode && unlikely(!spin_trylock(&inode->i_lock))) 71862306a36Sopenharmony_ci goto slow_positive; 71962306a36Sopenharmony_ci 72062306a36Sopenharmony_ci if (!IS_ROOT(dentry)) { 72162306a36Sopenharmony_ci parent = dentry->d_parent; 72262306a36Sopenharmony_ci if (unlikely(!spin_trylock(&parent->d_lock))) { 72362306a36Sopenharmony_ci parent = __lock_parent(dentry); 72462306a36Sopenharmony_ci if (likely(inode || !dentry->d_inode)) 72562306a36Sopenharmony_ci goto got_locks; 72662306a36Sopenharmony_ci /* negative that became positive */ 72762306a36Sopenharmony_ci if (parent) 72862306a36Sopenharmony_ci spin_unlock(&parent->d_lock); 72962306a36Sopenharmony_ci inode = dentry->d_inode; 73062306a36Sopenharmony_ci goto slow_positive; 73162306a36Sopenharmony_ci } 73262306a36Sopenharmony_ci } 73362306a36Sopenharmony_ci __dentry_kill(dentry); 73462306a36Sopenharmony_ci return parent; 73562306a36Sopenharmony_ci 73662306a36Sopenharmony_cislow_positive: 73762306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 73862306a36Sopenharmony_ci spin_lock(&inode->i_lock); 73962306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 74062306a36Sopenharmony_ci parent = lock_parent(dentry); 74162306a36Sopenharmony_cigot_locks: 74262306a36Sopenharmony_ci if (unlikely(dentry->d_lockref.count != 1)) { 74362306a36Sopenharmony_ci dentry->d_lockref.count--; 74462306a36Sopenharmony_ci } else if (likely(!retain_dentry(dentry))) { 74562306a36Sopenharmony_ci __dentry_kill(dentry); 74662306a36Sopenharmony_ci return parent; 74762306a36Sopenharmony_ci } 74862306a36Sopenharmony_ci /* we are keeping it, after all */ 74962306a36Sopenharmony_ci if (inode) 75062306a36Sopenharmony_ci spin_unlock(&inode->i_lock); 75162306a36Sopenharmony_ci if (parent) 75262306a36Sopenharmony_ci spin_unlock(&parent->d_lock); 75362306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 75462306a36Sopenharmony_ci return NULL; 75562306a36Sopenharmony_ci} 75662306a36Sopenharmony_ci 75762306a36Sopenharmony_ci/* 75862306a36Sopenharmony_ci * Try to do a lockless dput(), and return whether that was successful. 75962306a36Sopenharmony_ci * 76062306a36Sopenharmony_ci * If unsuccessful, we return false, having already taken the dentry lock. 76162306a36Sopenharmony_ci * 76262306a36Sopenharmony_ci * The caller needs to hold the RCU read lock, so that the dentry is 76362306a36Sopenharmony_ci * guaranteed to stay around even if the refcount goes down to zero! 76462306a36Sopenharmony_ci */ 76562306a36Sopenharmony_cistatic inline bool fast_dput(struct dentry *dentry) 76662306a36Sopenharmony_ci{ 76762306a36Sopenharmony_ci int ret; 76862306a36Sopenharmony_ci unsigned int d_flags; 76962306a36Sopenharmony_ci 77062306a36Sopenharmony_ci /* 77162306a36Sopenharmony_ci * If we have a d_op->d_delete() operation, we sould not 77262306a36Sopenharmony_ci * let the dentry count go to zero, so use "put_or_lock". 77362306a36Sopenharmony_ci */ 77462306a36Sopenharmony_ci if (unlikely(dentry->d_flags & DCACHE_OP_DELETE)) 77562306a36Sopenharmony_ci return lockref_put_or_lock(&dentry->d_lockref); 77662306a36Sopenharmony_ci 77762306a36Sopenharmony_ci /* 77862306a36Sopenharmony_ci * .. otherwise, we can try to just decrement the 77962306a36Sopenharmony_ci * lockref optimistically. 78062306a36Sopenharmony_ci */ 78162306a36Sopenharmony_ci ret = lockref_put_return(&dentry->d_lockref); 78262306a36Sopenharmony_ci 78362306a36Sopenharmony_ci /* 78462306a36Sopenharmony_ci * If the lockref_put_return() failed due to the lock being held 78562306a36Sopenharmony_ci * by somebody else, the fast path has failed. We will need to 78662306a36Sopenharmony_ci * get the lock, and then check the count again. 78762306a36Sopenharmony_ci */ 78862306a36Sopenharmony_ci if (unlikely(ret < 0)) { 78962306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 79062306a36Sopenharmony_ci if (WARN_ON_ONCE(dentry->d_lockref.count <= 0)) { 79162306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 79262306a36Sopenharmony_ci return true; 79362306a36Sopenharmony_ci } 79462306a36Sopenharmony_ci dentry->d_lockref.count--; 79562306a36Sopenharmony_ci goto locked; 79662306a36Sopenharmony_ci } 79762306a36Sopenharmony_ci 79862306a36Sopenharmony_ci /* 79962306a36Sopenharmony_ci * If we weren't the last ref, we're done. 80062306a36Sopenharmony_ci */ 80162306a36Sopenharmony_ci if (ret) 80262306a36Sopenharmony_ci return true; 80362306a36Sopenharmony_ci 80462306a36Sopenharmony_ci /* 80562306a36Sopenharmony_ci * Careful, careful. The reference count went down 80662306a36Sopenharmony_ci * to zero, but we don't hold the dentry lock, so 80762306a36Sopenharmony_ci * somebody else could get it again, and do another 80862306a36Sopenharmony_ci * dput(), and we need to not race with that. 80962306a36Sopenharmony_ci * 81062306a36Sopenharmony_ci * However, there is a very special and common case 81162306a36Sopenharmony_ci * where we don't care, because there is nothing to 81262306a36Sopenharmony_ci * do: the dentry is still hashed, it does not have 81362306a36Sopenharmony_ci * a 'delete' op, and it's referenced and already on 81462306a36Sopenharmony_ci * the LRU list. 81562306a36Sopenharmony_ci * 81662306a36Sopenharmony_ci * NOTE! Since we aren't locked, these values are 81762306a36Sopenharmony_ci * not "stable". However, it is sufficient that at 81862306a36Sopenharmony_ci * some point after we dropped the reference the 81962306a36Sopenharmony_ci * dentry was hashed and the flags had the proper 82062306a36Sopenharmony_ci * value. Other dentry users may have re-gotten 82162306a36Sopenharmony_ci * a reference to the dentry and change that, but 82262306a36Sopenharmony_ci * our work is done - we can leave the dentry 82362306a36Sopenharmony_ci * around with a zero refcount. 82462306a36Sopenharmony_ci * 82562306a36Sopenharmony_ci * Nevertheless, there are two cases that we should kill 82662306a36Sopenharmony_ci * the dentry anyway. 82762306a36Sopenharmony_ci * 1. free disconnected dentries as soon as their refcount 82862306a36Sopenharmony_ci * reached zero. 82962306a36Sopenharmony_ci * 2. free dentries if they should not be cached. 83062306a36Sopenharmony_ci */ 83162306a36Sopenharmony_ci smp_rmb(); 83262306a36Sopenharmony_ci d_flags = READ_ONCE(dentry->d_flags); 83362306a36Sopenharmony_ci d_flags &= DCACHE_REFERENCED | DCACHE_LRU_LIST | 83462306a36Sopenharmony_ci DCACHE_DISCONNECTED | DCACHE_DONTCACHE; 83562306a36Sopenharmony_ci 83662306a36Sopenharmony_ci /* Nothing to do? Dropping the reference was all we needed? */ 83762306a36Sopenharmony_ci if (d_flags == (DCACHE_REFERENCED | DCACHE_LRU_LIST) && !d_unhashed(dentry)) 83862306a36Sopenharmony_ci return true; 83962306a36Sopenharmony_ci 84062306a36Sopenharmony_ci /* 84162306a36Sopenharmony_ci * Not the fast normal case? Get the lock. We've already decremented 84262306a36Sopenharmony_ci * the refcount, but we'll need to re-check the situation after 84362306a36Sopenharmony_ci * getting the lock. 84462306a36Sopenharmony_ci */ 84562306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 84662306a36Sopenharmony_ci 84762306a36Sopenharmony_ci /* 84862306a36Sopenharmony_ci * Did somebody else grab a reference to it in the meantime, and 84962306a36Sopenharmony_ci * we're no longer the last user after all? Alternatively, somebody 85062306a36Sopenharmony_ci * else could have killed it and marked it dead. Either way, we 85162306a36Sopenharmony_ci * don't need to do anything else. 85262306a36Sopenharmony_ci */ 85362306a36Sopenharmony_cilocked: 85462306a36Sopenharmony_ci if (dentry->d_lockref.count) { 85562306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 85662306a36Sopenharmony_ci return true; 85762306a36Sopenharmony_ci } 85862306a36Sopenharmony_ci 85962306a36Sopenharmony_ci /* 86062306a36Sopenharmony_ci * Re-get the reference we optimistically dropped. We hold the 86162306a36Sopenharmony_ci * lock, and we just tested that it was zero, so we can just 86262306a36Sopenharmony_ci * set it to 1. 86362306a36Sopenharmony_ci */ 86462306a36Sopenharmony_ci dentry->d_lockref.count = 1; 86562306a36Sopenharmony_ci return false; 86662306a36Sopenharmony_ci} 86762306a36Sopenharmony_ci 86862306a36Sopenharmony_ci 86962306a36Sopenharmony_ci/* 87062306a36Sopenharmony_ci * This is dput 87162306a36Sopenharmony_ci * 87262306a36Sopenharmony_ci * This is complicated by the fact that we do not want to put 87362306a36Sopenharmony_ci * dentries that are no longer on any hash chain on the unused 87462306a36Sopenharmony_ci * list: we'd much rather just get rid of them immediately. 87562306a36Sopenharmony_ci * 87662306a36Sopenharmony_ci * However, that implies that we have to traverse the dentry 87762306a36Sopenharmony_ci * tree upwards to the parents which might _also_ now be 87862306a36Sopenharmony_ci * scheduled for deletion (it may have been only waiting for 87962306a36Sopenharmony_ci * its last child to go away). 88062306a36Sopenharmony_ci * 88162306a36Sopenharmony_ci * This tail recursion is done by hand as we don't want to depend 88262306a36Sopenharmony_ci * on the compiler to always get this right (gcc generally doesn't). 88362306a36Sopenharmony_ci * Real recursion would eat up our stack space. 88462306a36Sopenharmony_ci */ 88562306a36Sopenharmony_ci 88662306a36Sopenharmony_ci/* 88762306a36Sopenharmony_ci * dput - release a dentry 88862306a36Sopenharmony_ci * @dentry: dentry to release 88962306a36Sopenharmony_ci * 89062306a36Sopenharmony_ci * Release a dentry. This will drop the usage count and if appropriate 89162306a36Sopenharmony_ci * call the dentry unlink method as well as removing it from the queues and 89262306a36Sopenharmony_ci * releasing its resources. If the parent dentries were scheduled for release 89362306a36Sopenharmony_ci * they too may now get deleted. 89462306a36Sopenharmony_ci */ 89562306a36Sopenharmony_civoid dput(struct dentry *dentry) 89662306a36Sopenharmony_ci{ 89762306a36Sopenharmony_ci while (dentry) { 89862306a36Sopenharmony_ci might_sleep(); 89962306a36Sopenharmony_ci 90062306a36Sopenharmony_ci rcu_read_lock(); 90162306a36Sopenharmony_ci if (likely(fast_dput(dentry))) { 90262306a36Sopenharmony_ci rcu_read_unlock(); 90362306a36Sopenharmony_ci return; 90462306a36Sopenharmony_ci } 90562306a36Sopenharmony_ci 90662306a36Sopenharmony_ci /* Slow case: now with the dentry lock held */ 90762306a36Sopenharmony_ci rcu_read_unlock(); 90862306a36Sopenharmony_ci 90962306a36Sopenharmony_ci if (likely(retain_dentry(dentry))) { 91062306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 91162306a36Sopenharmony_ci return; 91262306a36Sopenharmony_ci } 91362306a36Sopenharmony_ci 91462306a36Sopenharmony_ci dentry = dentry_kill(dentry); 91562306a36Sopenharmony_ci } 91662306a36Sopenharmony_ci} 91762306a36Sopenharmony_ciEXPORT_SYMBOL(dput); 91862306a36Sopenharmony_ci 91962306a36Sopenharmony_cistatic void __dput_to_list(struct dentry *dentry, struct list_head *list) 92062306a36Sopenharmony_ci__must_hold(&dentry->d_lock) 92162306a36Sopenharmony_ci{ 92262306a36Sopenharmony_ci if (dentry->d_flags & DCACHE_SHRINK_LIST) { 92362306a36Sopenharmony_ci /* let the owner of the list it's on deal with it */ 92462306a36Sopenharmony_ci --dentry->d_lockref.count; 92562306a36Sopenharmony_ci } else { 92662306a36Sopenharmony_ci if (dentry->d_flags & DCACHE_LRU_LIST) 92762306a36Sopenharmony_ci d_lru_del(dentry); 92862306a36Sopenharmony_ci if (!--dentry->d_lockref.count) 92962306a36Sopenharmony_ci d_shrink_add(dentry, list); 93062306a36Sopenharmony_ci } 93162306a36Sopenharmony_ci} 93262306a36Sopenharmony_ci 93362306a36Sopenharmony_civoid dput_to_list(struct dentry *dentry, struct list_head *list) 93462306a36Sopenharmony_ci{ 93562306a36Sopenharmony_ci rcu_read_lock(); 93662306a36Sopenharmony_ci if (likely(fast_dput(dentry))) { 93762306a36Sopenharmony_ci rcu_read_unlock(); 93862306a36Sopenharmony_ci return; 93962306a36Sopenharmony_ci } 94062306a36Sopenharmony_ci rcu_read_unlock(); 94162306a36Sopenharmony_ci if (!retain_dentry(dentry)) 94262306a36Sopenharmony_ci __dput_to_list(dentry, list); 94362306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 94462306a36Sopenharmony_ci} 94562306a36Sopenharmony_ci 94662306a36Sopenharmony_ci/* This must be called with d_lock held */ 94762306a36Sopenharmony_cistatic inline void __dget_dlock(struct dentry *dentry) 94862306a36Sopenharmony_ci{ 94962306a36Sopenharmony_ci dentry->d_lockref.count++; 95062306a36Sopenharmony_ci} 95162306a36Sopenharmony_ci 95262306a36Sopenharmony_cistatic inline void __dget(struct dentry *dentry) 95362306a36Sopenharmony_ci{ 95462306a36Sopenharmony_ci lockref_get(&dentry->d_lockref); 95562306a36Sopenharmony_ci} 95662306a36Sopenharmony_ci 95762306a36Sopenharmony_cistruct dentry *dget_parent(struct dentry *dentry) 95862306a36Sopenharmony_ci{ 95962306a36Sopenharmony_ci int gotref; 96062306a36Sopenharmony_ci struct dentry *ret; 96162306a36Sopenharmony_ci unsigned seq; 96262306a36Sopenharmony_ci 96362306a36Sopenharmony_ci /* 96462306a36Sopenharmony_ci * Do optimistic parent lookup without any 96562306a36Sopenharmony_ci * locking. 96662306a36Sopenharmony_ci */ 96762306a36Sopenharmony_ci rcu_read_lock(); 96862306a36Sopenharmony_ci seq = raw_seqcount_begin(&dentry->d_seq); 96962306a36Sopenharmony_ci ret = READ_ONCE(dentry->d_parent); 97062306a36Sopenharmony_ci gotref = lockref_get_not_zero(&ret->d_lockref); 97162306a36Sopenharmony_ci rcu_read_unlock(); 97262306a36Sopenharmony_ci if (likely(gotref)) { 97362306a36Sopenharmony_ci if (!read_seqcount_retry(&dentry->d_seq, seq)) 97462306a36Sopenharmony_ci return ret; 97562306a36Sopenharmony_ci dput(ret); 97662306a36Sopenharmony_ci } 97762306a36Sopenharmony_ci 97862306a36Sopenharmony_cirepeat: 97962306a36Sopenharmony_ci /* 98062306a36Sopenharmony_ci * Don't need rcu_dereference because we re-check it was correct under 98162306a36Sopenharmony_ci * the lock. 98262306a36Sopenharmony_ci */ 98362306a36Sopenharmony_ci rcu_read_lock(); 98462306a36Sopenharmony_ci ret = dentry->d_parent; 98562306a36Sopenharmony_ci spin_lock(&ret->d_lock); 98662306a36Sopenharmony_ci if (unlikely(ret != dentry->d_parent)) { 98762306a36Sopenharmony_ci spin_unlock(&ret->d_lock); 98862306a36Sopenharmony_ci rcu_read_unlock(); 98962306a36Sopenharmony_ci goto repeat; 99062306a36Sopenharmony_ci } 99162306a36Sopenharmony_ci rcu_read_unlock(); 99262306a36Sopenharmony_ci BUG_ON(!ret->d_lockref.count); 99362306a36Sopenharmony_ci ret->d_lockref.count++; 99462306a36Sopenharmony_ci spin_unlock(&ret->d_lock); 99562306a36Sopenharmony_ci return ret; 99662306a36Sopenharmony_ci} 99762306a36Sopenharmony_ciEXPORT_SYMBOL(dget_parent); 99862306a36Sopenharmony_ci 99962306a36Sopenharmony_cistatic struct dentry * __d_find_any_alias(struct inode *inode) 100062306a36Sopenharmony_ci{ 100162306a36Sopenharmony_ci struct dentry *alias; 100262306a36Sopenharmony_ci 100362306a36Sopenharmony_ci if (hlist_empty(&inode->i_dentry)) 100462306a36Sopenharmony_ci return NULL; 100562306a36Sopenharmony_ci alias = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias); 100662306a36Sopenharmony_ci __dget(alias); 100762306a36Sopenharmony_ci return alias; 100862306a36Sopenharmony_ci} 100962306a36Sopenharmony_ci 101062306a36Sopenharmony_ci/** 101162306a36Sopenharmony_ci * d_find_any_alias - find any alias for a given inode 101262306a36Sopenharmony_ci * @inode: inode to find an alias for 101362306a36Sopenharmony_ci * 101462306a36Sopenharmony_ci * If any aliases exist for the given inode, take and return a 101562306a36Sopenharmony_ci * reference for one of them. If no aliases exist, return %NULL. 101662306a36Sopenharmony_ci */ 101762306a36Sopenharmony_cistruct dentry *d_find_any_alias(struct inode *inode) 101862306a36Sopenharmony_ci{ 101962306a36Sopenharmony_ci struct dentry *de; 102062306a36Sopenharmony_ci 102162306a36Sopenharmony_ci spin_lock(&inode->i_lock); 102262306a36Sopenharmony_ci de = __d_find_any_alias(inode); 102362306a36Sopenharmony_ci spin_unlock(&inode->i_lock); 102462306a36Sopenharmony_ci return de; 102562306a36Sopenharmony_ci} 102662306a36Sopenharmony_ciEXPORT_SYMBOL(d_find_any_alias); 102762306a36Sopenharmony_ci 102862306a36Sopenharmony_cistatic struct dentry *__d_find_alias(struct inode *inode) 102962306a36Sopenharmony_ci{ 103062306a36Sopenharmony_ci struct dentry *alias; 103162306a36Sopenharmony_ci 103262306a36Sopenharmony_ci if (S_ISDIR(inode->i_mode)) 103362306a36Sopenharmony_ci return __d_find_any_alias(inode); 103462306a36Sopenharmony_ci 103562306a36Sopenharmony_ci hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) { 103662306a36Sopenharmony_ci spin_lock(&alias->d_lock); 103762306a36Sopenharmony_ci if (!d_unhashed(alias)) { 103862306a36Sopenharmony_ci __dget_dlock(alias); 103962306a36Sopenharmony_ci spin_unlock(&alias->d_lock); 104062306a36Sopenharmony_ci return alias; 104162306a36Sopenharmony_ci } 104262306a36Sopenharmony_ci spin_unlock(&alias->d_lock); 104362306a36Sopenharmony_ci } 104462306a36Sopenharmony_ci return NULL; 104562306a36Sopenharmony_ci} 104662306a36Sopenharmony_ci 104762306a36Sopenharmony_ci/** 104862306a36Sopenharmony_ci * d_find_alias - grab a hashed alias of inode 104962306a36Sopenharmony_ci * @inode: inode in question 105062306a36Sopenharmony_ci * 105162306a36Sopenharmony_ci * If inode has a hashed alias, or is a directory and has any alias, 105262306a36Sopenharmony_ci * acquire the reference to alias and return it. Otherwise return NULL. 105362306a36Sopenharmony_ci * Notice that if inode is a directory there can be only one alias and 105462306a36Sopenharmony_ci * it can be unhashed only if it has no children, or if it is the root 105562306a36Sopenharmony_ci * of a filesystem, or if the directory was renamed and d_revalidate 105662306a36Sopenharmony_ci * was the first vfs operation to notice. 105762306a36Sopenharmony_ci * 105862306a36Sopenharmony_ci * If the inode has an IS_ROOT, DCACHE_DISCONNECTED alias, then prefer 105962306a36Sopenharmony_ci * any other hashed alias over that one. 106062306a36Sopenharmony_ci */ 106162306a36Sopenharmony_cistruct dentry *d_find_alias(struct inode *inode) 106262306a36Sopenharmony_ci{ 106362306a36Sopenharmony_ci struct dentry *de = NULL; 106462306a36Sopenharmony_ci 106562306a36Sopenharmony_ci if (!hlist_empty(&inode->i_dentry)) { 106662306a36Sopenharmony_ci spin_lock(&inode->i_lock); 106762306a36Sopenharmony_ci de = __d_find_alias(inode); 106862306a36Sopenharmony_ci spin_unlock(&inode->i_lock); 106962306a36Sopenharmony_ci } 107062306a36Sopenharmony_ci return de; 107162306a36Sopenharmony_ci} 107262306a36Sopenharmony_ciEXPORT_SYMBOL(d_find_alias); 107362306a36Sopenharmony_ci 107462306a36Sopenharmony_ci/* 107562306a36Sopenharmony_ci * Caller MUST be holding rcu_read_lock() and be guaranteed 107662306a36Sopenharmony_ci * that inode won't get freed until rcu_read_unlock(). 107762306a36Sopenharmony_ci */ 107862306a36Sopenharmony_cistruct dentry *d_find_alias_rcu(struct inode *inode) 107962306a36Sopenharmony_ci{ 108062306a36Sopenharmony_ci struct hlist_head *l = &inode->i_dentry; 108162306a36Sopenharmony_ci struct dentry *de = NULL; 108262306a36Sopenharmony_ci 108362306a36Sopenharmony_ci spin_lock(&inode->i_lock); 108462306a36Sopenharmony_ci // ->i_dentry and ->i_rcu are colocated, but the latter won't be 108562306a36Sopenharmony_ci // used without having I_FREEING set, which means no aliases left 108662306a36Sopenharmony_ci if (likely(!(inode->i_state & I_FREEING) && !hlist_empty(l))) { 108762306a36Sopenharmony_ci if (S_ISDIR(inode->i_mode)) { 108862306a36Sopenharmony_ci de = hlist_entry(l->first, struct dentry, d_u.d_alias); 108962306a36Sopenharmony_ci } else { 109062306a36Sopenharmony_ci hlist_for_each_entry(de, l, d_u.d_alias) 109162306a36Sopenharmony_ci if (!d_unhashed(de)) 109262306a36Sopenharmony_ci break; 109362306a36Sopenharmony_ci } 109462306a36Sopenharmony_ci } 109562306a36Sopenharmony_ci spin_unlock(&inode->i_lock); 109662306a36Sopenharmony_ci return de; 109762306a36Sopenharmony_ci} 109862306a36Sopenharmony_ci 109962306a36Sopenharmony_ci/* 110062306a36Sopenharmony_ci * Try to kill dentries associated with this inode. 110162306a36Sopenharmony_ci * WARNING: you must own a reference to inode. 110262306a36Sopenharmony_ci */ 110362306a36Sopenharmony_civoid d_prune_aliases(struct inode *inode) 110462306a36Sopenharmony_ci{ 110562306a36Sopenharmony_ci struct dentry *dentry; 110662306a36Sopenharmony_cirestart: 110762306a36Sopenharmony_ci spin_lock(&inode->i_lock); 110862306a36Sopenharmony_ci hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) { 110962306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 111062306a36Sopenharmony_ci if (!dentry->d_lockref.count) { 111162306a36Sopenharmony_ci struct dentry *parent = lock_parent(dentry); 111262306a36Sopenharmony_ci if (likely(!dentry->d_lockref.count)) { 111362306a36Sopenharmony_ci __dentry_kill(dentry); 111462306a36Sopenharmony_ci dput(parent); 111562306a36Sopenharmony_ci goto restart; 111662306a36Sopenharmony_ci } 111762306a36Sopenharmony_ci if (parent) 111862306a36Sopenharmony_ci spin_unlock(&parent->d_lock); 111962306a36Sopenharmony_ci } 112062306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 112162306a36Sopenharmony_ci } 112262306a36Sopenharmony_ci spin_unlock(&inode->i_lock); 112362306a36Sopenharmony_ci} 112462306a36Sopenharmony_ciEXPORT_SYMBOL(d_prune_aliases); 112562306a36Sopenharmony_ci 112662306a36Sopenharmony_ci/* 112762306a36Sopenharmony_ci * Lock a dentry from shrink list. 112862306a36Sopenharmony_ci * Called under rcu_read_lock() and dentry->d_lock; the former 112962306a36Sopenharmony_ci * guarantees that nothing we access will be freed under us. 113062306a36Sopenharmony_ci * Note that dentry is *not* protected from concurrent dentry_kill(), 113162306a36Sopenharmony_ci * d_delete(), etc. 113262306a36Sopenharmony_ci * 113362306a36Sopenharmony_ci * Return false if dentry has been disrupted or grabbed, leaving 113462306a36Sopenharmony_ci * the caller to kick it off-list. Otherwise, return true and have 113562306a36Sopenharmony_ci * that dentry's inode and parent both locked. 113662306a36Sopenharmony_ci */ 113762306a36Sopenharmony_cistatic bool shrink_lock_dentry(struct dentry *dentry) 113862306a36Sopenharmony_ci{ 113962306a36Sopenharmony_ci struct inode *inode; 114062306a36Sopenharmony_ci struct dentry *parent; 114162306a36Sopenharmony_ci 114262306a36Sopenharmony_ci if (dentry->d_lockref.count) 114362306a36Sopenharmony_ci return false; 114462306a36Sopenharmony_ci 114562306a36Sopenharmony_ci inode = dentry->d_inode; 114662306a36Sopenharmony_ci if (inode && unlikely(!spin_trylock(&inode->i_lock))) { 114762306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 114862306a36Sopenharmony_ci spin_lock(&inode->i_lock); 114962306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 115062306a36Sopenharmony_ci if (unlikely(dentry->d_lockref.count)) 115162306a36Sopenharmony_ci goto out; 115262306a36Sopenharmony_ci /* changed inode means that somebody had grabbed it */ 115362306a36Sopenharmony_ci if (unlikely(inode != dentry->d_inode)) 115462306a36Sopenharmony_ci goto out; 115562306a36Sopenharmony_ci } 115662306a36Sopenharmony_ci 115762306a36Sopenharmony_ci parent = dentry->d_parent; 115862306a36Sopenharmony_ci if (IS_ROOT(dentry) || likely(spin_trylock(&parent->d_lock))) 115962306a36Sopenharmony_ci return true; 116062306a36Sopenharmony_ci 116162306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 116262306a36Sopenharmony_ci spin_lock(&parent->d_lock); 116362306a36Sopenharmony_ci if (unlikely(parent != dentry->d_parent)) { 116462306a36Sopenharmony_ci spin_unlock(&parent->d_lock); 116562306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 116662306a36Sopenharmony_ci goto out; 116762306a36Sopenharmony_ci } 116862306a36Sopenharmony_ci spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED); 116962306a36Sopenharmony_ci if (likely(!dentry->d_lockref.count)) 117062306a36Sopenharmony_ci return true; 117162306a36Sopenharmony_ci spin_unlock(&parent->d_lock); 117262306a36Sopenharmony_ciout: 117362306a36Sopenharmony_ci if (inode) 117462306a36Sopenharmony_ci spin_unlock(&inode->i_lock); 117562306a36Sopenharmony_ci return false; 117662306a36Sopenharmony_ci} 117762306a36Sopenharmony_ci 117862306a36Sopenharmony_civoid shrink_dentry_list(struct list_head *list) 117962306a36Sopenharmony_ci{ 118062306a36Sopenharmony_ci while (!list_empty(list)) { 118162306a36Sopenharmony_ci struct dentry *dentry, *parent; 118262306a36Sopenharmony_ci 118362306a36Sopenharmony_ci dentry = list_entry(list->prev, struct dentry, d_lru); 118462306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 118562306a36Sopenharmony_ci rcu_read_lock(); 118662306a36Sopenharmony_ci if (!shrink_lock_dentry(dentry)) { 118762306a36Sopenharmony_ci bool can_free = false; 118862306a36Sopenharmony_ci rcu_read_unlock(); 118962306a36Sopenharmony_ci d_shrink_del(dentry); 119062306a36Sopenharmony_ci if (dentry->d_lockref.count < 0) 119162306a36Sopenharmony_ci can_free = dentry->d_flags & DCACHE_MAY_FREE; 119262306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 119362306a36Sopenharmony_ci if (can_free) 119462306a36Sopenharmony_ci dentry_free(dentry); 119562306a36Sopenharmony_ci continue; 119662306a36Sopenharmony_ci } 119762306a36Sopenharmony_ci rcu_read_unlock(); 119862306a36Sopenharmony_ci d_shrink_del(dentry); 119962306a36Sopenharmony_ci parent = dentry->d_parent; 120062306a36Sopenharmony_ci if (parent != dentry) 120162306a36Sopenharmony_ci __dput_to_list(parent, list); 120262306a36Sopenharmony_ci __dentry_kill(dentry); 120362306a36Sopenharmony_ci } 120462306a36Sopenharmony_ci} 120562306a36Sopenharmony_ci 120662306a36Sopenharmony_cistatic enum lru_status dentry_lru_isolate(struct list_head *item, 120762306a36Sopenharmony_ci struct list_lru_one *lru, spinlock_t *lru_lock, void *arg) 120862306a36Sopenharmony_ci{ 120962306a36Sopenharmony_ci struct list_head *freeable = arg; 121062306a36Sopenharmony_ci struct dentry *dentry = container_of(item, struct dentry, d_lru); 121162306a36Sopenharmony_ci 121262306a36Sopenharmony_ci 121362306a36Sopenharmony_ci /* 121462306a36Sopenharmony_ci * we are inverting the lru lock/dentry->d_lock here, 121562306a36Sopenharmony_ci * so use a trylock. If we fail to get the lock, just skip 121662306a36Sopenharmony_ci * it 121762306a36Sopenharmony_ci */ 121862306a36Sopenharmony_ci if (!spin_trylock(&dentry->d_lock)) 121962306a36Sopenharmony_ci return LRU_SKIP; 122062306a36Sopenharmony_ci 122162306a36Sopenharmony_ci /* 122262306a36Sopenharmony_ci * Referenced dentries are still in use. If they have active 122362306a36Sopenharmony_ci * counts, just remove them from the LRU. Otherwise give them 122462306a36Sopenharmony_ci * another pass through the LRU. 122562306a36Sopenharmony_ci */ 122662306a36Sopenharmony_ci if (dentry->d_lockref.count) { 122762306a36Sopenharmony_ci d_lru_isolate(lru, dentry); 122862306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 122962306a36Sopenharmony_ci return LRU_REMOVED; 123062306a36Sopenharmony_ci } 123162306a36Sopenharmony_ci 123262306a36Sopenharmony_ci if (dentry->d_flags & DCACHE_REFERENCED) { 123362306a36Sopenharmony_ci dentry->d_flags &= ~DCACHE_REFERENCED; 123462306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 123562306a36Sopenharmony_ci 123662306a36Sopenharmony_ci /* 123762306a36Sopenharmony_ci * The list move itself will be made by the common LRU code. At 123862306a36Sopenharmony_ci * this point, we've dropped the dentry->d_lock but keep the 123962306a36Sopenharmony_ci * lru lock. This is safe to do, since every list movement is 124062306a36Sopenharmony_ci * protected by the lru lock even if both locks are held. 124162306a36Sopenharmony_ci * 124262306a36Sopenharmony_ci * This is guaranteed by the fact that all LRU management 124362306a36Sopenharmony_ci * functions are intermediated by the LRU API calls like 124462306a36Sopenharmony_ci * list_lru_add and list_lru_del. List movement in this file 124562306a36Sopenharmony_ci * only ever occur through this functions or through callbacks 124662306a36Sopenharmony_ci * like this one, that are called from the LRU API. 124762306a36Sopenharmony_ci * 124862306a36Sopenharmony_ci * The only exceptions to this are functions like 124962306a36Sopenharmony_ci * shrink_dentry_list, and code that first checks for the 125062306a36Sopenharmony_ci * DCACHE_SHRINK_LIST flag. Those are guaranteed to be 125162306a36Sopenharmony_ci * operating only with stack provided lists after they are 125262306a36Sopenharmony_ci * properly isolated from the main list. It is thus, always a 125362306a36Sopenharmony_ci * local access. 125462306a36Sopenharmony_ci */ 125562306a36Sopenharmony_ci return LRU_ROTATE; 125662306a36Sopenharmony_ci } 125762306a36Sopenharmony_ci 125862306a36Sopenharmony_ci d_lru_shrink_move(lru, dentry, freeable); 125962306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 126062306a36Sopenharmony_ci 126162306a36Sopenharmony_ci return LRU_REMOVED; 126262306a36Sopenharmony_ci} 126362306a36Sopenharmony_ci 126462306a36Sopenharmony_ci/** 126562306a36Sopenharmony_ci * prune_dcache_sb - shrink the dcache 126662306a36Sopenharmony_ci * @sb: superblock 126762306a36Sopenharmony_ci * @sc: shrink control, passed to list_lru_shrink_walk() 126862306a36Sopenharmony_ci * 126962306a36Sopenharmony_ci * Attempt to shrink the superblock dcache LRU by @sc->nr_to_scan entries. This 127062306a36Sopenharmony_ci * is done when we need more memory and called from the superblock shrinker 127162306a36Sopenharmony_ci * function. 127262306a36Sopenharmony_ci * 127362306a36Sopenharmony_ci * This function may fail to free any resources if all the dentries are in 127462306a36Sopenharmony_ci * use. 127562306a36Sopenharmony_ci */ 127662306a36Sopenharmony_cilong prune_dcache_sb(struct super_block *sb, struct shrink_control *sc) 127762306a36Sopenharmony_ci{ 127862306a36Sopenharmony_ci LIST_HEAD(dispose); 127962306a36Sopenharmony_ci long freed; 128062306a36Sopenharmony_ci 128162306a36Sopenharmony_ci freed = list_lru_shrink_walk(&sb->s_dentry_lru, sc, 128262306a36Sopenharmony_ci dentry_lru_isolate, &dispose); 128362306a36Sopenharmony_ci shrink_dentry_list(&dispose); 128462306a36Sopenharmony_ci return freed; 128562306a36Sopenharmony_ci} 128662306a36Sopenharmony_ci 128762306a36Sopenharmony_cistatic enum lru_status dentry_lru_isolate_shrink(struct list_head *item, 128862306a36Sopenharmony_ci struct list_lru_one *lru, spinlock_t *lru_lock, void *arg) 128962306a36Sopenharmony_ci{ 129062306a36Sopenharmony_ci struct list_head *freeable = arg; 129162306a36Sopenharmony_ci struct dentry *dentry = container_of(item, struct dentry, d_lru); 129262306a36Sopenharmony_ci 129362306a36Sopenharmony_ci /* 129462306a36Sopenharmony_ci * we are inverting the lru lock/dentry->d_lock here, 129562306a36Sopenharmony_ci * so use a trylock. If we fail to get the lock, just skip 129662306a36Sopenharmony_ci * it 129762306a36Sopenharmony_ci */ 129862306a36Sopenharmony_ci if (!spin_trylock(&dentry->d_lock)) 129962306a36Sopenharmony_ci return LRU_SKIP; 130062306a36Sopenharmony_ci 130162306a36Sopenharmony_ci d_lru_shrink_move(lru, dentry, freeable); 130262306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 130362306a36Sopenharmony_ci 130462306a36Sopenharmony_ci return LRU_REMOVED; 130562306a36Sopenharmony_ci} 130662306a36Sopenharmony_ci 130762306a36Sopenharmony_ci 130862306a36Sopenharmony_ci/** 130962306a36Sopenharmony_ci * shrink_dcache_sb - shrink dcache for a superblock 131062306a36Sopenharmony_ci * @sb: superblock 131162306a36Sopenharmony_ci * 131262306a36Sopenharmony_ci * Shrink the dcache for the specified super block. This is used to free 131362306a36Sopenharmony_ci * the dcache before unmounting a file system. 131462306a36Sopenharmony_ci */ 131562306a36Sopenharmony_civoid shrink_dcache_sb(struct super_block *sb) 131662306a36Sopenharmony_ci{ 131762306a36Sopenharmony_ci do { 131862306a36Sopenharmony_ci LIST_HEAD(dispose); 131962306a36Sopenharmony_ci 132062306a36Sopenharmony_ci list_lru_walk(&sb->s_dentry_lru, 132162306a36Sopenharmony_ci dentry_lru_isolate_shrink, &dispose, 1024); 132262306a36Sopenharmony_ci shrink_dentry_list(&dispose); 132362306a36Sopenharmony_ci } while (list_lru_count(&sb->s_dentry_lru) > 0); 132462306a36Sopenharmony_ci} 132562306a36Sopenharmony_ciEXPORT_SYMBOL(shrink_dcache_sb); 132662306a36Sopenharmony_ci 132762306a36Sopenharmony_ci/** 132862306a36Sopenharmony_ci * enum d_walk_ret - action to talke during tree walk 132962306a36Sopenharmony_ci * @D_WALK_CONTINUE: contrinue walk 133062306a36Sopenharmony_ci * @D_WALK_QUIT: quit walk 133162306a36Sopenharmony_ci * @D_WALK_NORETRY: quit when retry is needed 133262306a36Sopenharmony_ci * @D_WALK_SKIP: skip this dentry and its children 133362306a36Sopenharmony_ci */ 133462306a36Sopenharmony_cienum d_walk_ret { 133562306a36Sopenharmony_ci D_WALK_CONTINUE, 133662306a36Sopenharmony_ci D_WALK_QUIT, 133762306a36Sopenharmony_ci D_WALK_NORETRY, 133862306a36Sopenharmony_ci D_WALK_SKIP, 133962306a36Sopenharmony_ci}; 134062306a36Sopenharmony_ci 134162306a36Sopenharmony_ci/** 134262306a36Sopenharmony_ci * d_walk - walk the dentry tree 134362306a36Sopenharmony_ci * @parent: start of walk 134462306a36Sopenharmony_ci * @data: data passed to @enter() and @finish() 134562306a36Sopenharmony_ci * @enter: callback when first entering the dentry 134662306a36Sopenharmony_ci * 134762306a36Sopenharmony_ci * The @enter() callbacks are called with d_lock held. 134862306a36Sopenharmony_ci */ 134962306a36Sopenharmony_cistatic void d_walk(struct dentry *parent, void *data, 135062306a36Sopenharmony_ci enum d_walk_ret (*enter)(void *, struct dentry *)) 135162306a36Sopenharmony_ci{ 135262306a36Sopenharmony_ci struct dentry *this_parent; 135362306a36Sopenharmony_ci struct list_head *next; 135462306a36Sopenharmony_ci unsigned seq = 0; 135562306a36Sopenharmony_ci enum d_walk_ret ret; 135662306a36Sopenharmony_ci bool retry = true; 135762306a36Sopenharmony_ci 135862306a36Sopenharmony_ciagain: 135962306a36Sopenharmony_ci read_seqbegin_or_lock(&rename_lock, &seq); 136062306a36Sopenharmony_ci this_parent = parent; 136162306a36Sopenharmony_ci spin_lock(&this_parent->d_lock); 136262306a36Sopenharmony_ci 136362306a36Sopenharmony_ci ret = enter(data, this_parent); 136462306a36Sopenharmony_ci switch (ret) { 136562306a36Sopenharmony_ci case D_WALK_CONTINUE: 136662306a36Sopenharmony_ci break; 136762306a36Sopenharmony_ci case D_WALK_QUIT: 136862306a36Sopenharmony_ci case D_WALK_SKIP: 136962306a36Sopenharmony_ci goto out_unlock; 137062306a36Sopenharmony_ci case D_WALK_NORETRY: 137162306a36Sopenharmony_ci retry = false; 137262306a36Sopenharmony_ci break; 137362306a36Sopenharmony_ci } 137462306a36Sopenharmony_cirepeat: 137562306a36Sopenharmony_ci next = this_parent->d_subdirs.next; 137662306a36Sopenharmony_ciresume: 137762306a36Sopenharmony_ci while (next != &this_parent->d_subdirs) { 137862306a36Sopenharmony_ci struct list_head *tmp = next; 137962306a36Sopenharmony_ci struct dentry *dentry = list_entry(tmp, struct dentry, d_child); 138062306a36Sopenharmony_ci next = tmp->next; 138162306a36Sopenharmony_ci 138262306a36Sopenharmony_ci if (unlikely(dentry->d_flags & DCACHE_DENTRY_CURSOR)) 138362306a36Sopenharmony_ci continue; 138462306a36Sopenharmony_ci 138562306a36Sopenharmony_ci spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED); 138662306a36Sopenharmony_ci 138762306a36Sopenharmony_ci ret = enter(data, dentry); 138862306a36Sopenharmony_ci switch (ret) { 138962306a36Sopenharmony_ci case D_WALK_CONTINUE: 139062306a36Sopenharmony_ci break; 139162306a36Sopenharmony_ci case D_WALK_QUIT: 139262306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 139362306a36Sopenharmony_ci goto out_unlock; 139462306a36Sopenharmony_ci case D_WALK_NORETRY: 139562306a36Sopenharmony_ci retry = false; 139662306a36Sopenharmony_ci break; 139762306a36Sopenharmony_ci case D_WALK_SKIP: 139862306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 139962306a36Sopenharmony_ci continue; 140062306a36Sopenharmony_ci } 140162306a36Sopenharmony_ci 140262306a36Sopenharmony_ci if (!list_empty(&dentry->d_subdirs)) { 140362306a36Sopenharmony_ci spin_unlock(&this_parent->d_lock); 140462306a36Sopenharmony_ci spin_release(&dentry->d_lock.dep_map, _RET_IP_); 140562306a36Sopenharmony_ci this_parent = dentry; 140662306a36Sopenharmony_ci spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_); 140762306a36Sopenharmony_ci goto repeat; 140862306a36Sopenharmony_ci } 140962306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 141062306a36Sopenharmony_ci } 141162306a36Sopenharmony_ci /* 141262306a36Sopenharmony_ci * All done at this level ... ascend and resume the search. 141362306a36Sopenharmony_ci */ 141462306a36Sopenharmony_ci rcu_read_lock(); 141562306a36Sopenharmony_ciascend: 141662306a36Sopenharmony_ci if (this_parent != parent) { 141762306a36Sopenharmony_ci struct dentry *child = this_parent; 141862306a36Sopenharmony_ci this_parent = child->d_parent; 141962306a36Sopenharmony_ci 142062306a36Sopenharmony_ci spin_unlock(&child->d_lock); 142162306a36Sopenharmony_ci spin_lock(&this_parent->d_lock); 142262306a36Sopenharmony_ci 142362306a36Sopenharmony_ci /* might go back up the wrong parent if we have had a rename. */ 142462306a36Sopenharmony_ci if (need_seqretry(&rename_lock, seq)) 142562306a36Sopenharmony_ci goto rename_retry; 142662306a36Sopenharmony_ci /* go into the first sibling still alive */ 142762306a36Sopenharmony_ci do { 142862306a36Sopenharmony_ci next = child->d_child.next; 142962306a36Sopenharmony_ci if (next == &this_parent->d_subdirs) 143062306a36Sopenharmony_ci goto ascend; 143162306a36Sopenharmony_ci child = list_entry(next, struct dentry, d_child); 143262306a36Sopenharmony_ci } while (unlikely(child->d_flags & DCACHE_DENTRY_KILLED)); 143362306a36Sopenharmony_ci rcu_read_unlock(); 143462306a36Sopenharmony_ci goto resume; 143562306a36Sopenharmony_ci } 143662306a36Sopenharmony_ci if (need_seqretry(&rename_lock, seq)) 143762306a36Sopenharmony_ci goto rename_retry; 143862306a36Sopenharmony_ci rcu_read_unlock(); 143962306a36Sopenharmony_ci 144062306a36Sopenharmony_ciout_unlock: 144162306a36Sopenharmony_ci spin_unlock(&this_parent->d_lock); 144262306a36Sopenharmony_ci done_seqretry(&rename_lock, seq); 144362306a36Sopenharmony_ci return; 144462306a36Sopenharmony_ci 144562306a36Sopenharmony_cirename_retry: 144662306a36Sopenharmony_ci spin_unlock(&this_parent->d_lock); 144762306a36Sopenharmony_ci rcu_read_unlock(); 144862306a36Sopenharmony_ci BUG_ON(seq & 1); 144962306a36Sopenharmony_ci if (!retry) 145062306a36Sopenharmony_ci return; 145162306a36Sopenharmony_ci seq = 1; 145262306a36Sopenharmony_ci goto again; 145362306a36Sopenharmony_ci} 145462306a36Sopenharmony_ci 145562306a36Sopenharmony_cistruct check_mount { 145662306a36Sopenharmony_ci struct vfsmount *mnt; 145762306a36Sopenharmony_ci unsigned int mounted; 145862306a36Sopenharmony_ci}; 145962306a36Sopenharmony_ci 146062306a36Sopenharmony_cistatic enum d_walk_ret path_check_mount(void *data, struct dentry *dentry) 146162306a36Sopenharmony_ci{ 146262306a36Sopenharmony_ci struct check_mount *info = data; 146362306a36Sopenharmony_ci struct path path = { .mnt = info->mnt, .dentry = dentry }; 146462306a36Sopenharmony_ci 146562306a36Sopenharmony_ci if (likely(!d_mountpoint(dentry))) 146662306a36Sopenharmony_ci return D_WALK_CONTINUE; 146762306a36Sopenharmony_ci if (__path_is_mountpoint(&path)) { 146862306a36Sopenharmony_ci info->mounted = 1; 146962306a36Sopenharmony_ci return D_WALK_QUIT; 147062306a36Sopenharmony_ci } 147162306a36Sopenharmony_ci return D_WALK_CONTINUE; 147262306a36Sopenharmony_ci} 147362306a36Sopenharmony_ci 147462306a36Sopenharmony_ci/** 147562306a36Sopenharmony_ci * path_has_submounts - check for mounts over a dentry in the 147662306a36Sopenharmony_ci * current namespace. 147762306a36Sopenharmony_ci * @parent: path to check. 147862306a36Sopenharmony_ci * 147962306a36Sopenharmony_ci * Return true if the parent or its subdirectories contain 148062306a36Sopenharmony_ci * a mount point in the current namespace. 148162306a36Sopenharmony_ci */ 148262306a36Sopenharmony_ciint path_has_submounts(const struct path *parent) 148362306a36Sopenharmony_ci{ 148462306a36Sopenharmony_ci struct check_mount data = { .mnt = parent->mnt, .mounted = 0 }; 148562306a36Sopenharmony_ci 148662306a36Sopenharmony_ci read_seqlock_excl(&mount_lock); 148762306a36Sopenharmony_ci d_walk(parent->dentry, &data, path_check_mount); 148862306a36Sopenharmony_ci read_sequnlock_excl(&mount_lock); 148962306a36Sopenharmony_ci 149062306a36Sopenharmony_ci return data.mounted; 149162306a36Sopenharmony_ci} 149262306a36Sopenharmony_ciEXPORT_SYMBOL(path_has_submounts); 149362306a36Sopenharmony_ci 149462306a36Sopenharmony_ci/* 149562306a36Sopenharmony_ci * Called by mount code to set a mountpoint and check if the mountpoint is 149662306a36Sopenharmony_ci * reachable (e.g. NFS can unhash a directory dentry and then the complete 149762306a36Sopenharmony_ci * subtree can become unreachable). 149862306a36Sopenharmony_ci * 149962306a36Sopenharmony_ci * Only one of d_invalidate() and d_set_mounted() must succeed. For 150062306a36Sopenharmony_ci * this reason take rename_lock and d_lock on dentry and ancestors. 150162306a36Sopenharmony_ci */ 150262306a36Sopenharmony_ciint d_set_mounted(struct dentry *dentry) 150362306a36Sopenharmony_ci{ 150462306a36Sopenharmony_ci struct dentry *p; 150562306a36Sopenharmony_ci int ret = -ENOENT; 150662306a36Sopenharmony_ci write_seqlock(&rename_lock); 150762306a36Sopenharmony_ci for (p = dentry->d_parent; !IS_ROOT(p); p = p->d_parent) { 150862306a36Sopenharmony_ci /* Need exclusion wrt. d_invalidate() */ 150962306a36Sopenharmony_ci spin_lock(&p->d_lock); 151062306a36Sopenharmony_ci if (unlikely(d_unhashed(p))) { 151162306a36Sopenharmony_ci spin_unlock(&p->d_lock); 151262306a36Sopenharmony_ci goto out; 151362306a36Sopenharmony_ci } 151462306a36Sopenharmony_ci spin_unlock(&p->d_lock); 151562306a36Sopenharmony_ci } 151662306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 151762306a36Sopenharmony_ci if (!d_unlinked(dentry)) { 151862306a36Sopenharmony_ci ret = -EBUSY; 151962306a36Sopenharmony_ci if (!d_mountpoint(dentry)) { 152062306a36Sopenharmony_ci dentry->d_flags |= DCACHE_MOUNTED; 152162306a36Sopenharmony_ci ret = 0; 152262306a36Sopenharmony_ci } 152362306a36Sopenharmony_ci } 152462306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 152562306a36Sopenharmony_ciout: 152662306a36Sopenharmony_ci write_sequnlock(&rename_lock); 152762306a36Sopenharmony_ci return ret; 152862306a36Sopenharmony_ci} 152962306a36Sopenharmony_ci 153062306a36Sopenharmony_ci/* 153162306a36Sopenharmony_ci * Search the dentry child list of the specified parent, 153262306a36Sopenharmony_ci * and move any unused dentries to the end of the unused 153362306a36Sopenharmony_ci * list for prune_dcache(). We descend to the next level 153462306a36Sopenharmony_ci * whenever the d_subdirs list is non-empty and continue 153562306a36Sopenharmony_ci * searching. 153662306a36Sopenharmony_ci * 153762306a36Sopenharmony_ci * It returns zero iff there are no unused children, 153862306a36Sopenharmony_ci * otherwise it returns the number of children moved to 153962306a36Sopenharmony_ci * the end of the unused list. This may not be the total 154062306a36Sopenharmony_ci * number of unused children, because select_parent can 154162306a36Sopenharmony_ci * drop the lock and return early due to latency 154262306a36Sopenharmony_ci * constraints. 154362306a36Sopenharmony_ci */ 154462306a36Sopenharmony_ci 154562306a36Sopenharmony_cistruct select_data { 154662306a36Sopenharmony_ci struct dentry *start; 154762306a36Sopenharmony_ci union { 154862306a36Sopenharmony_ci long found; 154962306a36Sopenharmony_ci struct dentry *victim; 155062306a36Sopenharmony_ci }; 155162306a36Sopenharmony_ci struct list_head dispose; 155262306a36Sopenharmony_ci}; 155362306a36Sopenharmony_ci 155462306a36Sopenharmony_cistatic enum d_walk_ret select_collect(void *_data, struct dentry *dentry) 155562306a36Sopenharmony_ci{ 155662306a36Sopenharmony_ci struct select_data *data = _data; 155762306a36Sopenharmony_ci enum d_walk_ret ret = D_WALK_CONTINUE; 155862306a36Sopenharmony_ci 155962306a36Sopenharmony_ci if (data->start == dentry) 156062306a36Sopenharmony_ci goto out; 156162306a36Sopenharmony_ci 156262306a36Sopenharmony_ci if (dentry->d_flags & DCACHE_SHRINK_LIST) { 156362306a36Sopenharmony_ci data->found++; 156462306a36Sopenharmony_ci } else { 156562306a36Sopenharmony_ci if (dentry->d_flags & DCACHE_LRU_LIST) 156662306a36Sopenharmony_ci d_lru_del(dentry); 156762306a36Sopenharmony_ci if (!dentry->d_lockref.count) { 156862306a36Sopenharmony_ci d_shrink_add(dentry, &data->dispose); 156962306a36Sopenharmony_ci data->found++; 157062306a36Sopenharmony_ci } 157162306a36Sopenharmony_ci } 157262306a36Sopenharmony_ci /* 157362306a36Sopenharmony_ci * We can return to the caller if we have found some (this 157462306a36Sopenharmony_ci * ensures forward progress). We'll be coming back to find 157562306a36Sopenharmony_ci * the rest. 157662306a36Sopenharmony_ci */ 157762306a36Sopenharmony_ci if (!list_empty(&data->dispose)) 157862306a36Sopenharmony_ci ret = need_resched() ? D_WALK_QUIT : D_WALK_NORETRY; 157962306a36Sopenharmony_ciout: 158062306a36Sopenharmony_ci return ret; 158162306a36Sopenharmony_ci} 158262306a36Sopenharmony_ci 158362306a36Sopenharmony_cistatic enum d_walk_ret select_collect2(void *_data, struct dentry *dentry) 158462306a36Sopenharmony_ci{ 158562306a36Sopenharmony_ci struct select_data *data = _data; 158662306a36Sopenharmony_ci enum d_walk_ret ret = D_WALK_CONTINUE; 158762306a36Sopenharmony_ci 158862306a36Sopenharmony_ci if (data->start == dentry) 158962306a36Sopenharmony_ci goto out; 159062306a36Sopenharmony_ci 159162306a36Sopenharmony_ci if (dentry->d_flags & DCACHE_SHRINK_LIST) { 159262306a36Sopenharmony_ci if (!dentry->d_lockref.count) { 159362306a36Sopenharmony_ci rcu_read_lock(); 159462306a36Sopenharmony_ci data->victim = dentry; 159562306a36Sopenharmony_ci return D_WALK_QUIT; 159662306a36Sopenharmony_ci } 159762306a36Sopenharmony_ci } else { 159862306a36Sopenharmony_ci if (dentry->d_flags & DCACHE_LRU_LIST) 159962306a36Sopenharmony_ci d_lru_del(dentry); 160062306a36Sopenharmony_ci if (!dentry->d_lockref.count) 160162306a36Sopenharmony_ci d_shrink_add(dentry, &data->dispose); 160262306a36Sopenharmony_ci } 160362306a36Sopenharmony_ci /* 160462306a36Sopenharmony_ci * We can return to the caller if we have found some (this 160562306a36Sopenharmony_ci * ensures forward progress). We'll be coming back to find 160662306a36Sopenharmony_ci * the rest. 160762306a36Sopenharmony_ci */ 160862306a36Sopenharmony_ci if (!list_empty(&data->dispose)) 160962306a36Sopenharmony_ci ret = need_resched() ? D_WALK_QUIT : D_WALK_NORETRY; 161062306a36Sopenharmony_ciout: 161162306a36Sopenharmony_ci return ret; 161262306a36Sopenharmony_ci} 161362306a36Sopenharmony_ci 161462306a36Sopenharmony_ci/** 161562306a36Sopenharmony_ci * shrink_dcache_parent - prune dcache 161662306a36Sopenharmony_ci * @parent: parent of entries to prune 161762306a36Sopenharmony_ci * 161862306a36Sopenharmony_ci * Prune the dcache to remove unused children of the parent dentry. 161962306a36Sopenharmony_ci */ 162062306a36Sopenharmony_civoid shrink_dcache_parent(struct dentry *parent) 162162306a36Sopenharmony_ci{ 162262306a36Sopenharmony_ci for (;;) { 162362306a36Sopenharmony_ci struct select_data data = {.start = parent}; 162462306a36Sopenharmony_ci 162562306a36Sopenharmony_ci INIT_LIST_HEAD(&data.dispose); 162662306a36Sopenharmony_ci d_walk(parent, &data, select_collect); 162762306a36Sopenharmony_ci 162862306a36Sopenharmony_ci if (!list_empty(&data.dispose)) { 162962306a36Sopenharmony_ci shrink_dentry_list(&data.dispose); 163062306a36Sopenharmony_ci continue; 163162306a36Sopenharmony_ci } 163262306a36Sopenharmony_ci 163362306a36Sopenharmony_ci cond_resched(); 163462306a36Sopenharmony_ci if (!data.found) 163562306a36Sopenharmony_ci break; 163662306a36Sopenharmony_ci data.victim = NULL; 163762306a36Sopenharmony_ci d_walk(parent, &data, select_collect2); 163862306a36Sopenharmony_ci if (data.victim) { 163962306a36Sopenharmony_ci struct dentry *parent; 164062306a36Sopenharmony_ci spin_lock(&data.victim->d_lock); 164162306a36Sopenharmony_ci if (!shrink_lock_dentry(data.victim)) { 164262306a36Sopenharmony_ci spin_unlock(&data.victim->d_lock); 164362306a36Sopenharmony_ci rcu_read_unlock(); 164462306a36Sopenharmony_ci } else { 164562306a36Sopenharmony_ci rcu_read_unlock(); 164662306a36Sopenharmony_ci parent = data.victim->d_parent; 164762306a36Sopenharmony_ci if (parent != data.victim) 164862306a36Sopenharmony_ci __dput_to_list(parent, &data.dispose); 164962306a36Sopenharmony_ci __dentry_kill(data.victim); 165062306a36Sopenharmony_ci } 165162306a36Sopenharmony_ci } 165262306a36Sopenharmony_ci if (!list_empty(&data.dispose)) 165362306a36Sopenharmony_ci shrink_dentry_list(&data.dispose); 165462306a36Sopenharmony_ci } 165562306a36Sopenharmony_ci} 165662306a36Sopenharmony_ciEXPORT_SYMBOL(shrink_dcache_parent); 165762306a36Sopenharmony_ci 165862306a36Sopenharmony_cistatic enum d_walk_ret umount_check(void *_data, struct dentry *dentry) 165962306a36Sopenharmony_ci{ 166062306a36Sopenharmony_ci /* it has busy descendents; complain about those instead */ 166162306a36Sopenharmony_ci if (!list_empty(&dentry->d_subdirs)) 166262306a36Sopenharmony_ci return D_WALK_CONTINUE; 166362306a36Sopenharmony_ci 166462306a36Sopenharmony_ci /* root with refcount 1 is fine */ 166562306a36Sopenharmony_ci if (dentry == _data && dentry->d_lockref.count == 1) 166662306a36Sopenharmony_ci return D_WALK_CONTINUE; 166762306a36Sopenharmony_ci 166862306a36Sopenharmony_ci WARN(1, "BUG: Dentry %p{i=%lx,n=%pd} " 166962306a36Sopenharmony_ci " still in use (%d) [unmount of %s %s]\n", 167062306a36Sopenharmony_ci dentry, 167162306a36Sopenharmony_ci dentry->d_inode ? 167262306a36Sopenharmony_ci dentry->d_inode->i_ino : 0UL, 167362306a36Sopenharmony_ci dentry, 167462306a36Sopenharmony_ci dentry->d_lockref.count, 167562306a36Sopenharmony_ci dentry->d_sb->s_type->name, 167662306a36Sopenharmony_ci dentry->d_sb->s_id); 167762306a36Sopenharmony_ci return D_WALK_CONTINUE; 167862306a36Sopenharmony_ci} 167962306a36Sopenharmony_ci 168062306a36Sopenharmony_cistatic void do_one_tree(struct dentry *dentry) 168162306a36Sopenharmony_ci{ 168262306a36Sopenharmony_ci shrink_dcache_parent(dentry); 168362306a36Sopenharmony_ci d_walk(dentry, dentry, umount_check); 168462306a36Sopenharmony_ci d_drop(dentry); 168562306a36Sopenharmony_ci dput(dentry); 168662306a36Sopenharmony_ci} 168762306a36Sopenharmony_ci 168862306a36Sopenharmony_ci/* 168962306a36Sopenharmony_ci * destroy the dentries attached to a superblock on unmounting 169062306a36Sopenharmony_ci */ 169162306a36Sopenharmony_civoid shrink_dcache_for_umount(struct super_block *sb) 169262306a36Sopenharmony_ci{ 169362306a36Sopenharmony_ci struct dentry *dentry; 169462306a36Sopenharmony_ci 169562306a36Sopenharmony_ci WARN(down_read_trylock(&sb->s_umount), "s_umount should've been locked"); 169662306a36Sopenharmony_ci 169762306a36Sopenharmony_ci dentry = sb->s_root; 169862306a36Sopenharmony_ci sb->s_root = NULL; 169962306a36Sopenharmony_ci do_one_tree(dentry); 170062306a36Sopenharmony_ci 170162306a36Sopenharmony_ci while (!hlist_bl_empty(&sb->s_roots)) { 170262306a36Sopenharmony_ci dentry = dget(hlist_bl_entry(hlist_bl_first(&sb->s_roots), struct dentry, d_hash)); 170362306a36Sopenharmony_ci do_one_tree(dentry); 170462306a36Sopenharmony_ci } 170562306a36Sopenharmony_ci} 170662306a36Sopenharmony_ci 170762306a36Sopenharmony_cistatic enum d_walk_ret find_submount(void *_data, struct dentry *dentry) 170862306a36Sopenharmony_ci{ 170962306a36Sopenharmony_ci struct dentry **victim = _data; 171062306a36Sopenharmony_ci if (d_mountpoint(dentry)) { 171162306a36Sopenharmony_ci __dget_dlock(dentry); 171262306a36Sopenharmony_ci *victim = dentry; 171362306a36Sopenharmony_ci return D_WALK_QUIT; 171462306a36Sopenharmony_ci } 171562306a36Sopenharmony_ci return D_WALK_CONTINUE; 171662306a36Sopenharmony_ci} 171762306a36Sopenharmony_ci 171862306a36Sopenharmony_ci/** 171962306a36Sopenharmony_ci * d_invalidate - detach submounts, prune dcache, and drop 172062306a36Sopenharmony_ci * @dentry: dentry to invalidate (aka detach, prune and drop) 172162306a36Sopenharmony_ci */ 172262306a36Sopenharmony_civoid d_invalidate(struct dentry *dentry) 172362306a36Sopenharmony_ci{ 172462306a36Sopenharmony_ci bool had_submounts = false; 172562306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 172662306a36Sopenharmony_ci if (d_unhashed(dentry)) { 172762306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 172862306a36Sopenharmony_ci return; 172962306a36Sopenharmony_ci } 173062306a36Sopenharmony_ci __d_drop(dentry); 173162306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 173262306a36Sopenharmony_ci 173362306a36Sopenharmony_ci /* Negative dentries can be dropped without further checks */ 173462306a36Sopenharmony_ci if (!dentry->d_inode) 173562306a36Sopenharmony_ci return; 173662306a36Sopenharmony_ci 173762306a36Sopenharmony_ci shrink_dcache_parent(dentry); 173862306a36Sopenharmony_ci for (;;) { 173962306a36Sopenharmony_ci struct dentry *victim = NULL; 174062306a36Sopenharmony_ci d_walk(dentry, &victim, find_submount); 174162306a36Sopenharmony_ci if (!victim) { 174262306a36Sopenharmony_ci if (had_submounts) 174362306a36Sopenharmony_ci shrink_dcache_parent(dentry); 174462306a36Sopenharmony_ci return; 174562306a36Sopenharmony_ci } 174662306a36Sopenharmony_ci had_submounts = true; 174762306a36Sopenharmony_ci detach_mounts(victim); 174862306a36Sopenharmony_ci dput(victim); 174962306a36Sopenharmony_ci } 175062306a36Sopenharmony_ci} 175162306a36Sopenharmony_ciEXPORT_SYMBOL(d_invalidate); 175262306a36Sopenharmony_ci 175362306a36Sopenharmony_ci/** 175462306a36Sopenharmony_ci * __d_alloc - allocate a dcache entry 175562306a36Sopenharmony_ci * @sb: filesystem it will belong to 175662306a36Sopenharmony_ci * @name: qstr of the name 175762306a36Sopenharmony_ci * 175862306a36Sopenharmony_ci * Allocates a dentry. It returns %NULL if there is insufficient memory 175962306a36Sopenharmony_ci * available. On a success the dentry is returned. The name passed in is 176062306a36Sopenharmony_ci * copied and the copy passed in may be reused after this call. 176162306a36Sopenharmony_ci */ 176262306a36Sopenharmony_ci 176362306a36Sopenharmony_cistatic struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name) 176462306a36Sopenharmony_ci{ 176562306a36Sopenharmony_ci struct dentry *dentry; 176662306a36Sopenharmony_ci char *dname; 176762306a36Sopenharmony_ci int err; 176862306a36Sopenharmony_ci 176962306a36Sopenharmony_ci dentry = kmem_cache_alloc_lru(dentry_cache, &sb->s_dentry_lru, 177062306a36Sopenharmony_ci GFP_KERNEL); 177162306a36Sopenharmony_ci if (!dentry) 177262306a36Sopenharmony_ci return NULL; 177362306a36Sopenharmony_ci 177462306a36Sopenharmony_ci /* 177562306a36Sopenharmony_ci * We guarantee that the inline name is always NUL-terminated. 177662306a36Sopenharmony_ci * This way the memcpy() done by the name switching in rename 177762306a36Sopenharmony_ci * will still always have a NUL at the end, even if we might 177862306a36Sopenharmony_ci * be overwriting an internal NUL character 177962306a36Sopenharmony_ci */ 178062306a36Sopenharmony_ci dentry->d_iname[DNAME_INLINE_LEN-1] = 0; 178162306a36Sopenharmony_ci if (unlikely(!name)) { 178262306a36Sopenharmony_ci name = &slash_name; 178362306a36Sopenharmony_ci dname = dentry->d_iname; 178462306a36Sopenharmony_ci } else if (name->len > DNAME_INLINE_LEN-1) { 178562306a36Sopenharmony_ci size_t size = offsetof(struct external_name, name[1]); 178662306a36Sopenharmony_ci struct external_name *p = kmalloc(size + name->len, 178762306a36Sopenharmony_ci GFP_KERNEL_ACCOUNT | 178862306a36Sopenharmony_ci __GFP_RECLAIMABLE); 178962306a36Sopenharmony_ci if (!p) { 179062306a36Sopenharmony_ci kmem_cache_free(dentry_cache, dentry); 179162306a36Sopenharmony_ci return NULL; 179262306a36Sopenharmony_ci } 179362306a36Sopenharmony_ci atomic_set(&p->u.count, 1); 179462306a36Sopenharmony_ci dname = p->name; 179562306a36Sopenharmony_ci } else { 179662306a36Sopenharmony_ci dname = dentry->d_iname; 179762306a36Sopenharmony_ci } 179862306a36Sopenharmony_ci 179962306a36Sopenharmony_ci dentry->d_name.len = name->len; 180062306a36Sopenharmony_ci dentry->d_name.hash = name->hash; 180162306a36Sopenharmony_ci memcpy(dname, name->name, name->len); 180262306a36Sopenharmony_ci dname[name->len] = 0; 180362306a36Sopenharmony_ci 180462306a36Sopenharmony_ci /* Make sure we always see the terminating NUL character */ 180562306a36Sopenharmony_ci smp_store_release(&dentry->d_name.name, dname); /* ^^^ */ 180662306a36Sopenharmony_ci 180762306a36Sopenharmony_ci dentry->d_lockref.count = 1; 180862306a36Sopenharmony_ci dentry->d_flags = 0; 180962306a36Sopenharmony_ci spin_lock_init(&dentry->d_lock); 181062306a36Sopenharmony_ci seqcount_spinlock_init(&dentry->d_seq, &dentry->d_lock); 181162306a36Sopenharmony_ci dentry->d_inode = NULL; 181262306a36Sopenharmony_ci dentry->d_parent = dentry; 181362306a36Sopenharmony_ci dentry->d_sb = sb; 181462306a36Sopenharmony_ci dentry->d_op = NULL; 181562306a36Sopenharmony_ci dentry->d_fsdata = NULL; 181662306a36Sopenharmony_ci INIT_HLIST_BL_NODE(&dentry->d_hash); 181762306a36Sopenharmony_ci INIT_LIST_HEAD(&dentry->d_lru); 181862306a36Sopenharmony_ci INIT_LIST_HEAD(&dentry->d_subdirs); 181962306a36Sopenharmony_ci INIT_HLIST_NODE(&dentry->d_u.d_alias); 182062306a36Sopenharmony_ci INIT_LIST_HEAD(&dentry->d_child); 182162306a36Sopenharmony_ci d_set_d_op(dentry, dentry->d_sb->s_d_op); 182262306a36Sopenharmony_ci 182362306a36Sopenharmony_ci if (dentry->d_op && dentry->d_op->d_init) { 182462306a36Sopenharmony_ci err = dentry->d_op->d_init(dentry); 182562306a36Sopenharmony_ci if (err) { 182662306a36Sopenharmony_ci if (dname_external(dentry)) 182762306a36Sopenharmony_ci kfree(external_name(dentry)); 182862306a36Sopenharmony_ci kmem_cache_free(dentry_cache, dentry); 182962306a36Sopenharmony_ci return NULL; 183062306a36Sopenharmony_ci } 183162306a36Sopenharmony_ci } 183262306a36Sopenharmony_ci 183362306a36Sopenharmony_ci this_cpu_inc(nr_dentry); 183462306a36Sopenharmony_ci 183562306a36Sopenharmony_ci return dentry; 183662306a36Sopenharmony_ci} 183762306a36Sopenharmony_ci 183862306a36Sopenharmony_ci/** 183962306a36Sopenharmony_ci * d_alloc - allocate a dcache entry 184062306a36Sopenharmony_ci * @parent: parent of entry to allocate 184162306a36Sopenharmony_ci * @name: qstr of the name 184262306a36Sopenharmony_ci * 184362306a36Sopenharmony_ci * Allocates a dentry. It returns %NULL if there is insufficient memory 184462306a36Sopenharmony_ci * available. On a success the dentry is returned. The name passed in is 184562306a36Sopenharmony_ci * copied and the copy passed in may be reused after this call. 184662306a36Sopenharmony_ci */ 184762306a36Sopenharmony_cistruct dentry *d_alloc(struct dentry * parent, const struct qstr *name) 184862306a36Sopenharmony_ci{ 184962306a36Sopenharmony_ci struct dentry *dentry = __d_alloc(parent->d_sb, name); 185062306a36Sopenharmony_ci if (!dentry) 185162306a36Sopenharmony_ci return NULL; 185262306a36Sopenharmony_ci spin_lock(&parent->d_lock); 185362306a36Sopenharmony_ci /* 185462306a36Sopenharmony_ci * don't need child lock because it is not subject 185562306a36Sopenharmony_ci * to concurrency here 185662306a36Sopenharmony_ci */ 185762306a36Sopenharmony_ci __dget_dlock(parent); 185862306a36Sopenharmony_ci dentry->d_parent = parent; 185962306a36Sopenharmony_ci list_add(&dentry->d_child, &parent->d_subdirs); 186062306a36Sopenharmony_ci spin_unlock(&parent->d_lock); 186162306a36Sopenharmony_ci 186262306a36Sopenharmony_ci return dentry; 186362306a36Sopenharmony_ci} 186462306a36Sopenharmony_ciEXPORT_SYMBOL(d_alloc); 186562306a36Sopenharmony_ci 186662306a36Sopenharmony_cistruct dentry *d_alloc_anon(struct super_block *sb) 186762306a36Sopenharmony_ci{ 186862306a36Sopenharmony_ci return __d_alloc(sb, NULL); 186962306a36Sopenharmony_ci} 187062306a36Sopenharmony_ciEXPORT_SYMBOL(d_alloc_anon); 187162306a36Sopenharmony_ci 187262306a36Sopenharmony_cistruct dentry *d_alloc_cursor(struct dentry * parent) 187362306a36Sopenharmony_ci{ 187462306a36Sopenharmony_ci struct dentry *dentry = d_alloc_anon(parent->d_sb); 187562306a36Sopenharmony_ci if (dentry) { 187662306a36Sopenharmony_ci dentry->d_flags |= DCACHE_DENTRY_CURSOR; 187762306a36Sopenharmony_ci dentry->d_parent = dget(parent); 187862306a36Sopenharmony_ci } 187962306a36Sopenharmony_ci return dentry; 188062306a36Sopenharmony_ci} 188162306a36Sopenharmony_ci 188262306a36Sopenharmony_ci/** 188362306a36Sopenharmony_ci * d_alloc_pseudo - allocate a dentry (for lookup-less filesystems) 188462306a36Sopenharmony_ci * @sb: the superblock 188562306a36Sopenharmony_ci * @name: qstr of the name 188662306a36Sopenharmony_ci * 188762306a36Sopenharmony_ci * For a filesystem that just pins its dentries in memory and never 188862306a36Sopenharmony_ci * performs lookups at all, return an unhashed IS_ROOT dentry. 188962306a36Sopenharmony_ci * This is used for pipes, sockets et.al. - the stuff that should 189062306a36Sopenharmony_ci * never be anyone's children or parents. Unlike all other 189162306a36Sopenharmony_ci * dentries, these will not have RCU delay between dropping the 189262306a36Sopenharmony_ci * last reference and freeing them. 189362306a36Sopenharmony_ci * 189462306a36Sopenharmony_ci * The only user is alloc_file_pseudo() and that's what should 189562306a36Sopenharmony_ci * be considered a public interface. Don't use directly. 189662306a36Sopenharmony_ci */ 189762306a36Sopenharmony_cistruct dentry *d_alloc_pseudo(struct super_block *sb, const struct qstr *name) 189862306a36Sopenharmony_ci{ 189962306a36Sopenharmony_ci struct dentry *dentry = __d_alloc(sb, name); 190062306a36Sopenharmony_ci if (likely(dentry)) 190162306a36Sopenharmony_ci dentry->d_flags |= DCACHE_NORCU; 190262306a36Sopenharmony_ci return dentry; 190362306a36Sopenharmony_ci} 190462306a36Sopenharmony_ci 190562306a36Sopenharmony_cistruct dentry *d_alloc_name(struct dentry *parent, const char *name) 190662306a36Sopenharmony_ci{ 190762306a36Sopenharmony_ci struct qstr q; 190862306a36Sopenharmony_ci 190962306a36Sopenharmony_ci q.name = name; 191062306a36Sopenharmony_ci q.hash_len = hashlen_string(parent, name); 191162306a36Sopenharmony_ci return d_alloc(parent, &q); 191262306a36Sopenharmony_ci} 191362306a36Sopenharmony_ciEXPORT_SYMBOL(d_alloc_name); 191462306a36Sopenharmony_ci 191562306a36Sopenharmony_civoid d_set_d_op(struct dentry *dentry, const struct dentry_operations *op) 191662306a36Sopenharmony_ci{ 191762306a36Sopenharmony_ci WARN_ON_ONCE(dentry->d_op); 191862306a36Sopenharmony_ci WARN_ON_ONCE(dentry->d_flags & (DCACHE_OP_HASH | 191962306a36Sopenharmony_ci DCACHE_OP_COMPARE | 192062306a36Sopenharmony_ci DCACHE_OP_REVALIDATE | 192162306a36Sopenharmony_ci DCACHE_OP_WEAK_REVALIDATE | 192262306a36Sopenharmony_ci DCACHE_OP_DELETE | 192362306a36Sopenharmony_ci DCACHE_OP_REAL)); 192462306a36Sopenharmony_ci dentry->d_op = op; 192562306a36Sopenharmony_ci if (!op) 192662306a36Sopenharmony_ci return; 192762306a36Sopenharmony_ci if (op->d_hash) 192862306a36Sopenharmony_ci dentry->d_flags |= DCACHE_OP_HASH; 192962306a36Sopenharmony_ci if (op->d_compare) 193062306a36Sopenharmony_ci dentry->d_flags |= DCACHE_OP_COMPARE; 193162306a36Sopenharmony_ci if (op->d_revalidate) 193262306a36Sopenharmony_ci dentry->d_flags |= DCACHE_OP_REVALIDATE; 193362306a36Sopenharmony_ci if (op->d_weak_revalidate) 193462306a36Sopenharmony_ci dentry->d_flags |= DCACHE_OP_WEAK_REVALIDATE; 193562306a36Sopenharmony_ci if (op->d_delete) 193662306a36Sopenharmony_ci dentry->d_flags |= DCACHE_OP_DELETE; 193762306a36Sopenharmony_ci if (op->d_prune) 193862306a36Sopenharmony_ci dentry->d_flags |= DCACHE_OP_PRUNE; 193962306a36Sopenharmony_ci if (op->d_real) 194062306a36Sopenharmony_ci dentry->d_flags |= DCACHE_OP_REAL; 194162306a36Sopenharmony_ci 194262306a36Sopenharmony_ci} 194362306a36Sopenharmony_ciEXPORT_SYMBOL(d_set_d_op); 194462306a36Sopenharmony_ci 194562306a36Sopenharmony_ci 194662306a36Sopenharmony_ci/* 194762306a36Sopenharmony_ci * d_set_fallthru - Mark a dentry as falling through to a lower layer 194862306a36Sopenharmony_ci * @dentry - The dentry to mark 194962306a36Sopenharmony_ci * 195062306a36Sopenharmony_ci * Mark a dentry as falling through to the lower layer (as set with 195162306a36Sopenharmony_ci * d_pin_lower()). This flag may be recorded on the medium. 195262306a36Sopenharmony_ci */ 195362306a36Sopenharmony_civoid d_set_fallthru(struct dentry *dentry) 195462306a36Sopenharmony_ci{ 195562306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 195662306a36Sopenharmony_ci dentry->d_flags |= DCACHE_FALLTHRU; 195762306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 195862306a36Sopenharmony_ci} 195962306a36Sopenharmony_ciEXPORT_SYMBOL(d_set_fallthru); 196062306a36Sopenharmony_ci 196162306a36Sopenharmony_cistatic unsigned d_flags_for_inode(struct inode *inode) 196262306a36Sopenharmony_ci{ 196362306a36Sopenharmony_ci unsigned add_flags = DCACHE_REGULAR_TYPE; 196462306a36Sopenharmony_ci 196562306a36Sopenharmony_ci if (!inode) 196662306a36Sopenharmony_ci return DCACHE_MISS_TYPE; 196762306a36Sopenharmony_ci 196862306a36Sopenharmony_ci if (S_ISDIR(inode->i_mode)) { 196962306a36Sopenharmony_ci add_flags = DCACHE_DIRECTORY_TYPE; 197062306a36Sopenharmony_ci if (unlikely(!(inode->i_opflags & IOP_LOOKUP))) { 197162306a36Sopenharmony_ci if (unlikely(!inode->i_op->lookup)) 197262306a36Sopenharmony_ci add_flags = DCACHE_AUTODIR_TYPE; 197362306a36Sopenharmony_ci else 197462306a36Sopenharmony_ci inode->i_opflags |= IOP_LOOKUP; 197562306a36Sopenharmony_ci } 197662306a36Sopenharmony_ci goto type_determined; 197762306a36Sopenharmony_ci } 197862306a36Sopenharmony_ci 197962306a36Sopenharmony_ci if (unlikely(!(inode->i_opflags & IOP_NOFOLLOW))) { 198062306a36Sopenharmony_ci if (unlikely(inode->i_op->get_link)) { 198162306a36Sopenharmony_ci add_flags = DCACHE_SYMLINK_TYPE; 198262306a36Sopenharmony_ci goto type_determined; 198362306a36Sopenharmony_ci } 198462306a36Sopenharmony_ci inode->i_opflags |= IOP_NOFOLLOW; 198562306a36Sopenharmony_ci } 198662306a36Sopenharmony_ci 198762306a36Sopenharmony_ci if (unlikely(!S_ISREG(inode->i_mode))) 198862306a36Sopenharmony_ci add_flags = DCACHE_SPECIAL_TYPE; 198962306a36Sopenharmony_ci 199062306a36Sopenharmony_citype_determined: 199162306a36Sopenharmony_ci if (unlikely(IS_AUTOMOUNT(inode))) 199262306a36Sopenharmony_ci add_flags |= DCACHE_NEED_AUTOMOUNT; 199362306a36Sopenharmony_ci return add_flags; 199462306a36Sopenharmony_ci} 199562306a36Sopenharmony_ci 199662306a36Sopenharmony_cistatic void __d_instantiate(struct dentry *dentry, struct inode *inode) 199762306a36Sopenharmony_ci{ 199862306a36Sopenharmony_ci unsigned add_flags = d_flags_for_inode(inode); 199962306a36Sopenharmony_ci WARN_ON(d_in_lookup(dentry)); 200062306a36Sopenharmony_ci 200162306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 200262306a36Sopenharmony_ci /* 200362306a36Sopenharmony_ci * Decrement negative dentry count if it was in the LRU list. 200462306a36Sopenharmony_ci */ 200562306a36Sopenharmony_ci if (dentry->d_flags & DCACHE_LRU_LIST) 200662306a36Sopenharmony_ci this_cpu_dec(nr_dentry_negative); 200762306a36Sopenharmony_ci hlist_add_head(&dentry->d_u.d_alias, &inode->i_dentry); 200862306a36Sopenharmony_ci raw_write_seqcount_begin(&dentry->d_seq); 200962306a36Sopenharmony_ci __d_set_inode_and_type(dentry, inode, add_flags); 201062306a36Sopenharmony_ci raw_write_seqcount_end(&dentry->d_seq); 201162306a36Sopenharmony_ci fsnotify_update_flags(dentry); 201262306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 201362306a36Sopenharmony_ci} 201462306a36Sopenharmony_ci 201562306a36Sopenharmony_ci/** 201662306a36Sopenharmony_ci * d_instantiate - fill in inode information for a dentry 201762306a36Sopenharmony_ci * @entry: dentry to complete 201862306a36Sopenharmony_ci * @inode: inode to attach to this dentry 201962306a36Sopenharmony_ci * 202062306a36Sopenharmony_ci * Fill in inode information in the entry. 202162306a36Sopenharmony_ci * 202262306a36Sopenharmony_ci * This turns negative dentries into productive full members 202362306a36Sopenharmony_ci * of society. 202462306a36Sopenharmony_ci * 202562306a36Sopenharmony_ci * NOTE! This assumes that the inode count has been incremented 202662306a36Sopenharmony_ci * (or otherwise set) by the caller to indicate that it is now 202762306a36Sopenharmony_ci * in use by the dcache. 202862306a36Sopenharmony_ci */ 202962306a36Sopenharmony_ci 203062306a36Sopenharmony_civoid d_instantiate(struct dentry *entry, struct inode * inode) 203162306a36Sopenharmony_ci{ 203262306a36Sopenharmony_ci BUG_ON(!hlist_unhashed(&entry->d_u.d_alias)); 203362306a36Sopenharmony_ci if (inode) { 203462306a36Sopenharmony_ci security_d_instantiate(entry, inode); 203562306a36Sopenharmony_ci spin_lock(&inode->i_lock); 203662306a36Sopenharmony_ci __d_instantiate(entry, inode); 203762306a36Sopenharmony_ci spin_unlock(&inode->i_lock); 203862306a36Sopenharmony_ci } 203962306a36Sopenharmony_ci} 204062306a36Sopenharmony_ciEXPORT_SYMBOL(d_instantiate); 204162306a36Sopenharmony_ci 204262306a36Sopenharmony_ci/* 204362306a36Sopenharmony_ci * This should be equivalent to d_instantiate() + unlock_new_inode(), 204462306a36Sopenharmony_ci * with lockdep-related part of unlock_new_inode() done before 204562306a36Sopenharmony_ci * anything else. Use that instead of open-coding d_instantiate()/ 204662306a36Sopenharmony_ci * unlock_new_inode() combinations. 204762306a36Sopenharmony_ci */ 204862306a36Sopenharmony_civoid d_instantiate_new(struct dentry *entry, struct inode *inode) 204962306a36Sopenharmony_ci{ 205062306a36Sopenharmony_ci BUG_ON(!hlist_unhashed(&entry->d_u.d_alias)); 205162306a36Sopenharmony_ci BUG_ON(!inode); 205262306a36Sopenharmony_ci lockdep_annotate_inode_mutex_key(inode); 205362306a36Sopenharmony_ci security_d_instantiate(entry, inode); 205462306a36Sopenharmony_ci spin_lock(&inode->i_lock); 205562306a36Sopenharmony_ci __d_instantiate(entry, inode); 205662306a36Sopenharmony_ci WARN_ON(!(inode->i_state & I_NEW)); 205762306a36Sopenharmony_ci inode->i_state &= ~I_NEW & ~I_CREATING; 205862306a36Sopenharmony_ci smp_mb(); 205962306a36Sopenharmony_ci wake_up_bit(&inode->i_state, __I_NEW); 206062306a36Sopenharmony_ci spin_unlock(&inode->i_lock); 206162306a36Sopenharmony_ci} 206262306a36Sopenharmony_ciEXPORT_SYMBOL(d_instantiate_new); 206362306a36Sopenharmony_ci 206462306a36Sopenharmony_cistruct dentry *d_make_root(struct inode *root_inode) 206562306a36Sopenharmony_ci{ 206662306a36Sopenharmony_ci struct dentry *res = NULL; 206762306a36Sopenharmony_ci 206862306a36Sopenharmony_ci if (root_inode) { 206962306a36Sopenharmony_ci res = d_alloc_anon(root_inode->i_sb); 207062306a36Sopenharmony_ci if (res) 207162306a36Sopenharmony_ci d_instantiate(res, root_inode); 207262306a36Sopenharmony_ci else 207362306a36Sopenharmony_ci iput(root_inode); 207462306a36Sopenharmony_ci } 207562306a36Sopenharmony_ci return res; 207662306a36Sopenharmony_ci} 207762306a36Sopenharmony_ciEXPORT_SYMBOL(d_make_root); 207862306a36Sopenharmony_ci 207962306a36Sopenharmony_cistatic struct dentry *__d_instantiate_anon(struct dentry *dentry, 208062306a36Sopenharmony_ci struct inode *inode, 208162306a36Sopenharmony_ci bool disconnected) 208262306a36Sopenharmony_ci{ 208362306a36Sopenharmony_ci struct dentry *res; 208462306a36Sopenharmony_ci unsigned add_flags; 208562306a36Sopenharmony_ci 208662306a36Sopenharmony_ci security_d_instantiate(dentry, inode); 208762306a36Sopenharmony_ci spin_lock(&inode->i_lock); 208862306a36Sopenharmony_ci res = __d_find_any_alias(inode); 208962306a36Sopenharmony_ci if (res) { 209062306a36Sopenharmony_ci spin_unlock(&inode->i_lock); 209162306a36Sopenharmony_ci dput(dentry); 209262306a36Sopenharmony_ci goto out_iput; 209362306a36Sopenharmony_ci } 209462306a36Sopenharmony_ci 209562306a36Sopenharmony_ci /* attach a disconnected dentry */ 209662306a36Sopenharmony_ci add_flags = d_flags_for_inode(inode); 209762306a36Sopenharmony_ci 209862306a36Sopenharmony_ci if (disconnected) 209962306a36Sopenharmony_ci add_flags |= DCACHE_DISCONNECTED; 210062306a36Sopenharmony_ci 210162306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 210262306a36Sopenharmony_ci __d_set_inode_and_type(dentry, inode, add_flags); 210362306a36Sopenharmony_ci hlist_add_head(&dentry->d_u.d_alias, &inode->i_dentry); 210462306a36Sopenharmony_ci if (!disconnected) { 210562306a36Sopenharmony_ci hlist_bl_lock(&dentry->d_sb->s_roots); 210662306a36Sopenharmony_ci hlist_bl_add_head(&dentry->d_hash, &dentry->d_sb->s_roots); 210762306a36Sopenharmony_ci hlist_bl_unlock(&dentry->d_sb->s_roots); 210862306a36Sopenharmony_ci } 210962306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 211062306a36Sopenharmony_ci spin_unlock(&inode->i_lock); 211162306a36Sopenharmony_ci 211262306a36Sopenharmony_ci return dentry; 211362306a36Sopenharmony_ci 211462306a36Sopenharmony_ci out_iput: 211562306a36Sopenharmony_ci iput(inode); 211662306a36Sopenharmony_ci return res; 211762306a36Sopenharmony_ci} 211862306a36Sopenharmony_ci 211962306a36Sopenharmony_cistruct dentry *d_instantiate_anon(struct dentry *dentry, struct inode *inode) 212062306a36Sopenharmony_ci{ 212162306a36Sopenharmony_ci return __d_instantiate_anon(dentry, inode, true); 212262306a36Sopenharmony_ci} 212362306a36Sopenharmony_ciEXPORT_SYMBOL(d_instantiate_anon); 212462306a36Sopenharmony_ci 212562306a36Sopenharmony_cistatic struct dentry *__d_obtain_alias(struct inode *inode, bool disconnected) 212662306a36Sopenharmony_ci{ 212762306a36Sopenharmony_ci struct dentry *tmp; 212862306a36Sopenharmony_ci struct dentry *res; 212962306a36Sopenharmony_ci 213062306a36Sopenharmony_ci if (!inode) 213162306a36Sopenharmony_ci return ERR_PTR(-ESTALE); 213262306a36Sopenharmony_ci if (IS_ERR(inode)) 213362306a36Sopenharmony_ci return ERR_CAST(inode); 213462306a36Sopenharmony_ci 213562306a36Sopenharmony_ci res = d_find_any_alias(inode); 213662306a36Sopenharmony_ci if (res) 213762306a36Sopenharmony_ci goto out_iput; 213862306a36Sopenharmony_ci 213962306a36Sopenharmony_ci tmp = d_alloc_anon(inode->i_sb); 214062306a36Sopenharmony_ci if (!tmp) { 214162306a36Sopenharmony_ci res = ERR_PTR(-ENOMEM); 214262306a36Sopenharmony_ci goto out_iput; 214362306a36Sopenharmony_ci } 214462306a36Sopenharmony_ci 214562306a36Sopenharmony_ci return __d_instantiate_anon(tmp, inode, disconnected); 214662306a36Sopenharmony_ci 214762306a36Sopenharmony_ciout_iput: 214862306a36Sopenharmony_ci iput(inode); 214962306a36Sopenharmony_ci return res; 215062306a36Sopenharmony_ci} 215162306a36Sopenharmony_ci 215262306a36Sopenharmony_ci/** 215362306a36Sopenharmony_ci * d_obtain_alias - find or allocate a DISCONNECTED dentry for a given inode 215462306a36Sopenharmony_ci * @inode: inode to allocate the dentry for 215562306a36Sopenharmony_ci * 215662306a36Sopenharmony_ci * Obtain a dentry for an inode resulting from NFS filehandle conversion or 215762306a36Sopenharmony_ci * similar open by handle operations. The returned dentry may be anonymous, 215862306a36Sopenharmony_ci * or may have a full name (if the inode was already in the cache). 215962306a36Sopenharmony_ci * 216062306a36Sopenharmony_ci * When called on a directory inode, we must ensure that the inode only ever 216162306a36Sopenharmony_ci * has one dentry. If a dentry is found, that is returned instead of 216262306a36Sopenharmony_ci * allocating a new one. 216362306a36Sopenharmony_ci * 216462306a36Sopenharmony_ci * On successful return, the reference to the inode has been transferred 216562306a36Sopenharmony_ci * to the dentry. In case of an error the reference on the inode is released. 216662306a36Sopenharmony_ci * To make it easier to use in export operations a %NULL or IS_ERR inode may 216762306a36Sopenharmony_ci * be passed in and the error will be propagated to the return value, 216862306a36Sopenharmony_ci * with a %NULL @inode replaced by ERR_PTR(-ESTALE). 216962306a36Sopenharmony_ci */ 217062306a36Sopenharmony_cistruct dentry *d_obtain_alias(struct inode *inode) 217162306a36Sopenharmony_ci{ 217262306a36Sopenharmony_ci return __d_obtain_alias(inode, true); 217362306a36Sopenharmony_ci} 217462306a36Sopenharmony_ciEXPORT_SYMBOL(d_obtain_alias); 217562306a36Sopenharmony_ci 217662306a36Sopenharmony_ci/** 217762306a36Sopenharmony_ci * d_obtain_root - find or allocate a dentry for a given inode 217862306a36Sopenharmony_ci * @inode: inode to allocate the dentry for 217962306a36Sopenharmony_ci * 218062306a36Sopenharmony_ci * Obtain an IS_ROOT dentry for the root of a filesystem. 218162306a36Sopenharmony_ci * 218262306a36Sopenharmony_ci * We must ensure that directory inodes only ever have one dentry. If a 218362306a36Sopenharmony_ci * dentry is found, that is returned instead of allocating a new one. 218462306a36Sopenharmony_ci * 218562306a36Sopenharmony_ci * On successful return, the reference to the inode has been transferred 218662306a36Sopenharmony_ci * to the dentry. In case of an error the reference on the inode is 218762306a36Sopenharmony_ci * released. A %NULL or IS_ERR inode may be passed in and will be the 218862306a36Sopenharmony_ci * error will be propagate to the return value, with a %NULL @inode 218962306a36Sopenharmony_ci * replaced by ERR_PTR(-ESTALE). 219062306a36Sopenharmony_ci */ 219162306a36Sopenharmony_cistruct dentry *d_obtain_root(struct inode *inode) 219262306a36Sopenharmony_ci{ 219362306a36Sopenharmony_ci return __d_obtain_alias(inode, false); 219462306a36Sopenharmony_ci} 219562306a36Sopenharmony_ciEXPORT_SYMBOL(d_obtain_root); 219662306a36Sopenharmony_ci 219762306a36Sopenharmony_ci/** 219862306a36Sopenharmony_ci * d_add_ci - lookup or allocate new dentry with case-exact name 219962306a36Sopenharmony_ci * @inode: the inode case-insensitive lookup has found 220062306a36Sopenharmony_ci * @dentry: the negative dentry that was passed to the parent's lookup func 220162306a36Sopenharmony_ci * @name: the case-exact name to be associated with the returned dentry 220262306a36Sopenharmony_ci * 220362306a36Sopenharmony_ci * This is to avoid filling the dcache with case-insensitive names to the 220462306a36Sopenharmony_ci * same inode, only the actual correct case is stored in the dcache for 220562306a36Sopenharmony_ci * case-insensitive filesystems. 220662306a36Sopenharmony_ci * 220762306a36Sopenharmony_ci * For a case-insensitive lookup match and if the case-exact dentry 220862306a36Sopenharmony_ci * already exists in the dcache, use it and return it. 220962306a36Sopenharmony_ci * 221062306a36Sopenharmony_ci * If no entry exists with the exact case name, allocate new dentry with 221162306a36Sopenharmony_ci * the exact case, and return the spliced entry. 221262306a36Sopenharmony_ci */ 221362306a36Sopenharmony_cistruct dentry *d_add_ci(struct dentry *dentry, struct inode *inode, 221462306a36Sopenharmony_ci struct qstr *name) 221562306a36Sopenharmony_ci{ 221662306a36Sopenharmony_ci struct dentry *found, *res; 221762306a36Sopenharmony_ci 221862306a36Sopenharmony_ci /* 221962306a36Sopenharmony_ci * First check if a dentry matching the name already exists, 222062306a36Sopenharmony_ci * if not go ahead and create it now. 222162306a36Sopenharmony_ci */ 222262306a36Sopenharmony_ci found = d_hash_and_lookup(dentry->d_parent, name); 222362306a36Sopenharmony_ci if (found) { 222462306a36Sopenharmony_ci iput(inode); 222562306a36Sopenharmony_ci return found; 222662306a36Sopenharmony_ci } 222762306a36Sopenharmony_ci if (d_in_lookup(dentry)) { 222862306a36Sopenharmony_ci found = d_alloc_parallel(dentry->d_parent, name, 222962306a36Sopenharmony_ci dentry->d_wait); 223062306a36Sopenharmony_ci if (IS_ERR(found) || !d_in_lookup(found)) { 223162306a36Sopenharmony_ci iput(inode); 223262306a36Sopenharmony_ci return found; 223362306a36Sopenharmony_ci } 223462306a36Sopenharmony_ci } else { 223562306a36Sopenharmony_ci found = d_alloc(dentry->d_parent, name); 223662306a36Sopenharmony_ci if (!found) { 223762306a36Sopenharmony_ci iput(inode); 223862306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 223962306a36Sopenharmony_ci } 224062306a36Sopenharmony_ci } 224162306a36Sopenharmony_ci res = d_splice_alias(inode, found); 224262306a36Sopenharmony_ci if (res) { 224362306a36Sopenharmony_ci d_lookup_done(found); 224462306a36Sopenharmony_ci dput(found); 224562306a36Sopenharmony_ci return res; 224662306a36Sopenharmony_ci } 224762306a36Sopenharmony_ci return found; 224862306a36Sopenharmony_ci} 224962306a36Sopenharmony_ciEXPORT_SYMBOL(d_add_ci); 225062306a36Sopenharmony_ci 225162306a36Sopenharmony_ci/** 225262306a36Sopenharmony_ci * d_same_name - compare dentry name with case-exact name 225362306a36Sopenharmony_ci * @parent: parent dentry 225462306a36Sopenharmony_ci * @dentry: the negative dentry that was passed to the parent's lookup func 225562306a36Sopenharmony_ci * @name: the case-exact name to be associated with the returned dentry 225662306a36Sopenharmony_ci * 225762306a36Sopenharmony_ci * Return: true if names are same, or false 225862306a36Sopenharmony_ci */ 225962306a36Sopenharmony_cibool d_same_name(const struct dentry *dentry, const struct dentry *parent, 226062306a36Sopenharmony_ci const struct qstr *name) 226162306a36Sopenharmony_ci{ 226262306a36Sopenharmony_ci if (likely(!(parent->d_flags & DCACHE_OP_COMPARE))) { 226362306a36Sopenharmony_ci if (dentry->d_name.len != name->len) 226462306a36Sopenharmony_ci return false; 226562306a36Sopenharmony_ci return dentry_cmp(dentry, name->name, name->len) == 0; 226662306a36Sopenharmony_ci } 226762306a36Sopenharmony_ci return parent->d_op->d_compare(dentry, 226862306a36Sopenharmony_ci dentry->d_name.len, dentry->d_name.name, 226962306a36Sopenharmony_ci name) == 0; 227062306a36Sopenharmony_ci} 227162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(d_same_name); 227262306a36Sopenharmony_ci 227362306a36Sopenharmony_ci/* 227462306a36Sopenharmony_ci * This is __d_lookup_rcu() when the parent dentry has 227562306a36Sopenharmony_ci * DCACHE_OP_COMPARE, which makes things much nastier. 227662306a36Sopenharmony_ci */ 227762306a36Sopenharmony_cistatic noinline struct dentry *__d_lookup_rcu_op_compare( 227862306a36Sopenharmony_ci const struct dentry *parent, 227962306a36Sopenharmony_ci const struct qstr *name, 228062306a36Sopenharmony_ci unsigned *seqp) 228162306a36Sopenharmony_ci{ 228262306a36Sopenharmony_ci u64 hashlen = name->hash_len; 228362306a36Sopenharmony_ci struct hlist_bl_head *b = d_hash(hashlen_hash(hashlen)); 228462306a36Sopenharmony_ci struct hlist_bl_node *node; 228562306a36Sopenharmony_ci struct dentry *dentry; 228662306a36Sopenharmony_ci 228762306a36Sopenharmony_ci hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) { 228862306a36Sopenharmony_ci int tlen; 228962306a36Sopenharmony_ci const char *tname; 229062306a36Sopenharmony_ci unsigned seq; 229162306a36Sopenharmony_ci 229262306a36Sopenharmony_ciseqretry: 229362306a36Sopenharmony_ci seq = raw_seqcount_begin(&dentry->d_seq); 229462306a36Sopenharmony_ci if (dentry->d_parent != parent) 229562306a36Sopenharmony_ci continue; 229662306a36Sopenharmony_ci if (d_unhashed(dentry)) 229762306a36Sopenharmony_ci continue; 229862306a36Sopenharmony_ci if (dentry->d_name.hash != hashlen_hash(hashlen)) 229962306a36Sopenharmony_ci continue; 230062306a36Sopenharmony_ci tlen = dentry->d_name.len; 230162306a36Sopenharmony_ci tname = dentry->d_name.name; 230262306a36Sopenharmony_ci /* we want a consistent (name,len) pair */ 230362306a36Sopenharmony_ci if (read_seqcount_retry(&dentry->d_seq, seq)) { 230462306a36Sopenharmony_ci cpu_relax(); 230562306a36Sopenharmony_ci goto seqretry; 230662306a36Sopenharmony_ci } 230762306a36Sopenharmony_ci if (parent->d_op->d_compare(dentry, tlen, tname, name) != 0) 230862306a36Sopenharmony_ci continue; 230962306a36Sopenharmony_ci *seqp = seq; 231062306a36Sopenharmony_ci return dentry; 231162306a36Sopenharmony_ci } 231262306a36Sopenharmony_ci return NULL; 231362306a36Sopenharmony_ci} 231462306a36Sopenharmony_ci 231562306a36Sopenharmony_ci/** 231662306a36Sopenharmony_ci * __d_lookup_rcu - search for a dentry (racy, store-free) 231762306a36Sopenharmony_ci * @parent: parent dentry 231862306a36Sopenharmony_ci * @name: qstr of name we wish to find 231962306a36Sopenharmony_ci * @seqp: returns d_seq value at the point where the dentry was found 232062306a36Sopenharmony_ci * Returns: dentry, or NULL 232162306a36Sopenharmony_ci * 232262306a36Sopenharmony_ci * __d_lookup_rcu is the dcache lookup function for rcu-walk name 232362306a36Sopenharmony_ci * resolution (store-free path walking) design described in 232462306a36Sopenharmony_ci * Documentation/filesystems/path-lookup.txt. 232562306a36Sopenharmony_ci * 232662306a36Sopenharmony_ci * This is not to be used outside core vfs. 232762306a36Sopenharmony_ci * 232862306a36Sopenharmony_ci * __d_lookup_rcu must only be used in rcu-walk mode, ie. with vfsmount lock 232962306a36Sopenharmony_ci * held, and rcu_read_lock held. The returned dentry must not be stored into 233062306a36Sopenharmony_ci * without taking d_lock and checking d_seq sequence count against @seq 233162306a36Sopenharmony_ci * returned here. 233262306a36Sopenharmony_ci * 233362306a36Sopenharmony_ci * A refcount may be taken on the found dentry with the d_rcu_to_refcount 233462306a36Sopenharmony_ci * function. 233562306a36Sopenharmony_ci * 233662306a36Sopenharmony_ci * Alternatively, __d_lookup_rcu may be called again to look up the child of 233762306a36Sopenharmony_ci * the returned dentry, so long as its parent's seqlock is checked after the 233862306a36Sopenharmony_ci * child is looked up. Thus, an interlocking stepping of sequence lock checks 233962306a36Sopenharmony_ci * is formed, giving integrity down the path walk. 234062306a36Sopenharmony_ci * 234162306a36Sopenharmony_ci * NOTE! The caller *has* to check the resulting dentry against the sequence 234262306a36Sopenharmony_ci * number we've returned before using any of the resulting dentry state! 234362306a36Sopenharmony_ci */ 234462306a36Sopenharmony_cistruct dentry *__d_lookup_rcu(const struct dentry *parent, 234562306a36Sopenharmony_ci const struct qstr *name, 234662306a36Sopenharmony_ci unsigned *seqp) 234762306a36Sopenharmony_ci{ 234862306a36Sopenharmony_ci u64 hashlen = name->hash_len; 234962306a36Sopenharmony_ci const unsigned char *str = name->name; 235062306a36Sopenharmony_ci struct hlist_bl_head *b = d_hash(hashlen_hash(hashlen)); 235162306a36Sopenharmony_ci struct hlist_bl_node *node; 235262306a36Sopenharmony_ci struct dentry *dentry; 235362306a36Sopenharmony_ci 235462306a36Sopenharmony_ci /* 235562306a36Sopenharmony_ci * Note: There is significant duplication with __d_lookup_rcu which is 235662306a36Sopenharmony_ci * required to prevent single threaded performance regressions 235762306a36Sopenharmony_ci * especially on architectures where smp_rmb (in seqcounts) are costly. 235862306a36Sopenharmony_ci * Keep the two functions in sync. 235962306a36Sopenharmony_ci */ 236062306a36Sopenharmony_ci 236162306a36Sopenharmony_ci if (unlikely(parent->d_flags & DCACHE_OP_COMPARE)) 236262306a36Sopenharmony_ci return __d_lookup_rcu_op_compare(parent, name, seqp); 236362306a36Sopenharmony_ci 236462306a36Sopenharmony_ci /* 236562306a36Sopenharmony_ci * The hash list is protected using RCU. 236662306a36Sopenharmony_ci * 236762306a36Sopenharmony_ci * Carefully use d_seq when comparing a candidate dentry, to avoid 236862306a36Sopenharmony_ci * races with d_move(). 236962306a36Sopenharmony_ci * 237062306a36Sopenharmony_ci * It is possible that concurrent renames can mess up our list 237162306a36Sopenharmony_ci * walk here and result in missing our dentry, resulting in the 237262306a36Sopenharmony_ci * false-negative result. d_lookup() protects against concurrent 237362306a36Sopenharmony_ci * renames using rename_lock seqlock. 237462306a36Sopenharmony_ci * 237562306a36Sopenharmony_ci * See Documentation/filesystems/path-lookup.txt for more details. 237662306a36Sopenharmony_ci */ 237762306a36Sopenharmony_ci hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) { 237862306a36Sopenharmony_ci unsigned seq; 237962306a36Sopenharmony_ci 238062306a36Sopenharmony_ci /* 238162306a36Sopenharmony_ci * The dentry sequence count protects us from concurrent 238262306a36Sopenharmony_ci * renames, and thus protects parent and name fields. 238362306a36Sopenharmony_ci * 238462306a36Sopenharmony_ci * The caller must perform a seqcount check in order 238562306a36Sopenharmony_ci * to do anything useful with the returned dentry. 238662306a36Sopenharmony_ci * 238762306a36Sopenharmony_ci * NOTE! We do a "raw" seqcount_begin here. That means that 238862306a36Sopenharmony_ci * we don't wait for the sequence count to stabilize if it 238962306a36Sopenharmony_ci * is in the middle of a sequence change. If we do the slow 239062306a36Sopenharmony_ci * dentry compare, we will do seqretries until it is stable, 239162306a36Sopenharmony_ci * and if we end up with a successful lookup, we actually 239262306a36Sopenharmony_ci * want to exit RCU lookup anyway. 239362306a36Sopenharmony_ci * 239462306a36Sopenharmony_ci * Note that raw_seqcount_begin still *does* smp_rmb(), so 239562306a36Sopenharmony_ci * we are still guaranteed NUL-termination of ->d_name.name. 239662306a36Sopenharmony_ci */ 239762306a36Sopenharmony_ci seq = raw_seqcount_begin(&dentry->d_seq); 239862306a36Sopenharmony_ci if (dentry->d_parent != parent) 239962306a36Sopenharmony_ci continue; 240062306a36Sopenharmony_ci if (d_unhashed(dentry)) 240162306a36Sopenharmony_ci continue; 240262306a36Sopenharmony_ci if (dentry->d_name.hash_len != hashlen) 240362306a36Sopenharmony_ci continue; 240462306a36Sopenharmony_ci if (dentry_cmp(dentry, str, hashlen_len(hashlen)) != 0) 240562306a36Sopenharmony_ci continue; 240662306a36Sopenharmony_ci *seqp = seq; 240762306a36Sopenharmony_ci return dentry; 240862306a36Sopenharmony_ci } 240962306a36Sopenharmony_ci return NULL; 241062306a36Sopenharmony_ci} 241162306a36Sopenharmony_ci 241262306a36Sopenharmony_ci/** 241362306a36Sopenharmony_ci * d_lookup - search for a dentry 241462306a36Sopenharmony_ci * @parent: parent dentry 241562306a36Sopenharmony_ci * @name: qstr of name we wish to find 241662306a36Sopenharmony_ci * Returns: dentry, or NULL 241762306a36Sopenharmony_ci * 241862306a36Sopenharmony_ci * d_lookup searches the children of the parent dentry for the name in 241962306a36Sopenharmony_ci * question. If the dentry is found its reference count is incremented and the 242062306a36Sopenharmony_ci * dentry is returned. The caller must use dput to free the entry when it has 242162306a36Sopenharmony_ci * finished using it. %NULL is returned if the dentry does not exist. 242262306a36Sopenharmony_ci */ 242362306a36Sopenharmony_cistruct dentry *d_lookup(const struct dentry *parent, const struct qstr *name) 242462306a36Sopenharmony_ci{ 242562306a36Sopenharmony_ci struct dentry *dentry; 242662306a36Sopenharmony_ci unsigned seq; 242762306a36Sopenharmony_ci 242862306a36Sopenharmony_ci do { 242962306a36Sopenharmony_ci seq = read_seqbegin(&rename_lock); 243062306a36Sopenharmony_ci dentry = __d_lookup(parent, name); 243162306a36Sopenharmony_ci if (dentry) 243262306a36Sopenharmony_ci break; 243362306a36Sopenharmony_ci } while (read_seqretry(&rename_lock, seq)); 243462306a36Sopenharmony_ci return dentry; 243562306a36Sopenharmony_ci} 243662306a36Sopenharmony_ciEXPORT_SYMBOL(d_lookup); 243762306a36Sopenharmony_ci 243862306a36Sopenharmony_ci/** 243962306a36Sopenharmony_ci * __d_lookup - search for a dentry (racy) 244062306a36Sopenharmony_ci * @parent: parent dentry 244162306a36Sopenharmony_ci * @name: qstr of name we wish to find 244262306a36Sopenharmony_ci * Returns: dentry, or NULL 244362306a36Sopenharmony_ci * 244462306a36Sopenharmony_ci * __d_lookup is like d_lookup, however it may (rarely) return a 244562306a36Sopenharmony_ci * false-negative result due to unrelated rename activity. 244662306a36Sopenharmony_ci * 244762306a36Sopenharmony_ci * __d_lookup is slightly faster by avoiding rename_lock read seqlock, 244862306a36Sopenharmony_ci * however it must be used carefully, eg. with a following d_lookup in 244962306a36Sopenharmony_ci * the case of failure. 245062306a36Sopenharmony_ci * 245162306a36Sopenharmony_ci * __d_lookup callers must be commented. 245262306a36Sopenharmony_ci */ 245362306a36Sopenharmony_cistruct dentry *__d_lookup(const struct dentry *parent, const struct qstr *name) 245462306a36Sopenharmony_ci{ 245562306a36Sopenharmony_ci unsigned int hash = name->hash; 245662306a36Sopenharmony_ci struct hlist_bl_head *b = d_hash(hash); 245762306a36Sopenharmony_ci struct hlist_bl_node *node; 245862306a36Sopenharmony_ci struct dentry *found = NULL; 245962306a36Sopenharmony_ci struct dentry *dentry; 246062306a36Sopenharmony_ci 246162306a36Sopenharmony_ci /* 246262306a36Sopenharmony_ci * Note: There is significant duplication with __d_lookup_rcu which is 246362306a36Sopenharmony_ci * required to prevent single threaded performance regressions 246462306a36Sopenharmony_ci * especially on architectures where smp_rmb (in seqcounts) are costly. 246562306a36Sopenharmony_ci * Keep the two functions in sync. 246662306a36Sopenharmony_ci */ 246762306a36Sopenharmony_ci 246862306a36Sopenharmony_ci /* 246962306a36Sopenharmony_ci * The hash list is protected using RCU. 247062306a36Sopenharmony_ci * 247162306a36Sopenharmony_ci * Take d_lock when comparing a candidate dentry, to avoid races 247262306a36Sopenharmony_ci * with d_move(). 247362306a36Sopenharmony_ci * 247462306a36Sopenharmony_ci * It is possible that concurrent renames can mess up our list 247562306a36Sopenharmony_ci * walk here and result in missing our dentry, resulting in the 247662306a36Sopenharmony_ci * false-negative result. d_lookup() protects against concurrent 247762306a36Sopenharmony_ci * renames using rename_lock seqlock. 247862306a36Sopenharmony_ci * 247962306a36Sopenharmony_ci * See Documentation/filesystems/path-lookup.txt for more details. 248062306a36Sopenharmony_ci */ 248162306a36Sopenharmony_ci rcu_read_lock(); 248262306a36Sopenharmony_ci 248362306a36Sopenharmony_ci hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) { 248462306a36Sopenharmony_ci 248562306a36Sopenharmony_ci if (dentry->d_name.hash != hash) 248662306a36Sopenharmony_ci continue; 248762306a36Sopenharmony_ci 248862306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 248962306a36Sopenharmony_ci if (dentry->d_parent != parent) 249062306a36Sopenharmony_ci goto next; 249162306a36Sopenharmony_ci if (d_unhashed(dentry)) 249262306a36Sopenharmony_ci goto next; 249362306a36Sopenharmony_ci 249462306a36Sopenharmony_ci if (!d_same_name(dentry, parent, name)) 249562306a36Sopenharmony_ci goto next; 249662306a36Sopenharmony_ci 249762306a36Sopenharmony_ci dentry->d_lockref.count++; 249862306a36Sopenharmony_ci found = dentry; 249962306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 250062306a36Sopenharmony_ci break; 250162306a36Sopenharmony_cinext: 250262306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 250362306a36Sopenharmony_ci } 250462306a36Sopenharmony_ci rcu_read_unlock(); 250562306a36Sopenharmony_ci 250662306a36Sopenharmony_ci return found; 250762306a36Sopenharmony_ci} 250862306a36Sopenharmony_ci 250962306a36Sopenharmony_ci/** 251062306a36Sopenharmony_ci * d_hash_and_lookup - hash the qstr then search for a dentry 251162306a36Sopenharmony_ci * @dir: Directory to search in 251262306a36Sopenharmony_ci * @name: qstr of name we wish to find 251362306a36Sopenharmony_ci * 251462306a36Sopenharmony_ci * On lookup failure NULL is returned; on bad name - ERR_PTR(-error) 251562306a36Sopenharmony_ci */ 251662306a36Sopenharmony_cistruct dentry *d_hash_and_lookup(struct dentry *dir, struct qstr *name) 251762306a36Sopenharmony_ci{ 251862306a36Sopenharmony_ci /* 251962306a36Sopenharmony_ci * Check for a fs-specific hash function. Note that we must 252062306a36Sopenharmony_ci * calculate the standard hash first, as the d_op->d_hash() 252162306a36Sopenharmony_ci * routine may choose to leave the hash value unchanged. 252262306a36Sopenharmony_ci */ 252362306a36Sopenharmony_ci name->hash = full_name_hash(dir, name->name, name->len); 252462306a36Sopenharmony_ci if (dir->d_flags & DCACHE_OP_HASH) { 252562306a36Sopenharmony_ci int err = dir->d_op->d_hash(dir, name); 252662306a36Sopenharmony_ci if (unlikely(err < 0)) 252762306a36Sopenharmony_ci return ERR_PTR(err); 252862306a36Sopenharmony_ci } 252962306a36Sopenharmony_ci return d_lookup(dir, name); 253062306a36Sopenharmony_ci} 253162306a36Sopenharmony_ciEXPORT_SYMBOL(d_hash_and_lookup); 253262306a36Sopenharmony_ci 253362306a36Sopenharmony_ci/* 253462306a36Sopenharmony_ci * When a file is deleted, we have two options: 253562306a36Sopenharmony_ci * - turn this dentry into a negative dentry 253662306a36Sopenharmony_ci * - unhash this dentry and free it. 253762306a36Sopenharmony_ci * 253862306a36Sopenharmony_ci * Usually, we want to just turn this into 253962306a36Sopenharmony_ci * a negative dentry, but if anybody else is 254062306a36Sopenharmony_ci * currently using the dentry or the inode 254162306a36Sopenharmony_ci * we can't do that and we fall back on removing 254262306a36Sopenharmony_ci * it from the hash queues and waiting for 254362306a36Sopenharmony_ci * it to be deleted later when it has no users 254462306a36Sopenharmony_ci */ 254562306a36Sopenharmony_ci 254662306a36Sopenharmony_ci/** 254762306a36Sopenharmony_ci * d_delete - delete a dentry 254862306a36Sopenharmony_ci * @dentry: The dentry to delete 254962306a36Sopenharmony_ci * 255062306a36Sopenharmony_ci * Turn the dentry into a negative dentry if possible, otherwise 255162306a36Sopenharmony_ci * remove it from the hash queues so it can be deleted later 255262306a36Sopenharmony_ci */ 255362306a36Sopenharmony_ci 255462306a36Sopenharmony_civoid d_delete(struct dentry * dentry) 255562306a36Sopenharmony_ci{ 255662306a36Sopenharmony_ci struct inode *inode = dentry->d_inode; 255762306a36Sopenharmony_ci 255862306a36Sopenharmony_ci spin_lock(&inode->i_lock); 255962306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 256062306a36Sopenharmony_ci /* 256162306a36Sopenharmony_ci * Are we the only user? 256262306a36Sopenharmony_ci */ 256362306a36Sopenharmony_ci if (dentry->d_lockref.count == 1) { 256462306a36Sopenharmony_ci dentry->d_flags &= ~DCACHE_CANT_MOUNT; 256562306a36Sopenharmony_ci dentry_unlink_inode(dentry); 256662306a36Sopenharmony_ci } else { 256762306a36Sopenharmony_ci __d_drop(dentry); 256862306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 256962306a36Sopenharmony_ci spin_unlock(&inode->i_lock); 257062306a36Sopenharmony_ci } 257162306a36Sopenharmony_ci} 257262306a36Sopenharmony_ciEXPORT_SYMBOL(d_delete); 257362306a36Sopenharmony_ci 257462306a36Sopenharmony_cistatic void __d_rehash(struct dentry *entry) 257562306a36Sopenharmony_ci{ 257662306a36Sopenharmony_ci struct hlist_bl_head *b = d_hash(entry->d_name.hash); 257762306a36Sopenharmony_ci 257862306a36Sopenharmony_ci hlist_bl_lock(b); 257962306a36Sopenharmony_ci hlist_bl_add_head_rcu(&entry->d_hash, b); 258062306a36Sopenharmony_ci hlist_bl_unlock(b); 258162306a36Sopenharmony_ci} 258262306a36Sopenharmony_ci 258362306a36Sopenharmony_ci/** 258462306a36Sopenharmony_ci * d_rehash - add an entry back to the hash 258562306a36Sopenharmony_ci * @entry: dentry to add to the hash 258662306a36Sopenharmony_ci * 258762306a36Sopenharmony_ci * Adds a dentry to the hash according to its name. 258862306a36Sopenharmony_ci */ 258962306a36Sopenharmony_ci 259062306a36Sopenharmony_civoid d_rehash(struct dentry * entry) 259162306a36Sopenharmony_ci{ 259262306a36Sopenharmony_ci spin_lock(&entry->d_lock); 259362306a36Sopenharmony_ci __d_rehash(entry); 259462306a36Sopenharmony_ci spin_unlock(&entry->d_lock); 259562306a36Sopenharmony_ci} 259662306a36Sopenharmony_ciEXPORT_SYMBOL(d_rehash); 259762306a36Sopenharmony_ci 259862306a36Sopenharmony_cistatic inline unsigned start_dir_add(struct inode *dir) 259962306a36Sopenharmony_ci{ 260062306a36Sopenharmony_ci preempt_disable_nested(); 260162306a36Sopenharmony_ci for (;;) { 260262306a36Sopenharmony_ci unsigned n = dir->i_dir_seq; 260362306a36Sopenharmony_ci if (!(n & 1) && cmpxchg(&dir->i_dir_seq, n, n + 1) == n) 260462306a36Sopenharmony_ci return n; 260562306a36Sopenharmony_ci cpu_relax(); 260662306a36Sopenharmony_ci } 260762306a36Sopenharmony_ci} 260862306a36Sopenharmony_ci 260962306a36Sopenharmony_cistatic inline void end_dir_add(struct inode *dir, unsigned int n, 261062306a36Sopenharmony_ci wait_queue_head_t *d_wait) 261162306a36Sopenharmony_ci{ 261262306a36Sopenharmony_ci smp_store_release(&dir->i_dir_seq, n + 2); 261362306a36Sopenharmony_ci preempt_enable_nested(); 261462306a36Sopenharmony_ci wake_up_all(d_wait); 261562306a36Sopenharmony_ci} 261662306a36Sopenharmony_ci 261762306a36Sopenharmony_cistatic void d_wait_lookup(struct dentry *dentry) 261862306a36Sopenharmony_ci{ 261962306a36Sopenharmony_ci if (d_in_lookup(dentry)) { 262062306a36Sopenharmony_ci DECLARE_WAITQUEUE(wait, current); 262162306a36Sopenharmony_ci add_wait_queue(dentry->d_wait, &wait); 262262306a36Sopenharmony_ci do { 262362306a36Sopenharmony_ci set_current_state(TASK_UNINTERRUPTIBLE); 262462306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 262562306a36Sopenharmony_ci schedule(); 262662306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 262762306a36Sopenharmony_ci } while (d_in_lookup(dentry)); 262862306a36Sopenharmony_ci } 262962306a36Sopenharmony_ci} 263062306a36Sopenharmony_ci 263162306a36Sopenharmony_cistruct dentry *d_alloc_parallel(struct dentry *parent, 263262306a36Sopenharmony_ci const struct qstr *name, 263362306a36Sopenharmony_ci wait_queue_head_t *wq) 263462306a36Sopenharmony_ci{ 263562306a36Sopenharmony_ci unsigned int hash = name->hash; 263662306a36Sopenharmony_ci struct hlist_bl_head *b = in_lookup_hash(parent, hash); 263762306a36Sopenharmony_ci struct hlist_bl_node *node; 263862306a36Sopenharmony_ci struct dentry *new = d_alloc(parent, name); 263962306a36Sopenharmony_ci struct dentry *dentry; 264062306a36Sopenharmony_ci unsigned seq, r_seq, d_seq; 264162306a36Sopenharmony_ci 264262306a36Sopenharmony_ci if (unlikely(!new)) 264362306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 264462306a36Sopenharmony_ci 264562306a36Sopenharmony_ciretry: 264662306a36Sopenharmony_ci rcu_read_lock(); 264762306a36Sopenharmony_ci seq = smp_load_acquire(&parent->d_inode->i_dir_seq); 264862306a36Sopenharmony_ci r_seq = read_seqbegin(&rename_lock); 264962306a36Sopenharmony_ci dentry = __d_lookup_rcu(parent, name, &d_seq); 265062306a36Sopenharmony_ci if (unlikely(dentry)) { 265162306a36Sopenharmony_ci if (!lockref_get_not_dead(&dentry->d_lockref)) { 265262306a36Sopenharmony_ci rcu_read_unlock(); 265362306a36Sopenharmony_ci goto retry; 265462306a36Sopenharmony_ci } 265562306a36Sopenharmony_ci if (read_seqcount_retry(&dentry->d_seq, d_seq)) { 265662306a36Sopenharmony_ci rcu_read_unlock(); 265762306a36Sopenharmony_ci dput(dentry); 265862306a36Sopenharmony_ci goto retry; 265962306a36Sopenharmony_ci } 266062306a36Sopenharmony_ci rcu_read_unlock(); 266162306a36Sopenharmony_ci dput(new); 266262306a36Sopenharmony_ci return dentry; 266362306a36Sopenharmony_ci } 266462306a36Sopenharmony_ci if (unlikely(read_seqretry(&rename_lock, r_seq))) { 266562306a36Sopenharmony_ci rcu_read_unlock(); 266662306a36Sopenharmony_ci goto retry; 266762306a36Sopenharmony_ci } 266862306a36Sopenharmony_ci 266962306a36Sopenharmony_ci if (unlikely(seq & 1)) { 267062306a36Sopenharmony_ci rcu_read_unlock(); 267162306a36Sopenharmony_ci goto retry; 267262306a36Sopenharmony_ci } 267362306a36Sopenharmony_ci 267462306a36Sopenharmony_ci hlist_bl_lock(b); 267562306a36Sopenharmony_ci if (unlikely(READ_ONCE(parent->d_inode->i_dir_seq) != seq)) { 267662306a36Sopenharmony_ci hlist_bl_unlock(b); 267762306a36Sopenharmony_ci rcu_read_unlock(); 267862306a36Sopenharmony_ci goto retry; 267962306a36Sopenharmony_ci } 268062306a36Sopenharmony_ci /* 268162306a36Sopenharmony_ci * No changes for the parent since the beginning of d_lookup(). 268262306a36Sopenharmony_ci * Since all removals from the chain happen with hlist_bl_lock(), 268362306a36Sopenharmony_ci * any potential in-lookup matches are going to stay here until 268462306a36Sopenharmony_ci * we unlock the chain. All fields are stable in everything 268562306a36Sopenharmony_ci * we encounter. 268662306a36Sopenharmony_ci */ 268762306a36Sopenharmony_ci hlist_bl_for_each_entry(dentry, node, b, d_u.d_in_lookup_hash) { 268862306a36Sopenharmony_ci if (dentry->d_name.hash != hash) 268962306a36Sopenharmony_ci continue; 269062306a36Sopenharmony_ci if (dentry->d_parent != parent) 269162306a36Sopenharmony_ci continue; 269262306a36Sopenharmony_ci if (!d_same_name(dentry, parent, name)) 269362306a36Sopenharmony_ci continue; 269462306a36Sopenharmony_ci hlist_bl_unlock(b); 269562306a36Sopenharmony_ci /* now we can try to grab a reference */ 269662306a36Sopenharmony_ci if (!lockref_get_not_dead(&dentry->d_lockref)) { 269762306a36Sopenharmony_ci rcu_read_unlock(); 269862306a36Sopenharmony_ci goto retry; 269962306a36Sopenharmony_ci } 270062306a36Sopenharmony_ci 270162306a36Sopenharmony_ci rcu_read_unlock(); 270262306a36Sopenharmony_ci /* 270362306a36Sopenharmony_ci * somebody is likely to be still doing lookup for it; 270462306a36Sopenharmony_ci * wait for them to finish 270562306a36Sopenharmony_ci */ 270662306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 270762306a36Sopenharmony_ci d_wait_lookup(dentry); 270862306a36Sopenharmony_ci /* 270962306a36Sopenharmony_ci * it's not in-lookup anymore; in principle we should repeat 271062306a36Sopenharmony_ci * everything from dcache lookup, but it's likely to be what 271162306a36Sopenharmony_ci * d_lookup() would've found anyway. If it is, just return it; 271262306a36Sopenharmony_ci * otherwise we really have to repeat the whole thing. 271362306a36Sopenharmony_ci */ 271462306a36Sopenharmony_ci if (unlikely(dentry->d_name.hash != hash)) 271562306a36Sopenharmony_ci goto mismatch; 271662306a36Sopenharmony_ci if (unlikely(dentry->d_parent != parent)) 271762306a36Sopenharmony_ci goto mismatch; 271862306a36Sopenharmony_ci if (unlikely(d_unhashed(dentry))) 271962306a36Sopenharmony_ci goto mismatch; 272062306a36Sopenharmony_ci if (unlikely(!d_same_name(dentry, parent, name))) 272162306a36Sopenharmony_ci goto mismatch; 272262306a36Sopenharmony_ci /* OK, it *is* a hashed match; return it */ 272362306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 272462306a36Sopenharmony_ci dput(new); 272562306a36Sopenharmony_ci return dentry; 272662306a36Sopenharmony_ci } 272762306a36Sopenharmony_ci rcu_read_unlock(); 272862306a36Sopenharmony_ci /* we can't take ->d_lock here; it's OK, though. */ 272962306a36Sopenharmony_ci new->d_flags |= DCACHE_PAR_LOOKUP; 273062306a36Sopenharmony_ci new->d_wait = wq; 273162306a36Sopenharmony_ci hlist_bl_add_head_rcu(&new->d_u.d_in_lookup_hash, b); 273262306a36Sopenharmony_ci hlist_bl_unlock(b); 273362306a36Sopenharmony_ci return new; 273462306a36Sopenharmony_cimismatch: 273562306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 273662306a36Sopenharmony_ci dput(dentry); 273762306a36Sopenharmony_ci goto retry; 273862306a36Sopenharmony_ci} 273962306a36Sopenharmony_ciEXPORT_SYMBOL(d_alloc_parallel); 274062306a36Sopenharmony_ci 274162306a36Sopenharmony_ci/* 274262306a36Sopenharmony_ci * - Unhash the dentry 274362306a36Sopenharmony_ci * - Retrieve and clear the waitqueue head in dentry 274462306a36Sopenharmony_ci * - Return the waitqueue head 274562306a36Sopenharmony_ci */ 274662306a36Sopenharmony_cistatic wait_queue_head_t *__d_lookup_unhash(struct dentry *dentry) 274762306a36Sopenharmony_ci{ 274862306a36Sopenharmony_ci wait_queue_head_t *d_wait; 274962306a36Sopenharmony_ci struct hlist_bl_head *b; 275062306a36Sopenharmony_ci 275162306a36Sopenharmony_ci lockdep_assert_held(&dentry->d_lock); 275262306a36Sopenharmony_ci 275362306a36Sopenharmony_ci b = in_lookup_hash(dentry->d_parent, dentry->d_name.hash); 275462306a36Sopenharmony_ci hlist_bl_lock(b); 275562306a36Sopenharmony_ci dentry->d_flags &= ~DCACHE_PAR_LOOKUP; 275662306a36Sopenharmony_ci __hlist_bl_del(&dentry->d_u.d_in_lookup_hash); 275762306a36Sopenharmony_ci d_wait = dentry->d_wait; 275862306a36Sopenharmony_ci dentry->d_wait = NULL; 275962306a36Sopenharmony_ci hlist_bl_unlock(b); 276062306a36Sopenharmony_ci INIT_HLIST_NODE(&dentry->d_u.d_alias); 276162306a36Sopenharmony_ci INIT_LIST_HEAD(&dentry->d_lru); 276262306a36Sopenharmony_ci return d_wait; 276362306a36Sopenharmony_ci} 276462306a36Sopenharmony_ci 276562306a36Sopenharmony_civoid __d_lookup_unhash_wake(struct dentry *dentry) 276662306a36Sopenharmony_ci{ 276762306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 276862306a36Sopenharmony_ci wake_up_all(__d_lookup_unhash(dentry)); 276962306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 277062306a36Sopenharmony_ci} 277162306a36Sopenharmony_ciEXPORT_SYMBOL(__d_lookup_unhash_wake); 277262306a36Sopenharmony_ci 277362306a36Sopenharmony_ci/* inode->i_lock held if inode is non-NULL */ 277462306a36Sopenharmony_ci 277562306a36Sopenharmony_cistatic inline void __d_add(struct dentry *dentry, struct inode *inode) 277662306a36Sopenharmony_ci{ 277762306a36Sopenharmony_ci wait_queue_head_t *d_wait; 277862306a36Sopenharmony_ci struct inode *dir = NULL; 277962306a36Sopenharmony_ci unsigned n; 278062306a36Sopenharmony_ci spin_lock(&dentry->d_lock); 278162306a36Sopenharmony_ci if (unlikely(d_in_lookup(dentry))) { 278262306a36Sopenharmony_ci dir = dentry->d_parent->d_inode; 278362306a36Sopenharmony_ci n = start_dir_add(dir); 278462306a36Sopenharmony_ci d_wait = __d_lookup_unhash(dentry); 278562306a36Sopenharmony_ci } 278662306a36Sopenharmony_ci if (inode) { 278762306a36Sopenharmony_ci unsigned add_flags = d_flags_for_inode(inode); 278862306a36Sopenharmony_ci hlist_add_head(&dentry->d_u.d_alias, &inode->i_dentry); 278962306a36Sopenharmony_ci raw_write_seqcount_begin(&dentry->d_seq); 279062306a36Sopenharmony_ci __d_set_inode_and_type(dentry, inode, add_flags); 279162306a36Sopenharmony_ci raw_write_seqcount_end(&dentry->d_seq); 279262306a36Sopenharmony_ci fsnotify_update_flags(dentry); 279362306a36Sopenharmony_ci } 279462306a36Sopenharmony_ci __d_rehash(dentry); 279562306a36Sopenharmony_ci if (dir) 279662306a36Sopenharmony_ci end_dir_add(dir, n, d_wait); 279762306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 279862306a36Sopenharmony_ci if (inode) 279962306a36Sopenharmony_ci spin_unlock(&inode->i_lock); 280062306a36Sopenharmony_ci} 280162306a36Sopenharmony_ci 280262306a36Sopenharmony_ci/** 280362306a36Sopenharmony_ci * d_add - add dentry to hash queues 280462306a36Sopenharmony_ci * @entry: dentry to add 280562306a36Sopenharmony_ci * @inode: The inode to attach to this dentry 280662306a36Sopenharmony_ci * 280762306a36Sopenharmony_ci * This adds the entry to the hash queues and initializes @inode. 280862306a36Sopenharmony_ci * The entry was actually filled in earlier during d_alloc(). 280962306a36Sopenharmony_ci */ 281062306a36Sopenharmony_ci 281162306a36Sopenharmony_civoid d_add(struct dentry *entry, struct inode *inode) 281262306a36Sopenharmony_ci{ 281362306a36Sopenharmony_ci if (inode) { 281462306a36Sopenharmony_ci security_d_instantiate(entry, inode); 281562306a36Sopenharmony_ci spin_lock(&inode->i_lock); 281662306a36Sopenharmony_ci } 281762306a36Sopenharmony_ci __d_add(entry, inode); 281862306a36Sopenharmony_ci} 281962306a36Sopenharmony_ciEXPORT_SYMBOL(d_add); 282062306a36Sopenharmony_ci 282162306a36Sopenharmony_ci/** 282262306a36Sopenharmony_ci * d_exact_alias - find and hash an exact unhashed alias 282362306a36Sopenharmony_ci * @entry: dentry to add 282462306a36Sopenharmony_ci * @inode: The inode to go with this dentry 282562306a36Sopenharmony_ci * 282662306a36Sopenharmony_ci * If an unhashed dentry with the same name/parent and desired 282762306a36Sopenharmony_ci * inode already exists, hash and return it. Otherwise, return 282862306a36Sopenharmony_ci * NULL. 282962306a36Sopenharmony_ci * 283062306a36Sopenharmony_ci * Parent directory should be locked. 283162306a36Sopenharmony_ci */ 283262306a36Sopenharmony_cistruct dentry *d_exact_alias(struct dentry *entry, struct inode *inode) 283362306a36Sopenharmony_ci{ 283462306a36Sopenharmony_ci struct dentry *alias; 283562306a36Sopenharmony_ci unsigned int hash = entry->d_name.hash; 283662306a36Sopenharmony_ci 283762306a36Sopenharmony_ci spin_lock(&inode->i_lock); 283862306a36Sopenharmony_ci hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) { 283962306a36Sopenharmony_ci /* 284062306a36Sopenharmony_ci * Don't need alias->d_lock here, because aliases with 284162306a36Sopenharmony_ci * d_parent == entry->d_parent are not subject to name or 284262306a36Sopenharmony_ci * parent changes, because the parent inode i_mutex is held. 284362306a36Sopenharmony_ci */ 284462306a36Sopenharmony_ci if (alias->d_name.hash != hash) 284562306a36Sopenharmony_ci continue; 284662306a36Sopenharmony_ci if (alias->d_parent != entry->d_parent) 284762306a36Sopenharmony_ci continue; 284862306a36Sopenharmony_ci if (!d_same_name(alias, entry->d_parent, &entry->d_name)) 284962306a36Sopenharmony_ci continue; 285062306a36Sopenharmony_ci spin_lock(&alias->d_lock); 285162306a36Sopenharmony_ci if (!d_unhashed(alias)) { 285262306a36Sopenharmony_ci spin_unlock(&alias->d_lock); 285362306a36Sopenharmony_ci alias = NULL; 285462306a36Sopenharmony_ci } else { 285562306a36Sopenharmony_ci __dget_dlock(alias); 285662306a36Sopenharmony_ci __d_rehash(alias); 285762306a36Sopenharmony_ci spin_unlock(&alias->d_lock); 285862306a36Sopenharmony_ci } 285962306a36Sopenharmony_ci spin_unlock(&inode->i_lock); 286062306a36Sopenharmony_ci return alias; 286162306a36Sopenharmony_ci } 286262306a36Sopenharmony_ci spin_unlock(&inode->i_lock); 286362306a36Sopenharmony_ci return NULL; 286462306a36Sopenharmony_ci} 286562306a36Sopenharmony_ciEXPORT_SYMBOL(d_exact_alias); 286662306a36Sopenharmony_ci 286762306a36Sopenharmony_cistatic void swap_names(struct dentry *dentry, struct dentry *target) 286862306a36Sopenharmony_ci{ 286962306a36Sopenharmony_ci if (unlikely(dname_external(target))) { 287062306a36Sopenharmony_ci if (unlikely(dname_external(dentry))) { 287162306a36Sopenharmony_ci /* 287262306a36Sopenharmony_ci * Both external: swap the pointers 287362306a36Sopenharmony_ci */ 287462306a36Sopenharmony_ci swap(target->d_name.name, dentry->d_name.name); 287562306a36Sopenharmony_ci } else { 287662306a36Sopenharmony_ci /* 287762306a36Sopenharmony_ci * dentry:internal, target:external. Steal target's 287862306a36Sopenharmony_ci * storage and make target internal. 287962306a36Sopenharmony_ci */ 288062306a36Sopenharmony_ci memcpy(target->d_iname, dentry->d_name.name, 288162306a36Sopenharmony_ci dentry->d_name.len + 1); 288262306a36Sopenharmony_ci dentry->d_name.name = target->d_name.name; 288362306a36Sopenharmony_ci target->d_name.name = target->d_iname; 288462306a36Sopenharmony_ci } 288562306a36Sopenharmony_ci } else { 288662306a36Sopenharmony_ci if (unlikely(dname_external(dentry))) { 288762306a36Sopenharmony_ci /* 288862306a36Sopenharmony_ci * dentry:external, target:internal. Give dentry's 288962306a36Sopenharmony_ci * storage to target and make dentry internal 289062306a36Sopenharmony_ci */ 289162306a36Sopenharmony_ci memcpy(dentry->d_iname, target->d_name.name, 289262306a36Sopenharmony_ci target->d_name.len + 1); 289362306a36Sopenharmony_ci target->d_name.name = dentry->d_name.name; 289462306a36Sopenharmony_ci dentry->d_name.name = dentry->d_iname; 289562306a36Sopenharmony_ci } else { 289662306a36Sopenharmony_ci /* 289762306a36Sopenharmony_ci * Both are internal. 289862306a36Sopenharmony_ci */ 289962306a36Sopenharmony_ci unsigned int i; 290062306a36Sopenharmony_ci BUILD_BUG_ON(!IS_ALIGNED(DNAME_INLINE_LEN, sizeof(long))); 290162306a36Sopenharmony_ci for (i = 0; i < DNAME_INLINE_LEN / sizeof(long); i++) { 290262306a36Sopenharmony_ci swap(((long *) &dentry->d_iname)[i], 290362306a36Sopenharmony_ci ((long *) &target->d_iname)[i]); 290462306a36Sopenharmony_ci } 290562306a36Sopenharmony_ci } 290662306a36Sopenharmony_ci } 290762306a36Sopenharmony_ci swap(dentry->d_name.hash_len, target->d_name.hash_len); 290862306a36Sopenharmony_ci} 290962306a36Sopenharmony_ci 291062306a36Sopenharmony_cistatic void copy_name(struct dentry *dentry, struct dentry *target) 291162306a36Sopenharmony_ci{ 291262306a36Sopenharmony_ci struct external_name *old_name = NULL; 291362306a36Sopenharmony_ci if (unlikely(dname_external(dentry))) 291462306a36Sopenharmony_ci old_name = external_name(dentry); 291562306a36Sopenharmony_ci if (unlikely(dname_external(target))) { 291662306a36Sopenharmony_ci atomic_inc(&external_name(target)->u.count); 291762306a36Sopenharmony_ci dentry->d_name = target->d_name; 291862306a36Sopenharmony_ci } else { 291962306a36Sopenharmony_ci memcpy(dentry->d_iname, target->d_name.name, 292062306a36Sopenharmony_ci target->d_name.len + 1); 292162306a36Sopenharmony_ci dentry->d_name.name = dentry->d_iname; 292262306a36Sopenharmony_ci dentry->d_name.hash_len = target->d_name.hash_len; 292362306a36Sopenharmony_ci } 292462306a36Sopenharmony_ci if (old_name && likely(atomic_dec_and_test(&old_name->u.count))) 292562306a36Sopenharmony_ci kfree_rcu(old_name, u.head); 292662306a36Sopenharmony_ci} 292762306a36Sopenharmony_ci 292862306a36Sopenharmony_ci/* 292962306a36Sopenharmony_ci * __d_move - move a dentry 293062306a36Sopenharmony_ci * @dentry: entry to move 293162306a36Sopenharmony_ci * @target: new dentry 293262306a36Sopenharmony_ci * @exchange: exchange the two dentries 293362306a36Sopenharmony_ci * 293462306a36Sopenharmony_ci * Update the dcache to reflect the move of a file name. Negative 293562306a36Sopenharmony_ci * dcache entries should not be moved in this way. Caller must hold 293662306a36Sopenharmony_ci * rename_lock, the i_mutex of the source and target directories, 293762306a36Sopenharmony_ci * and the sb->s_vfs_rename_mutex if they differ. See lock_rename(). 293862306a36Sopenharmony_ci */ 293962306a36Sopenharmony_cistatic void __d_move(struct dentry *dentry, struct dentry *target, 294062306a36Sopenharmony_ci bool exchange) 294162306a36Sopenharmony_ci{ 294262306a36Sopenharmony_ci struct dentry *old_parent, *p; 294362306a36Sopenharmony_ci wait_queue_head_t *d_wait; 294462306a36Sopenharmony_ci struct inode *dir = NULL; 294562306a36Sopenharmony_ci unsigned n; 294662306a36Sopenharmony_ci 294762306a36Sopenharmony_ci WARN_ON(!dentry->d_inode); 294862306a36Sopenharmony_ci if (WARN_ON(dentry == target)) 294962306a36Sopenharmony_ci return; 295062306a36Sopenharmony_ci 295162306a36Sopenharmony_ci BUG_ON(d_ancestor(target, dentry)); 295262306a36Sopenharmony_ci old_parent = dentry->d_parent; 295362306a36Sopenharmony_ci p = d_ancestor(old_parent, target); 295462306a36Sopenharmony_ci if (IS_ROOT(dentry)) { 295562306a36Sopenharmony_ci BUG_ON(p); 295662306a36Sopenharmony_ci spin_lock(&target->d_parent->d_lock); 295762306a36Sopenharmony_ci } else if (!p) { 295862306a36Sopenharmony_ci /* target is not a descendent of dentry->d_parent */ 295962306a36Sopenharmony_ci spin_lock(&target->d_parent->d_lock); 296062306a36Sopenharmony_ci spin_lock_nested(&old_parent->d_lock, DENTRY_D_LOCK_NESTED); 296162306a36Sopenharmony_ci } else { 296262306a36Sopenharmony_ci BUG_ON(p == dentry); 296362306a36Sopenharmony_ci spin_lock(&old_parent->d_lock); 296462306a36Sopenharmony_ci if (p != target) 296562306a36Sopenharmony_ci spin_lock_nested(&target->d_parent->d_lock, 296662306a36Sopenharmony_ci DENTRY_D_LOCK_NESTED); 296762306a36Sopenharmony_ci } 296862306a36Sopenharmony_ci spin_lock_nested(&dentry->d_lock, 2); 296962306a36Sopenharmony_ci spin_lock_nested(&target->d_lock, 3); 297062306a36Sopenharmony_ci 297162306a36Sopenharmony_ci if (unlikely(d_in_lookup(target))) { 297262306a36Sopenharmony_ci dir = target->d_parent->d_inode; 297362306a36Sopenharmony_ci n = start_dir_add(dir); 297462306a36Sopenharmony_ci d_wait = __d_lookup_unhash(target); 297562306a36Sopenharmony_ci } 297662306a36Sopenharmony_ci 297762306a36Sopenharmony_ci write_seqcount_begin(&dentry->d_seq); 297862306a36Sopenharmony_ci write_seqcount_begin_nested(&target->d_seq, DENTRY_D_LOCK_NESTED); 297962306a36Sopenharmony_ci 298062306a36Sopenharmony_ci /* unhash both */ 298162306a36Sopenharmony_ci if (!d_unhashed(dentry)) 298262306a36Sopenharmony_ci ___d_drop(dentry); 298362306a36Sopenharmony_ci if (!d_unhashed(target)) 298462306a36Sopenharmony_ci ___d_drop(target); 298562306a36Sopenharmony_ci 298662306a36Sopenharmony_ci /* ... and switch them in the tree */ 298762306a36Sopenharmony_ci dentry->d_parent = target->d_parent; 298862306a36Sopenharmony_ci if (!exchange) { 298962306a36Sopenharmony_ci copy_name(dentry, target); 299062306a36Sopenharmony_ci target->d_hash.pprev = NULL; 299162306a36Sopenharmony_ci dentry->d_parent->d_lockref.count++; 299262306a36Sopenharmony_ci if (dentry != old_parent) /* wasn't IS_ROOT */ 299362306a36Sopenharmony_ci WARN_ON(!--old_parent->d_lockref.count); 299462306a36Sopenharmony_ci } else { 299562306a36Sopenharmony_ci target->d_parent = old_parent; 299662306a36Sopenharmony_ci swap_names(dentry, target); 299762306a36Sopenharmony_ci list_move(&target->d_child, &target->d_parent->d_subdirs); 299862306a36Sopenharmony_ci __d_rehash(target); 299962306a36Sopenharmony_ci fsnotify_update_flags(target); 300062306a36Sopenharmony_ci } 300162306a36Sopenharmony_ci list_move(&dentry->d_child, &dentry->d_parent->d_subdirs); 300262306a36Sopenharmony_ci __d_rehash(dentry); 300362306a36Sopenharmony_ci fsnotify_update_flags(dentry); 300462306a36Sopenharmony_ci fscrypt_handle_d_move(dentry); 300562306a36Sopenharmony_ci 300662306a36Sopenharmony_ci write_seqcount_end(&target->d_seq); 300762306a36Sopenharmony_ci write_seqcount_end(&dentry->d_seq); 300862306a36Sopenharmony_ci 300962306a36Sopenharmony_ci if (dir) 301062306a36Sopenharmony_ci end_dir_add(dir, n, d_wait); 301162306a36Sopenharmony_ci 301262306a36Sopenharmony_ci if (dentry->d_parent != old_parent) 301362306a36Sopenharmony_ci spin_unlock(&dentry->d_parent->d_lock); 301462306a36Sopenharmony_ci if (dentry != old_parent) 301562306a36Sopenharmony_ci spin_unlock(&old_parent->d_lock); 301662306a36Sopenharmony_ci spin_unlock(&target->d_lock); 301762306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 301862306a36Sopenharmony_ci} 301962306a36Sopenharmony_ci 302062306a36Sopenharmony_ci/* 302162306a36Sopenharmony_ci * d_move - move a dentry 302262306a36Sopenharmony_ci * @dentry: entry to move 302362306a36Sopenharmony_ci * @target: new dentry 302462306a36Sopenharmony_ci * 302562306a36Sopenharmony_ci * Update the dcache to reflect the move of a file name. Negative 302662306a36Sopenharmony_ci * dcache entries should not be moved in this way. See the locking 302762306a36Sopenharmony_ci * requirements for __d_move. 302862306a36Sopenharmony_ci */ 302962306a36Sopenharmony_civoid d_move(struct dentry *dentry, struct dentry *target) 303062306a36Sopenharmony_ci{ 303162306a36Sopenharmony_ci write_seqlock(&rename_lock); 303262306a36Sopenharmony_ci __d_move(dentry, target, false); 303362306a36Sopenharmony_ci write_sequnlock(&rename_lock); 303462306a36Sopenharmony_ci} 303562306a36Sopenharmony_ciEXPORT_SYMBOL(d_move); 303662306a36Sopenharmony_ci 303762306a36Sopenharmony_ci/* 303862306a36Sopenharmony_ci * d_exchange - exchange two dentries 303962306a36Sopenharmony_ci * @dentry1: first dentry 304062306a36Sopenharmony_ci * @dentry2: second dentry 304162306a36Sopenharmony_ci */ 304262306a36Sopenharmony_civoid d_exchange(struct dentry *dentry1, struct dentry *dentry2) 304362306a36Sopenharmony_ci{ 304462306a36Sopenharmony_ci write_seqlock(&rename_lock); 304562306a36Sopenharmony_ci 304662306a36Sopenharmony_ci WARN_ON(!dentry1->d_inode); 304762306a36Sopenharmony_ci WARN_ON(!dentry2->d_inode); 304862306a36Sopenharmony_ci WARN_ON(IS_ROOT(dentry1)); 304962306a36Sopenharmony_ci WARN_ON(IS_ROOT(dentry2)); 305062306a36Sopenharmony_ci 305162306a36Sopenharmony_ci __d_move(dentry1, dentry2, true); 305262306a36Sopenharmony_ci 305362306a36Sopenharmony_ci write_sequnlock(&rename_lock); 305462306a36Sopenharmony_ci} 305562306a36Sopenharmony_ci 305662306a36Sopenharmony_ci/** 305762306a36Sopenharmony_ci * d_ancestor - search for an ancestor 305862306a36Sopenharmony_ci * @p1: ancestor dentry 305962306a36Sopenharmony_ci * @p2: child dentry 306062306a36Sopenharmony_ci * 306162306a36Sopenharmony_ci * Returns the ancestor dentry of p2 which is a child of p1, if p1 is 306262306a36Sopenharmony_ci * an ancestor of p2, else NULL. 306362306a36Sopenharmony_ci */ 306462306a36Sopenharmony_cistruct dentry *d_ancestor(struct dentry *p1, struct dentry *p2) 306562306a36Sopenharmony_ci{ 306662306a36Sopenharmony_ci struct dentry *p; 306762306a36Sopenharmony_ci 306862306a36Sopenharmony_ci for (p = p2; !IS_ROOT(p); p = p->d_parent) { 306962306a36Sopenharmony_ci if (p->d_parent == p1) 307062306a36Sopenharmony_ci return p; 307162306a36Sopenharmony_ci } 307262306a36Sopenharmony_ci return NULL; 307362306a36Sopenharmony_ci} 307462306a36Sopenharmony_ci 307562306a36Sopenharmony_ci/* 307662306a36Sopenharmony_ci * This helper attempts to cope with remotely renamed directories 307762306a36Sopenharmony_ci * 307862306a36Sopenharmony_ci * It assumes that the caller is already holding 307962306a36Sopenharmony_ci * dentry->d_parent->d_inode->i_mutex, and rename_lock 308062306a36Sopenharmony_ci * 308162306a36Sopenharmony_ci * Note: If ever the locking in lock_rename() changes, then please 308262306a36Sopenharmony_ci * remember to update this too... 308362306a36Sopenharmony_ci */ 308462306a36Sopenharmony_cistatic int __d_unalias(struct inode *inode, 308562306a36Sopenharmony_ci struct dentry *dentry, struct dentry *alias) 308662306a36Sopenharmony_ci{ 308762306a36Sopenharmony_ci struct mutex *m1 = NULL; 308862306a36Sopenharmony_ci struct rw_semaphore *m2 = NULL; 308962306a36Sopenharmony_ci int ret = -ESTALE; 309062306a36Sopenharmony_ci 309162306a36Sopenharmony_ci /* If alias and dentry share a parent, then no extra locks required */ 309262306a36Sopenharmony_ci if (alias->d_parent == dentry->d_parent) 309362306a36Sopenharmony_ci goto out_unalias; 309462306a36Sopenharmony_ci 309562306a36Sopenharmony_ci /* See lock_rename() */ 309662306a36Sopenharmony_ci if (!mutex_trylock(&dentry->d_sb->s_vfs_rename_mutex)) 309762306a36Sopenharmony_ci goto out_err; 309862306a36Sopenharmony_ci m1 = &dentry->d_sb->s_vfs_rename_mutex; 309962306a36Sopenharmony_ci if (!inode_trylock_shared(alias->d_parent->d_inode)) 310062306a36Sopenharmony_ci goto out_err; 310162306a36Sopenharmony_ci m2 = &alias->d_parent->d_inode->i_rwsem; 310262306a36Sopenharmony_ciout_unalias: 310362306a36Sopenharmony_ci __d_move(alias, dentry, false); 310462306a36Sopenharmony_ci ret = 0; 310562306a36Sopenharmony_ciout_err: 310662306a36Sopenharmony_ci if (m2) 310762306a36Sopenharmony_ci up_read(m2); 310862306a36Sopenharmony_ci if (m1) 310962306a36Sopenharmony_ci mutex_unlock(m1); 311062306a36Sopenharmony_ci return ret; 311162306a36Sopenharmony_ci} 311262306a36Sopenharmony_ci 311362306a36Sopenharmony_ci/** 311462306a36Sopenharmony_ci * d_splice_alias - splice a disconnected dentry into the tree if one exists 311562306a36Sopenharmony_ci * @inode: the inode which may have a disconnected dentry 311662306a36Sopenharmony_ci * @dentry: a negative dentry which we want to point to the inode. 311762306a36Sopenharmony_ci * 311862306a36Sopenharmony_ci * If inode is a directory and has an IS_ROOT alias, then d_move that in 311962306a36Sopenharmony_ci * place of the given dentry and return it, else simply d_add the inode 312062306a36Sopenharmony_ci * to the dentry and return NULL. 312162306a36Sopenharmony_ci * 312262306a36Sopenharmony_ci * If a non-IS_ROOT directory is found, the filesystem is corrupt, and 312362306a36Sopenharmony_ci * we should error out: directories can't have multiple aliases. 312462306a36Sopenharmony_ci * 312562306a36Sopenharmony_ci * This is needed in the lookup routine of any filesystem that is exportable 312662306a36Sopenharmony_ci * (via knfsd) so that we can build dcache paths to directories effectively. 312762306a36Sopenharmony_ci * 312862306a36Sopenharmony_ci * If a dentry was found and moved, then it is returned. Otherwise NULL 312962306a36Sopenharmony_ci * is returned. This matches the expected return value of ->lookup. 313062306a36Sopenharmony_ci * 313162306a36Sopenharmony_ci * Cluster filesystems may call this function with a negative, hashed dentry. 313262306a36Sopenharmony_ci * In that case, we know that the inode will be a regular file, and also this 313362306a36Sopenharmony_ci * will only occur during atomic_open. So we need to check for the dentry 313462306a36Sopenharmony_ci * being already hashed only in the final case. 313562306a36Sopenharmony_ci */ 313662306a36Sopenharmony_cistruct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry) 313762306a36Sopenharmony_ci{ 313862306a36Sopenharmony_ci if (IS_ERR(inode)) 313962306a36Sopenharmony_ci return ERR_CAST(inode); 314062306a36Sopenharmony_ci 314162306a36Sopenharmony_ci BUG_ON(!d_unhashed(dentry)); 314262306a36Sopenharmony_ci 314362306a36Sopenharmony_ci if (!inode) 314462306a36Sopenharmony_ci goto out; 314562306a36Sopenharmony_ci 314662306a36Sopenharmony_ci security_d_instantiate(dentry, inode); 314762306a36Sopenharmony_ci spin_lock(&inode->i_lock); 314862306a36Sopenharmony_ci if (S_ISDIR(inode->i_mode)) { 314962306a36Sopenharmony_ci struct dentry *new = __d_find_any_alias(inode); 315062306a36Sopenharmony_ci if (unlikely(new)) { 315162306a36Sopenharmony_ci /* The reference to new ensures it remains an alias */ 315262306a36Sopenharmony_ci spin_unlock(&inode->i_lock); 315362306a36Sopenharmony_ci write_seqlock(&rename_lock); 315462306a36Sopenharmony_ci if (unlikely(d_ancestor(new, dentry))) { 315562306a36Sopenharmony_ci write_sequnlock(&rename_lock); 315662306a36Sopenharmony_ci dput(new); 315762306a36Sopenharmony_ci new = ERR_PTR(-ELOOP); 315862306a36Sopenharmony_ci pr_warn_ratelimited( 315962306a36Sopenharmony_ci "VFS: Lookup of '%s' in %s %s" 316062306a36Sopenharmony_ci " would have caused loop\n", 316162306a36Sopenharmony_ci dentry->d_name.name, 316262306a36Sopenharmony_ci inode->i_sb->s_type->name, 316362306a36Sopenharmony_ci inode->i_sb->s_id); 316462306a36Sopenharmony_ci } else if (!IS_ROOT(new)) { 316562306a36Sopenharmony_ci struct dentry *old_parent = dget(new->d_parent); 316662306a36Sopenharmony_ci int err = __d_unalias(inode, dentry, new); 316762306a36Sopenharmony_ci write_sequnlock(&rename_lock); 316862306a36Sopenharmony_ci if (err) { 316962306a36Sopenharmony_ci dput(new); 317062306a36Sopenharmony_ci new = ERR_PTR(err); 317162306a36Sopenharmony_ci } 317262306a36Sopenharmony_ci dput(old_parent); 317362306a36Sopenharmony_ci } else { 317462306a36Sopenharmony_ci __d_move(new, dentry, false); 317562306a36Sopenharmony_ci write_sequnlock(&rename_lock); 317662306a36Sopenharmony_ci } 317762306a36Sopenharmony_ci iput(inode); 317862306a36Sopenharmony_ci return new; 317962306a36Sopenharmony_ci } 318062306a36Sopenharmony_ci } 318162306a36Sopenharmony_ciout: 318262306a36Sopenharmony_ci __d_add(dentry, inode); 318362306a36Sopenharmony_ci return NULL; 318462306a36Sopenharmony_ci} 318562306a36Sopenharmony_ciEXPORT_SYMBOL(d_splice_alias); 318662306a36Sopenharmony_ci 318762306a36Sopenharmony_ci/* 318862306a36Sopenharmony_ci * Test whether new_dentry is a subdirectory of old_dentry. 318962306a36Sopenharmony_ci * 319062306a36Sopenharmony_ci * Trivially implemented using the dcache structure 319162306a36Sopenharmony_ci */ 319262306a36Sopenharmony_ci 319362306a36Sopenharmony_ci/** 319462306a36Sopenharmony_ci * is_subdir - is new dentry a subdirectory of old_dentry 319562306a36Sopenharmony_ci * @new_dentry: new dentry 319662306a36Sopenharmony_ci * @old_dentry: old dentry 319762306a36Sopenharmony_ci * 319862306a36Sopenharmony_ci * Returns true if new_dentry is a subdirectory of the parent (at any depth). 319962306a36Sopenharmony_ci * Returns false otherwise. 320062306a36Sopenharmony_ci * Caller must ensure that "new_dentry" is pinned before calling is_subdir() 320162306a36Sopenharmony_ci */ 320262306a36Sopenharmony_ci 320362306a36Sopenharmony_cibool is_subdir(struct dentry *new_dentry, struct dentry *old_dentry) 320462306a36Sopenharmony_ci{ 320562306a36Sopenharmony_ci bool result; 320662306a36Sopenharmony_ci unsigned seq; 320762306a36Sopenharmony_ci 320862306a36Sopenharmony_ci if (new_dentry == old_dentry) 320962306a36Sopenharmony_ci return true; 321062306a36Sopenharmony_ci 321162306a36Sopenharmony_ci do { 321262306a36Sopenharmony_ci /* for restarting inner loop in case of seq retry */ 321362306a36Sopenharmony_ci seq = read_seqbegin(&rename_lock); 321462306a36Sopenharmony_ci /* 321562306a36Sopenharmony_ci * Need rcu_readlock to protect against the d_parent trashing 321662306a36Sopenharmony_ci * due to d_move 321762306a36Sopenharmony_ci */ 321862306a36Sopenharmony_ci rcu_read_lock(); 321962306a36Sopenharmony_ci if (d_ancestor(old_dentry, new_dentry)) 322062306a36Sopenharmony_ci result = true; 322162306a36Sopenharmony_ci else 322262306a36Sopenharmony_ci result = false; 322362306a36Sopenharmony_ci rcu_read_unlock(); 322462306a36Sopenharmony_ci } while (read_seqretry(&rename_lock, seq)); 322562306a36Sopenharmony_ci 322662306a36Sopenharmony_ci return result; 322762306a36Sopenharmony_ci} 322862306a36Sopenharmony_ciEXPORT_SYMBOL(is_subdir); 322962306a36Sopenharmony_ci 323062306a36Sopenharmony_cistatic enum d_walk_ret d_genocide_kill(void *data, struct dentry *dentry) 323162306a36Sopenharmony_ci{ 323262306a36Sopenharmony_ci struct dentry *root = data; 323362306a36Sopenharmony_ci if (dentry != root) { 323462306a36Sopenharmony_ci if (d_unhashed(dentry) || !dentry->d_inode) 323562306a36Sopenharmony_ci return D_WALK_SKIP; 323662306a36Sopenharmony_ci 323762306a36Sopenharmony_ci if (!(dentry->d_flags & DCACHE_GENOCIDE)) { 323862306a36Sopenharmony_ci dentry->d_flags |= DCACHE_GENOCIDE; 323962306a36Sopenharmony_ci dentry->d_lockref.count--; 324062306a36Sopenharmony_ci } 324162306a36Sopenharmony_ci } 324262306a36Sopenharmony_ci return D_WALK_CONTINUE; 324362306a36Sopenharmony_ci} 324462306a36Sopenharmony_ci 324562306a36Sopenharmony_civoid d_genocide(struct dentry *parent) 324662306a36Sopenharmony_ci{ 324762306a36Sopenharmony_ci d_walk(parent, parent, d_genocide_kill); 324862306a36Sopenharmony_ci} 324962306a36Sopenharmony_ci 325062306a36Sopenharmony_civoid d_tmpfile(struct file *file, struct inode *inode) 325162306a36Sopenharmony_ci{ 325262306a36Sopenharmony_ci struct dentry *dentry = file->f_path.dentry; 325362306a36Sopenharmony_ci 325462306a36Sopenharmony_ci inode_dec_link_count(inode); 325562306a36Sopenharmony_ci BUG_ON(dentry->d_name.name != dentry->d_iname || 325662306a36Sopenharmony_ci !hlist_unhashed(&dentry->d_u.d_alias) || 325762306a36Sopenharmony_ci !d_unlinked(dentry)); 325862306a36Sopenharmony_ci spin_lock(&dentry->d_parent->d_lock); 325962306a36Sopenharmony_ci spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED); 326062306a36Sopenharmony_ci dentry->d_name.len = sprintf(dentry->d_iname, "#%llu", 326162306a36Sopenharmony_ci (unsigned long long)inode->i_ino); 326262306a36Sopenharmony_ci spin_unlock(&dentry->d_lock); 326362306a36Sopenharmony_ci spin_unlock(&dentry->d_parent->d_lock); 326462306a36Sopenharmony_ci d_instantiate(dentry, inode); 326562306a36Sopenharmony_ci} 326662306a36Sopenharmony_ciEXPORT_SYMBOL(d_tmpfile); 326762306a36Sopenharmony_ci 326862306a36Sopenharmony_cistatic __initdata unsigned long dhash_entries; 326962306a36Sopenharmony_cistatic int __init set_dhash_entries(char *str) 327062306a36Sopenharmony_ci{ 327162306a36Sopenharmony_ci if (!str) 327262306a36Sopenharmony_ci return 0; 327362306a36Sopenharmony_ci dhash_entries = simple_strtoul(str, &str, 0); 327462306a36Sopenharmony_ci return 1; 327562306a36Sopenharmony_ci} 327662306a36Sopenharmony_ci__setup("dhash_entries=", set_dhash_entries); 327762306a36Sopenharmony_ci 327862306a36Sopenharmony_cistatic void __init dcache_init_early(void) 327962306a36Sopenharmony_ci{ 328062306a36Sopenharmony_ci /* If hashes are distributed across NUMA nodes, defer 328162306a36Sopenharmony_ci * hash allocation until vmalloc space is available. 328262306a36Sopenharmony_ci */ 328362306a36Sopenharmony_ci if (hashdist) 328462306a36Sopenharmony_ci return; 328562306a36Sopenharmony_ci 328662306a36Sopenharmony_ci dentry_hashtable = 328762306a36Sopenharmony_ci alloc_large_system_hash("Dentry cache", 328862306a36Sopenharmony_ci sizeof(struct hlist_bl_head), 328962306a36Sopenharmony_ci dhash_entries, 329062306a36Sopenharmony_ci 13, 329162306a36Sopenharmony_ci HASH_EARLY | HASH_ZERO, 329262306a36Sopenharmony_ci &d_hash_shift, 329362306a36Sopenharmony_ci NULL, 329462306a36Sopenharmony_ci 0, 329562306a36Sopenharmony_ci 0); 329662306a36Sopenharmony_ci d_hash_shift = 32 - d_hash_shift; 329762306a36Sopenharmony_ci} 329862306a36Sopenharmony_ci 329962306a36Sopenharmony_cistatic void __init dcache_init(void) 330062306a36Sopenharmony_ci{ 330162306a36Sopenharmony_ci /* 330262306a36Sopenharmony_ci * A constructor could be added for stable state like the lists, 330362306a36Sopenharmony_ci * but it is probably not worth it because of the cache nature 330462306a36Sopenharmony_ci * of the dcache. 330562306a36Sopenharmony_ci */ 330662306a36Sopenharmony_ci dentry_cache = KMEM_CACHE_USERCOPY(dentry, 330762306a36Sopenharmony_ci SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_MEM_SPREAD|SLAB_ACCOUNT, 330862306a36Sopenharmony_ci d_iname); 330962306a36Sopenharmony_ci 331062306a36Sopenharmony_ci /* Hash may have been set up in dcache_init_early */ 331162306a36Sopenharmony_ci if (!hashdist) 331262306a36Sopenharmony_ci return; 331362306a36Sopenharmony_ci 331462306a36Sopenharmony_ci dentry_hashtable = 331562306a36Sopenharmony_ci alloc_large_system_hash("Dentry cache", 331662306a36Sopenharmony_ci sizeof(struct hlist_bl_head), 331762306a36Sopenharmony_ci dhash_entries, 331862306a36Sopenharmony_ci 13, 331962306a36Sopenharmony_ci HASH_ZERO, 332062306a36Sopenharmony_ci &d_hash_shift, 332162306a36Sopenharmony_ci NULL, 332262306a36Sopenharmony_ci 0, 332362306a36Sopenharmony_ci 0); 332462306a36Sopenharmony_ci d_hash_shift = 32 - d_hash_shift; 332562306a36Sopenharmony_ci} 332662306a36Sopenharmony_ci 332762306a36Sopenharmony_ci/* SLAB cache for __getname() consumers */ 332862306a36Sopenharmony_cistruct kmem_cache *names_cachep __read_mostly; 332962306a36Sopenharmony_ciEXPORT_SYMBOL(names_cachep); 333062306a36Sopenharmony_ci 333162306a36Sopenharmony_civoid __init vfs_caches_init_early(void) 333262306a36Sopenharmony_ci{ 333362306a36Sopenharmony_ci int i; 333462306a36Sopenharmony_ci 333562306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(in_lookup_hashtable); i++) 333662306a36Sopenharmony_ci INIT_HLIST_BL_HEAD(&in_lookup_hashtable[i]); 333762306a36Sopenharmony_ci 333862306a36Sopenharmony_ci dcache_init_early(); 333962306a36Sopenharmony_ci inode_init_early(); 334062306a36Sopenharmony_ci} 334162306a36Sopenharmony_ci 334262306a36Sopenharmony_civoid __init vfs_caches_init(void) 334362306a36Sopenharmony_ci{ 334462306a36Sopenharmony_ci names_cachep = kmem_cache_create_usercopy("names_cache", PATH_MAX, 0, 334562306a36Sopenharmony_ci SLAB_HWCACHE_ALIGN|SLAB_PANIC, 0, PATH_MAX, NULL); 334662306a36Sopenharmony_ci 334762306a36Sopenharmony_ci dcache_init(); 334862306a36Sopenharmony_ci inode_init(); 334962306a36Sopenharmony_ci files_init(); 335062306a36Sopenharmony_ci files_maxfiles_init(); 335162306a36Sopenharmony_ci mnt_init(); 335262306a36Sopenharmony_ci bdev_cache_init(); 335362306a36Sopenharmony_ci chrdev_init(); 335462306a36Sopenharmony_ci} 3355