xref: /kernel/linux/linux-5.10/fs/dcache.c (revision 8c2ecf20)
18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * fs/dcache.c
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Complete reimplementation
68c2ecf20Sopenharmony_ci * (C) 1997 Thomas Schoebel-Theuer,
78c2ecf20Sopenharmony_ci * with heavy changes by Linus Torvalds
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci/*
118c2ecf20Sopenharmony_ci * Notes on the allocation strategy:
128c2ecf20Sopenharmony_ci *
138c2ecf20Sopenharmony_ci * The dcache is a master of the icache - whenever a dcache entry
148c2ecf20Sopenharmony_ci * exists, the inode will always exist. "iput()" is done either when
158c2ecf20Sopenharmony_ci * the dcache entry is deleted or garbage collected.
168c2ecf20Sopenharmony_ci */
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#include <linux/ratelimit.h>
198c2ecf20Sopenharmony_ci#include <linux/string.h>
208c2ecf20Sopenharmony_ci#include <linux/mm.h>
218c2ecf20Sopenharmony_ci#include <linux/fs.h>
228c2ecf20Sopenharmony_ci#include <linux/fscrypt.h>
238c2ecf20Sopenharmony_ci#include <linux/fsnotify.h>
248c2ecf20Sopenharmony_ci#include <linux/slab.h>
258c2ecf20Sopenharmony_ci#include <linux/init.h>
268c2ecf20Sopenharmony_ci#include <linux/hash.h>
278c2ecf20Sopenharmony_ci#include <linux/cache.h>
288c2ecf20Sopenharmony_ci#include <linux/export.h>
298c2ecf20Sopenharmony_ci#include <linux/security.h>
308c2ecf20Sopenharmony_ci#include <linux/seqlock.h>
318c2ecf20Sopenharmony_ci#include <linux/memblock.h>
328c2ecf20Sopenharmony_ci#include <linux/bit_spinlock.h>
338c2ecf20Sopenharmony_ci#include <linux/rculist_bl.h>
348c2ecf20Sopenharmony_ci#include <linux/list_lru.h>
358c2ecf20Sopenharmony_ci#include "internal.h"
368c2ecf20Sopenharmony_ci#include "mount.h"
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci/*
398c2ecf20Sopenharmony_ci * Usage:
408c2ecf20Sopenharmony_ci * dcache->d_inode->i_lock protects:
418c2ecf20Sopenharmony_ci *   - i_dentry, d_u.d_alias, d_inode of aliases
428c2ecf20Sopenharmony_ci * dcache_hash_bucket lock protects:
438c2ecf20Sopenharmony_ci *   - the dcache hash table
448c2ecf20Sopenharmony_ci * s_roots bl list spinlock protects:
458c2ecf20Sopenharmony_ci *   - the s_roots list (see __d_drop)
468c2ecf20Sopenharmony_ci * dentry->d_sb->s_dentry_lru_lock protects:
478c2ecf20Sopenharmony_ci *   - the dcache lru lists and counters
488c2ecf20Sopenharmony_ci * d_lock protects:
498c2ecf20Sopenharmony_ci *   - d_flags
508c2ecf20Sopenharmony_ci *   - d_name
518c2ecf20Sopenharmony_ci *   - d_lru
528c2ecf20Sopenharmony_ci *   - d_count
538c2ecf20Sopenharmony_ci *   - d_unhashed()
548c2ecf20Sopenharmony_ci *   - d_parent and d_subdirs
558c2ecf20Sopenharmony_ci *   - childrens' d_child and d_parent
568c2ecf20Sopenharmony_ci *   - d_u.d_alias, d_inode
578c2ecf20Sopenharmony_ci *
588c2ecf20Sopenharmony_ci * Ordering:
598c2ecf20Sopenharmony_ci * dentry->d_inode->i_lock
608c2ecf20Sopenharmony_ci *   dentry->d_lock
618c2ecf20Sopenharmony_ci *     dentry->d_sb->s_dentry_lru_lock
628c2ecf20Sopenharmony_ci *     dcache_hash_bucket lock
638c2ecf20Sopenharmony_ci *     s_roots lock
648c2ecf20Sopenharmony_ci *
658c2ecf20Sopenharmony_ci * If there is an ancestor relationship:
668c2ecf20Sopenharmony_ci * dentry->d_parent->...->d_parent->d_lock
678c2ecf20Sopenharmony_ci *   ...
688c2ecf20Sopenharmony_ci *     dentry->d_parent->d_lock
698c2ecf20Sopenharmony_ci *       dentry->d_lock
708c2ecf20Sopenharmony_ci *
718c2ecf20Sopenharmony_ci * If no ancestor relationship:
728c2ecf20Sopenharmony_ci * arbitrary, since it's serialized on rename_lock
738c2ecf20Sopenharmony_ci */
748c2ecf20Sopenharmony_ciint sysctl_vfs_cache_pressure __read_mostly = 100;
758c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(sysctl_vfs_cache_pressure);
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci__cacheline_aligned_in_smp DEFINE_SEQLOCK(rename_lock);
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ciEXPORT_SYMBOL(rename_lock);
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_cistatic struct kmem_cache *dentry_cache __read_mostly;
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ciconst struct qstr empty_name = QSTR_INIT("", 0);
848c2ecf20Sopenharmony_ciEXPORT_SYMBOL(empty_name);
858c2ecf20Sopenharmony_ciconst struct qstr slash_name = QSTR_INIT("/", 1);
868c2ecf20Sopenharmony_ciEXPORT_SYMBOL(slash_name);
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci/*
898c2ecf20Sopenharmony_ci * This is the single most critical data structure when it comes
908c2ecf20Sopenharmony_ci * to the dcache: the hashtable for lookups. Somebody should try
918c2ecf20Sopenharmony_ci * to make this good - I've just made it work.
928c2ecf20Sopenharmony_ci *
938c2ecf20Sopenharmony_ci * This hash-function tries to avoid losing too many bits of hash
948c2ecf20Sopenharmony_ci * information, yet avoid using a prime hash-size or similar.
958c2ecf20Sopenharmony_ci */
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_cistatic unsigned int d_hash_shift __read_mostly;
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_cistatic struct hlist_bl_head *dentry_hashtable __read_mostly;
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_cistatic inline struct hlist_bl_head *d_hash(unsigned int hash)
1028c2ecf20Sopenharmony_ci{
1038c2ecf20Sopenharmony_ci	return dentry_hashtable + (hash >> d_hash_shift);
1048c2ecf20Sopenharmony_ci}
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_ci#define IN_LOOKUP_SHIFT 10
1078c2ecf20Sopenharmony_cistatic struct hlist_bl_head in_lookup_hashtable[1 << IN_LOOKUP_SHIFT];
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_cistatic inline struct hlist_bl_head *in_lookup_hash(const struct dentry *parent,
1108c2ecf20Sopenharmony_ci					unsigned int hash)
1118c2ecf20Sopenharmony_ci{
1128c2ecf20Sopenharmony_ci	hash += (unsigned long) parent / L1_CACHE_BYTES;
1138c2ecf20Sopenharmony_ci	return in_lookup_hashtable + hash_32(hash, IN_LOOKUP_SHIFT);
1148c2ecf20Sopenharmony_ci}
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci/* Statistics gathering. */
1188c2ecf20Sopenharmony_cistruct dentry_stat_t dentry_stat = {
1198c2ecf20Sopenharmony_ci	.age_limit = 45,
1208c2ecf20Sopenharmony_ci};
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_cistatic DEFINE_PER_CPU(long, nr_dentry);
1238c2ecf20Sopenharmony_cistatic DEFINE_PER_CPU(long, nr_dentry_unused);
1248c2ecf20Sopenharmony_cistatic DEFINE_PER_CPU(long, nr_dentry_negative);
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_ci#if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS)
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_ci/*
1298c2ecf20Sopenharmony_ci * Here we resort to our own counters instead of using generic per-cpu counters
1308c2ecf20Sopenharmony_ci * for consistency with what the vfs inode code does. We are expected to harvest
1318c2ecf20Sopenharmony_ci * better code and performance by having our own specialized counters.
1328c2ecf20Sopenharmony_ci *
1338c2ecf20Sopenharmony_ci * Please note that the loop is done over all possible CPUs, not over all online
1348c2ecf20Sopenharmony_ci * CPUs. The reason for this is that we don't want to play games with CPUs going
1358c2ecf20Sopenharmony_ci * on and off. If one of them goes off, we will just keep their counters.
1368c2ecf20Sopenharmony_ci *
1378c2ecf20Sopenharmony_ci * glommer: See cffbc8a for details, and if you ever intend to change this,
1388c2ecf20Sopenharmony_ci * please update all vfs counters to match.
1398c2ecf20Sopenharmony_ci */
1408c2ecf20Sopenharmony_cistatic long get_nr_dentry(void)
1418c2ecf20Sopenharmony_ci{
1428c2ecf20Sopenharmony_ci	int i;
1438c2ecf20Sopenharmony_ci	long sum = 0;
1448c2ecf20Sopenharmony_ci	for_each_possible_cpu(i)
1458c2ecf20Sopenharmony_ci		sum += per_cpu(nr_dentry, i);
1468c2ecf20Sopenharmony_ci	return sum < 0 ? 0 : sum;
1478c2ecf20Sopenharmony_ci}
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_cistatic long get_nr_dentry_unused(void)
1508c2ecf20Sopenharmony_ci{
1518c2ecf20Sopenharmony_ci	int i;
1528c2ecf20Sopenharmony_ci	long sum = 0;
1538c2ecf20Sopenharmony_ci	for_each_possible_cpu(i)
1548c2ecf20Sopenharmony_ci		sum += per_cpu(nr_dentry_unused, i);
1558c2ecf20Sopenharmony_ci	return sum < 0 ? 0 : sum;
1568c2ecf20Sopenharmony_ci}
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_cistatic long get_nr_dentry_negative(void)
1598c2ecf20Sopenharmony_ci{
1608c2ecf20Sopenharmony_ci	int i;
1618c2ecf20Sopenharmony_ci	long sum = 0;
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci	for_each_possible_cpu(i)
1648c2ecf20Sopenharmony_ci		sum += per_cpu(nr_dentry_negative, i);
1658c2ecf20Sopenharmony_ci	return sum < 0 ? 0 : sum;
1668c2ecf20Sopenharmony_ci}
1678c2ecf20Sopenharmony_ci
1688c2ecf20Sopenharmony_ciint proc_nr_dentry(struct ctl_table *table, int write, void *buffer,
1698c2ecf20Sopenharmony_ci		   size_t *lenp, loff_t *ppos)
1708c2ecf20Sopenharmony_ci{
1718c2ecf20Sopenharmony_ci	dentry_stat.nr_dentry = get_nr_dentry();
1728c2ecf20Sopenharmony_ci	dentry_stat.nr_unused = get_nr_dentry_unused();
1738c2ecf20Sopenharmony_ci	dentry_stat.nr_negative = get_nr_dentry_negative();
1748c2ecf20Sopenharmony_ci	return proc_doulongvec_minmax(table, write, buffer, lenp, ppos);
1758c2ecf20Sopenharmony_ci}
1768c2ecf20Sopenharmony_ci#endif
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci/*
1798c2ecf20Sopenharmony_ci * Compare 2 name strings, return 0 if they match, otherwise non-zero.
1808c2ecf20Sopenharmony_ci * The strings are both count bytes long, and count is non-zero.
1818c2ecf20Sopenharmony_ci */
1828c2ecf20Sopenharmony_ci#ifdef CONFIG_DCACHE_WORD_ACCESS
1838c2ecf20Sopenharmony_ci
1848c2ecf20Sopenharmony_ci#include <asm/word-at-a-time.h>
1858c2ecf20Sopenharmony_ci/*
1868c2ecf20Sopenharmony_ci * NOTE! 'cs' and 'scount' come from a dentry, so it has a
1878c2ecf20Sopenharmony_ci * aligned allocation for this particular component. We don't
1888c2ecf20Sopenharmony_ci * strictly need the load_unaligned_zeropad() safety, but it
1898c2ecf20Sopenharmony_ci * doesn't hurt either.
1908c2ecf20Sopenharmony_ci *
1918c2ecf20Sopenharmony_ci * In contrast, 'ct' and 'tcount' can be from a pathname, and do
1928c2ecf20Sopenharmony_ci * need the careful unaligned handling.
1938c2ecf20Sopenharmony_ci */
1948c2ecf20Sopenharmony_cistatic inline int dentry_string_cmp(const unsigned char *cs, const unsigned char *ct, unsigned tcount)
1958c2ecf20Sopenharmony_ci{
1968c2ecf20Sopenharmony_ci	unsigned long a,b,mask;
1978c2ecf20Sopenharmony_ci
1988c2ecf20Sopenharmony_ci	for (;;) {
1998c2ecf20Sopenharmony_ci		a = read_word_at_a_time(cs);
2008c2ecf20Sopenharmony_ci		b = load_unaligned_zeropad(ct);
2018c2ecf20Sopenharmony_ci		if (tcount < sizeof(unsigned long))
2028c2ecf20Sopenharmony_ci			break;
2038c2ecf20Sopenharmony_ci		if (unlikely(a != b))
2048c2ecf20Sopenharmony_ci			return 1;
2058c2ecf20Sopenharmony_ci		cs += sizeof(unsigned long);
2068c2ecf20Sopenharmony_ci		ct += sizeof(unsigned long);
2078c2ecf20Sopenharmony_ci		tcount -= sizeof(unsigned long);
2088c2ecf20Sopenharmony_ci		if (!tcount)
2098c2ecf20Sopenharmony_ci			return 0;
2108c2ecf20Sopenharmony_ci	}
2118c2ecf20Sopenharmony_ci	mask = bytemask_from_count(tcount);
2128c2ecf20Sopenharmony_ci	return unlikely(!!((a ^ b) & mask));
2138c2ecf20Sopenharmony_ci}
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_ci#else
2168c2ecf20Sopenharmony_ci
2178c2ecf20Sopenharmony_cistatic inline int dentry_string_cmp(const unsigned char *cs, const unsigned char *ct, unsigned tcount)
2188c2ecf20Sopenharmony_ci{
2198c2ecf20Sopenharmony_ci	do {
2208c2ecf20Sopenharmony_ci		if (*cs != *ct)
2218c2ecf20Sopenharmony_ci			return 1;
2228c2ecf20Sopenharmony_ci		cs++;
2238c2ecf20Sopenharmony_ci		ct++;
2248c2ecf20Sopenharmony_ci		tcount--;
2258c2ecf20Sopenharmony_ci	} while (tcount);
2268c2ecf20Sopenharmony_ci	return 0;
2278c2ecf20Sopenharmony_ci}
2288c2ecf20Sopenharmony_ci
2298c2ecf20Sopenharmony_ci#endif
2308c2ecf20Sopenharmony_ci
2318c2ecf20Sopenharmony_cistatic inline int dentry_cmp(const struct dentry *dentry, const unsigned char *ct, unsigned tcount)
2328c2ecf20Sopenharmony_ci{
2338c2ecf20Sopenharmony_ci	/*
2348c2ecf20Sopenharmony_ci	 * Be careful about RCU walk racing with rename:
2358c2ecf20Sopenharmony_ci	 * use 'READ_ONCE' to fetch the name pointer.
2368c2ecf20Sopenharmony_ci	 *
2378c2ecf20Sopenharmony_ci	 * NOTE! Even if a rename will mean that the length
2388c2ecf20Sopenharmony_ci	 * was not loaded atomically, we don't care. The
2398c2ecf20Sopenharmony_ci	 * RCU walk will check the sequence count eventually,
2408c2ecf20Sopenharmony_ci	 * and catch it. And we won't overrun the buffer,
2418c2ecf20Sopenharmony_ci	 * because we're reading the name pointer atomically,
2428c2ecf20Sopenharmony_ci	 * and a dentry name is guaranteed to be properly
2438c2ecf20Sopenharmony_ci	 * terminated with a NUL byte.
2448c2ecf20Sopenharmony_ci	 *
2458c2ecf20Sopenharmony_ci	 * End result: even if 'len' is wrong, we'll exit
2468c2ecf20Sopenharmony_ci	 * early because the data cannot match (there can
2478c2ecf20Sopenharmony_ci	 * be no NUL in the ct/tcount data)
2488c2ecf20Sopenharmony_ci	 */
2498c2ecf20Sopenharmony_ci	const unsigned char *cs = READ_ONCE(dentry->d_name.name);
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_ci	return dentry_string_cmp(cs, ct, tcount);
2528c2ecf20Sopenharmony_ci}
2538c2ecf20Sopenharmony_ci
2548c2ecf20Sopenharmony_cistruct external_name {
2558c2ecf20Sopenharmony_ci	union {
2568c2ecf20Sopenharmony_ci		atomic_t count;
2578c2ecf20Sopenharmony_ci		struct rcu_head head;
2588c2ecf20Sopenharmony_ci	} u;
2598c2ecf20Sopenharmony_ci	unsigned char name[];
2608c2ecf20Sopenharmony_ci};
2618c2ecf20Sopenharmony_ci
2628c2ecf20Sopenharmony_cistatic inline struct external_name *external_name(struct dentry *dentry)
2638c2ecf20Sopenharmony_ci{
2648c2ecf20Sopenharmony_ci	return container_of(dentry->d_name.name, struct external_name, name[0]);
2658c2ecf20Sopenharmony_ci}
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_cistatic void __d_free(struct rcu_head *head)
2688c2ecf20Sopenharmony_ci{
2698c2ecf20Sopenharmony_ci	struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu);
2708c2ecf20Sopenharmony_ci
2718c2ecf20Sopenharmony_ci	kmem_cache_free(dentry_cache, dentry);
2728c2ecf20Sopenharmony_ci}
2738c2ecf20Sopenharmony_ci
2748c2ecf20Sopenharmony_cistatic void __d_free_external(struct rcu_head *head)
2758c2ecf20Sopenharmony_ci{
2768c2ecf20Sopenharmony_ci	struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu);
2778c2ecf20Sopenharmony_ci	kfree(external_name(dentry));
2788c2ecf20Sopenharmony_ci	kmem_cache_free(dentry_cache, dentry);
2798c2ecf20Sopenharmony_ci}
2808c2ecf20Sopenharmony_ci
2818c2ecf20Sopenharmony_cistatic inline int dname_external(const struct dentry *dentry)
2828c2ecf20Sopenharmony_ci{
2838c2ecf20Sopenharmony_ci	return dentry->d_name.name != dentry->d_iname;
2848c2ecf20Sopenharmony_ci}
2858c2ecf20Sopenharmony_ci
2868c2ecf20Sopenharmony_civoid take_dentry_name_snapshot(struct name_snapshot *name, struct dentry *dentry)
2878c2ecf20Sopenharmony_ci{
2888c2ecf20Sopenharmony_ci	spin_lock(&dentry->d_lock);
2898c2ecf20Sopenharmony_ci	name->name = dentry->d_name;
2908c2ecf20Sopenharmony_ci	if (unlikely(dname_external(dentry))) {
2918c2ecf20Sopenharmony_ci		atomic_inc(&external_name(dentry)->u.count);
2928c2ecf20Sopenharmony_ci	} else {
2938c2ecf20Sopenharmony_ci		memcpy(name->inline_name, dentry->d_iname,
2948c2ecf20Sopenharmony_ci		       dentry->d_name.len + 1);
2958c2ecf20Sopenharmony_ci		name->name.name = name->inline_name;
2968c2ecf20Sopenharmony_ci	}
2978c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
2988c2ecf20Sopenharmony_ci}
2998c2ecf20Sopenharmony_ciEXPORT_SYMBOL(take_dentry_name_snapshot);
3008c2ecf20Sopenharmony_ci
3018c2ecf20Sopenharmony_civoid release_dentry_name_snapshot(struct name_snapshot *name)
3028c2ecf20Sopenharmony_ci{
3038c2ecf20Sopenharmony_ci	if (unlikely(name->name.name != name->inline_name)) {
3048c2ecf20Sopenharmony_ci		struct external_name *p;
3058c2ecf20Sopenharmony_ci		p = container_of(name->name.name, struct external_name, name[0]);
3068c2ecf20Sopenharmony_ci		if (unlikely(atomic_dec_and_test(&p->u.count)))
3078c2ecf20Sopenharmony_ci			kfree_rcu(p, u.head);
3088c2ecf20Sopenharmony_ci	}
3098c2ecf20Sopenharmony_ci}
3108c2ecf20Sopenharmony_ciEXPORT_SYMBOL(release_dentry_name_snapshot);
3118c2ecf20Sopenharmony_ci
3128c2ecf20Sopenharmony_cistatic inline void __d_set_inode_and_type(struct dentry *dentry,
3138c2ecf20Sopenharmony_ci					  struct inode *inode,
3148c2ecf20Sopenharmony_ci					  unsigned type_flags)
3158c2ecf20Sopenharmony_ci{
3168c2ecf20Sopenharmony_ci	unsigned flags;
3178c2ecf20Sopenharmony_ci
3188c2ecf20Sopenharmony_ci	dentry->d_inode = inode;
3198c2ecf20Sopenharmony_ci	flags = READ_ONCE(dentry->d_flags);
3208c2ecf20Sopenharmony_ci	flags &= ~(DCACHE_ENTRY_TYPE | DCACHE_FALLTHRU);
3218c2ecf20Sopenharmony_ci	flags |= type_flags;
3228c2ecf20Sopenharmony_ci	smp_store_release(&dentry->d_flags, flags);
3238c2ecf20Sopenharmony_ci}
3248c2ecf20Sopenharmony_ci
3258c2ecf20Sopenharmony_cistatic inline void __d_clear_type_and_inode(struct dentry *dentry)
3268c2ecf20Sopenharmony_ci{
3278c2ecf20Sopenharmony_ci	unsigned flags = READ_ONCE(dentry->d_flags);
3288c2ecf20Sopenharmony_ci
3298c2ecf20Sopenharmony_ci	flags &= ~(DCACHE_ENTRY_TYPE | DCACHE_FALLTHRU);
3308c2ecf20Sopenharmony_ci	WRITE_ONCE(dentry->d_flags, flags);
3318c2ecf20Sopenharmony_ci	dentry->d_inode = NULL;
3328c2ecf20Sopenharmony_ci	if (dentry->d_flags & DCACHE_LRU_LIST)
3338c2ecf20Sopenharmony_ci		this_cpu_inc(nr_dentry_negative);
3348c2ecf20Sopenharmony_ci}
3358c2ecf20Sopenharmony_ci
3368c2ecf20Sopenharmony_cistatic void dentry_free(struct dentry *dentry)
3378c2ecf20Sopenharmony_ci{
3388c2ecf20Sopenharmony_ci	WARN_ON(!hlist_unhashed(&dentry->d_u.d_alias));
3398c2ecf20Sopenharmony_ci	if (unlikely(dname_external(dentry))) {
3408c2ecf20Sopenharmony_ci		struct external_name *p = external_name(dentry);
3418c2ecf20Sopenharmony_ci		if (likely(atomic_dec_and_test(&p->u.count))) {
3428c2ecf20Sopenharmony_ci			call_rcu(&dentry->d_u.d_rcu, __d_free_external);
3438c2ecf20Sopenharmony_ci			return;
3448c2ecf20Sopenharmony_ci		}
3458c2ecf20Sopenharmony_ci	}
3468c2ecf20Sopenharmony_ci	/* if dentry was never visible to RCU, immediate free is OK */
3478c2ecf20Sopenharmony_ci	if (dentry->d_flags & DCACHE_NORCU)
3488c2ecf20Sopenharmony_ci		__d_free(&dentry->d_u.d_rcu);
3498c2ecf20Sopenharmony_ci	else
3508c2ecf20Sopenharmony_ci		call_rcu(&dentry->d_u.d_rcu, __d_free);
3518c2ecf20Sopenharmony_ci}
3528c2ecf20Sopenharmony_ci
3538c2ecf20Sopenharmony_ci/*
3548c2ecf20Sopenharmony_ci * Release the dentry's inode, using the filesystem
3558c2ecf20Sopenharmony_ci * d_iput() operation if defined.
3568c2ecf20Sopenharmony_ci */
3578c2ecf20Sopenharmony_cistatic void dentry_unlink_inode(struct dentry * dentry)
3588c2ecf20Sopenharmony_ci	__releases(dentry->d_lock)
3598c2ecf20Sopenharmony_ci	__releases(dentry->d_inode->i_lock)
3608c2ecf20Sopenharmony_ci{
3618c2ecf20Sopenharmony_ci	struct inode *inode = dentry->d_inode;
3628c2ecf20Sopenharmony_ci
3638c2ecf20Sopenharmony_ci	raw_write_seqcount_begin(&dentry->d_seq);
3648c2ecf20Sopenharmony_ci	__d_clear_type_and_inode(dentry);
3658c2ecf20Sopenharmony_ci	hlist_del_init(&dentry->d_u.d_alias);
3668c2ecf20Sopenharmony_ci	raw_write_seqcount_end(&dentry->d_seq);
3678c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
3688c2ecf20Sopenharmony_ci	spin_unlock(&inode->i_lock);
3698c2ecf20Sopenharmony_ci	if (!inode->i_nlink)
3708c2ecf20Sopenharmony_ci		fsnotify_inoderemove(inode);
3718c2ecf20Sopenharmony_ci	if (dentry->d_op && dentry->d_op->d_iput)
3728c2ecf20Sopenharmony_ci		dentry->d_op->d_iput(dentry, inode);
3738c2ecf20Sopenharmony_ci	else
3748c2ecf20Sopenharmony_ci		iput(inode);
3758c2ecf20Sopenharmony_ci}
3768c2ecf20Sopenharmony_ci
3778c2ecf20Sopenharmony_ci/*
3788c2ecf20Sopenharmony_ci * The DCACHE_LRU_LIST bit is set whenever the 'd_lru' entry
3798c2ecf20Sopenharmony_ci * is in use - which includes both the "real" per-superblock
3808c2ecf20Sopenharmony_ci * LRU list _and_ the DCACHE_SHRINK_LIST use.
3818c2ecf20Sopenharmony_ci *
3828c2ecf20Sopenharmony_ci * The DCACHE_SHRINK_LIST bit is set whenever the dentry is
3838c2ecf20Sopenharmony_ci * on the shrink list (ie not on the superblock LRU list).
3848c2ecf20Sopenharmony_ci *
3858c2ecf20Sopenharmony_ci * The per-cpu "nr_dentry_unused" counters are updated with
3868c2ecf20Sopenharmony_ci * the DCACHE_LRU_LIST bit.
3878c2ecf20Sopenharmony_ci *
3888c2ecf20Sopenharmony_ci * The per-cpu "nr_dentry_negative" counters are only updated
3898c2ecf20Sopenharmony_ci * when deleted from or added to the per-superblock LRU list, not
3908c2ecf20Sopenharmony_ci * from/to the shrink list. That is to avoid an unneeded dec/inc
3918c2ecf20Sopenharmony_ci * pair when moving from LRU to shrink list in select_collect().
3928c2ecf20Sopenharmony_ci *
3938c2ecf20Sopenharmony_ci * These helper functions make sure we always follow the
3948c2ecf20Sopenharmony_ci * rules. d_lock must be held by the caller.
3958c2ecf20Sopenharmony_ci */
3968c2ecf20Sopenharmony_ci#define D_FLAG_VERIFY(dentry,x) WARN_ON_ONCE(((dentry)->d_flags & (DCACHE_LRU_LIST | DCACHE_SHRINK_LIST)) != (x))
3978c2ecf20Sopenharmony_cistatic void d_lru_add(struct dentry *dentry)
3988c2ecf20Sopenharmony_ci{
3998c2ecf20Sopenharmony_ci	D_FLAG_VERIFY(dentry, 0);
4008c2ecf20Sopenharmony_ci	dentry->d_flags |= DCACHE_LRU_LIST;
4018c2ecf20Sopenharmony_ci	this_cpu_inc(nr_dentry_unused);
4028c2ecf20Sopenharmony_ci	if (d_is_negative(dentry))
4038c2ecf20Sopenharmony_ci		this_cpu_inc(nr_dentry_negative);
4048c2ecf20Sopenharmony_ci	WARN_ON_ONCE(!list_lru_add(&dentry->d_sb->s_dentry_lru, &dentry->d_lru));
4058c2ecf20Sopenharmony_ci}
4068c2ecf20Sopenharmony_ci
4078c2ecf20Sopenharmony_cistatic void d_lru_del(struct dentry *dentry)
4088c2ecf20Sopenharmony_ci{
4098c2ecf20Sopenharmony_ci	D_FLAG_VERIFY(dentry, DCACHE_LRU_LIST);
4108c2ecf20Sopenharmony_ci	dentry->d_flags &= ~DCACHE_LRU_LIST;
4118c2ecf20Sopenharmony_ci	this_cpu_dec(nr_dentry_unused);
4128c2ecf20Sopenharmony_ci	if (d_is_negative(dentry))
4138c2ecf20Sopenharmony_ci		this_cpu_dec(nr_dentry_negative);
4148c2ecf20Sopenharmony_ci	WARN_ON_ONCE(!list_lru_del(&dentry->d_sb->s_dentry_lru, &dentry->d_lru));
4158c2ecf20Sopenharmony_ci}
4168c2ecf20Sopenharmony_ci
4178c2ecf20Sopenharmony_cistatic void d_shrink_del(struct dentry *dentry)
4188c2ecf20Sopenharmony_ci{
4198c2ecf20Sopenharmony_ci	D_FLAG_VERIFY(dentry, DCACHE_SHRINK_LIST | DCACHE_LRU_LIST);
4208c2ecf20Sopenharmony_ci	list_del_init(&dentry->d_lru);
4218c2ecf20Sopenharmony_ci	dentry->d_flags &= ~(DCACHE_SHRINK_LIST | DCACHE_LRU_LIST);
4228c2ecf20Sopenharmony_ci	this_cpu_dec(nr_dentry_unused);
4238c2ecf20Sopenharmony_ci}
4248c2ecf20Sopenharmony_ci
4258c2ecf20Sopenharmony_cistatic void d_shrink_add(struct dentry *dentry, struct list_head *list)
4268c2ecf20Sopenharmony_ci{
4278c2ecf20Sopenharmony_ci	D_FLAG_VERIFY(dentry, 0);
4288c2ecf20Sopenharmony_ci	list_add(&dentry->d_lru, list);
4298c2ecf20Sopenharmony_ci	dentry->d_flags |= DCACHE_SHRINK_LIST | DCACHE_LRU_LIST;
4308c2ecf20Sopenharmony_ci	this_cpu_inc(nr_dentry_unused);
4318c2ecf20Sopenharmony_ci}
4328c2ecf20Sopenharmony_ci
4338c2ecf20Sopenharmony_ci/*
4348c2ecf20Sopenharmony_ci * These can only be called under the global LRU lock, ie during the
4358c2ecf20Sopenharmony_ci * callback for freeing the LRU list. "isolate" removes it from the
4368c2ecf20Sopenharmony_ci * LRU lists entirely, while shrink_move moves it to the indicated
4378c2ecf20Sopenharmony_ci * private list.
4388c2ecf20Sopenharmony_ci */
4398c2ecf20Sopenharmony_cistatic void d_lru_isolate(struct list_lru_one *lru, struct dentry *dentry)
4408c2ecf20Sopenharmony_ci{
4418c2ecf20Sopenharmony_ci	D_FLAG_VERIFY(dentry, DCACHE_LRU_LIST);
4428c2ecf20Sopenharmony_ci	dentry->d_flags &= ~DCACHE_LRU_LIST;
4438c2ecf20Sopenharmony_ci	this_cpu_dec(nr_dentry_unused);
4448c2ecf20Sopenharmony_ci	if (d_is_negative(dentry))
4458c2ecf20Sopenharmony_ci		this_cpu_dec(nr_dentry_negative);
4468c2ecf20Sopenharmony_ci	list_lru_isolate(lru, &dentry->d_lru);
4478c2ecf20Sopenharmony_ci}
4488c2ecf20Sopenharmony_ci
4498c2ecf20Sopenharmony_cistatic void d_lru_shrink_move(struct list_lru_one *lru, struct dentry *dentry,
4508c2ecf20Sopenharmony_ci			      struct list_head *list)
4518c2ecf20Sopenharmony_ci{
4528c2ecf20Sopenharmony_ci	D_FLAG_VERIFY(dentry, DCACHE_LRU_LIST);
4538c2ecf20Sopenharmony_ci	dentry->d_flags |= DCACHE_SHRINK_LIST;
4548c2ecf20Sopenharmony_ci	if (d_is_negative(dentry))
4558c2ecf20Sopenharmony_ci		this_cpu_dec(nr_dentry_negative);
4568c2ecf20Sopenharmony_ci	list_lru_isolate_move(lru, &dentry->d_lru, list);
4578c2ecf20Sopenharmony_ci}
4588c2ecf20Sopenharmony_ci
4598c2ecf20Sopenharmony_ci/**
4608c2ecf20Sopenharmony_ci * d_drop - drop a dentry
4618c2ecf20Sopenharmony_ci * @dentry: dentry to drop
4628c2ecf20Sopenharmony_ci *
4638c2ecf20Sopenharmony_ci * d_drop() unhashes the entry from the parent dentry hashes, so that it won't
4648c2ecf20Sopenharmony_ci * be found through a VFS lookup any more. Note that this is different from
4658c2ecf20Sopenharmony_ci * deleting the dentry - d_delete will try to mark the dentry negative if
4668c2ecf20Sopenharmony_ci * possible, giving a successful _negative_ lookup, while d_drop will
4678c2ecf20Sopenharmony_ci * just make the cache lookup fail.
4688c2ecf20Sopenharmony_ci *
4698c2ecf20Sopenharmony_ci * d_drop() is used mainly for stuff that wants to invalidate a dentry for some
4708c2ecf20Sopenharmony_ci * reason (NFS timeouts or autofs deletes).
4718c2ecf20Sopenharmony_ci *
4728c2ecf20Sopenharmony_ci * __d_drop requires dentry->d_lock
4738c2ecf20Sopenharmony_ci * ___d_drop doesn't mark dentry as "unhashed"
4748c2ecf20Sopenharmony_ci *   (dentry->d_hash.pprev will be LIST_POISON2, not NULL).
4758c2ecf20Sopenharmony_ci */
4768c2ecf20Sopenharmony_cistatic void ___d_drop(struct dentry *dentry)
4778c2ecf20Sopenharmony_ci{
4788c2ecf20Sopenharmony_ci	struct hlist_bl_head *b;
4798c2ecf20Sopenharmony_ci	/*
4808c2ecf20Sopenharmony_ci	 * Hashed dentries are normally on the dentry hashtable,
4818c2ecf20Sopenharmony_ci	 * with the exception of those newly allocated by
4828c2ecf20Sopenharmony_ci	 * d_obtain_root, which are always IS_ROOT:
4838c2ecf20Sopenharmony_ci	 */
4848c2ecf20Sopenharmony_ci	if (unlikely(IS_ROOT(dentry)))
4858c2ecf20Sopenharmony_ci		b = &dentry->d_sb->s_roots;
4868c2ecf20Sopenharmony_ci	else
4878c2ecf20Sopenharmony_ci		b = d_hash(dentry->d_name.hash);
4888c2ecf20Sopenharmony_ci
4898c2ecf20Sopenharmony_ci	hlist_bl_lock(b);
4908c2ecf20Sopenharmony_ci	__hlist_bl_del(&dentry->d_hash);
4918c2ecf20Sopenharmony_ci	hlist_bl_unlock(b);
4928c2ecf20Sopenharmony_ci}
4938c2ecf20Sopenharmony_ci
4948c2ecf20Sopenharmony_civoid __d_drop(struct dentry *dentry)
4958c2ecf20Sopenharmony_ci{
4968c2ecf20Sopenharmony_ci	if (!d_unhashed(dentry)) {
4978c2ecf20Sopenharmony_ci		___d_drop(dentry);
4988c2ecf20Sopenharmony_ci		dentry->d_hash.pprev = NULL;
4998c2ecf20Sopenharmony_ci		write_seqcount_invalidate(&dentry->d_seq);
5008c2ecf20Sopenharmony_ci	}
5018c2ecf20Sopenharmony_ci}
5028c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__d_drop);
5038c2ecf20Sopenharmony_ci
5048c2ecf20Sopenharmony_civoid d_drop(struct dentry *dentry)
5058c2ecf20Sopenharmony_ci{
5068c2ecf20Sopenharmony_ci	spin_lock(&dentry->d_lock);
5078c2ecf20Sopenharmony_ci	__d_drop(dentry);
5088c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
5098c2ecf20Sopenharmony_ci}
5108c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_drop);
5118c2ecf20Sopenharmony_ci
5128c2ecf20Sopenharmony_cistatic inline void dentry_unlist(struct dentry *dentry, struct dentry *parent)
5138c2ecf20Sopenharmony_ci{
5148c2ecf20Sopenharmony_ci	struct dentry *next;
5158c2ecf20Sopenharmony_ci	/*
5168c2ecf20Sopenharmony_ci	 * Inform d_walk() and shrink_dentry_list() that we are no longer
5178c2ecf20Sopenharmony_ci	 * attached to the dentry tree
5188c2ecf20Sopenharmony_ci	 */
5198c2ecf20Sopenharmony_ci	dentry->d_flags |= DCACHE_DENTRY_KILLED;
5208c2ecf20Sopenharmony_ci	if (unlikely(list_empty(&dentry->d_child)))
5218c2ecf20Sopenharmony_ci		return;
5228c2ecf20Sopenharmony_ci	__list_del_entry(&dentry->d_child);
5238c2ecf20Sopenharmony_ci	/*
5248c2ecf20Sopenharmony_ci	 * Cursors can move around the list of children.  While we'd been
5258c2ecf20Sopenharmony_ci	 * a normal list member, it didn't matter - ->d_child.next would've
5268c2ecf20Sopenharmony_ci	 * been updated.  However, from now on it won't be and for the
5278c2ecf20Sopenharmony_ci	 * things like d_walk() it might end up with a nasty surprise.
5288c2ecf20Sopenharmony_ci	 * Normally d_walk() doesn't care about cursors moving around -
5298c2ecf20Sopenharmony_ci	 * ->d_lock on parent prevents that and since a cursor has no children
5308c2ecf20Sopenharmony_ci	 * of its own, we get through it without ever unlocking the parent.
5318c2ecf20Sopenharmony_ci	 * There is one exception, though - if we ascend from a child that
5328c2ecf20Sopenharmony_ci	 * gets killed as soon as we unlock it, the next sibling is found
5338c2ecf20Sopenharmony_ci	 * using the value left in its ->d_child.next.  And if _that_
5348c2ecf20Sopenharmony_ci	 * pointed to a cursor, and cursor got moved (e.g. by lseek())
5358c2ecf20Sopenharmony_ci	 * before d_walk() regains parent->d_lock, we'll end up skipping
5368c2ecf20Sopenharmony_ci	 * everything the cursor had been moved past.
5378c2ecf20Sopenharmony_ci	 *
5388c2ecf20Sopenharmony_ci	 * Solution: make sure that the pointer left behind in ->d_child.next
5398c2ecf20Sopenharmony_ci	 * points to something that won't be moving around.  I.e. skip the
5408c2ecf20Sopenharmony_ci	 * cursors.
5418c2ecf20Sopenharmony_ci	 */
5428c2ecf20Sopenharmony_ci	while (dentry->d_child.next != &parent->d_subdirs) {
5438c2ecf20Sopenharmony_ci		next = list_entry(dentry->d_child.next, struct dentry, d_child);
5448c2ecf20Sopenharmony_ci		if (likely(!(next->d_flags & DCACHE_DENTRY_CURSOR)))
5458c2ecf20Sopenharmony_ci			break;
5468c2ecf20Sopenharmony_ci		dentry->d_child.next = next->d_child.next;
5478c2ecf20Sopenharmony_ci	}
5488c2ecf20Sopenharmony_ci}
5498c2ecf20Sopenharmony_ci
5508c2ecf20Sopenharmony_cistatic void __dentry_kill(struct dentry *dentry)
5518c2ecf20Sopenharmony_ci{
5528c2ecf20Sopenharmony_ci	struct dentry *parent = NULL;
5538c2ecf20Sopenharmony_ci	bool can_free = true;
5548c2ecf20Sopenharmony_ci	if (!IS_ROOT(dentry))
5558c2ecf20Sopenharmony_ci		parent = dentry->d_parent;
5568c2ecf20Sopenharmony_ci
5578c2ecf20Sopenharmony_ci	/*
5588c2ecf20Sopenharmony_ci	 * The dentry is now unrecoverably dead to the world.
5598c2ecf20Sopenharmony_ci	 */
5608c2ecf20Sopenharmony_ci	lockref_mark_dead(&dentry->d_lockref);
5618c2ecf20Sopenharmony_ci
5628c2ecf20Sopenharmony_ci	/*
5638c2ecf20Sopenharmony_ci	 * inform the fs via d_prune that this dentry is about to be
5648c2ecf20Sopenharmony_ci	 * unhashed and destroyed.
5658c2ecf20Sopenharmony_ci	 */
5668c2ecf20Sopenharmony_ci	if (dentry->d_flags & DCACHE_OP_PRUNE)
5678c2ecf20Sopenharmony_ci		dentry->d_op->d_prune(dentry);
5688c2ecf20Sopenharmony_ci
5698c2ecf20Sopenharmony_ci	if (dentry->d_flags & DCACHE_LRU_LIST) {
5708c2ecf20Sopenharmony_ci		if (!(dentry->d_flags & DCACHE_SHRINK_LIST))
5718c2ecf20Sopenharmony_ci			d_lru_del(dentry);
5728c2ecf20Sopenharmony_ci	}
5738c2ecf20Sopenharmony_ci	/* if it was on the hash then remove it */
5748c2ecf20Sopenharmony_ci	__d_drop(dentry);
5758c2ecf20Sopenharmony_ci	dentry_unlist(dentry, parent);
5768c2ecf20Sopenharmony_ci	if (parent)
5778c2ecf20Sopenharmony_ci		spin_unlock(&parent->d_lock);
5788c2ecf20Sopenharmony_ci	if (dentry->d_inode)
5798c2ecf20Sopenharmony_ci		dentry_unlink_inode(dentry);
5808c2ecf20Sopenharmony_ci	else
5818c2ecf20Sopenharmony_ci		spin_unlock(&dentry->d_lock);
5828c2ecf20Sopenharmony_ci	this_cpu_dec(nr_dentry);
5838c2ecf20Sopenharmony_ci	if (dentry->d_op && dentry->d_op->d_release)
5848c2ecf20Sopenharmony_ci		dentry->d_op->d_release(dentry);
5858c2ecf20Sopenharmony_ci
5868c2ecf20Sopenharmony_ci	spin_lock(&dentry->d_lock);
5878c2ecf20Sopenharmony_ci	if (dentry->d_flags & DCACHE_SHRINK_LIST) {
5888c2ecf20Sopenharmony_ci		dentry->d_flags |= DCACHE_MAY_FREE;
5898c2ecf20Sopenharmony_ci		can_free = false;
5908c2ecf20Sopenharmony_ci	}
5918c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
5928c2ecf20Sopenharmony_ci	if (likely(can_free))
5938c2ecf20Sopenharmony_ci		dentry_free(dentry);
5948c2ecf20Sopenharmony_ci	cond_resched();
5958c2ecf20Sopenharmony_ci}
5968c2ecf20Sopenharmony_ci
5978c2ecf20Sopenharmony_cistatic struct dentry *__lock_parent(struct dentry *dentry)
5988c2ecf20Sopenharmony_ci{
5998c2ecf20Sopenharmony_ci	struct dentry *parent;
6008c2ecf20Sopenharmony_ci	rcu_read_lock();
6018c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
6028c2ecf20Sopenharmony_ciagain:
6038c2ecf20Sopenharmony_ci	parent = READ_ONCE(dentry->d_parent);
6048c2ecf20Sopenharmony_ci	spin_lock(&parent->d_lock);
6058c2ecf20Sopenharmony_ci	/*
6068c2ecf20Sopenharmony_ci	 * We can't blindly lock dentry until we are sure
6078c2ecf20Sopenharmony_ci	 * that we won't violate the locking order.
6088c2ecf20Sopenharmony_ci	 * Any changes of dentry->d_parent must have
6098c2ecf20Sopenharmony_ci	 * been done with parent->d_lock held, so
6108c2ecf20Sopenharmony_ci	 * spin_lock() above is enough of a barrier
6118c2ecf20Sopenharmony_ci	 * for checking if it's still our child.
6128c2ecf20Sopenharmony_ci	 */
6138c2ecf20Sopenharmony_ci	if (unlikely(parent != dentry->d_parent)) {
6148c2ecf20Sopenharmony_ci		spin_unlock(&parent->d_lock);
6158c2ecf20Sopenharmony_ci		goto again;
6168c2ecf20Sopenharmony_ci	}
6178c2ecf20Sopenharmony_ci	rcu_read_unlock();
6188c2ecf20Sopenharmony_ci	if (parent != dentry)
6198c2ecf20Sopenharmony_ci		spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
6208c2ecf20Sopenharmony_ci	else
6218c2ecf20Sopenharmony_ci		parent = NULL;
6228c2ecf20Sopenharmony_ci	return parent;
6238c2ecf20Sopenharmony_ci}
6248c2ecf20Sopenharmony_ci
6258c2ecf20Sopenharmony_cistatic inline struct dentry *lock_parent(struct dentry *dentry)
6268c2ecf20Sopenharmony_ci{
6278c2ecf20Sopenharmony_ci	struct dentry *parent = dentry->d_parent;
6288c2ecf20Sopenharmony_ci	if (IS_ROOT(dentry))
6298c2ecf20Sopenharmony_ci		return NULL;
6308c2ecf20Sopenharmony_ci	if (likely(spin_trylock(&parent->d_lock)))
6318c2ecf20Sopenharmony_ci		return parent;
6328c2ecf20Sopenharmony_ci	return __lock_parent(dentry);
6338c2ecf20Sopenharmony_ci}
6348c2ecf20Sopenharmony_ci
6358c2ecf20Sopenharmony_cistatic inline bool retain_dentry(struct dentry *dentry)
6368c2ecf20Sopenharmony_ci{
6378c2ecf20Sopenharmony_ci	WARN_ON(d_in_lookup(dentry));
6388c2ecf20Sopenharmony_ci
6398c2ecf20Sopenharmony_ci	/* Unreachable? Get rid of it */
6408c2ecf20Sopenharmony_ci	if (unlikely(d_unhashed(dentry)))
6418c2ecf20Sopenharmony_ci		return false;
6428c2ecf20Sopenharmony_ci
6438c2ecf20Sopenharmony_ci	if (unlikely(dentry->d_flags & DCACHE_DISCONNECTED))
6448c2ecf20Sopenharmony_ci		return false;
6458c2ecf20Sopenharmony_ci
6468c2ecf20Sopenharmony_ci	if (unlikely(dentry->d_flags & DCACHE_OP_DELETE)) {
6478c2ecf20Sopenharmony_ci		if (dentry->d_op->d_delete(dentry))
6488c2ecf20Sopenharmony_ci			return false;
6498c2ecf20Sopenharmony_ci	}
6508c2ecf20Sopenharmony_ci
6518c2ecf20Sopenharmony_ci	if (unlikely(dentry->d_flags & DCACHE_DONTCACHE))
6528c2ecf20Sopenharmony_ci		return false;
6538c2ecf20Sopenharmony_ci
6548c2ecf20Sopenharmony_ci	/* retain; LRU fodder */
6558c2ecf20Sopenharmony_ci	dentry->d_lockref.count--;
6568c2ecf20Sopenharmony_ci	if (unlikely(!(dentry->d_flags & DCACHE_LRU_LIST)))
6578c2ecf20Sopenharmony_ci		d_lru_add(dentry);
6588c2ecf20Sopenharmony_ci	else if (unlikely(!(dentry->d_flags & DCACHE_REFERENCED)))
6598c2ecf20Sopenharmony_ci		dentry->d_flags |= DCACHE_REFERENCED;
6608c2ecf20Sopenharmony_ci	return true;
6618c2ecf20Sopenharmony_ci}
6628c2ecf20Sopenharmony_ci
6638c2ecf20Sopenharmony_civoid d_mark_dontcache(struct inode *inode)
6648c2ecf20Sopenharmony_ci{
6658c2ecf20Sopenharmony_ci	struct dentry *de;
6668c2ecf20Sopenharmony_ci
6678c2ecf20Sopenharmony_ci	spin_lock(&inode->i_lock);
6688c2ecf20Sopenharmony_ci	hlist_for_each_entry(de, &inode->i_dentry, d_u.d_alias) {
6698c2ecf20Sopenharmony_ci		spin_lock(&de->d_lock);
6708c2ecf20Sopenharmony_ci		de->d_flags |= DCACHE_DONTCACHE;
6718c2ecf20Sopenharmony_ci		spin_unlock(&de->d_lock);
6728c2ecf20Sopenharmony_ci	}
6738c2ecf20Sopenharmony_ci	inode->i_state |= I_DONTCACHE;
6748c2ecf20Sopenharmony_ci	spin_unlock(&inode->i_lock);
6758c2ecf20Sopenharmony_ci}
6768c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_mark_dontcache);
6778c2ecf20Sopenharmony_ci
6788c2ecf20Sopenharmony_ci/*
6798c2ecf20Sopenharmony_ci * Finish off a dentry we've decided to kill.
6808c2ecf20Sopenharmony_ci * dentry->d_lock must be held, returns with it unlocked.
6818c2ecf20Sopenharmony_ci * Returns dentry requiring refcount drop, or NULL if we're done.
6828c2ecf20Sopenharmony_ci */
6838c2ecf20Sopenharmony_cistatic struct dentry *dentry_kill(struct dentry *dentry)
6848c2ecf20Sopenharmony_ci	__releases(dentry->d_lock)
6858c2ecf20Sopenharmony_ci{
6868c2ecf20Sopenharmony_ci	struct inode *inode = dentry->d_inode;
6878c2ecf20Sopenharmony_ci	struct dentry *parent = NULL;
6888c2ecf20Sopenharmony_ci
6898c2ecf20Sopenharmony_ci	if (inode && unlikely(!spin_trylock(&inode->i_lock)))
6908c2ecf20Sopenharmony_ci		goto slow_positive;
6918c2ecf20Sopenharmony_ci
6928c2ecf20Sopenharmony_ci	if (!IS_ROOT(dentry)) {
6938c2ecf20Sopenharmony_ci		parent = dentry->d_parent;
6948c2ecf20Sopenharmony_ci		if (unlikely(!spin_trylock(&parent->d_lock))) {
6958c2ecf20Sopenharmony_ci			parent = __lock_parent(dentry);
6968c2ecf20Sopenharmony_ci			if (likely(inode || !dentry->d_inode))
6978c2ecf20Sopenharmony_ci				goto got_locks;
6988c2ecf20Sopenharmony_ci			/* negative that became positive */
6998c2ecf20Sopenharmony_ci			if (parent)
7008c2ecf20Sopenharmony_ci				spin_unlock(&parent->d_lock);
7018c2ecf20Sopenharmony_ci			inode = dentry->d_inode;
7028c2ecf20Sopenharmony_ci			goto slow_positive;
7038c2ecf20Sopenharmony_ci		}
7048c2ecf20Sopenharmony_ci	}
7058c2ecf20Sopenharmony_ci	__dentry_kill(dentry);
7068c2ecf20Sopenharmony_ci	return parent;
7078c2ecf20Sopenharmony_ci
7088c2ecf20Sopenharmony_cislow_positive:
7098c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
7108c2ecf20Sopenharmony_ci	spin_lock(&inode->i_lock);
7118c2ecf20Sopenharmony_ci	spin_lock(&dentry->d_lock);
7128c2ecf20Sopenharmony_ci	parent = lock_parent(dentry);
7138c2ecf20Sopenharmony_cigot_locks:
7148c2ecf20Sopenharmony_ci	if (unlikely(dentry->d_lockref.count != 1)) {
7158c2ecf20Sopenharmony_ci		dentry->d_lockref.count--;
7168c2ecf20Sopenharmony_ci	} else if (likely(!retain_dentry(dentry))) {
7178c2ecf20Sopenharmony_ci		__dentry_kill(dentry);
7188c2ecf20Sopenharmony_ci		return parent;
7198c2ecf20Sopenharmony_ci	}
7208c2ecf20Sopenharmony_ci	/* we are keeping it, after all */
7218c2ecf20Sopenharmony_ci	if (inode)
7228c2ecf20Sopenharmony_ci		spin_unlock(&inode->i_lock);
7238c2ecf20Sopenharmony_ci	if (parent)
7248c2ecf20Sopenharmony_ci		spin_unlock(&parent->d_lock);
7258c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
7268c2ecf20Sopenharmony_ci	return NULL;
7278c2ecf20Sopenharmony_ci}
7288c2ecf20Sopenharmony_ci
7298c2ecf20Sopenharmony_ci/*
7308c2ecf20Sopenharmony_ci * Try to do a lockless dput(), and return whether that was successful.
7318c2ecf20Sopenharmony_ci *
7328c2ecf20Sopenharmony_ci * If unsuccessful, we return false, having already taken the dentry lock.
7338c2ecf20Sopenharmony_ci *
7348c2ecf20Sopenharmony_ci * The caller needs to hold the RCU read lock, so that the dentry is
7358c2ecf20Sopenharmony_ci * guaranteed to stay around even if the refcount goes down to zero!
7368c2ecf20Sopenharmony_ci */
7378c2ecf20Sopenharmony_cistatic inline bool fast_dput(struct dentry *dentry)
7388c2ecf20Sopenharmony_ci{
7398c2ecf20Sopenharmony_ci	int ret;
7408c2ecf20Sopenharmony_ci	unsigned int d_flags;
7418c2ecf20Sopenharmony_ci
7428c2ecf20Sopenharmony_ci	/*
7438c2ecf20Sopenharmony_ci	 * If we have a d_op->d_delete() operation, we sould not
7448c2ecf20Sopenharmony_ci	 * let the dentry count go to zero, so use "put_or_lock".
7458c2ecf20Sopenharmony_ci	 */
7468c2ecf20Sopenharmony_ci	if (unlikely(dentry->d_flags & DCACHE_OP_DELETE))
7478c2ecf20Sopenharmony_ci		return lockref_put_or_lock(&dentry->d_lockref);
7488c2ecf20Sopenharmony_ci
7498c2ecf20Sopenharmony_ci	/*
7508c2ecf20Sopenharmony_ci	 * .. otherwise, we can try to just decrement the
7518c2ecf20Sopenharmony_ci	 * lockref optimistically.
7528c2ecf20Sopenharmony_ci	 */
7538c2ecf20Sopenharmony_ci	ret = lockref_put_return(&dentry->d_lockref);
7548c2ecf20Sopenharmony_ci
7558c2ecf20Sopenharmony_ci	/*
7568c2ecf20Sopenharmony_ci	 * If the lockref_put_return() failed due to the lock being held
7578c2ecf20Sopenharmony_ci	 * by somebody else, the fast path has failed. We will need to
7588c2ecf20Sopenharmony_ci	 * get the lock, and then check the count again.
7598c2ecf20Sopenharmony_ci	 */
7608c2ecf20Sopenharmony_ci	if (unlikely(ret < 0)) {
7618c2ecf20Sopenharmony_ci		spin_lock(&dentry->d_lock);
7628c2ecf20Sopenharmony_ci		if (WARN_ON_ONCE(dentry->d_lockref.count <= 0)) {
7638c2ecf20Sopenharmony_ci			spin_unlock(&dentry->d_lock);
7648c2ecf20Sopenharmony_ci			return true;
7658c2ecf20Sopenharmony_ci		}
7668c2ecf20Sopenharmony_ci		dentry->d_lockref.count--;
7678c2ecf20Sopenharmony_ci		goto locked;
7688c2ecf20Sopenharmony_ci	}
7698c2ecf20Sopenharmony_ci
7708c2ecf20Sopenharmony_ci	/*
7718c2ecf20Sopenharmony_ci	 * If we weren't the last ref, we're done.
7728c2ecf20Sopenharmony_ci	 */
7738c2ecf20Sopenharmony_ci	if (ret)
7748c2ecf20Sopenharmony_ci		return true;
7758c2ecf20Sopenharmony_ci
7768c2ecf20Sopenharmony_ci	/*
7778c2ecf20Sopenharmony_ci	 * Careful, careful. The reference count went down
7788c2ecf20Sopenharmony_ci	 * to zero, but we don't hold the dentry lock, so
7798c2ecf20Sopenharmony_ci	 * somebody else could get it again, and do another
7808c2ecf20Sopenharmony_ci	 * dput(), and we need to not race with that.
7818c2ecf20Sopenharmony_ci	 *
7828c2ecf20Sopenharmony_ci	 * However, there is a very special and common case
7838c2ecf20Sopenharmony_ci	 * where we don't care, because there is nothing to
7848c2ecf20Sopenharmony_ci	 * do: the dentry is still hashed, it does not have
7858c2ecf20Sopenharmony_ci	 * a 'delete' op, and it's referenced and already on
7868c2ecf20Sopenharmony_ci	 * the LRU list.
7878c2ecf20Sopenharmony_ci	 *
7888c2ecf20Sopenharmony_ci	 * NOTE! Since we aren't locked, these values are
7898c2ecf20Sopenharmony_ci	 * not "stable". However, it is sufficient that at
7908c2ecf20Sopenharmony_ci	 * some point after we dropped the reference the
7918c2ecf20Sopenharmony_ci	 * dentry was hashed and the flags had the proper
7928c2ecf20Sopenharmony_ci	 * value. Other dentry users may have re-gotten
7938c2ecf20Sopenharmony_ci	 * a reference to the dentry and change that, but
7948c2ecf20Sopenharmony_ci	 * our work is done - we can leave the dentry
7958c2ecf20Sopenharmony_ci	 * around with a zero refcount.
7968c2ecf20Sopenharmony_ci	 */
7978c2ecf20Sopenharmony_ci	smp_rmb();
7988c2ecf20Sopenharmony_ci	d_flags = READ_ONCE(dentry->d_flags);
7998c2ecf20Sopenharmony_ci	d_flags &= DCACHE_REFERENCED | DCACHE_LRU_LIST | DCACHE_DISCONNECTED;
8008c2ecf20Sopenharmony_ci
8018c2ecf20Sopenharmony_ci	/* Nothing to do? Dropping the reference was all we needed? */
8028c2ecf20Sopenharmony_ci	if (d_flags == (DCACHE_REFERENCED | DCACHE_LRU_LIST) && !d_unhashed(dentry))
8038c2ecf20Sopenharmony_ci		return true;
8048c2ecf20Sopenharmony_ci
8058c2ecf20Sopenharmony_ci	/*
8068c2ecf20Sopenharmony_ci	 * Not the fast normal case? Get the lock. We've already decremented
8078c2ecf20Sopenharmony_ci	 * the refcount, but we'll need to re-check the situation after
8088c2ecf20Sopenharmony_ci	 * getting the lock.
8098c2ecf20Sopenharmony_ci	 */
8108c2ecf20Sopenharmony_ci	spin_lock(&dentry->d_lock);
8118c2ecf20Sopenharmony_ci
8128c2ecf20Sopenharmony_ci	/*
8138c2ecf20Sopenharmony_ci	 * Did somebody else grab a reference to it in the meantime, and
8148c2ecf20Sopenharmony_ci	 * we're no longer the last user after all? Alternatively, somebody
8158c2ecf20Sopenharmony_ci	 * else could have killed it and marked it dead. Either way, we
8168c2ecf20Sopenharmony_ci	 * don't need to do anything else.
8178c2ecf20Sopenharmony_ci	 */
8188c2ecf20Sopenharmony_cilocked:
8198c2ecf20Sopenharmony_ci	if (dentry->d_lockref.count) {
8208c2ecf20Sopenharmony_ci		spin_unlock(&dentry->d_lock);
8218c2ecf20Sopenharmony_ci		return true;
8228c2ecf20Sopenharmony_ci	}
8238c2ecf20Sopenharmony_ci
8248c2ecf20Sopenharmony_ci	/*
8258c2ecf20Sopenharmony_ci	 * Re-get the reference we optimistically dropped. We hold the
8268c2ecf20Sopenharmony_ci	 * lock, and we just tested that it was zero, so we can just
8278c2ecf20Sopenharmony_ci	 * set it to 1.
8288c2ecf20Sopenharmony_ci	 */
8298c2ecf20Sopenharmony_ci	dentry->d_lockref.count = 1;
8308c2ecf20Sopenharmony_ci	return false;
8318c2ecf20Sopenharmony_ci}
8328c2ecf20Sopenharmony_ci
8338c2ecf20Sopenharmony_ci
8348c2ecf20Sopenharmony_ci/*
8358c2ecf20Sopenharmony_ci * This is dput
8368c2ecf20Sopenharmony_ci *
8378c2ecf20Sopenharmony_ci * This is complicated by the fact that we do not want to put
8388c2ecf20Sopenharmony_ci * dentries that are no longer on any hash chain on the unused
8398c2ecf20Sopenharmony_ci * list: we'd much rather just get rid of them immediately.
8408c2ecf20Sopenharmony_ci *
8418c2ecf20Sopenharmony_ci * However, that implies that we have to traverse the dentry
8428c2ecf20Sopenharmony_ci * tree upwards to the parents which might _also_ now be
8438c2ecf20Sopenharmony_ci * scheduled for deletion (it may have been only waiting for
8448c2ecf20Sopenharmony_ci * its last child to go away).
8458c2ecf20Sopenharmony_ci *
8468c2ecf20Sopenharmony_ci * This tail recursion is done by hand as we don't want to depend
8478c2ecf20Sopenharmony_ci * on the compiler to always get this right (gcc generally doesn't).
8488c2ecf20Sopenharmony_ci * Real recursion would eat up our stack space.
8498c2ecf20Sopenharmony_ci */
8508c2ecf20Sopenharmony_ci
8518c2ecf20Sopenharmony_ci/*
8528c2ecf20Sopenharmony_ci * dput - release a dentry
8538c2ecf20Sopenharmony_ci * @dentry: dentry to release
8548c2ecf20Sopenharmony_ci *
8558c2ecf20Sopenharmony_ci * Release a dentry. This will drop the usage count and if appropriate
8568c2ecf20Sopenharmony_ci * call the dentry unlink method as well as removing it from the queues and
8578c2ecf20Sopenharmony_ci * releasing its resources. If the parent dentries were scheduled for release
8588c2ecf20Sopenharmony_ci * they too may now get deleted.
8598c2ecf20Sopenharmony_ci */
8608c2ecf20Sopenharmony_civoid dput(struct dentry *dentry)
8618c2ecf20Sopenharmony_ci{
8628c2ecf20Sopenharmony_ci	while (dentry) {
8638c2ecf20Sopenharmony_ci		might_sleep();
8648c2ecf20Sopenharmony_ci
8658c2ecf20Sopenharmony_ci		rcu_read_lock();
8668c2ecf20Sopenharmony_ci		if (likely(fast_dput(dentry))) {
8678c2ecf20Sopenharmony_ci			rcu_read_unlock();
8688c2ecf20Sopenharmony_ci			return;
8698c2ecf20Sopenharmony_ci		}
8708c2ecf20Sopenharmony_ci
8718c2ecf20Sopenharmony_ci		/* Slow case: now with the dentry lock held */
8728c2ecf20Sopenharmony_ci		rcu_read_unlock();
8738c2ecf20Sopenharmony_ci
8748c2ecf20Sopenharmony_ci		if (likely(retain_dentry(dentry))) {
8758c2ecf20Sopenharmony_ci			spin_unlock(&dentry->d_lock);
8768c2ecf20Sopenharmony_ci			return;
8778c2ecf20Sopenharmony_ci		}
8788c2ecf20Sopenharmony_ci
8798c2ecf20Sopenharmony_ci		dentry = dentry_kill(dentry);
8808c2ecf20Sopenharmony_ci	}
8818c2ecf20Sopenharmony_ci}
8828c2ecf20Sopenharmony_ciEXPORT_SYMBOL(dput);
8838c2ecf20Sopenharmony_ci
8848c2ecf20Sopenharmony_cistatic void __dput_to_list(struct dentry *dentry, struct list_head *list)
8858c2ecf20Sopenharmony_ci__must_hold(&dentry->d_lock)
8868c2ecf20Sopenharmony_ci{
8878c2ecf20Sopenharmony_ci	if (dentry->d_flags & DCACHE_SHRINK_LIST) {
8888c2ecf20Sopenharmony_ci		/* let the owner of the list it's on deal with it */
8898c2ecf20Sopenharmony_ci		--dentry->d_lockref.count;
8908c2ecf20Sopenharmony_ci	} else {
8918c2ecf20Sopenharmony_ci		if (dentry->d_flags & DCACHE_LRU_LIST)
8928c2ecf20Sopenharmony_ci			d_lru_del(dentry);
8938c2ecf20Sopenharmony_ci		if (!--dentry->d_lockref.count)
8948c2ecf20Sopenharmony_ci			d_shrink_add(dentry, list);
8958c2ecf20Sopenharmony_ci	}
8968c2ecf20Sopenharmony_ci}
8978c2ecf20Sopenharmony_ci
8988c2ecf20Sopenharmony_civoid dput_to_list(struct dentry *dentry, struct list_head *list)
8998c2ecf20Sopenharmony_ci{
9008c2ecf20Sopenharmony_ci	rcu_read_lock();
9018c2ecf20Sopenharmony_ci	if (likely(fast_dput(dentry))) {
9028c2ecf20Sopenharmony_ci		rcu_read_unlock();
9038c2ecf20Sopenharmony_ci		return;
9048c2ecf20Sopenharmony_ci	}
9058c2ecf20Sopenharmony_ci	rcu_read_unlock();
9068c2ecf20Sopenharmony_ci	if (!retain_dentry(dentry))
9078c2ecf20Sopenharmony_ci		__dput_to_list(dentry, list);
9088c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
9098c2ecf20Sopenharmony_ci}
9108c2ecf20Sopenharmony_ci
9118c2ecf20Sopenharmony_ci/* This must be called with d_lock held */
9128c2ecf20Sopenharmony_cistatic inline void __dget_dlock(struct dentry *dentry)
9138c2ecf20Sopenharmony_ci{
9148c2ecf20Sopenharmony_ci	dentry->d_lockref.count++;
9158c2ecf20Sopenharmony_ci}
9168c2ecf20Sopenharmony_ci
9178c2ecf20Sopenharmony_cistatic inline void __dget(struct dentry *dentry)
9188c2ecf20Sopenharmony_ci{
9198c2ecf20Sopenharmony_ci	lockref_get(&dentry->d_lockref);
9208c2ecf20Sopenharmony_ci}
9218c2ecf20Sopenharmony_ci
9228c2ecf20Sopenharmony_cistruct dentry *dget_parent(struct dentry *dentry)
9238c2ecf20Sopenharmony_ci{
9248c2ecf20Sopenharmony_ci	int gotref;
9258c2ecf20Sopenharmony_ci	struct dentry *ret;
9268c2ecf20Sopenharmony_ci	unsigned seq;
9278c2ecf20Sopenharmony_ci
9288c2ecf20Sopenharmony_ci	/*
9298c2ecf20Sopenharmony_ci	 * Do optimistic parent lookup without any
9308c2ecf20Sopenharmony_ci	 * locking.
9318c2ecf20Sopenharmony_ci	 */
9328c2ecf20Sopenharmony_ci	rcu_read_lock();
9338c2ecf20Sopenharmony_ci	seq = raw_seqcount_begin(&dentry->d_seq);
9348c2ecf20Sopenharmony_ci	ret = READ_ONCE(dentry->d_parent);
9358c2ecf20Sopenharmony_ci	gotref = lockref_get_not_zero(&ret->d_lockref);
9368c2ecf20Sopenharmony_ci	rcu_read_unlock();
9378c2ecf20Sopenharmony_ci	if (likely(gotref)) {
9388c2ecf20Sopenharmony_ci		if (!read_seqcount_retry(&dentry->d_seq, seq))
9398c2ecf20Sopenharmony_ci			return ret;
9408c2ecf20Sopenharmony_ci		dput(ret);
9418c2ecf20Sopenharmony_ci	}
9428c2ecf20Sopenharmony_ci
9438c2ecf20Sopenharmony_cirepeat:
9448c2ecf20Sopenharmony_ci	/*
9458c2ecf20Sopenharmony_ci	 * Don't need rcu_dereference because we re-check it was correct under
9468c2ecf20Sopenharmony_ci	 * the lock.
9478c2ecf20Sopenharmony_ci	 */
9488c2ecf20Sopenharmony_ci	rcu_read_lock();
9498c2ecf20Sopenharmony_ci	ret = dentry->d_parent;
9508c2ecf20Sopenharmony_ci	spin_lock(&ret->d_lock);
9518c2ecf20Sopenharmony_ci	if (unlikely(ret != dentry->d_parent)) {
9528c2ecf20Sopenharmony_ci		spin_unlock(&ret->d_lock);
9538c2ecf20Sopenharmony_ci		rcu_read_unlock();
9548c2ecf20Sopenharmony_ci		goto repeat;
9558c2ecf20Sopenharmony_ci	}
9568c2ecf20Sopenharmony_ci	rcu_read_unlock();
9578c2ecf20Sopenharmony_ci	BUG_ON(!ret->d_lockref.count);
9588c2ecf20Sopenharmony_ci	ret->d_lockref.count++;
9598c2ecf20Sopenharmony_ci	spin_unlock(&ret->d_lock);
9608c2ecf20Sopenharmony_ci	return ret;
9618c2ecf20Sopenharmony_ci}
9628c2ecf20Sopenharmony_ciEXPORT_SYMBOL(dget_parent);
9638c2ecf20Sopenharmony_ci
9648c2ecf20Sopenharmony_cistatic struct dentry * __d_find_any_alias(struct inode *inode)
9658c2ecf20Sopenharmony_ci{
9668c2ecf20Sopenharmony_ci	struct dentry *alias;
9678c2ecf20Sopenharmony_ci
9688c2ecf20Sopenharmony_ci	if (hlist_empty(&inode->i_dentry))
9698c2ecf20Sopenharmony_ci		return NULL;
9708c2ecf20Sopenharmony_ci	alias = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);
9718c2ecf20Sopenharmony_ci	__dget(alias);
9728c2ecf20Sopenharmony_ci	return alias;
9738c2ecf20Sopenharmony_ci}
9748c2ecf20Sopenharmony_ci
9758c2ecf20Sopenharmony_ci/**
9768c2ecf20Sopenharmony_ci * d_find_any_alias - find any alias for a given inode
9778c2ecf20Sopenharmony_ci * @inode: inode to find an alias for
9788c2ecf20Sopenharmony_ci *
9798c2ecf20Sopenharmony_ci * If any aliases exist for the given inode, take and return a
9808c2ecf20Sopenharmony_ci * reference for one of them.  If no aliases exist, return %NULL.
9818c2ecf20Sopenharmony_ci */
9828c2ecf20Sopenharmony_cistruct dentry *d_find_any_alias(struct inode *inode)
9838c2ecf20Sopenharmony_ci{
9848c2ecf20Sopenharmony_ci	struct dentry *de;
9858c2ecf20Sopenharmony_ci
9868c2ecf20Sopenharmony_ci	spin_lock(&inode->i_lock);
9878c2ecf20Sopenharmony_ci	de = __d_find_any_alias(inode);
9888c2ecf20Sopenharmony_ci	spin_unlock(&inode->i_lock);
9898c2ecf20Sopenharmony_ci	return de;
9908c2ecf20Sopenharmony_ci}
9918c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_find_any_alias);
9928c2ecf20Sopenharmony_ci
9938c2ecf20Sopenharmony_ci/**
9948c2ecf20Sopenharmony_ci * d_find_alias - grab a hashed alias of inode
9958c2ecf20Sopenharmony_ci * @inode: inode in question
9968c2ecf20Sopenharmony_ci *
9978c2ecf20Sopenharmony_ci * If inode has a hashed alias, or is a directory and has any alias,
9988c2ecf20Sopenharmony_ci * acquire the reference to alias and return it. Otherwise return NULL.
9998c2ecf20Sopenharmony_ci * Notice that if inode is a directory there can be only one alias and
10008c2ecf20Sopenharmony_ci * it can be unhashed only if it has no children, or if it is the root
10018c2ecf20Sopenharmony_ci * of a filesystem, or if the directory was renamed and d_revalidate
10028c2ecf20Sopenharmony_ci * was the first vfs operation to notice.
10038c2ecf20Sopenharmony_ci *
10048c2ecf20Sopenharmony_ci * If the inode has an IS_ROOT, DCACHE_DISCONNECTED alias, then prefer
10058c2ecf20Sopenharmony_ci * any other hashed alias over that one.
10068c2ecf20Sopenharmony_ci */
10078c2ecf20Sopenharmony_cistatic struct dentry *__d_find_alias(struct inode *inode)
10088c2ecf20Sopenharmony_ci{
10098c2ecf20Sopenharmony_ci	struct dentry *alias;
10108c2ecf20Sopenharmony_ci
10118c2ecf20Sopenharmony_ci	if (S_ISDIR(inode->i_mode))
10128c2ecf20Sopenharmony_ci		return __d_find_any_alias(inode);
10138c2ecf20Sopenharmony_ci
10148c2ecf20Sopenharmony_ci	hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
10158c2ecf20Sopenharmony_ci		spin_lock(&alias->d_lock);
10168c2ecf20Sopenharmony_ci 		if (!d_unhashed(alias)) {
10178c2ecf20Sopenharmony_ci			__dget_dlock(alias);
10188c2ecf20Sopenharmony_ci			spin_unlock(&alias->d_lock);
10198c2ecf20Sopenharmony_ci			return alias;
10208c2ecf20Sopenharmony_ci		}
10218c2ecf20Sopenharmony_ci		spin_unlock(&alias->d_lock);
10228c2ecf20Sopenharmony_ci	}
10238c2ecf20Sopenharmony_ci	return NULL;
10248c2ecf20Sopenharmony_ci}
10258c2ecf20Sopenharmony_ci
10268c2ecf20Sopenharmony_cistruct dentry *d_find_alias(struct inode *inode)
10278c2ecf20Sopenharmony_ci{
10288c2ecf20Sopenharmony_ci	struct dentry *de = NULL;
10298c2ecf20Sopenharmony_ci
10308c2ecf20Sopenharmony_ci	if (!hlist_empty(&inode->i_dentry)) {
10318c2ecf20Sopenharmony_ci		spin_lock(&inode->i_lock);
10328c2ecf20Sopenharmony_ci		de = __d_find_alias(inode);
10338c2ecf20Sopenharmony_ci		spin_unlock(&inode->i_lock);
10348c2ecf20Sopenharmony_ci	}
10358c2ecf20Sopenharmony_ci	return de;
10368c2ecf20Sopenharmony_ci}
10378c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_find_alias);
10388c2ecf20Sopenharmony_ci
10398c2ecf20Sopenharmony_ci/*
10408c2ecf20Sopenharmony_ci *	Try to kill dentries associated with this inode.
10418c2ecf20Sopenharmony_ci * WARNING: you must own a reference to inode.
10428c2ecf20Sopenharmony_ci */
10438c2ecf20Sopenharmony_civoid d_prune_aliases(struct inode *inode)
10448c2ecf20Sopenharmony_ci{
10458c2ecf20Sopenharmony_ci	struct dentry *dentry;
10468c2ecf20Sopenharmony_cirestart:
10478c2ecf20Sopenharmony_ci	spin_lock(&inode->i_lock);
10488c2ecf20Sopenharmony_ci	hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
10498c2ecf20Sopenharmony_ci		spin_lock(&dentry->d_lock);
10508c2ecf20Sopenharmony_ci		if (!dentry->d_lockref.count) {
10518c2ecf20Sopenharmony_ci			struct dentry *parent = lock_parent(dentry);
10528c2ecf20Sopenharmony_ci			if (likely(!dentry->d_lockref.count)) {
10538c2ecf20Sopenharmony_ci				__dentry_kill(dentry);
10548c2ecf20Sopenharmony_ci				dput(parent);
10558c2ecf20Sopenharmony_ci				goto restart;
10568c2ecf20Sopenharmony_ci			}
10578c2ecf20Sopenharmony_ci			if (parent)
10588c2ecf20Sopenharmony_ci				spin_unlock(&parent->d_lock);
10598c2ecf20Sopenharmony_ci		}
10608c2ecf20Sopenharmony_ci		spin_unlock(&dentry->d_lock);
10618c2ecf20Sopenharmony_ci	}
10628c2ecf20Sopenharmony_ci	spin_unlock(&inode->i_lock);
10638c2ecf20Sopenharmony_ci}
10648c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_prune_aliases);
10658c2ecf20Sopenharmony_ci
10668c2ecf20Sopenharmony_ci/*
10678c2ecf20Sopenharmony_ci * Lock a dentry from shrink list.
10688c2ecf20Sopenharmony_ci * Called under rcu_read_lock() and dentry->d_lock; the former
10698c2ecf20Sopenharmony_ci * guarantees that nothing we access will be freed under us.
10708c2ecf20Sopenharmony_ci * Note that dentry is *not* protected from concurrent dentry_kill(),
10718c2ecf20Sopenharmony_ci * d_delete(), etc.
10728c2ecf20Sopenharmony_ci *
10738c2ecf20Sopenharmony_ci * Return false if dentry has been disrupted or grabbed, leaving
10748c2ecf20Sopenharmony_ci * the caller to kick it off-list.  Otherwise, return true and have
10758c2ecf20Sopenharmony_ci * that dentry's inode and parent both locked.
10768c2ecf20Sopenharmony_ci */
10778c2ecf20Sopenharmony_cistatic bool shrink_lock_dentry(struct dentry *dentry)
10788c2ecf20Sopenharmony_ci{
10798c2ecf20Sopenharmony_ci	struct inode *inode;
10808c2ecf20Sopenharmony_ci	struct dentry *parent;
10818c2ecf20Sopenharmony_ci
10828c2ecf20Sopenharmony_ci	if (dentry->d_lockref.count)
10838c2ecf20Sopenharmony_ci		return false;
10848c2ecf20Sopenharmony_ci
10858c2ecf20Sopenharmony_ci	inode = dentry->d_inode;
10868c2ecf20Sopenharmony_ci	if (inode && unlikely(!spin_trylock(&inode->i_lock))) {
10878c2ecf20Sopenharmony_ci		spin_unlock(&dentry->d_lock);
10888c2ecf20Sopenharmony_ci		spin_lock(&inode->i_lock);
10898c2ecf20Sopenharmony_ci		spin_lock(&dentry->d_lock);
10908c2ecf20Sopenharmony_ci		if (unlikely(dentry->d_lockref.count))
10918c2ecf20Sopenharmony_ci			goto out;
10928c2ecf20Sopenharmony_ci		/* changed inode means that somebody had grabbed it */
10938c2ecf20Sopenharmony_ci		if (unlikely(inode != dentry->d_inode))
10948c2ecf20Sopenharmony_ci			goto out;
10958c2ecf20Sopenharmony_ci	}
10968c2ecf20Sopenharmony_ci
10978c2ecf20Sopenharmony_ci	parent = dentry->d_parent;
10988c2ecf20Sopenharmony_ci	if (IS_ROOT(dentry) || likely(spin_trylock(&parent->d_lock)))
10998c2ecf20Sopenharmony_ci		return true;
11008c2ecf20Sopenharmony_ci
11018c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
11028c2ecf20Sopenharmony_ci	spin_lock(&parent->d_lock);
11038c2ecf20Sopenharmony_ci	if (unlikely(parent != dentry->d_parent)) {
11048c2ecf20Sopenharmony_ci		spin_unlock(&parent->d_lock);
11058c2ecf20Sopenharmony_ci		spin_lock(&dentry->d_lock);
11068c2ecf20Sopenharmony_ci		goto out;
11078c2ecf20Sopenharmony_ci	}
11088c2ecf20Sopenharmony_ci	spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
11098c2ecf20Sopenharmony_ci	if (likely(!dentry->d_lockref.count))
11108c2ecf20Sopenharmony_ci		return true;
11118c2ecf20Sopenharmony_ci	spin_unlock(&parent->d_lock);
11128c2ecf20Sopenharmony_ciout:
11138c2ecf20Sopenharmony_ci	if (inode)
11148c2ecf20Sopenharmony_ci		spin_unlock(&inode->i_lock);
11158c2ecf20Sopenharmony_ci	return false;
11168c2ecf20Sopenharmony_ci}
11178c2ecf20Sopenharmony_ci
11188c2ecf20Sopenharmony_civoid shrink_dentry_list(struct list_head *list)
11198c2ecf20Sopenharmony_ci{
11208c2ecf20Sopenharmony_ci	while (!list_empty(list)) {
11218c2ecf20Sopenharmony_ci		struct dentry *dentry, *parent;
11228c2ecf20Sopenharmony_ci
11238c2ecf20Sopenharmony_ci		dentry = list_entry(list->prev, struct dentry, d_lru);
11248c2ecf20Sopenharmony_ci		spin_lock(&dentry->d_lock);
11258c2ecf20Sopenharmony_ci		rcu_read_lock();
11268c2ecf20Sopenharmony_ci		if (!shrink_lock_dentry(dentry)) {
11278c2ecf20Sopenharmony_ci			bool can_free = false;
11288c2ecf20Sopenharmony_ci			rcu_read_unlock();
11298c2ecf20Sopenharmony_ci			d_shrink_del(dentry);
11308c2ecf20Sopenharmony_ci			if (dentry->d_lockref.count < 0)
11318c2ecf20Sopenharmony_ci				can_free = dentry->d_flags & DCACHE_MAY_FREE;
11328c2ecf20Sopenharmony_ci			spin_unlock(&dentry->d_lock);
11338c2ecf20Sopenharmony_ci			if (can_free)
11348c2ecf20Sopenharmony_ci				dentry_free(dentry);
11358c2ecf20Sopenharmony_ci			continue;
11368c2ecf20Sopenharmony_ci		}
11378c2ecf20Sopenharmony_ci		rcu_read_unlock();
11388c2ecf20Sopenharmony_ci		d_shrink_del(dentry);
11398c2ecf20Sopenharmony_ci		parent = dentry->d_parent;
11408c2ecf20Sopenharmony_ci		if (parent != dentry)
11418c2ecf20Sopenharmony_ci			__dput_to_list(parent, list);
11428c2ecf20Sopenharmony_ci		__dentry_kill(dentry);
11438c2ecf20Sopenharmony_ci	}
11448c2ecf20Sopenharmony_ci}
11458c2ecf20Sopenharmony_ci
11468c2ecf20Sopenharmony_cistatic enum lru_status dentry_lru_isolate(struct list_head *item,
11478c2ecf20Sopenharmony_ci		struct list_lru_one *lru, spinlock_t *lru_lock, void *arg)
11488c2ecf20Sopenharmony_ci{
11498c2ecf20Sopenharmony_ci	struct list_head *freeable = arg;
11508c2ecf20Sopenharmony_ci	struct dentry	*dentry = container_of(item, struct dentry, d_lru);
11518c2ecf20Sopenharmony_ci
11528c2ecf20Sopenharmony_ci
11538c2ecf20Sopenharmony_ci	/*
11548c2ecf20Sopenharmony_ci	 * we are inverting the lru lock/dentry->d_lock here,
11558c2ecf20Sopenharmony_ci	 * so use a trylock. If we fail to get the lock, just skip
11568c2ecf20Sopenharmony_ci	 * it
11578c2ecf20Sopenharmony_ci	 */
11588c2ecf20Sopenharmony_ci	if (!spin_trylock(&dentry->d_lock))
11598c2ecf20Sopenharmony_ci		return LRU_SKIP;
11608c2ecf20Sopenharmony_ci
11618c2ecf20Sopenharmony_ci	/*
11628c2ecf20Sopenharmony_ci	 * Referenced dentries are still in use. If they have active
11638c2ecf20Sopenharmony_ci	 * counts, just remove them from the LRU. Otherwise give them
11648c2ecf20Sopenharmony_ci	 * another pass through the LRU.
11658c2ecf20Sopenharmony_ci	 */
11668c2ecf20Sopenharmony_ci	if (dentry->d_lockref.count) {
11678c2ecf20Sopenharmony_ci		d_lru_isolate(lru, dentry);
11688c2ecf20Sopenharmony_ci		spin_unlock(&dentry->d_lock);
11698c2ecf20Sopenharmony_ci		return LRU_REMOVED;
11708c2ecf20Sopenharmony_ci	}
11718c2ecf20Sopenharmony_ci
11728c2ecf20Sopenharmony_ci	if (dentry->d_flags & DCACHE_REFERENCED) {
11738c2ecf20Sopenharmony_ci		dentry->d_flags &= ~DCACHE_REFERENCED;
11748c2ecf20Sopenharmony_ci		spin_unlock(&dentry->d_lock);
11758c2ecf20Sopenharmony_ci
11768c2ecf20Sopenharmony_ci		/*
11778c2ecf20Sopenharmony_ci		 * The list move itself will be made by the common LRU code. At
11788c2ecf20Sopenharmony_ci		 * this point, we've dropped the dentry->d_lock but keep the
11798c2ecf20Sopenharmony_ci		 * lru lock. This is safe to do, since every list movement is
11808c2ecf20Sopenharmony_ci		 * protected by the lru lock even if both locks are held.
11818c2ecf20Sopenharmony_ci		 *
11828c2ecf20Sopenharmony_ci		 * This is guaranteed by the fact that all LRU management
11838c2ecf20Sopenharmony_ci		 * functions are intermediated by the LRU API calls like
11848c2ecf20Sopenharmony_ci		 * list_lru_add and list_lru_del. List movement in this file
11858c2ecf20Sopenharmony_ci		 * only ever occur through this functions or through callbacks
11868c2ecf20Sopenharmony_ci		 * like this one, that are called from the LRU API.
11878c2ecf20Sopenharmony_ci		 *
11888c2ecf20Sopenharmony_ci		 * The only exceptions to this are functions like
11898c2ecf20Sopenharmony_ci		 * shrink_dentry_list, and code that first checks for the
11908c2ecf20Sopenharmony_ci		 * DCACHE_SHRINK_LIST flag.  Those are guaranteed to be
11918c2ecf20Sopenharmony_ci		 * operating only with stack provided lists after they are
11928c2ecf20Sopenharmony_ci		 * properly isolated from the main list.  It is thus, always a
11938c2ecf20Sopenharmony_ci		 * local access.
11948c2ecf20Sopenharmony_ci		 */
11958c2ecf20Sopenharmony_ci		return LRU_ROTATE;
11968c2ecf20Sopenharmony_ci	}
11978c2ecf20Sopenharmony_ci
11988c2ecf20Sopenharmony_ci	d_lru_shrink_move(lru, dentry, freeable);
11998c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
12008c2ecf20Sopenharmony_ci
12018c2ecf20Sopenharmony_ci	return LRU_REMOVED;
12028c2ecf20Sopenharmony_ci}
12038c2ecf20Sopenharmony_ci
12048c2ecf20Sopenharmony_ci/**
12058c2ecf20Sopenharmony_ci * prune_dcache_sb - shrink the dcache
12068c2ecf20Sopenharmony_ci * @sb: superblock
12078c2ecf20Sopenharmony_ci * @sc: shrink control, passed to list_lru_shrink_walk()
12088c2ecf20Sopenharmony_ci *
12098c2ecf20Sopenharmony_ci * Attempt to shrink the superblock dcache LRU by @sc->nr_to_scan entries. This
12108c2ecf20Sopenharmony_ci * is done when we need more memory and called from the superblock shrinker
12118c2ecf20Sopenharmony_ci * function.
12128c2ecf20Sopenharmony_ci *
12138c2ecf20Sopenharmony_ci * This function may fail to free any resources if all the dentries are in
12148c2ecf20Sopenharmony_ci * use.
12158c2ecf20Sopenharmony_ci */
12168c2ecf20Sopenharmony_cilong prune_dcache_sb(struct super_block *sb, struct shrink_control *sc)
12178c2ecf20Sopenharmony_ci{
12188c2ecf20Sopenharmony_ci	LIST_HEAD(dispose);
12198c2ecf20Sopenharmony_ci	long freed;
12208c2ecf20Sopenharmony_ci
12218c2ecf20Sopenharmony_ci	freed = list_lru_shrink_walk(&sb->s_dentry_lru, sc,
12228c2ecf20Sopenharmony_ci				     dentry_lru_isolate, &dispose);
12238c2ecf20Sopenharmony_ci	shrink_dentry_list(&dispose);
12248c2ecf20Sopenharmony_ci	return freed;
12258c2ecf20Sopenharmony_ci}
12268c2ecf20Sopenharmony_ci
12278c2ecf20Sopenharmony_cistatic enum lru_status dentry_lru_isolate_shrink(struct list_head *item,
12288c2ecf20Sopenharmony_ci		struct list_lru_one *lru, spinlock_t *lru_lock, void *arg)
12298c2ecf20Sopenharmony_ci{
12308c2ecf20Sopenharmony_ci	struct list_head *freeable = arg;
12318c2ecf20Sopenharmony_ci	struct dentry	*dentry = container_of(item, struct dentry, d_lru);
12328c2ecf20Sopenharmony_ci
12338c2ecf20Sopenharmony_ci	/*
12348c2ecf20Sopenharmony_ci	 * we are inverting the lru lock/dentry->d_lock here,
12358c2ecf20Sopenharmony_ci	 * so use a trylock. If we fail to get the lock, just skip
12368c2ecf20Sopenharmony_ci	 * it
12378c2ecf20Sopenharmony_ci	 */
12388c2ecf20Sopenharmony_ci	if (!spin_trylock(&dentry->d_lock))
12398c2ecf20Sopenharmony_ci		return LRU_SKIP;
12408c2ecf20Sopenharmony_ci
12418c2ecf20Sopenharmony_ci	d_lru_shrink_move(lru, dentry, freeable);
12428c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
12438c2ecf20Sopenharmony_ci
12448c2ecf20Sopenharmony_ci	return LRU_REMOVED;
12458c2ecf20Sopenharmony_ci}
12468c2ecf20Sopenharmony_ci
12478c2ecf20Sopenharmony_ci
12488c2ecf20Sopenharmony_ci/**
12498c2ecf20Sopenharmony_ci * shrink_dcache_sb - shrink dcache for a superblock
12508c2ecf20Sopenharmony_ci * @sb: superblock
12518c2ecf20Sopenharmony_ci *
12528c2ecf20Sopenharmony_ci * Shrink the dcache for the specified super block. This is used to free
12538c2ecf20Sopenharmony_ci * the dcache before unmounting a file system.
12548c2ecf20Sopenharmony_ci */
12558c2ecf20Sopenharmony_civoid shrink_dcache_sb(struct super_block *sb)
12568c2ecf20Sopenharmony_ci{
12578c2ecf20Sopenharmony_ci	do {
12588c2ecf20Sopenharmony_ci		LIST_HEAD(dispose);
12598c2ecf20Sopenharmony_ci
12608c2ecf20Sopenharmony_ci		list_lru_walk(&sb->s_dentry_lru,
12618c2ecf20Sopenharmony_ci			dentry_lru_isolate_shrink, &dispose, 1024);
12628c2ecf20Sopenharmony_ci		shrink_dentry_list(&dispose);
12638c2ecf20Sopenharmony_ci	} while (list_lru_count(&sb->s_dentry_lru) > 0);
12648c2ecf20Sopenharmony_ci}
12658c2ecf20Sopenharmony_ciEXPORT_SYMBOL(shrink_dcache_sb);
12668c2ecf20Sopenharmony_ci
12678c2ecf20Sopenharmony_ci/**
12688c2ecf20Sopenharmony_ci * enum d_walk_ret - action to talke during tree walk
12698c2ecf20Sopenharmony_ci * @D_WALK_CONTINUE:	contrinue walk
12708c2ecf20Sopenharmony_ci * @D_WALK_QUIT:	quit walk
12718c2ecf20Sopenharmony_ci * @D_WALK_NORETRY:	quit when retry is needed
12728c2ecf20Sopenharmony_ci * @D_WALK_SKIP:	skip this dentry and its children
12738c2ecf20Sopenharmony_ci */
12748c2ecf20Sopenharmony_cienum d_walk_ret {
12758c2ecf20Sopenharmony_ci	D_WALK_CONTINUE,
12768c2ecf20Sopenharmony_ci	D_WALK_QUIT,
12778c2ecf20Sopenharmony_ci	D_WALK_NORETRY,
12788c2ecf20Sopenharmony_ci	D_WALK_SKIP,
12798c2ecf20Sopenharmony_ci};
12808c2ecf20Sopenharmony_ci
12818c2ecf20Sopenharmony_ci/**
12828c2ecf20Sopenharmony_ci * d_walk - walk the dentry tree
12838c2ecf20Sopenharmony_ci * @parent:	start of walk
12848c2ecf20Sopenharmony_ci * @data:	data passed to @enter() and @finish()
12858c2ecf20Sopenharmony_ci * @enter:	callback when first entering the dentry
12868c2ecf20Sopenharmony_ci *
12878c2ecf20Sopenharmony_ci * The @enter() callbacks are called with d_lock held.
12888c2ecf20Sopenharmony_ci */
12898c2ecf20Sopenharmony_cistatic void d_walk(struct dentry *parent, void *data,
12908c2ecf20Sopenharmony_ci		   enum d_walk_ret (*enter)(void *, struct dentry *))
12918c2ecf20Sopenharmony_ci{
12928c2ecf20Sopenharmony_ci	struct dentry *this_parent;
12938c2ecf20Sopenharmony_ci	struct list_head *next;
12948c2ecf20Sopenharmony_ci	unsigned seq = 0;
12958c2ecf20Sopenharmony_ci	enum d_walk_ret ret;
12968c2ecf20Sopenharmony_ci	bool retry = true;
12978c2ecf20Sopenharmony_ci
12988c2ecf20Sopenharmony_ciagain:
12998c2ecf20Sopenharmony_ci	read_seqbegin_or_lock(&rename_lock, &seq);
13008c2ecf20Sopenharmony_ci	this_parent = parent;
13018c2ecf20Sopenharmony_ci	spin_lock(&this_parent->d_lock);
13028c2ecf20Sopenharmony_ci
13038c2ecf20Sopenharmony_ci	ret = enter(data, this_parent);
13048c2ecf20Sopenharmony_ci	switch (ret) {
13058c2ecf20Sopenharmony_ci	case D_WALK_CONTINUE:
13068c2ecf20Sopenharmony_ci		break;
13078c2ecf20Sopenharmony_ci	case D_WALK_QUIT:
13088c2ecf20Sopenharmony_ci	case D_WALK_SKIP:
13098c2ecf20Sopenharmony_ci		goto out_unlock;
13108c2ecf20Sopenharmony_ci	case D_WALK_NORETRY:
13118c2ecf20Sopenharmony_ci		retry = false;
13128c2ecf20Sopenharmony_ci		break;
13138c2ecf20Sopenharmony_ci	}
13148c2ecf20Sopenharmony_cirepeat:
13158c2ecf20Sopenharmony_ci	next = this_parent->d_subdirs.next;
13168c2ecf20Sopenharmony_ciresume:
13178c2ecf20Sopenharmony_ci	while (next != &this_parent->d_subdirs) {
13188c2ecf20Sopenharmony_ci		struct list_head *tmp = next;
13198c2ecf20Sopenharmony_ci		struct dentry *dentry = list_entry(tmp, struct dentry, d_child);
13208c2ecf20Sopenharmony_ci		next = tmp->next;
13218c2ecf20Sopenharmony_ci
13228c2ecf20Sopenharmony_ci		if (unlikely(dentry->d_flags & DCACHE_DENTRY_CURSOR))
13238c2ecf20Sopenharmony_ci			continue;
13248c2ecf20Sopenharmony_ci
13258c2ecf20Sopenharmony_ci		spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
13268c2ecf20Sopenharmony_ci
13278c2ecf20Sopenharmony_ci		ret = enter(data, dentry);
13288c2ecf20Sopenharmony_ci		switch (ret) {
13298c2ecf20Sopenharmony_ci		case D_WALK_CONTINUE:
13308c2ecf20Sopenharmony_ci			break;
13318c2ecf20Sopenharmony_ci		case D_WALK_QUIT:
13328c2ecf20Sopenharmony_ci			spin_unlock(&dentry->d_lock);
13338c2ecf20Sopenharmony_ci			goto out_unlock;
13348c2ecf20Sopenharmony_ci		case D_WALK_NORETRY:
13358c2ecf20Sopenharmony_ci			retry = false;
13368c2ecf20Sopenharmony_ci			break;
13378c2ecf20Sopenharmony_ci		case D_WALK_SKIP:
13388c2ecf20Sopenharmony_ci			spin_unlock(&dentry->d_lock);
13398c2ecf20Sopenharmony_ci			continue;
13408c2ecf20Sopenharmony_ci		}
13418c2ecf20Sopenharmony_ci
13428c2ecf20Sopenharmony_ci		if (!list_empty(&dentry->d_subdirs)) {
13438c2ecf20Sopenharmony_ci			spin_unlock(&this_parent->d_lock);
13448c2ecf20Sopenharmony_ci			spin_release(&dentry->d_lock.dep_map, _RET_IP_);
13458c2ecf20Sopenharmony_ci			this_parent = dentry;
13468c2ecf20Sopenharmony_ci			spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_);
13478c2ecf20Sopenharmony_ci			goto repeat;
13488c2ecf20Sopenharmony_ci		}
13498c2ecf20Sopenharmony_ci		spin_unlock(&dentry->d_lock);
13508c2ecf20Sopenharmony_ci	}
13518c2ecf20Sopenharmony_ci	/*
13528c2ecf20Sopenharmony_ci	 * All done at this level ... ascend and resume the search.
13538c2ecf20Sopenharmony_ci	 */
13548c2ecf20Sopenharmony_ci	rcu_read_lock();
13558c2ecf20Sopenharmony_ciascend:
13568c2ecf20Sopenharmony_ci	if (this_parent != parent) {
13578c2ecf20Sopenharmony_ci		struct dentry *child = this_parent;
13588c2ecf20Sopenharmony_ci		this_parent = child->d_parent;
13598c2ecf20Sopenharmony_ci
13608c2ecf20Sopenharmony_ci		spin_unlock(&child->d_lock);
13618c2ecf20Sopenharmony_ci		spin_lock(&this_parent->d_lock);
13628c2ecf20Sopenharmony_ci
13638c2ecf20Sopenharmony_ci		/* might go back up the wrong parent if we have had a rename. */
13648c2ecf20Sopenharmony_ci		if (need_seqretry(&rename_lock, seq))
13658c2ecf20Sopenharmony_ci			goto rename_retry;
13668c2ecf20Sopenharmony_ci		/* go into the first sibling still alive */
13678c2ecf20Sopenharmony_ci		do {
13688c2ecf20Sopenharmony_ci			next = child->d_child.next;
13698c2ecf20Sopenharmony_ci			if (next == &this_parent->d_subdirs)
13708c2ecf20Sopenharmony_ci				goto ascend;
13718c2ecf20Sopenharmony_ci			child = list_entry(next, struct dentry, d_child);
13728c2ecf20Sopenharmony_ci		} while (unlikely(child->d_flags & DCACHE_DENTRY_KILLED));
13738c2ecf20Sopenharmony_ci		rcu_read_unlock();
13748c2ecf20Sopenharmony_ci		goto resume;
13758c2ecf20Sopenharmony_ci	}
13768c2ecf20Sopenharmony_ci	if (need_seqretry(&rename_lock, seq))
13778c2ecf20Sopenharmony_ci		goto rename_retry;
13788c2ecf20Sopenharmony_ci	rcu_read_unlock();
13798c2ecf20Sopenharmony_ci
13808c2ecf20Sopenharmony_ciout_unlock:
13818c2ecf20Sopenharmony_ci	spin_unlock(&this_parent->d_lock);
13828c2ecf20Sopenharmony_ci	done_seqretry(&rename_lock, seq);
13838c2ecf20Sopenharmony_ci	return;
13848c2ecf20Sopenharmony_ci
13858c2ecf20Sopenharmony_cirename_retry:
13868c2ecf20Sopenharmony_ci	spin_unlock(&this_parent->d_lock);
13878c2ecf20Sopenharmony_ci	rcu_read_unlock();
13888c2ecf20Sopenharmony_ci	BUG_ON(seq & 1);
13898c2ecf20Sopenharmony_ci	if (!retry)
13908c2ecf20Sopenharmony_ci		return;
13918c2ecf20Sopenharmony_ci	seq = 1;
13928c2ecf20Sopenharmony_ci	goto again;
13938c2ecf20Sopenharmony_ci}
13948c2ecf20Sopenharmony_ci
13958c2ecf20Sopenharmony_cistruct check_mount {
13968c2ecf20Sopenharmony_ci	struct vfsmount *mnt;
13978c2ecf20Sopenharmony_ci	unsigned int mounted;
13988c2ecf20Sopenharmony_ci};
13998c2ecf20Sopenharmony_ci
14008c2ecf20Sopenharmony_cistatic enum d_walk_ret path_check_mount(void *data, struct dentry *dentry)
14018c2ecf20Sopenharmony_ci{
14028c2ecf20Sopenharmony_ci	struct check_mount *info = data;
14038c2ecf20Sopenharmony_ci	struct path path = { .mnt = info->mnt, .dentry = dentry };
14048c2ecf20Sopenharmony_ci
14058c2ecf20Sopenharmony_ci	if (likely(!d_mountpoint(dentry)))
14068c2ecf20Sopenharmony_ci		return D_WALK_CONTINUE;
14078c2ecf20Sopenharmony_ci	if (__path_is_mountpoint(&path)) {
14088c2ecf20Sopenharmony_ci		info->mounted = 1;
14098c2ecf20Sopenharmony_ci		return D_WALK_QUIT;
14108c2ecf20Sopenharmony_ci	}
14118c2ecf20Sopenharmony_ci	return D_WALK_CONTINUE;
14128c2ecf20Sopenharmony_ci}
14138c2ecf20Sopenharmony_ci
14148c2ecf20Sopenharmony_ci/**
14158c2ecf20Sopenharmony_ci * path_has_submounts - check for mounts over a dentry in the
14168c2ecf20Sopenharmony_ci *                      current namespace.
14178c2ecf20Sopenharmony_ci * @parent: path to check.
14188c2ecf20Sopenharmony_ci *
14198c2ecf20Sopenharmony_ci * Return true if the parent or its subdirectories contain
14208c2ecf20Sopenharmony_ci * a mount point in the current namespace.
14218c2ecf20Sopenharmony_ci */
14228c2ecf20Sopenharmony_ciint path_has_submounts(const struct path *parent)
14238c2ecf20Sopenharmony_ci{
14248c2ecf20Sopenharmony_ci	struct check_mount data = { .mnt = parent->mnt, .mounted = 0 };
14258c2ecf20Sopenharmony_ci
14268c2ecf20Sopenharmony_ci	read_seqlock_excl(&mount_lock);
14278c2ecf20Sopenharmony_ci	d_walk(parent->dentry, &data, path_check_mount);
14288c2ecf20Sopenharmony_ci	read_sequnlock_excl(&mount_lock);
14298c2ecf20Sopenharmony_ci
14308c2ecf20Sopenharmony_ci	return data.mounted;
14318c2ecf20Sopenharmony_ci}
14328c2ecf20Sopenharmony_ciEXPORT_SYMBOL(path_has_submounts);
14338c2ecf20Sopenharmony_ci
14348c2ecf20Sopenharmony_ci/*
14358c2ecf20Sopenharmony_ci * Called by mount code to set a mountpoint and check if the mountpoint is
14368c2ecf20Sopenharmony_ci * reachable (e.g. NFS can unhash a directory dentry and then the complete
14378c2ecf20Sopenharmony_ci * subtree can become unreachable).
14388c2ecf20Sopenharmony_ci *
14398c2ecf20Sopenharmony_ci * Only one of d_invalidate() and d_set_mounted() must succeed.  For
14408c2ecf20Sopenharmony_ci * this reason take rename_lock and d_lock on dentry and ancestors.
14418c2ecf20Sopenharmony_ci */
14428c2ecf20Sopenharmony_ciint d_set_mounted(struct dentry *dentry)
14438c2ecf20Sopenharmony_ci{
14448c2ecf20Sopenharmony_ci	struct dentry *p;
14458c2ecf20Sopenharmony_ci	int ret = -ENOENT;
14468c2ecf20Sopenharmony_ci	write_seqlock(&rename_lock);
14478c2ecf20Sopenharmony_ci	for (p = dentry->d_parent; !IS_ROOT(p); p = p->d_parent) {
14488c2ecf20Sopenharmony_ci		/* Need exclusion wrt. d_invalidate() */
14498c2ecf20Sopenharmony_ci		spin_lock(&p->d_lock);
14508c2ecf20Sopenharmony_ci		if (unlikely(d_unhashed(p))) {
14518c2ecf20Sopenharmony_ci			spin_unlock(&p->d_lock);
14528c2ecf20Sopenharmony_ci			goto out;
14538c2ecf20Sopenharmony_ci		}
14548c2ecf20Sopenharmony_ci		spin_unlock(&p->d_lock);
14558c2ecf20Sopenharmony_ci	}
14568c2ecf20Sopenharmony_ci	spin_lock(&dentry->d_lock);
14578c2ecf20Sopenharmony_ci	if (!d_unlinked(dentry)) {
14588c2ecf20Sopenharmony_ci		ret = -EBUSY;
14598c2ecf20Sopenharmony_ci		if (!d_mountpoint(dentry)) {
14608c2ecf20Sopenharmony_ci			dentry->d_flags |= DCACHE_MOUNTED;
14618c2ecf20Sopenharmony_ci			ret = 0;
14628c2ecf20Sopenharmony_ci		}
14638c2ecf20Sopenharmony_ci	}
14648c2ecf20Sopenharmony_ci 	spin_unlock(&dentry->d_lock);
14658c2ecf20Sopenharmony_ciout:
14668c2ecf20Sopenharmony_ci	write_sequnlock(&rename_lock);
14678c2ecf20Sopenharmony_ci	return ret;
14688c2ecf20Sopenharmony_ci}
14698c2ecf20Sopenharmony_ci
14708c2ecf20Sopenharmony_ci/*
14718c2ecf20Sopenharmony_ci * Search the dentry child list of the specified parent,
14728c2ecf20Sopenharmony_ci * and move any unused dentries to the end of the unused
14738c2ecf20Sopenharmony_ci * list for prune_dcache(). We descend to the next level
14748c2ecf20Sopenharmony_ci * whenever the d_subdirs list is non-empty and continue
14758c2ecf20Sopenharmony_ci * searching.
14768c2ecf20Sopenharmony_ci *
14778c2ecf20Sopenharmony_ci * It returns zero iff there are no unused children,
14788c2ecf20Sopenharmony_ci * otherwise  it returns the number of children moved to
14798c2ecf20Sopenharmony_ci * the end of the unused list. This may not be the total
14808c2ecf20Sopenharmony_ci * number of unused children, because select_parent can
14818c2ecf20Sopenharmony_ci * drop the lock and return early due to latency
14828c2ecf20Sopenharmony_ci * constraints.
14838c2ecf20Sopenharmony_ci */
14848c2ecf20Sopenharmony_ci
14858c2ecf20Sopenharmony_cistruct select_data {
14868c2ecf20Sopenharmony_ci	struct dentry *start;
14878c2ecf20Sopenharmony_ci	union {
14888c2ecf20Sopenharmony_ci		long found;
14898c2ecf20Sopenharmony_ci		struct dentry *victim;
14908c2ecf20Sopenharmony_ci	};
14918c2ecf20Sopenharmony_ci	struct list_head dispose;
14928c2ecf20Sopenharmony_ci};
14938c2ecf20Sopenharmony_ci
14948c2ecf20Sopenharmony_cistatic enum d_walk_ret select_collect(void *_data, struct dentry *dentry)
14958c2ecf20Sopenharmony_ci{
14968c2ecf20Sopenharmony_ci	struct select_data *data = _data;
14978c2ecf20Sopenharmony_ci	enum d_walk_ret ret = D_WALK_CONTINUE;
14988c2ecf20Sopenharmony_ci
14998c2ecf20Sopenharmony_ci	if (data->start == dentry)
15008c2ecf20Sopenharmony_ci		goto out;
15018c2ecf20Sopenharmony_ci
15028c2ecf20Sopenharmony_ci	if (dentry->d_flags & DCACHE_SHRINK_LIST) {
15038c2ecf20Sopenharmony_ci		data->found++;
15048c2ecf20Sopenharmony_ci	} else {
15058c2ecf20Sopenharmony_ci		if (dentry->d_flags & DCACHE_LRU_LIST)
15068c2ecf20Sopenharmony_ci			d_lru_del(dentry);
15078c2ecf20Sopenharmony_ci		if (!dentry->d_lockref.count) {
15088c2ecf20Sopenharmony_ci			d_shrink_add(dentry, &data->dispose);
15098c2ecf20Sopenharmony_ci			data->found++;
15108c2ecf20Sopenharmony_ci		}
15118c2ecf20Sopenharmony_ci	}
15128c2ecf20Sopenharmony_ci	/*
15138c2ecf20Sopenharmony_ci	 * We can return to the caller if we have found some (this
15148c2ecf20Sopenharmony_ci	 * ensures forward progress). We'll be coming back to find
15158c2ecf20Sopenharmony_ci	 * the rest.
15168c2ecf20Sopenharmony_ci	 */
15178c2ecf20Sopenharmony_ci	if (!list_empty(&data->dispose))
15188c2ecf20Sopenharmony_ci		ret = need_resched() ? D_WALK_QUIT : D_WALK_NORETRY;
15198c2ecf20Sopenharmony_ciout:
15208c2ecf20Sopenharmony_ci	return ret;
15218c2ecf20Sopenharmony_ci}
15228c2ecf20Sopenharmony_ci
15238c2ecf20Sopenharmony_cistatic enum d_walk_ret select_collect2(void *_data, struct dentry *dentry)
15248c2ecf20Sopenharmony_ci{
15258c2ecf20Sopenharmony_ci	struct select_data *data = _data;
15268c2ecf20Sopenharmony_ci	enum d_walk_ret ret = D_WALK_CONTINUE;
15278c2ecf20Sopenharmony_ci
15288c2ecf20Sopenharmony_ci	if (data->start == dentry)
15298c2ecf20Sopenharmony_ci		goto out;
15308c2ecf20Sopenharmony_ci
15318c2ecf20Sopenharmony_ci	if (dentry->d_flags & DCACHE_SHRINK_LIST) {
15328c2ecf20Sopenharmony_ci		if (!dentry->d_lockref.count) {
15338c2ecf20Sopenharmony_ci			rcu_read_lock();
15348c2ecf20Sopenharmony_ci			data->victim = dentry;
15358c2ecf20Sopenharmony_ci			return D_WALK_QUIT;
15368c2ecf20Sopenharmony_ci		}
15378c2ecf20Sopenharmony_ci	} else {
15388c2ecf20Sopenharmony_ci		if (dentry->d_flags & DCACHE_LRU_LIST)
15398c2ecf20Sopenharmony_ci			d_lru_del(dentry);
15408c2ecf20Sopenharmony_ci		if (!dentry->d_lockref.count)
15418c2ecf20Sopenharmony_ci			d_shrink_add(dentry, &data->dispose);
15428c2ecf20Sopenharmony_ci	}
15438c2ecf20Sopenharmony_ci	/*
15448c2ecf20Sopenharmony_ci	 * We can return to the caller if we have found some (this
15458c2ecf20Sopenharmony_ci	 * ensures forward progress). We'll be coming back to find
15468c2ecf20Sopenharmony_ci	 * the rest.
15478c2ecf20Sopenharmony_ci	 */
15488c2ecf20Sopenharmony_ci	if (!list_empty(&data->dispose))
15498c2ecf20Sopenharmony_ci		ret = need_resched() ? D_WALK_QUIT : D_WALK_NORETRY;
15508c2ecf20Sopenharmony_ciout:
15518c2ecf20Sopenharmony_ci	return ret;
15528c2ecf20Sopenharmony_ci}
15538c2ecf20Sopenharmony_ci
15548c2ecf20Sopenharmony_ci/**
15558c2ecf20Sopenharmony_ci * shrink_dcache_parent - prune dcache
15568c2ecf20Sopenharmony_ci * @parent: parent of entries to prune
15578c2ecf20Sopenharmony_ci *
15588c2ecf20Sopenharmony_ci * Prune the dcache to remove unused children of the parent dentry.
15598c2ecf20Sopenharmony_ci */
15608c2ecf20Sopenharmony_civoid shrink_dcache_parent(struct dentry *parent)
15618c2ecf20Sopenharmony_ci{
15628c2ecf20Sopenharmony_ci	for (;;) {
15638c2ecf20Sopenharmony_ci		struct select_data data = {.start = parent};
15648c2ecf20Sopenharmony_ci
15658c2ecf20Sopenharmony_ci		INIT_LIST_HEAD(&data.dispose);
15668c2ecf20Sopenharmony_ci		d_walk(parent, &data, select_collect);
15678c2ecf20Sopenharmony_ci
15688c2ecf20Sopenharmony_ci		if (!list_empty(&data.dispose)) {
15698c2ecf20Sopenharmony_ci			shrink_dentry_list(&data.dispose);
15708c2ecf20Sopenharmony_ci			continue;
15718c2ecf20Sopenharmony_ci		}
15728c2ecf20Sopenharmony_ci
15738c2ecf20Sopenharmony_ci		cond_resched();
15748c2ecf20Sopenharmony_ci		if (!data.found)
15758c2ecf20Sopenharmony_ci			break;
15768c2ecf20Sopenharmony_ci		data.victim = NULL;
15778c2ecf20Sopenharmony_ci		d_walk(parent, &data, select_collect2);
15788c2ecf20Sopenharmony_ci		if (data.victim) {
15798c2ecf20Sopenharmony_ci			struct dentry *parent;
15808c2ecf20Sopenharmony_ci			spin_lock(&data.victim->d_lock);
15818c2ecf20Sopenharmony_ci			if (!shrink_lock_dentry(data.victim)) {
15828c2ecf20Sopenharmony_ci				spin_unlock(&data.victim->d_lock);
15838c2ecf20Sopenharmony_ci				rcu_read_unlock();
15848c2ecf20Sopenharmony_ci			} else {
15858c2ecf20Sopenharmony_ci				rcu_read_unlock();
15868c2ecf20Sopenharmony_ci				parent = data.victim->d_parent;
15878c2ecf20Sopenharmony_ci				if (parent != data.victim)
15888c2ecf20Sopenharmony_ci					__dput_to_list(parent, &data.dispose);
15898c2ecf20Sopenharmony_ci				__dentry_kill(data.victim);
15908c2ecf20Sopenharmony_ci			}
15918c2ecf20Sopenharmony_ci		}
15928c2ecf20Sopenharmony_ci		if (!list_empty(&data.dispose))
15938c2ecf20Sopenharmony_ci			shrink_dentry_list(&data.dispose);
15948c2ecf20Sopenharmony_ci	}
15958c2ecf20Sopenharmony_ci}
15968c2ecf20Sopenharmony_ciEXPORT_SYMBOL(shrink_dcache_parent);
15978c2ecf20Sopenharmony_ci
15988c2ecf20Sopenharmony_cistatic enum d_walk_ret umount_check(void *_data, struct dentry *dentry)
15998c2ecf20Sopenharmony_ci{
16008c2ecf20Sopenharmony_ci	/* it has busy descendents; complain about those instead */
16018c2ecf20Sopenharmony_ci	if (!list_empty(&dentry->d_subdirs))
16028c2ecf20Sopenharmony_ci		return D_WALK_CONTINUE;
16038c2ecf20Sopenharmony_ci
16048c2ecf20Sopenharmony_ci	/* root with refcount 1 is fine */
16058c2ecf20Sopenharmony_ci	if (dentry == _data && dentry->d_lockref.count == 1)
16068c2ecf20Sopenharmony_ci		return D_WALK_CONTINUE;
16078c2ecf20Sopenharmony_ci
16088c2ecf20Sopenharmony_ci	printk(KERN_ERR "BUG: Dentry %p{i=%lx,n=%pd} "
16098c2ecf20Sopenharmony_ci			" still in use (%d) [unmount of %s %s]\n",
16108c2ecf20Sopenharmony_ci		       dentry,
16118c2ecf20Sopenharmony_ci		       dentry->d_inode ?
16128c2ecf20Sopenharmony_ci		       dentry->d_inode->i_ino : 0UL,
16138c2ecf20Sopenharmony_ci		       dentry,
16148c2ecf20Sopenharmony_ci		       dentry->d_lockref.count,
16158c2ecf20Sopenharmony_ci		       dentry->d_sb->s_type->name,
16168c2ecf20Sopenharmony_ci		       dentry->d_sb->s_id);
16178c2ecf20Sopenharmony_ci	WARN_ON(1);
16188c2ecf20Sopenharmony_ci	return D_WALK_CONTINUE;
16198c2ecf20Sopenharmony_ci}
16208c2ecf20Sopenharmony_ci
16218c2ecf20Sopenharmony_cistatic void do_one_tree(struct dentry *dentry)
16228c2ecf20Sopenharmony_ci{
16238c2ecf20Sopenharmony_ci	shrink_dcache_parent(dentry);
16248c2ecf20Sopenharmony_ci	d_walk(dentry, dentry, umount_check);
16258c2ecf20Sopenharmony_ci	d_drop(dentry);
16268c2ecf20Sopenharmony_ci	dput(dentry);
16278c2ecf20Sopenharmony_ci}
16288c2ecf20Sopenharmony_ci
16298c2ecf20Sopenharmony_ci/*
16308c2ecf20Sopenharmony_ci * destroy the dentries attached to a superblock on unmounting
16318c2ecf20Sopenharmony_ci */
16328c2ecf20Sopenharmony_civoid shrink_dcache_for_umount(struct super_block *sb)
16338c2ecf20Sopenharmony_ci{
16348c2ecf20Sopenharmony_ci	struct dentry *dentry;
16358c2ecf20Sopenharmony_ci
16368c2ecf20Sopenharmony_ci	WARN(down_read_trylock(&sb->s_umount), "s_umount should've been locked");
16378c2ecf20Sopenharmony_ci
16388c2ecf20Sopenharmony_ci	dentry = sb->s_root;
16398c2ecf20Sopenharmony_ci	sb->s_root = NULL;
16408c2ecf20Sopenharmony_ci	do_one_tree(dentry);
16418c2ecf20Sopenharmony_ci
16428c2ecf20Sopenharmony_ci	while (!hlist_bl_empty(&sb->s_roots)) {
16438c2ecf20Sopenharmony_ci		dentry = dget(hlist_bl_entry(hlist_bl_first(&sb->s_roots), struct dentry, d_hash));
16448c2ecf20Sopenharmony_ci		do_one_tree(dentry);
16458c2ecf20Sopenharmony_ci	}
16468c2ecf20Sopenharmony_ci}
16478c2ecf20Sopenharmony_ci
16488c2ecf20Sopenharmony_cistatic enum d_walk_ret find_submount(void *_data, struct dentry *dentry)
16498c2ecf20Sopenharmony_ci{
16508c2ecf20Sopenharmony_ci	struct dentry **victim = _data;
16518c2ecf20Sopenharmony_ci	if (d_mountpoint(dentry)) {
16528c2ecf20Sopenharmony_ci		__dget_dlock(dentry);
16538c2ecf20Sopenharmony_ci		*victim = dentry;
16548c2ecf20Sopenharmony_ci		return D_WALK_QUIT;
16558c2ecf20Sopenharmony_ci	}
16568c2ecf20Sopenharmony_ci	return D_WALK_CONTINUE;
16578c2ecf20Sopenharmony_ci}
16588c2ecf20Sopenharmony_ci
16598c2ecf20Sopenharmony_ci/**
16608c2ecf20Sopenharmony_ci * d_invalidate - detach submounts, prune dcache, and drop
16618c2ecf20Sopenharmony_ci * @dentry: dentry to invalidate (aka detach, prune and drop)
16628c2ecf20Sopenharmony_ci */
16638c2ecf20Sopenharmony_civoid d_invalidate(struct dentry *dentry)
16648c2ecf20Sopenharmony_ci{
16658c2ecf20Sopenharmony_ci	bool had_submounts = false;
16668c2ecf20Sopenharmony_ci	spin_lock(&dentry->d_lock);
16678c2ecf20Sopenharmony_ci	if (d_unhashed(dentry)) {
16688c2ecf20Sopenharmony_ci		spin_unlock(&dentry->d_lock);
16698c2ecf20Sopenharmony_ci		return;
16708c2ecf20Sopenharmony_ci	}
16718c2ecf20Sopenharmony_ci	__d_drop(dentry);
16728c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
16738c2ecf20Sopenharmony_ci
16748c2ecf20Sopenharmony_ci	/* Negative dentries can be dropped without further checks */
16758c2ecf20Sopenharmony_ci	if (!dentry->d_inode)
16768c2ecf20Sopenharmony_ci		return;
16778c2ecf20Sopenharmony_ci
16788c2ecf20Sopenharmony_ci	shrink_dcache_parent(dentry);
16798c2ecf20Sopenharmony_ci	for (;;) {
16808c2ecf20Sopenharmony_ci		struct dentry *victim = NULL;
16818c2ecf20Sopenharmony_ci		d_walk(dentry, &victim, find_submount);
16828c2ecf20Sopenharmony_ci		if (!victim) {
16838c2ecf20Sopenharmony_ci			if (had_submounts)
16848c2ecf20Sopenharmony_ci				shrink_dcache_parent(dentry);
16858c2ecf20Sopenharmony_ci			return;
16868c2ecf20Sopenharmony_ci		}
16878c2ecf20Sopenharmony_ci		had_submounts = true;
16888c2ecf20Sopenharmony_ci		detach_mounts(victim);
16898c2ecf20Sopenharmony_ci		dput(victim);
16908c2ecf20Sopenharmony_ci	}
16918c2ecf20Sopenharmony_ci}
16928c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_invalidate);
16938c2ecf20Sopenharmony_ci
16948c2ecf20Sopenharmony_ci/**
16958c2ecf20Sopenharmony_ci * __d_alloc	-	allocate a dcache entry
16968c2ecf20Sopenharmony_ci * @sb: filesystem it will belong to
16978c2ecf20Sopenharmony_ci * @name: qstr of the name
16988c2ecf20Sopenharmony_ci *
16998c2ecf20Sopenharmony_ci * Allocates a dentry. It returns %NULL if there is insufficient memory
17008c2ecf20Sopenharmony_ci * available. On a success the dentry is returned. The name passed in is
17018c2ecf20Sopenharmony_ci * copied and the copy passed in may be reused after this call.
17028c2ecf20Sopenharmony_ci */
17038c2ecf20Sopenharmony_ci
17048c2ecf20Sopenharmony_cistatic struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name)
17058c2ecf20Sopenharmony_ci{
17068c2ecf20Sopenharmony_ci	struct dentry *dentry;
17078c2ecf20Sopenharmony_ci	char *dname;
17088c2ecf20Sopenharmony_ci	int err;
17098c2ecf20Sopenharmony_ci
17108c2ecf20Sopenharmony_ci	dentry = kmem_cache_alloc(dentry_cache, GFP_KERNEL);
17118c2ecf20Sopenharmony_ci	if (!dentry)
17128c2ecf20Sopenharmony_ci		return NULL;
17138c2ecf20Sopenharmony_ci
17148c2ecf20Sopenharmony_ci	/*
17158c2ecf20Sopenharmony_ci	 * We guarantee that the inline name is always NUL-terminated.
17168c2ecf20Sopenharmony_ci	 * This way the memcpy() done by the name switching in rename
17178c2ecf20Sopenharmony_ci	 * will still always have a NUL at the end, even if we might
17188c2ecf20Sopenharmony_ci	 * be overwriting an internal NUL character
17198c2ecf20Sopenharmony_ci	 */
17208c2ecf20Sopenharmony_ci	dentry->d_iname[DNAME_INLINE_LEN-1] = 0;
17218c2ecf20Sopenharmony_ci	if (unlikely(!name)) {
17228c2ecf20Sopenharmony_ci		name = &slash_name;
17238c2ecf20Sopenharmony_ci		dname = dentry->d_iname;
17248c2ecf20Sopenharmony_ci	} else if (name->len > DNAME_INLINE_LEN-1) {
17258c2ecf20Sopenharmony_ci		size_t size = offsetof(struct external_name, name[1]);
17268c2ecf20Sopenharmony_ci		struct external_name *p = kmalloc(size + name->len,
17278c2ecf20Sopenharmony_ci						  GFP_KERNEL_ACCOUNT |
17288c2ecf20Sopenharmony_ci						  __GFP_RECLAIMABLE);
17298c2ecf20Sopenharmony_ci		if (!p) {
17308c2ecf20Sopenharmony_ci			kmem_cache_free(dentry_cache, dentry);
17318c2ecf20Sopenharmony_ci			return NULL;
17328c2ecf20Sopenharmony_ci		}
17338c2ecf20Sopenharmony_ci		atomic_set(&p->u.count, 1);
17348c2ecf20Sopenharmony_ci		dname = p->name;
17358c2ecf20Sopenharmony_ci	} else  {
17368c2ecf20Sopenharmony_ci		dname = dentry->d_iname;
17378c2ecf20Sopenharmony_ci	}
17388c2ecf20Sopenharmony_ci
17398c2ecf20Sopenharmony_ci	dentry->d_name.len = name->len;
17408c2ecf20Sopenharmony_ci	dentry->d_name.hash = name->hash;
17418c2ecf20Sopenharmony_ci	memcpy(dname, name->name, name->len);
17428c2ecf20Sopenharmony_ci	dname[name->len] = 0;
17438c2ecf20Sopenharmony_ci
17448c2ecf20Sopenharmony_ci	/* Make sure we always see the terminating NUL character */
17458c2ecf20Sopenharmony_ci	smp_store_release(&dentry->d_name.name, dname); /* ^^^ */
17468c2ecf20Sopenharmony_ci
17478c2ecf20Sopenharmony_ci	dentry->d_lockref.count = 1;
17488c2ecf20Sopenharmony_ci	dentry->d_flags = 0;
17498c2ecf20Sopenharmony_ci	spin_lock_init(&dentry->d_lock);
17508c2ecf20Sopenharmony_ci	seqcount_spinlock_init(&dentry->d_seq, &dentry->d_lock);
17518c2ecf20Sopenharmony_ci	dentry->d_inode = NULL;
17528c2ecf20Sopenharmony_ci	dentry->d_parent = dentry;
17538c2ecf20Sopenharmony_ci	dentry->d_sb = sb;
17548c2ecf20Sopenharmony_ci	dentry->d_op = NULL;
17558c2ecf20Sopenharmony_ci	dentry->d_fsdata = NULL;
17568c2ecf20Sopenharmony_ci	INIT_HLIST_BL_NODE(&dentry->d_hash);
17578c2ecf20Sopenharmony_ci	INIT_LIST_HEAD(&dentry->d_lru);
17588c2ecf20Sopenharmony_ci	INIT_LIST_HEAD(&dentry->d_subdirs);
17598c2ecf20Sopenharmony_ci	INIT_HLIST_NODE(&dentry->d_u.d_alias);
17608c2ecf20Sopenharmony_ci	INIT_LIST_HEAD(&dentry->d_child);
17618c2ecf20Sopenharmony_ci	d_set_d_op(dentry, dentry->d_sb->s_d_op);
17628c2ecf20Sopenharmony_ci
17638c2ecf20Sopenharmony_ci	if (dentry->d_op && dentry->d_op->d_init) {
17648c2ecf20Sopenharmony_ci		err = dentry->d_op->d_init(dentry);
17658c2ecf20Sopenharmony_ci		if (err) {
17668c2ecf20Sopenharmony_ci			if (dname_external(dentry))
17678c2ecf20Sopenharmony_ci				kfree(external_name(dentry));
17688c2ecf20Sopenharmony_ci			kmem_cache_free(dentry_cache, dentry);
17698c2ecf20Sopenharmony_ci			return NULL;
17708c2ecf20Sopenharmony_ci		}
17718c2ecf20Sopenharmony_ci	}
17728c2ecf20Sopenharmony_ci
17738c2ecf20Sopenharmony_ci	this_cpu_inc(nr_dentry);
17748c2ecf20Sopenharmony_ci
17758c2ecf20Sopenharmony_ci	return dentry;
17768c2ecf20Sopenharmony_ci}
17778c2ecf20Sopenharmony_ci
17788c2ecf20Sopenharmony_ci/**
17798c2ecf20Sopenharmony_ci * d_alloc	-	allocate a dcache entry
17808c2ecf20Sopenharmony_ci * @parent: parent of entry to allocate
17818c2ecf20Sopenharmony_ci * @name: qstr of the name
17828c2ecf20Sopenharmony_ci *
17838c2ecf20Sopenharmony_ci * Allocates a dentry. It returns %NULL if there is insufficient memory
17848c2ecf20Sopenharmony_ci * available. On a success the dentry is returned. The name passed in is
17858c2ecf20Sopenharmony_ci * copied and the copy passed in may be reused after this call.
17868c2ecf20Sopenharmony_ci */
17878c2ecf20Sopenharmony_cistruct dentry *d_alloc(struct dentry * parent, const struct qstr *name)
17888c2ecf20Sopenharmony_ci{
17898c2ecf20Sopenharmony_ci	struct dentry *dentry = __d_alloc(parent->d_sb, name);
17908c2ecf20Sopenharmony_ci	if (!dentry)
17918c2ecf20Sopenharmony_ci		return NULL;
17928c2ecf20Sopenharmony_ci	spin_lock(&parent->d_lock);
17938c2ecf20Sopenharmony_ci	/*
17948c2ecf20Sopenharmony_ci	 * don't need child lock because it is not subject
17958c2ecf20Sopenharmony_ci	 * to concurrency here
17968c2ecf20Sopenharmony_ci	 */
17978c2ecf20Sopenharmony_ci	__dget_dlock(parent);
17988c2ecf20Sopenharmony_ci	dentry->d_parent = parent;
17998c2ecf20Sopenharmony_ci	list_add(&dentry->d_child, &parent->d_subdirs);
18008c2ecf20Sopenharmony_ci	spin_unlock(&parent->d_lock);
18018c2ecf20Sopenharmony_ci
18028c2ecf20Sopenharmony_ci	return dentry;
18038c2ecf20Sopenharmony_ci}
18048c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_alloc);
18058c2ecf20Sopenharmony_ci
18068c2ecf20Sopenharmony_cistruct dentry *d_alloc_anon(struct super_block *sb)
18078c2ecf20Sopenharmony_ci{
18088c2ecf20Sopenharmony_ci	return __d_alloc(sb, NULL);
18098c2ecf20Sopenharmony_ci}
18108c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_alloc_anon);
18118c2ecf20Sopenharmony_ci
18128c2ecf20Sopenharmony_cistruct dentry *d_alloc_cursor(struct dentry * parent)
18138c2ecf20Sopenharmony_ci{
18148c2ecf20Sopenharmony_ci	struct dentry *dentry = d_alloc_anon(parent->d_sb);
18158c2ecf20Sopenharmony_ci	if (dentry) {
18168c2ecf20Sopenharmony_ci		dentry->d_flags |= DCACHE_DENTRY_CURSOR;
18178c2ecf20Sopenharmony_ci		dentry->d_parent = dget(parent);
18188c2ecf20Sopenharmony_ci	}
18198c2ecf20Sopenharmony_ci	return dentry;
18208c2ecf20Sopenharmony_ci}
18218c2ecf20Sopenharmony_ci
18228c2ecf20Sopenharmony_ci/**
18238c2ecf20Sopenharmony_ci * d_alloc_pseudo - allocate a dentry (for lookup-less filesystems)
18248c2ecf20Sopenharmony_ci * @sb: the superblock
18258c2ecf20Sopenharmony_ci * @name: qstr of the name
18268c2ecf20Sopenharmony_ci *
18278c2ecf20Sopenharmony_ci * For a filesystem that just pins its dentries in memory and never
18288c2ecf20Sopenharmony_ci * performs lookups at all, return an unhashed IS_ROOT dentry.
18298c2ecf20Sopenharmony_ci * This is used for pipes, sockets et.al. - the stuff that should
18308c2ecf20Sopenharmony_ci * never be anyone's children or parents.  Unlike all other
18318c2ecf20Sopenharmony_ci * dentries, these will not have RCU delay between dropping the
18328c2ecf20Sopenharmony_ci * last reference and freeing them.
18338c2ecf20Sopenharmony_ci *
18348c2ecf20Sopenharmony_ci * The only user is alloc_file_pseudo() and that's what should
18358c2ecf20Sopenharmony_ci * be considered a public interface.  Don't use directly.
18368c2ecf20Sopenharmony_ci */
18378c2ecf20Sopenharmony_cistruct dentry *d_alloc_pseudo(struct super_block *sb, const struct qstr *name)
18388c2ecf20Sopenharmony_ci{
18398c2ecf20Sopenharmony_ci	struct dentry *dentry = __d_alloc(sb, name);
18408c2ecf20Sopenharmony_ci	if (likely(dentry))
18418c2ecf20Sopenharmony_ci		dentry->d_flags |= DCACHE_NORCU;
18428c2ecf20Sopenharmony_ci	return dentry;
18438c2ecf20Sopenharmony_ci}
18448c2ecf20Sopenharmony_ci
18458c2ecf20Sopenharmony_cistruct dentry *d_alloc_name(struct dentry *parent, const char *name)
18468c2ecf20Sopenharmony_ci{
18478c2ecf20Sopenharmony_ci	struct qstr q;
18488c2ecf20Sopenharmony_ci
18498c2ecf20Sopenharmony_ci	q.name = name;
18508c2ecf20Sopenharmony_ci	q.hash_len = hashlen_string(parent, name);
18518c2ecf20Sopenharmony_ci	return d_alloc(parent, &q);
18528c2ecf20Sopenharmony_ci}
18538c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_alloc_name);
18548c2ecf20Sopenharmony_ci
18558c2ecf20Sopenharmony_civoid d_set_d_op(struct dentry *dentry, const struct dentry_operations *op)
18568c2ecf20Sopenharmony_ci{
18578c2ecf20Sopenharmony_ci	WARN_ON_ONCE(dentry->d_op);
18588c2ecf20Sopenharmony_ci	WARN_ON_ONCE(dentry->d_flags & (DCACHE_OP_HASH	|
18598c2ecf20Sopenharmony_ci				DCACHE_OP_COMPARE	|
18608c2ecf20Sopenharmony_ci				DCACHE_OP_REVALIDATE	|
18618c2ecf20Sopenharmony_ci				DCACHE_OP_WEAK_REVALIDATE	|
18628c2ecf20Sopenharmony_ci				DCACHE_OP_DELETE	|
18638c2ecf20Sopenharmony_ci				DCACHE_OP_REAL));
18648c2ecf20Sopenharmony_ci	dentry->d_op = op;
18658c2ecf20Sopenharmony_ci	if (!op)
18668c2ecf20Sopenharmony_ci		return;
18678c2ecf20Sopenharmony_ci	if (op->d_hash)
18688c2ecf20Sopenharmony_ci		dentry->d_flags |= DCACHE_OP_HASH;
18698c2ecf20Sopenharmony_ci	if (op->d_compare)
18708c2ecf20Sopenharmony_ci		dentry->d_flags |= DCACHE_OP_COMPARE;
18718c2ecf20Sopenharmony_ci	if (op->d_revalidate)
18728c2ecf20Sopenharmony_ci		dentry->d_flags |= DCACHE_OP_REVALIDATE;
18738c2ecf20Sopenharmony_ci	if (op->d_weak_revalidate)
18748c2ecf20Sopenharmony_ci		dentry->d_flags |= DCACHE_OP_WEAK_REVALIDATE;
18758c2ecf20Sopenharmony_ci	if (op->d_delete)
18768c2ecf20Sopenharmony_ci		dentry->d_flags |= DCACHE_OP_DELETE;
18778c2ecf20Sopenharmony_ci	if (op->d_prune)
18788c2ecf20Sopenharmony_ci		dentry->d_flags |= DCACHE_OP_PRUNE;
18798c2ecf20Sopenharmony_ci	if (op->d_real)
18808c2ecf20Sopenharmony_ci		dentry->d_flags |= DCACHE_OP_REAL;
18818c2ecf20Sopenharmony_ci
18828c2ecf20Sopenharmony_ci}
18838c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_set_d_op);
18848c2ecf20Sopenharmony_ci
18858c2ecf20Sopenharmony_ci
18868c2ecf20Sopenharmony_ci/*
18878c2ecf20Sopenharmony_ci * d_set_fallthru - Mark a dentry as falling through to a lower layer
18888c2ecf20Sopenharmony_ci * @dentry - The dentry to mark
18898c2ecf20Sopenharmony_ci *
18908c2ecf20Sopenharmony_ci * Mark a dentry as falling through to the lower layer (as set with
18918c2ecf20Sopenharmony_ci * d_pin_lower()).  This flag may be recorded on the medium.
18928c2ecf20Sopenharmony_ci */
18938c2ecf20Sopenharmony_civoid d_set_fallthru(struct dentry *dentry)
18948c2ecf20Sopenharmony_ci{
18958c2ecf20Sopenharmony_ci	spin_lock(&dentry->d_lock);
18968c2ecf20Sopenharmony_ci	dentry->d_flags |= DCACHE_FALLTHRU;
18978c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
18988c2ecf20Sopenharmony_ci}
18998c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_set_fallthru);
19008c2ecf20Sopenharmony_ci
19018c2ecf20Sopenharmony_cistatic unsigned d_flags_for_inode(struct inode *inode)
19028c2ecf20Sopenharmony_ci{
19038c2ecf20Sopenharmony_ci	unsigned add_flags = DCACHE_REGULAR_TYPE;
19048c2ecf20Sopenharmony_ci
19058c2ecf20Sopenharmony_ci	if (!inode)
19068c2ecf20Sopenharmony_ci		return DCACHE_MISS_TYPE;
19078c2ecf20Sopenharmony_ci
19088c2ecf20Sopenharmony_ci	if (S_ISDIR(inode->i_mode)) {
19098c2ecf20Sopenharmony_ci		add_flags = DCACHE_DIRECTORY_TYPE;
19108c2ecf20Sopenharmony_ci		if (unlikely(!(inode->i_opflags & IOP_LOOKUP))) {
19118c2ecf20Sopenharmony_ci			if (unlikely(!inode->i_op->lookup))
19128c2ecf20Sopenharmony_ci				add_flags = DCACHE_AUTODIR_TYPE;
19138c2ecf20Sopenharmony_ci			else
19148c2ecf20Sopenharmony_ci				inode->i_opflags |= IOP_LOOKUP;
19158c2ecf20Sopenharmony_ci		}
19168c2ecf20Sopenharmony_ci		goto type_determined;
19178c2ecf20Sopenharmony_ci	}
19188c2ecf20Sopenharmony_ci
19198c2ecf20Sopenharmony_ci	if (unlikely(!(inode->i_opflags & IOP_NOFOLLOW))) {
19208c2ecf20Sopenharmony_ci		if (unlikely(inode->i_op->get_link)) {
19218c2ecf20Sopenharmony_ci			add_flags = DCACHE_SYMLINK_TYPE;
19228c2ecf20Sopenharmony_ci			goto type_determined;
19238c2ecf20Sopenharmony_ci		}
19248c2ecf20Sopenharmony_ci		inode->i_opflags |= IOP_NOFOLLOW;
19258c2ecf20Sopenharmony_ci	}
19268c2ecf20Sopenharmony_ci
19278c2ecf20Sopenharmony_ci	if (unlikely(!S_ISREG(inode->i_mode)))
19288c2ecf20Sopenharmony_ci		add_flags = DCACHE_SPECIAL_TYPE;
19298c2ecf20Sopenharmony_ci
19308c2ecf20Sopenharmony_citype_determined:
19318c2ecf20Sopenharmony_ci	if (unlikely(IS_AUTOMOUNT(inode)))
19328c2ecf20Sopenharmony_ci		add_flags |= DCACHE_NEED_AUTOMOUNT;
19338c2ecf20Sopenharmony_ci	return add_flags;
19348c2ecf20Sopenharmony_ci}
19358c2ecf20Sopenharmony_ci
19368c2ecf20Sopenharmony_cistatic void __d_instantiate(struct dentry *dentry, struct inode *inode)
19378c2ecf20Sopenharmony_ci{
19388c2ecf20Sopenharmony_ci	unsigned add_flags = d_flags_for_inode(inode);
19398c2ecf20Sopenharmony_ci	WARN_ON(d_in_lookup(dentry));
19408c2ecf20Sopenharmony_ci
19418c2ecf20Sopenharmony_ci	spin_lock(&dentry->d_lock);
19428c2ecf20Sopenharmony_ci	/*
19438c2ecf20Sopenharmony_ci	 * Decrement negative dentry count if it was in the LRU list.
19448c2ecf20Sopenharmony_ci	 */
19458c2ecf20Sopenharmony_ci	if (dentry->d_flags & DCACHE_LRU_LIST)
19468c2ecf20Sopenharmony_ci		this_cpu_dec(nr_dentry_negative);
19478c2ecf20Sopenharmony_ci	hlist_add_head(&dentry->d_u.d_alias, &inode->i_dentry);
19488c2ecf20Sopenharmony_ci	raw_write_seqcount_begin(&dentry->d_seq);
19498c2ecf20Sopenharmony_ci	__d_set_inode_and_type(dentry, inode, add_flags);
19508c2ecf20Sopenharmony_ci	raw_write_seqcount_end(&dentry->d_seq);
19518c2ecf20Sopenharmony_ci	fsnotify_update_flags(dentry);
19528c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
19538c2ecf20Sopenharmony_ci}
19548c2ecf20Sopenharmony_ci
19558c2ecf20Sopenharmony_ci/**
19568c2ecf20Sopenharmony_ci * d_instantiate - fill in inode information for a dentry
19578c2ecf20Sopenharmony_ci * @entry: dentry to complete
19588c2ecf20Sopenharmony_ci * @inode: inode to attach to this dentry
19598c2ecf20Sopenharmony_ci *
19608c2ecf20Sopenharmony_ci * Fill in inode information in the entry.
19618c2ecf20Sopenharmony_ci *
19628c2ecf20Sopenharmony_ci * This turns negative dentries into productive full members
19638c2ecf20Sopenharmony_ci * of society.
19648c2ecf20Sopenharmony_ci *
19658c2ecf20Sopenharmony_ci * NOTE! This assumes that the inode count has been incremented
19668c2ecf20Sopenharmony_ci * (or otherwise set) by the caller to indicate that it is now
19678c2ecf20Sopenharmony_ci * in use by the dcache.
19688c2ecf20Sopenharmony_ci */
19698c2ecf20Sopenharmony_ci
19708c2ecf20Sopenharmony_civoid d_instantiate(struct dentry *entry, struct inode * inode)
19718c2ecf20Sopenharmony_ci{
19728c2ecf20Sopenharmony_ci	BUG_ON(!hlist_unhashed(&entry->d_u.d_alias));
19738c2ecf20Sopenharmony_ci	if (inode) {
19748c2ecf20Sopenharmony_ci		security_d_instantiate(entry, inode);
19758c2ecf20Sopenharmony_ci		spin_lock(&inode->i_lock);
19768c2ecf20Sopenharmony_ci		__d_instantiate(entry, inode);
19778c2ecf20Sopenharmony_ci		spin_unlock(&inode->i_lock);
19788c2ecf20Sopenharmony_ci	}
19798c2ecf20Sopenharmony_ci}
19808c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_instantiate);
19818c2ecf20Sopenharmony_ci
19828c2ecf20Sopenharmony_ci/*
19838c2ecf20Sopenharmony_ci * This should be equivalent to d_instantiate() + unlock_new_inode(),
19848c2ecf20Sopenharmony_ci * with lockdep-related part of unlock_new_inode() done before
19858c2ecf20Sopenharmony_ci * anything else.  Use that instead of open-coding d_instantiate()/
19868c2ecf20Sopenharmony_ci * unlock_new_inode() combinations.
19878c2ecf20Sopenharmony_ci */
19888c2ecf20Sopenharmony_civoid d_instantiate_new(struct dentry *entry, struct inode *inode)
19898c2ecf20Sopenharmony_ci{
19908c2ecf20Sopenharmony_ci	BUG_ON(!hlist_unhashed(&entry->d_u.d_alias));
19918c2ecf20Sopenharmony_ci	BUG_ON(!inode);
19928c2ecf20Sopenharmony_ci	lockdep_annotate_inode_mutex_key(inode);
19938c2ecf20Sopenharmony_ci	security_d_instantiate(entry, inode);
19948c2ecf20Sopenharmony_ci	spin_lock(&inode->i_lock);
19958c2ecf20Sopenharmony_ci	__d_instantiate(entry, inode);
19968c2ecf20Sopenharmony_ci	WARN_ON(!(inode->i_state & I_NEW));
19978c2ecf20Sopenharmony_ci	inode->i_state &= ~I_NEW & ~I_CREATING;
19988c2ecf20Sopenharmony_ci	smp_mb();
19998c2ecf20Sopenharmony_ci	wake_up_bit(&inode->i_state, __I_NEW);
20008c2ecf20Sopenharmony_ci	spin_unlock(&inode->i_lock);
20018c2ecf20Sopenharmony_ci}
20028c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_instantiate_new);
20038c2ecf20Sopenharmony_ci
20048c2ecf20Sopenharmony_cistruct dentry *d_make_root(struct inode *root_inode)
20058c2ecf20Sopenharmony_ci{
20068c2ecf20Sopenharmony_ci	struct dentry *res = NULL;
20078c2ecf20Sopenharmony_ci
20088c2ecf20Sopenharmony_ci	if (root_inode) {
20098c2ecf20Sopenharmony_ci		res = d_alloc_anon(root_inode->i_sb);
20108c2ecf20Sopenharmony_ci		if (res)
20118c2ecf20Sopenharmony_ci			d_instantiate(res, root_inode);
20128c2ecf20Sopenharmony_ci		else
20138c2ecf20Sopenharmony_ci			iput(root_inode);
20148c2ecf20Sopenharmony_ci	}
20158c2ecf20Sopenharmony_ci	return res;
20168c2ecf20Sopenharmony_ci}
20178c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_make_root);
20188c2ecf20Sopenharmony_ci
20198c2ecf20Sopenharmony_cistatic struct dentry *__d_instantiate_anon(struct dentry *dentry,
20208c2ecf20Sopenharmony_ci					   struct inode *inode,
20218c2ecf20Sopenharmony_ci					   bool disconnected)
20228c2ecf20Sopenharmony_ci{
20238c2ecf20Sopenharmony_ci	struct dentry *res;
20248c2ecf20Sopenharmony_ci	unsigned add_flags;
20258c2ecf20Sopenharmony_ci
20268c2ecf20Sopenharmony_ci	security_d_instantiate(dentry, inode);
20278c2ecf20Sopenharmony_ci	spin_lock(&inode->i_lock);
20288c2ecf20Sopenharmony_ci	res = __d_find_any_alias(inode);
20298c2ecf20Sopenharmony_ci	if (res) {
20308c2ecf20Sopenharmony_ci		spin_unlock(&inode->i_lock);
20318c2ecf20Sopenharmony_ci		dput(dentry);
20328c2ecf20Sopenharmony_ci		goto out_iput;
20338c2ecf20Sopenharmony_ci	}
20348c2ecf20Sopenharmony_ci
20358c2ecf20Sopenharmony_ci	/* attach a disconnected dentry */
20368c2ecf20Sopenharmony_ci	add_flags = d_flags_for_inode(inode);
20378c2ecf20Sopenharmony_ci
20388c2ecf20Sopenharmony_ci	if (disconnected)
20398c2ecf20Sopenharmony_ci		add_flags |= DCACHE_DISCONNECTED;
20408c2ecf20Sopenharmony_ci
20418c2ecf20Sopenharmony_ci	spin_lock(&dentry->d_lock);
20428c2ecf20Sopenharmony_ci	__d_set_inode_and_type(dentry, inode, add_flags);
20438c2ecf20Sopenharmony_ci	hlist_add_head(&dentry->d_u.d_alias, &inode->i_dentry);
20448c2ecf20Sopenharmony_ci	if (!disconnected) {
20458c2ecf20Sopenharmony_ci		hlist_bl_lock(&dentry->d_sb->s_roots);
20468c2ecf20Sopenharmony_ci		hlist_bl_add_head(&dentry->d_hash, &dentry->d_sb->s_roots);
20478c2ecf20Sopenharmony_ci		hlist_bl_unlock(&dentry->d_sb->s_roots);
20488c2ecf20Sopenharmony_ci	}
20498c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
20508c2ecf20Sopenharmony_ci	spin_unlock(&inode->i_lock);
20518c2ecf20Sopenharmony_ci
20528c2ecf20Sopenharmony_ci	return dentry;
20538c2ecf20Sopenharmony_ci
20548c2ecf20Sopenharmony_ci out_iput:
20558c2ecf20Sopenharmony_ci	iput(inode);
20568c2ecf20Sopenharmony_ci	return res;
20578c2ecf20Sopenharmony_ci}
20588c2ecf20Sopenharmony_ci
20598c2ecf20Sopenharmony_cistruct dentry *d_instantiate_anon(struct dentry *dentry, struct inode *inode)
20608c2ecf20Sopenharmony_ci{
20618c2ecf20Sopenharmony_ci	return __d_instantiate_anon(dentry, inode, true);
20628c2ecf20Sopenharmony_ci}
20638c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_instantiate_anon);
20648c2ecf20Sopenharmony_ci
20658c2ecf20Sopenharmony_cistatic struct dentry *__d_obtain_alias(struct inode *inode, bool disconnected)
20668c2ecf20Sopenharmony_ci{
20678c2ecf20Sopenharmony_ci	struct dentry *tmp;
20688c2ecf20Sopenharmony_ci	struct dentry *res;
20698c2ecf20Sopenharmony_ci
20708c2ecf20Sopenharmony_ci	if (!inode)
20718c2ecf20Sopenharmony_ci		return ERR_PTR(-ESTALE);
20728c2ecf20Sopenharmony_ci	if (IS_ERR(inode))
20738c2ecf20Sopenharmony_ci		return ERR_CAST(inode);
20748c2ecf20Sopenharmony_ci
20758c2ecf20Sopenharmony_ci	res = d_find_any_alias(inode);
20768c2ecf20Sopenharmony_ci	if (res)
20778c2ecf20Sopenharmony_ci		goto out_iput;
20788c2ecf20Sopenharmony_ci
20798c2ecf20Sopenharmony_ci	tmp = d_alloc_anon(inode->i_sb);
20808c2ecf20Sopenharmony_ci	if (!tmp) {
20818c2ecf20Sopenharmony_ci		res = ERR_PTR(-ENOMEM);
20828c2ecf20Sopenharmony_ci		goto out_iput;
20838c2ecf20Sopenharmony_ci	}
20848c2ecf20Sopenharmony_ci
20858c2ecf20Sopenharmony_ci	return __d_instantiate_anon(tmp, inode, disconnected);
20868c2ecf20Sopenharmony_ci
20878c2ecf20Sopenharmony_ciout_iput:
20888c2ecf20Sopenharmony_ci	iput(inode);
20898c2ecf20Sopenharmony_ci	return res;
20908c2ecf20Sopenharmony_ci}
20918c2ecf20Sopenharmony_ci
20928c2ecf20Sopenharmony_ci/**
20938c2ecf20Sopenharmony_ci * d_obtain_alias - find or allocate a DISCONNECTED dentry for a given inode
20948c2ecf20Sopenharmony_ci * @inode: inode to allocate the dentry for
20958c2ecf20Sopenharmony_ci *
20968c2ecf20Sopenharmony_ci * Obtain a dentry for an inode resulting from NFS filehandle conversion or
20978c2ecf20Sopenharmony_ci * similar open by handle operations.  The returned dentry may be anonymous,
20988c2ecf20Sopenharmony_ci * or may have a full name (if the inode was already in the cache).
20998c2ecf20Sopenharmony_ci *
21008c2ecf20Sopenharmony_ci * When called on a directory inode, we must ensure that the inode only ever
21018c2ecf20Sopenharmony_ci * has one dentry.  If a dentry is found, that is returned instead of
21028c2ecf20Sopenharmony_ci * allocating a new one.
21038c2ecf20Sopenharmony_ci *
21048c2ecf20Sopenharmony_ci * On successful return, the reference to the inode has been transferred
21058c2ecf20Sopenharmony_ci * to the dentry.  In case of an error the reference on the inode is released.
21068c2ecf20Sopenharmony_ci * To make it easier to use in export operations a %NULL or IS_ERR inode may
21078c2ecf20Sopenharmony_ci * be passed in and the error will be propagated to the return value,
21088c2ecf20Sopenharmony_ci * with a %NULL @inode replaced by ERR_PTR(-ESTALE).
21098c2ecf20Sopenharmony_ci */
21108c2ecf20Sopenharmony_cistruct dentry *d_obtain_alias(struct inode *inode)
21118c2ecf20Sopenharmony_ci{
21128c2ecf20Sopenharmony_ci	return __d_obtain_alias(inode, true);
21138c2ecf20Sopenharmony_ci}
21148c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_obtain_alias);
21158c2ecf20Sopenharmony_ci
21168c2ecf20Sopenharmony_ci/**
21178c2ecf20Sopenharmony_ci * d_obtain_root - find or allocate a dentry for a given inode
21188c2ecf20Sopenharmony_ci * @inode: inode to allocate the dentry for
21198c2ecf20Sopenharmony_ci *
21208c2ecf20Sopenharmony_ci * Obtain an IS_ROOT dentry for the root of a filesystem.
21218c2ecf20Sopenharmony_ci *
21228c2ecf20Sopenharmony_ci * We must ensure that directory inodes only ever have one dentry.  If a
21238c2ecf20Sopenharmony_ci * dentry is found, that is returned instead of allocating a new one.
21248c2ecf20Sopenharmony_ci *
21258c2ecf20Sopenharmony_ci * On successful return, the reference to the inode has been transferred
21268c2ecf20Sopenharmony_ci * to the dentry.  In case of an error the reference on the inode is
21278c2ecf20Sopenharmony_ci * released.  A %NULL or IS_ERR inode may be passed in and will be the
21288c2ecf20Sopenharmony_ci * error will be propagate to the return value, with a %NULL @inode
21298c2ecf20Sopenharmony_ci * replaced by ERR_PTR(-ESTALE).
21308c2ecf20Sopenharmony_ci */
21318c2ecf20Sopenharmony_cistruct dentry *d_obtain_root(struct inode *inode)
21328c2ecf20Sopenharmony_ci{
21338c2ecf20Sopenharmony_ci	return __d_obtain_alias(inode, false);
21348c2ecf20Sopenharmony_ci}
21358c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_obtain_root);
21368c2ecf20Sopenharmony_ci
21378c2ecf20Sopenharmony_ci/**
21388c2ecf20Sopenharmony_ci * d_add_ci - lookup or allocate new dentry with case-exact name
21398c2ecf20Sopenharmony_ci * @inode:  the inode case-insensitive lookup has found
21408c2ecf20Sopenharmony_ci * @dentry: the negative dentry that was passed to the parent's lookup func
21418c2ecf20Sopenharmony_ci * @name:   the case-exact name to be associated with the returned dentry
21428c2ecf20Sopenharmony_ci *
21438c2ecf20Sopenharmony_ci * This is to avoid filling the dcache with case-insensitive names to the
21448c2ecf20Sopenharmony_ci * same inode, only the actual correct case is stored in the dcache for
21458c2ecf20Sopenharmony_ci * case-insensitive filesystems.
21468c2ecf20Sopenharmony_ci *
21478c2ecf20Sopenharmony_ci * For a case-insensitive lookup match and if the the case-exact dentry
21488c2ecf20Sopenharmony_ci * already exists in in the dcache, use it and return it.
21498c2ecf20Sopenharmony_ci *
21508c2ecf20Sopenharmony_ci * If no entry exists with the exact case name, allocate new dentry with
21518c2ecf20Sopenharmony_ci * the exact case, and return the spliced entry.
21528c2ecf20Sopenharmony_ci */
21538c2ecf20Sopenharmony_cistruct dentry *d_add_ci(struct dentry *dentry, struct inode *inode,
21548c2ecf20Sopenharmony_ci			struct qstr *name)
21558c2ecf20Sopenharmony_ci{
21568c2ecf20Sopenharmony_ci	struct dentry *found, *res;
21578c2ecf20Sopenharmony_ci
21588c2ecf20Sopenharmony_ci	/*
21598c2ecf20Sopenharmony_ci	 * First check if a dentry matching the name already exists,
21608c2ecf20Sopenharmony_ci	 * if not go ahead and create it now.
21618c2ecf20Sopenharmony_ci	 */
21628c2ecf20Sopenharmony_ci	found = d_hash_and_lookup(dentry->d_parent, name);
21638c2ecf20Sopenharmony_ci	if (found) {
21648c2ecf20Sopenharmony_ci		iput(inode);
21658c2ecf20Sopenharmony_ci		return found;
21668c2ecf20Sopenharmony_ci	}
21678c2ecf20Sopenharmony_ci	if (d_in_lookup(dentry)) {
21688c2ecf20Sopenharmony_ci		found = d_alloc_parallel(dentry->d_parent, name,
21698c2ecf20Sopenharmony_ci					dentry->d_wait);
21708c2ecf20Sopenharmony_ci		if (IS_ERR(found) || !d_in_lookup(found)) {
21718c2ecf20Sopenharmony_ci			iput(inode);
21728c2ecf20Sopenharmony_ci			return found;
21738c2ecf20Sopenharmony_ci		}
21748c2ecf20Sopenharmony_ci	} else {
21758c2ecf20Sopenharmony_ci		found = d_alloc(dentry->d_parent, name);
21768c2ecf20Sopenharmony_ci		if (!found) {
21778c2ecf20Sopenharmony_ci			iput(inode);
21788c2ecf20Sopenharmony_ci			return ERR_PTR(-ENOMEM);
21798c2ecf20Sopenharmony_ci		}
21808c2ecf20Sopenharmony_ci	}
21818c2ecf20Sopenharmony_ci	res = d_splice_alias(inode, found);
21828c2ecf20Sopenharmony_ci	if (res) {
21838c2ecf20Sopenharmony_ci		dput(found);
21848c2ecf20Sopenharmony_ci		return res;
21858c2ecf20Sopenharmony_ci	}
21868c2ecf20Sopenharmony_ci	return found;
21878c2ecf20Sopenharmony_ci}
21888c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_add_ci);
21898c2ecf20Sopenharmony_ci
21908c2ecf20Sopenharmony_ci
21918c2ecf20Sopenharmony_cistatic inline bool d_same_name(const struct dentry *dentry,
21928c2ecf20Sopenharmony_ci				const struct dentry *parent,
21938c2ecf20Sopenharmony_ci				const struct qstr *name)
21948c2ecf20Sopenharmony_ci{
21958c2ecf20Sopenharmony_ci	if (likely(!(parent->d_flags & DCACHE_OP_COMPARE))) {
21968c2ecf20Sopenharmony_ci		if (dentry->d_name.len != name->len)
21978c2ecf20Sopenharmony_ci			return false;
21988c2ecf20Sopenharmony_ci		return dentry_cmp(dentry, name->name, name->len) == 0;
21998c2ecf20Sopenharmony_ci	}
22008c2ecf20Sopenharmony_ci	return parent->d_op->d_compare(dentry,
22018c2ecf20Sopenharmony_ci				       dentry->d_name.len, dentry->d_name.name,
22028c2ecf20Sopenharmony_ci				       name) == 0;
22038c2ecf20Sopenharmony_ci}
22048c2ecf20Sopenharmony_ci
22058c2ecf20Sopenharmony_ci/**
22068c2ecf20Sopenharmony_ci * __d_lookup_rcu - search for a dentry (racy, store-free)
22078c2ecf20Sopenharmony_ci * @parent: parent dentry
22088c2ecf20Sopenharmony_ci * @name: qstr of name we wish to find
22098c2ecf20Sopenharmony_ci * @seqp: returns d_seq value at the point where the dentry was found
22108c2ecf20Sopenharmony_ci * Returns: dentry, or NULL
22118c2ecf20Sopenharmony_ci *
22128c2ecf20Sopenharmony_ci * __d_lookup_rcu is the dcache lookup function for rcu-walk name
22138c2ecf20Sopenharmony_ci * resolution (store-free path walking) design described in
22148c2ecf20Sopenharmony_ci * Documentation/filesystems/path-lookup.txt.
22158c2ecf20Sopenharmony_ci *
22168c2ecf20Sopenharmony_ci * This is not to be used outside core vfs.
22178c2ecf20Sopenharmony_ci *
22188c2ecf20Sopenharmony_ci * __d_lookup_rcu must only be used in rcu-walk mode, ie. with vfsmount lock
22198c2ecf20Sopenharmony_ci * held, and rcu_read_lock held. The returned dentry must not be stored into
22208c2ecf20Sopenharmony_ci * without taking d_lock and checking d_seq sequence count against @seq
22218c2ecf20Sopenharmony_ci * returned here.
22228c2ecf20Sopenharmony_ci *
22238c2ecf20Sopenharmony_ci * A refcount may be taken on the found dentry with the d_rcu_to_refcount
22248c2ecf20Sopenharmony_ci * function.
22258c2ecf20Sopenharmony_ci *
22268c2ecf20Sopenharmony_ci * Alternatively, __d_lookup_rcu may be called again to look up the child of
22278c2ecf20Sopenharmony_ci * the returned dentry, so long as its parent's seqlock is checked after the
22288c2ecf20Sopenharmony_ci * child is looked up. Thus, an interlocking stepping of sequence lock checks
22298c2ecf20Sopenharmony_ci * is formed, giving integrity down the path walk.
22308c2ecf20Sopenharmony_ci *
22318c2ecf20Sopenharmony_ci * NOTE! The caller *has* to check the resulting dentry against the sequence
22328c2ecf20Sopenharmony_ci * number we've returned before using any of the resulting dentry state!
22338c2ecf20Sopenharmony_ci */
22348c2ecf20Sopenharmony_cistruct dentry *__d_lookup_rcu(const struct dentry *parent,
22358c2ecf20Sopenharmony_ci				const struct qstr *name,
22368c2ecf20Sopenharmony_ci				unsigned *seqp)
22378c2ecf20Sopenharmony_ci{
22388c2ecf20Sopenharmony_ci	u64 hashlen = name->hash_len;
22398c2ecf20Sopenharmony_ci	const unsigned char *str = name->name;
22408c2ecf20Sopenharmony_ci	struct hlist_bl_head *b = d_hash(hashlen_hash(hashlen));
22418c2ecf20Sopenharmony_ci	struct hlist_bl_node *node;
22428c2ecf20Sopenharmony_ci	struct dentry *dentry;
22438c2ecf20Sopenharmony_ci
22448c2ecf20Sopenharmony_ci	/*
22458c2ecf20Sopenharmony_ci	 * Note: There is significant duplication with __d_lookup_rcu which is
22468c2ecf20Sopenharmony_ci	 * required to prevent single threaded performance regressions
22478c2ecf20Sopenharmony_ci	 * especially on architectures where smp_rmb (in seqcounts) are costly.
22488c2ecf20Sopenharmony_ci	 * Keep the two functions in sync.
22498c2ecf20Sopenharmony_ci	 */
22508c2ecf20Sopenharmony_ci
22518c2ecf20Sopenharmony_ci	/*
22528c2ecf20Sopenharmony_ci	 * The hash list is protected using RCU.
22538c2ecf20Sopenharmony_ci	 *
22548c2ecf20Sopenharmony_ci	 * Carefully use d_seq when comparing a candidate dentry, to avoid
22558c2ecf20Sopenharmony_ci	 * races with d_move().
22568c2ecf20Sopenharmony_ci	 *
22578c2ecf20Sopenharmony_ci	 * It is possible that concurrent renames can mess up our list
22588c2ecf20Sopenharmony_ci	 * walk here and result in missing our dentry, resulting in the
22598c2ecf20Sopenharmony_ci	 * false-negative result. d_lookup() protects against concurrent
22608c2ecf20Sopenharmony_ci	 * renames using rename_lock seqlock.
22618c2ecf20Sopenharmony_ci	 *
22628c2ecf20Sopenharmony_ci	 * See Documentation/filesystems/path-lookup.txt for more details.
22638c2ecf20Sopenharmony_ci	 */
22648c2ecf20Sopenharmony_ci	hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) {
22658c2ecf20Sopenharmony_ci		unsigned seq;
22668c2ecf20Sopenharmony_ci
22678c2ecf20Sopenharmony_ciseqretry:
22688c2ecf20Sopenharmony_ci		/*
22698c2ecf20Sopenharmony_ci		 * The dentry sequence count protects us from concurrent
22708c2ecf20Sopenharmony_ci		 * renames, and thus protects parent and name fields.
22718c2ecf20Sopenharmony_ci		 *
22728c2ecf20Sopenharmony_ci		 * The caller must perform a seqcount check in order
22738c2ecf20Sopenharmony_ci		 * to do anything useful with the returned dentry.
22748c2ecf20Sopenharmony_ci		 *
22758c2ecf20Sopenharmony_ci		 * NOTE! We do a "raw" seqcount_begin here. That means that
22768c2ecf20Sopenharmony_ci		 * we don't wait for the sequence count to stabilize if it
22778c2ecf20Sopenharmony_ci		 * is in the middle of a sequence change. If we do the slow
22788c2ecf20Sopenharmony_ci		 * dentry compare, we will do seqretries until it is stable,
22798c2ecf20Sopenharmony_ci		 * and if we end up with a successful lookup, we actually
22808c2ecf20Sopenharmony_ci		 * want to exit RCU lookup anyway.
22818c2ecf20Sopenharmony_ci		 *
22828c2ecf20Sopenharmony_ci		 * Note that raw_seqcount_begin still *does* smp_rmb(), so
22838c2ecf20Sopenharmony_ci		 * we are still guaranteed NUL-termination of ->d_name.name.
22848c2ecf20Sopenharmony_ci		 */
22858c2ecf20Sopenharmony_ci		seq = raw_seqcount_begin(&dentry->d_seq);
22868c2ecf20Sopenharmony_ci		if (dentry->d_parent != parent)
22878c2ecf20Sopenharmony_ci			continue;
22888c2ecf20Sopenharmony_ci		if (d_unhashed(dentry))
22898c2ecf20Sopenharmony_ci			continue;
22908c2ecf20Sopenharmony_ci
22918c2ecf20Sopenharmony_ci		if (unlikely(parent->d_flags & DCACHE_OP_COMPARE)) {
22928c2ecf20Sopenharmony_ci			int tlen;
22938c2ecf20Sopenharmony_ci			const char *tname;
22948c2ecf20Sopenharmony_ci			if (dentry->d_name.hash != hashlen_hash(hashlen))
22958c2ecf20Sopenharmony_ci				continue;
22968c2ecf20Sopenharmony_ci			tlen = dentry->d_name.len;
22978c2ecf20Sopenharmony_ci			tname = dentry->d_name.name;
22988c2ecf20Sopenharmony_ci			/* we want a consistent (name,len) pair */
22998c2ecf20Sopenharmony_ci			if (read_seqcount_retry(&dentry->d_seq, seq)) {
23008c2ecf20Sopenharmony_ci				cpu_relax();
23018c2ecf20Sopenharmony_ci				goto seqretry;
23028c2ecf20Sopenharmony_ci			}
23038c2ecf20Sopenharmony_ci			if (parent->d_op->d_compare(dentry,
23048c2ecf20Sopenharmony_ci						    tlen, tname, name) != 0)
23058c2ecf20Sopenharmony_ci				continue;
23068c2ecf20Sopenharmony_ci		} else {
23078c2ecf20Sopenharmony_ci			if (dentry->d_name.hash_len != hashlen)
23088c2ecf20Sopenharmony_ci				continue;
23098c2ecf20Sopenharmony_ci			if (dentry_cmp(dentry, str, hashlen_len(hashlen)) != 0)
23108c2ecf20Sopenharmony_ci				continue;
23118c2ecf20Sopenharmony_ci		}
23128c2ecf20Sopenharmony_ci		*seqp = seq;
23138c2ecf20Sopenharmony_ci		return dentry;
23148c2ecf20Sopenharmony_ci	}
23158c2ecf20Sopenharmony_ci	return NULL;
23168c2ecf20Sopenharmony_ci}
23178c2ecf20Sopenharmony_ci
23188c2ecf20Sopenharmony_ci/**
23198c2ecf20Sopenharmony_ci * d_lookup - search for a dentry
23208c2ecf20Sopenharmony_ci * @parent: parent dentry
23218c2ecf20Sopenharmony_ci * @name: qstr of name we wish to find
23228c2ecf20Sopenharmony_ci * Returns: dentry, or NULL
23238c2ecf20Sopenharmony_ci *
23248c2ecf20Sopenharmony_ci * d_lookup searches the children of the parent dentry for the name in
23258c2ecf20Sopenharmony_ci * question. If the dentry is found its reference count is incremented and the
23268c2ecf20Sopenharmony_ci * dentry is returned. The caller must use dput to free the entry when it has
23278c2ecf20Sopenharmony_ci * finished using it. %NULL is returned if the dentry does not exist.
23288c2ecf20Sopenharmony_ci */
23298c2ecf20Sopenharmony_cistruct dentry *d_lookup(const struct dentry *parent, const struct qstr *name)
23308c2ecf20Sopenharmony_ci{
23318c2ecf20Sopenharmony_ci	struct dentry *dentry;
23328c2ecf20Sopenharmony_ci	unsigned seq;
23338c2ecf20Sopenharmony_ci
23348c2ecf20Sopenharmony_ci	do {
23358c2ecf20Sopenharmony_ci		seq = read_seqbegin(&rename_lock);
23368c2ecf20Sopenharmony_ci		dentry = __d_lookup(parent, name);
23378c2ecf20Sopenharmony_ci		if (dentry)
23388c2ecf20Sopenharmony_ci			break;
23398c2ecf20Sopenharmony_ci	} while (read_seqretry(&rename_lock, seq));
23408c2ecf20Sopenharmony_ci	return dentry;
23418c2ecf20Sopenharmony_ci}
23428c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_lookup);
23438c2ecf20Sopenharmony_ci
23448c2ecf20Sopenharmony_ci/**
23458c2ecf20Sopenharmony_ci * __d_lookup - search for a dentry (racy)
23468c2ecf20Sopenharmony_ci * @parent: parent dentry
23478c2ecf20Sopenharmony_ci * @name: qstr of name we wish to find
23488c2ecf20Sopenharmony_ci * Returns: dentry, or NULL
23498c2ecf20Sopenharmony_ci *
23508c2ecf20Sopenharmony_ci * __d_lookup is like d_lookup, however it may (rarely) return a
23518c2ecf20Sopenharmony_ci * false-negative result due to unrelated rename activity.
23528c2ecf20Sopenharmony_ci *
23538c2ecf20Sopenharmony_ci * __d_lookup is slightly faster by avoiding rename_lock read seqlock,
23548c2ecf20Sopenharmony_ci * however it must be used carefully, eg. with a following d_lookup in
23558c2ecf20Sopenharmony_ci * the case of failure.
23568c2ecf20Sopenharmony_ci *
23578c2ecf20Sopenharmony_ci * __d_lookup callers must be commented.
23588c2ecf20Sopenharmony_ci */
23598c2ecf20Sopenharmony_cistruct dentry *__d_lookup(const struct dentry *parent, const struct qstr *name)
23608c2ecf20Sopenharmony_ci{
23618c2ecf20Sopenharmony_ci	unsigned int hash = name->hash;
23628c2ecf20Sopenharmony_ci	struct hlist_bl_head *b = d_hash(hash);
23638c2ecf20Sopenharmony_ci	struct hlist_bl_node *node;
23648c2ecf20Sopenharmony_ci	struct dentry *found = NULL;
23658c2ecf20Sopenharmony_ci	struct dentry *dentry;
23668c2ecf20Sopenharmony_ci
23678c2ecf20Sopenharmony_ci	/*
23688c2ecf20Sopenharmony_ci	 * Note: There is significant duplication with __d_lookup_rcu which is
23698c2ecf20Sopenharmony_ci	 * required to prevent single threaded performance regressions
23708c2ecf20Sopenharmony_ci	 * especially on architectures where smp_rmb (in seqcounts) are costly.
23718c2ecf20Sopenharmony_ci	 * Keep the two functions in sync.
23728c2ecf20Sopenharmony_ci	 */
23738c2ecf20Sopenharmony_ci
23748c2ecf20Sopenharmony_ci	/*
23758c2ecf20Sopenharmony_ci	 * The hash list is protected using RCU.
23768c2ecf20Sopenharmony_ci	 *
23778c2ecf20Sopenharmony_ci	 * Take d_lock when comparing a candidate dentry, to avoid races
23788c2ecf20Sopenharmony_ci	 * with d_move().
23798c2ecf20Sopenharmony_ci	 *
23808c2ecf20Sopenharmony_ci	 * It is possible that concurrent renames can mess up our list
23818c2ecf20Sopenharmony_ci	 * walk here and result in missing our dentry, resulting in the
23828c2ecf20Sopenharmony_ci	 * false-negative result. d_lookup() protects against concurrent
23838c2ecf20Sopenharmony_ci	 * renames using rename_lock seqlock.
23848c2ecf20Sopenharmony_ci	 *
23858c2ecf20Sopenharmony_ci	 * See Documentation/filesystems/path-lookup.txt for more details.
23868c2ecf20Sopenharmony_ci	 */
23878c2ecf20Sopenharmony_ci	rcu_read_lock();
23888c2ecf20Sopenharmony_ci
23898c2ecf20Sopenharmony_ci	hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) {
23908c2ecf20Sopenharmony_ci
23918c2ecf20Sopenharmony_ci		if (dentry->d_name.hash != hash)
23928c2ecf20Sopenharmony_ci			continue;
23938c2ecf20Sopenharmony_ci
23948c2ecf20Sopenharmony_ci		spin_lock(&dentry->d_lock);
23958c2ecf20Sopenharmony_ci		if (dentry->d_parent != parent)
23968c2ecf20Sopenharmony_ci			goto next;
23978c2ecf20Sopenharmony_ci		if (d_unhashed(dentry))
23988c2ecf20Sopenharmony_ci			goto next;
23998c2ecf20Sopenharmony_ci
24008c2ecf20Sopenharmony_ci		if (!d_same_name(dentry, parent, name))
24018c2ecf20Sopenharmony_ci			goto next;
24028c2ecf20Sopenharmony_ci
24038c2ecf20Sopenharmony_ci		dentry->d_lockref.count++;
24048c2ecf20Sopenharmony_ci		found = dentry;
24058c2ecf20Sopenharmony_ci		spin_unlock(&dentry->d_lock);
24068c2ecf20Sopenharmony_ci		break;
24078c2ecf20Sopenharmony_cinext:
24088c2ecf20Sopenharmony_ci		spin_unlock(&dentry->d_lock);
24098c2ecf20Sopenharmony_ci 	}
24108c2ecf20Sopenharmony_ci 	rcu_read_unlock();
24118c2ecf20Sopenharmony_ci
24128c2ecf20Sopenharmony_ci 	return found;
24138c2ecf20Sopenharmony_ci}
24148c2ecf20Sopenharmony_ci
24158c2ecf20Sopenharmony_ci/**
24168c2ecf20Sopenharmony_ci * d_hash_and_lookup - hash the qstr then search for a dentry
24178c2ecf20Sopenharmony_ci * @dir: Directory to search in
24188c2ecf20Sopenharmony_ci * @name: qstr of name we wish to find
24198c2ecf20Sopenharmony_ci *
24208c2ecf20Sopenharmony_ci * On lookup failure NULL is returned; on bad name - ERR_PTR(-error)
24218c2ecf20Sopenharmony_ci */
24228c2ecf20Sopenharmony_cistruct dentry *d_hash_and_lookup(struct dentry *dir, struct qstr *name)
24238c2ecf20Sopenharmony_ci{
24248c2ecf20Sopenharmony_ci	/*
24258c2ecf20Sopenharmony_ci	 * Check for a fs-specific hash function. Note that we must
24268c2ecf20Sopenharmony_ci	 * calculate the standard hash first, as the d_op->d_hash()
24278c2ecf20Sopenharmony_ci	 * routine may choose to leave the hash value unchanged.
24288c2ecf20Sopenharmony_ci	 */
24298c2ecf20Sopenharmony_ci	name->hash = full_name_hash(dir, name->name, name->len);
24308c2ecf20Sopenharmony_ci	if (dir->d_flags & DCACHE_OP_HASH) {
24318c2ecf20Sopenharmony_ci		int err = dir->d_op->d_hash(dir, name);
24328c2ecf20Sopenharmony_ci		if (unlikely(err < 0))
24338c2ecf20Sopenharmony_ci			return ERR_PTR(err);
24348c2ecf20Sopenharmony_ci	}
24358c2ecf20Sopenharmony_ci	return d_lookup(dir, name);
24368c2ecf20Sopenharmony_ci}
24378c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_hash_and_lookup);
24388c2ecf20Sopenharmony_ci
24398c2ecf20Sopenharmony_ci/*
24408c2ecf20Sopenharmony_ci * When a file is deleted, we have two options:
24418c2ecf20Sopenharmony_ci * - turn this dentry into a negative dentry
24428c2ecf20Sopenharmony_ci * - unhash this dentry and free it.
24438c2ecf20Sopenharmony_ci *
24448c2ecf20Sopenharmony_ci * Usually, we want to just turn this into
24458c2ecf20Sopenharmony_ci * a negative dentry, but if anybody else is
24468c2ecf20Sopenharmony_ci * currently using the dentry or the inode
24478c2ecf20Sopenharmony_ci * we can't do that and we fall back on removing
24488c2ecf20Sopenharmony_ci * it from the hash queues and waiting for
24498c2ecf20Sopenharmony_ci * it to be deleted later when it has no users
24508c2ecf20Sopenharmony_ci */
24518c2ecf20Sopenharmony_ci
24528c2ecf20Sopenharmony_ci/**
24538c2ecf20Sopenharmony_ci * d_delete - delete a dentry
24548c2ecf20Sopenharmony_ci * @dentry: The dentry to delete
24558c2ecf20Sopenharmony_ci *
24568c2ecf20Sopenharmony_ci * Turn the dentry into a negative dentry if possible, otherwise
24578c2ecf20Sopenharmony_ci * remove it from the hash queues so it can be deleted later
24588c2ecf20Sopenharmony_ci */
24598c2ecf20Sopenharmony_ci
24608c2ecf20Sopenharmony_civoid d_delete(struct dentry * dentry)
24618c2ecf20Sopenharmony_ci{
24628c2ecf20Sopenharmony_ci	struct inode *inode = dentry->d_inode;
24638c2ecf20Sopenharmony_ci
24648c2ecf20Sopenharmony_ci	spin_lock(&inode->i_lock);
24658c2ecf20Sopenharmony_ci	spin_lock(&dentry->d_lock);
24668c2ecf20Sopenharmony_ci	/*
24678c2ecf20Sopenharmony_ci	 * Are we the only user?
24688c2ecf20Sopenharmony_ci	 */
24698c2ecf20Sopenharmony_ci	if (dentry->d_lockref.count == 1) {
24708c2ecf20Sopenharmony_ci		dentry->d_flags &= ~DCACHE_CANT_MOUNT;
24718c2ecf20Sopenharmony_ci		dentry_unlink_inode(dentry);
24728c2ecf20Sopenharmony_ci	} else {
24738c2ecf20Sopenharmony_ci		__d_drop(dentry);
24748c2ecf20Sopenharmony_ci		spin_unlock(&dentry->d_lock);
24758c2ecf20Sopenharmony_ci		spin_unlock(&inode->i_lock);
24768c2ecf20Sopenharmony_ci	}
24778c2ecf20Sopenharmony_ci}
24788c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_delete);
24798c2ecf20Sopenharmony_ci
24808c2ecf20Sopenharmony_cistatic void __d_rehash(struct dentry *entry)
24818c2ecf20Sopenharmony_ci{
24828c2ecf20Sopenharmony_ci	struct hlist_bl_head *b = d_hash(entry->d_name.hash);
24838c2ecf20Sopenharmony_ci
24848c2ecf20Sopenharmony_ci	hlist_bl_lock(b);
24858c2ecf20Sopenharmony_ci	hlist_bl_add_head_rcu(&entry->d_hash, b);
24868c2ecf20Sopenharmony_ci	hlist_bl_unlock(b);
24878c2ecf20Sopenharmony_ci}
24888c2ecf20Sopenharmony_ci
24898c2ecf20Sopenharmony_ci/**
24908c2ecf20Sopenharmony_ci * d_rehash	- add an entry back to the hash
24918c2ecf20Sopenharmony_ci * @entry: dentry to add to the hash
24928c2ecf20Sopenharmony_ci *
24938c2ecf20Sopenharmony_ci * Adds a dentry to the hash according to its name.
24948c2ecf20Sopenharmony_ci */
24958c2ecf20Sopenharmony_ci
24968c2ecf20Sopenharmony_civoid d_rehash(struct dentry * entry)
24978c2ecf20Sopenharmony_ci{
24988c2ecf20Sopenharmony_ci	spin_lock(&entry->d_lock);
24998c2ecf20Sopenharmony_ci	__d_rehash(entry);
25008c2ecf20Sopenharmony_ci	spin_unlock(&entry->d_lock);
25018c2ecf20Sopenharmony_ci}
25028c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_rehash);
25038c2ecf20Sopenharmony_ci
25048c2ecf20Sopenharmony_cistatic inline unsigned start_dir_add(struct inode *dir)
25058c2ecf20Sopenharmony_ci{
25068c2ecf20Sopenharmony_ci
25078c2ecf20Sopenharmony_ci	for (;;) {
25088c2ecf20Sopenharmony_ci		unsigned n = dir->i_dir_seq;
25098c2ecf20Sopenharmony_ci		if (!(n & 1) && cmpxchg(&dir->i_dir_seq, n, n + 1) == n)
25108c2ecf20Sopenharmony_ci			return n;
25118c2ecf20Sopenharmony_ci		cpu_relax();
25128c2ecf20Sopenharmony_ci	}
25138c2ecf20Sopenharmony_ci}
25148c2ecf20Sopenharmony_ci
25158c2ecf20Sopenharmony_cistatic inline void end_dir_add(struct inode *dir, unsigned n)
25168c2ecf20Sopenharmony_ci{
25178c2ecf20Sopenharmony_ci	smp_store_release(&dir->i_dir_seq, n + 2);
25188c2ecf20Sopenharmony_ci}
25198c2ecf20Sopenharmony_ci
25208c2ecf20Sopenharmony_cistatic void d_wait_lookup(struct dentry *dentry)
25218c2ecf20Sopenharmony_ci{
25228c2ecf20Sopenharmony_ci	if (d_in_lookup(dentry)) {
25238c2ecf20Sopenharmony_ci		DECLARE_WAITQUEUE(wait, current);
25248c2ecf20Sopenharmony_ci		add_wait_queue(dentry->d_wait, &wait);
25258c2ecf20Sopenharmony_ci		do {
25268c2ecf20Sopenharmony_ci			set_current_state(TASK_UNINTERRUPTIBLE);
25278c2ecf20Sopenharmony_ci			spin_unlock(&dentry->d_lock);
25288c2ecf20Sopenharmony_ci			schedule();
25298c2ecf20Sopenharmony_ci			spin_lock(&dentry->d_lock);
25308c2ecf20Sopenharmony_ci		} while (d_in_lookup(dentry));
25318c2ecf20Sopenharmony_ci	}
25328c2ecf20Sopenharmony_ci}
25338c2ecf20Sopenharmony_ci
25348c2ecf20Sopenharmony_cistruct dentry *d_alloc_parallel(struct dentry *parent,
25358c2ecf20Sopenharmony_ci				const struct qstr *name,
25368c2ecf20Sopenharmony_ci				wait_queue_head_t *wq)
25378c2ecf20Sopenharmony_ci{
25388c2ecf20Sopenharmony_ci	unsigned int hash = name->hash;
25398c2ecf20Sopenharmony_ci	struct hlist_bl_head *b = in_lookup_hash(parent, hash);
25408c2ecf20Sopenharmony_ci	struct hlist_bl_node *node;
25418c2ecf20Sopenharmony_ci	struct dentry *new = d_alloc(parent, name);
25428c2ecf20Sopenharmony_ci	struct dentry *dentry;
25438c2ecf20Sopenharmony_ci	unsigned seq, r_seq, d_seq;
25448c2ecf20Sopenharmony_ci
25458c2ecf20Sopenharmony_ci	if (unlikely(!new))
25468c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
25478c2ecf20Sopenharmony_ci
25488c2ecf20Sopenharmony_ciretry:
25498c2ecf20Sopenharmony_ci	rcu_read_lock();
25508c2ecf20Sopenharmony_ci	seq = smp_load_acquire(&parent->d_inode->i_dir_seq);
25518c2ecf20Sopenharmony_ci	r_seq = read_seqbegin(&rename_lock);
25528c2ecf20Sopenharmony_ci	dentry = __d_lookup_rcu(parent, name, &d_seq);
25538c2ecf20Sopenharmony_ci	if (unlikely(dentry)) {
25548c2ecf20Sopenharmony_ci		if (!lockref_get_not_dead(&dentry->d_lockref)) {
25558c2ecf20Sopenharmony_ci			rcu_read_unlock();
25568c2ecf20Sopenharmony_ci			goto retry;
25578c2ecf20Sopenharmony_ci		}
25588c2ecf20Sopenharmony_ci		if (read_seqcount_retry(&dentry->d_seq, d_seq)) {
25598c2ecf20Sopenharmony_ci			rcu_read_unlock();
25608c2ecf20Sopenharmony_ci			dput(dentry);
25618c2ecf20Sopenharmony_ci			goto retry;
25628c2ecf20Sopenharmony_ci		}
25638c2ecf20Sopenharmony_ci		rcu_read_unlock();
25648c2ecf20Sopenharmony_ci		dput(new);
25658c2ecf20Sopenharmony_ci		return dentry;
25668c2ecf20Sopenharmony_ci	}
25678c2ecf20Sopenharmony_ci	if (unlikely(read_seqretry(&rename_lock, r_seq))) {
25688c2ecf20Sopenharmony_ci		rcu_read_unlock();
25698c2ecf20Sopenharmony_ci		goto retry;
25708c2ecf20Sopenharmony_ci	}
25718c2ecf20Sopenharmony_ci
25728c2ecf20Sopenharmony_ci	if (unlikely(seq & 1)) {
25738c2ecf20Sopenharmony_ci		rcu_read_unlock();
25748c2ecf20Sopenharmony_ci		goto retry;
25758c2ecf20Sopenharmony_ci	}
25768c2ecf20Sopenharmony_ci
25778c2ecf20Sopenharmony_ci	hlist_bl_lock(b);
25788c2ecf20Sopenharmony_ci	if (unlikely(READ_ONCE(parent->d_inode->i_dir_seq) != seq)) {
25798c2ecf20Sopenharmony_ci		hlist_bl_unlock(b);
25808c2ecf20Sopenharmony_ci		rcu_read_unlock();
25818c2ecf20Sopenharmony_ci		goto retry;
25828c2ecf20Sopenharmony_ci	}
25838c2ecf20Sopenharmony_ci	/*
25848c2ecf20Sopenharmony_ci	 * No changes for the parent since the beginning of d_lookup().
25858c2ecf20Sopenharmony_ci	 * Since all removals from the chain happen with hlist_bl_lock(),
25868c2ecf20Sopenharmony_ci	 * any potential in-lookup matches are going to stay here until
25878c2ecf20Sopenharmony_ci	 * we unlock the chain.  All fields are stable in everything
25888c2ecf20Sopenharmony_ci	 * we encounter.
25898c2ecf20Sopenharmony_ci	 */
25908c2ecf20Sopenharmony_ci	hlist_bl_for_each_entry(dentry, node, b, d_u.d_in_lookup_hash) {
25918c2ecf20Sopenharmony_ci		if (dentry->d_name.hash != hash)
25928c2ecf20Sopenharmony_ci			continue;
25938c2ecf20Sopenharmony_ci		if (dentry->d_parent != parent)
25948c2ecf20Sopenharmony_ci			continue;
25958c2ecf20Sopenharmony_ci		if (!d_same_name(dentry, parent, name))
25968c2ecf20Sopenharmony_ci			continue;
25978c2ecf20Sopenharmony_ci		hlist_bl_unlock(b);
25988c2ecf20Sopenharmony_ci		/* now we can try to grab a reference */
25998c2ecf20Sopenharmony_ci		if (!lockref_get_not_dead(&dentry->d_lockref)) {
26008c2ecf20Sopenharmony_ci			rcu_read_unlock();
26018c2ecf20Sopenharmony_ci			goto retry;
26028c2ecf20Sopenharmony_ci		}
26038c2ecf20Sopenharmony_ci
26048c2ecf20Sopenharmony_ci		rcu_read_unlock();
26058c2ecf20Sopenharmony_ci		/*
26068c2ecf20Sopenharmony_ci		 * somebody is likely to be still doing lookup for it;
26078c2ecf20Sopenharmony_ci		 * wait for them to finish
26088c2ecf20Sopenharmony_ci		 */
26098c2ecf20Sopenharmony_ci		spin_lock(&dentry->d_lock);
26108c2ecf20Sopenharmony_ci		d_wait_lookup(dentry);
26118c2ecf20Sopenharmony_ci		/*
26128c2ecf20Sopenharmony_ci		 * it's not in-lookup anymore; in principle we should repeat
26138c2ecf20Sopenharmony_ci		 * everything from dcache lookup, but it's likely to be what
26148c2ecf20Sopenharmony_ci		 * d_lookup() would've found anyway.  If it is, just return it;
26158c2ecf20Sopenharmony_ci		 * otherwise we really have to repeat the whole thing.
26168c2ecf20Sopenharmony_ci		 */
26178c2ecf20Sopenharmony_ci		if (unlikely(dentry->d_name.hash != hash))
26188c2ecf20Sopenharmony_ci			goto mismatch;
26198c2ecf20Sopenharmony_ci		if (unlikely(dentry->d_parent != parent))
26208c2ecf20Sopenharmony_ci			goto mismatch;
26218c2ecf20Sopenharmony_ci		if (unlikely(d_unhashed(dentry)))
26228c2ecf20Sopenharmony_ci			goto mismatch;
26238c2ecf20Sopenharmony_ci		if (unlikely(!d_same_name(dentry, parent, name)))
26248c2ecf20Sopenharmony_ci			goto mismatch;
26258c2ecf20Sopenharmony_ci		/* OK, it *is* a hashed match; return it */
26268c2ecf20Sopenharmony_ci		spin_unlock(&dentry->d_lock);
26278c2ecf20Sopenharmony_ci		dput(new);
26288c2ecf20Sopenharmony_ci		return dentry;
26298c2ecf20Sopenharmony_ci	}
26308c2ecf20Sopenharmony_ci	rcu_read_unlock();
26318c2ecf20Sopenharmony_ci	/* we can't take ->d_lock here; it's OK, though. */
26328c2ecf20Sopenharmony_ci	new->d_flags |= DCACHE_PAR_LOOKUP;
26338c2ecf20Sopenharmony_ci	new->d_wait = wq;
26348c2ecf20Sopenharmony_ci	hlist_bl_add_head_rcu(&new->d_u.d_in_lookup_hash, b);
26358c2ecf20Sopenharmony_ci	hlist_bl_unlock(b);
26368c2ecf20Sopenharmony_ci	return new;
26378c2ecf20Sopenharmony_cimismatch:
26388c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
26398c2ecf20Sopenharmony_ci	dput(dentry);
26408c2ecf20Sopenharmony_ci	goto retry;
26418c2ecf20Sopenharmony_ci}
26428c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_alloc_parallel);
26438c2ecf20Sopenharmony_ci
26448c2ecf20Sopenharmony_civoid __d_lookup_done(struct dentry *dentry)
26458c2ecf20Sopenharmony_ci{
26468c2ecf20Sopenharmony_ci	struct hlist_bl_head *b = in_lookup_hash(dentry->d_parent,
26478c2ecf20Sopenharmony_ci						 dentry->d_name.hash);
26488c2ecf20Sopenharmony_ci	hlist_bl_lock(b);
26498c2ecf20Sopenharmony_ci	dentry->d_flags &= ~DCACHE_PAR_LOOKUP;
26508c2ecf20Sopenharmony_ci	__hlist_bl_del(&dentry->d_u.d_in_lookup_hash);
26518c2ecf20Sopenharmony_ci	wake_up_all(dentry->d_wait);
26528c2ecf20Sopenharmony_ci	dentry->d_wait = NULL;
26538c2ecf20Sopenharmony_ci	hlist_bl_unlock(b);
26548c2ecf20Sopenharmony_ci	INIT_HLIST_NODE(&dentry->d_u.d_alias);
26558c2ecf20Sopenharmony_ci	INIT_LIST_HEAD(&dentry->d_lru);
26568c2ecf20Sopenharmony_ci}
26578c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__d_lookup_done);
26588c2ecf20Sopenharmony_ci
26598c2ecf20Sopenharmony_ci/* inode->i_lock held if inode is non-NULL */
26608c2ecf20Sopenharmony_ci
26618c2ecf20Sopenharmony_cistatic inline void __d_add(struct dentry *dentry, struct inode *inode)
26628c2ecf20Sopenharmony_ci{
26638c2ecf20Sopenharmony_ci	struct inode *dir = NULL;
26648c2ecf20Sopenharmony_ci	unsigned n;
26658c2ecf20Sopenharmony_ci	spin_lock(&dentry->d_lock);
26668c2ecf20Sopenharmony_ci	if (unlikely(d_in_lookup(dentry))) {
26678c2ecf20Sopenharmony_ci		dir = dentry->d_parent->d_inode;
26688c2ecf20Sopenharmony_ci		n = start_dir_add(dir);
26698c2ecf20Sopenharmony_ci		__d_lookup_done(dentry);
26708c2ecf20Sopenharmony_ci	}
26718c2ecf20Sopenharmony_ci	if (inode) {
26728c2ecf20Sopenharmony_ci		unsigned add_flags = d_flags_for_inode(inode);
26738c2ecf20Sopenharmony_ci		hlist_add_head(&dentry->d_u.d_alias, &inode->i_dentry);
26748c2ecf20Sopenharmony_ci		raw_write_seqcount_begin(&dentry->d_seq);
26758c2ecf20Sopenharmony_ci		__d_set_inode_and_type(dentry, inode, add_flags);
26768c2ecf20Sopenharmony_ci		raw_write_seqcount_end(&dentry->d_seq);
26778c2ecf20Sopenharmony_ci		fsnotify_update_flags(dentry);
26788c2ecf20Sopenharmony_ci	}
26798c2ecf20Sopenharmony_ci	__d_rehash(dentry);
26808c2ecf20Sopenharmony_ci	if (dir)
26818c2ecf20Sopenharmony_ci		end_dir_add(dir, n);
26828c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
26838c2ecf20Sopenharmony_ci	if (inode)
26848c2ecf20Sopenharmony_ci		spin_unlock(&inode->i_lock);
26858c2ecf20Sopenharmony_ci}
26868c2ecf20Sopenharmony_ci
26878c2ecf20Sopenharmony_ci/**
26888c2ecf20Sopenharmony_ci * d_add - add dentry to hash queues
26898c2ecf20Sopenharmony_ci * @entry: dentry to add
26908c2ecf20Sopenharmony_ci * @inode: The inode to attach to this dentry
26918c2ecf20Sopenharmony_ci *
26928c2ecf20Sopenharmony_ci * This adds the entry to the hash queues and initializes @inode.
26938c2ecf20Sopenharmony_ci * The entry was actually filled in earlier during d_alloc().
26948c2ecf20Sopenharmony_ci */
26958c2ecf20Sopenharmony_ci
26968c2ecf20Sopenharmony_civoid d_add(struct dentry *entry, struct inode *inode)
26978c2ecf20Sopenharmony_ci{
26988c2ecf20Sopenharmony_ci	if (inode) {
26998c2ecf20Sopenharmony_ci		security_d_instantiate(entry, inode);
27008c2ecf20Sopenharmony_ci		spin_lock(&inode->i_lock);
27018c2ecf20Sopenharmony_ci	}
27028c2ecf20Sopenharmony_ci	__d_add(entry, inode);
27038c2ecf20Sopenharmony_ci}
27048c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_add);
27058c2ecf20Sopenharmony_ci
27068c2ecf20Sopenharmony_ci/**
27078c2ecf20Sopenharmony_ci * d_exact_alias - find and hash an exact unhashed alias
27088c2ecf20Sopenharmony_ci * @entry: dentry to add
27098c2ecf20Sopenharmony_ci * @inode: The inode to go with this dentry
27108c2ecf20Sopenharmony_ci *
27118c2ecf20Sopenharmony_ci * If an unhashed dentry with the same name/parent and desired
27128c2ecf20Sopenharmony_ci * inode already exists, hash and return it.  Otherwise, return
27138c2ecf20Sopenharmony_ci * NULL.
27148c2ecf20Sopenharmony_ci *
27158c2ecf20Sopenharmony_ci * Parent directory should be locked.
27168c2ecf20Sopenharmony_ci */
27178c2ecf20Sopenharmony_cistruct dentry *d_exact_alias(struct dentry *entry, struct inode *inode)
27188c2ecf20Sopenharmony_ci{
27198c2ecf20Sopenharmony_ci	struct dentry *alias;
27208c2ecf20Sopenharmony_ci	unsigned int hash = entry->d_name.hash;
27218c2ecf20Sopenharmony_ci
27228c2ecf20Sopenharmony_ci	spin_lock(&inode->i_lock);
27238c2ecf20Sopenharmony_ci	hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
27248c2ecf20Sopenharmony_ci		/*
27258c2ecf20Sopenharmony_ci		 * Don't need alias->d_lock here, because aliases with
27268c2ecf20Sopenharmony_ci		 * d_parent == entry->d_parent are not subject to name or
27278c2ecf20Sopenharmony_ci		 * parent changes, because the parent inode i_mutex is held.
27288c2ecf20Sopenharmony_ci		 */
27298c2ecf20Sopenharmony_ci		if (alias->d_name.hash != hash)
27308c2ecf20Sopenharmony_ci			continue;
27318c2ecf20Sopenharmony_ci		if (alias->d_parent != entry->d_parent)
27328c2ecf20Sopenharmony_ci			continue;
27338c2ecf20Sopenharmony_ci		if (!d_same_name(alias, entry->d_parent, &entry->d_name))
27348c2ecf20Sopenharmony_ci			continue;
27358c2ecf20Sopenharmony_ci		spin_lock(&alias->d_lock);
27368c2ecf20Sopenharmony_ci		if (!d_unhashed(alias)) {
27378c2ecf20Sopenharmony_ci			spin_unlock(&alias->d_lock);
27388c2ecf20Sopenharmony_ci			alias = NULL;
27398c2ecf20Sopenharmony_ci		} else {
27408c2ecf20Sopenharmony_ci			__dget_dlock(alias);
27418c2ecf20Sopenharmony_ci			__d_rehash(alias);
27428c2ecf20Sopenharmony_ci			spin_unlock(&alias->d_lock);
27438c2ecf20Sopenharmony_ci		}
27448c2ecf20Sopenharmony_ci		spin_unlock(&inode->i_lock);
27458c2ecf20Sopenharmony_ci		return alias;
27468c2ecf20Sopenharmony_ci	}
27478c2ecf20Sopenharmony_ci	spin_unlock(&inode->i_lock);
27488c2ecf20Sopenharmony_ci	return NULL;
27498c2ecf20Sopenharmony_ci}
27508c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_exact_alias);
27518c2ecf20Sopenharmony_ci
27528c2ecf20Sopenharmony_cistatic void swap_names(struct dentry *dentry, struct dentry *target)
27538c2ecf20Sopenharmony_ci{
27548c2ecf20Sopenharmony_ci	if (unlikely(dname_external(target))) {
27558c2ecf20Sopenharmony_ci		if (unlikely(dname_external(dentry))) {
27568c2ecf20Sopenharmony_ci			/*
27578c2ecf20Sopenharmony_ci			 * Both external: swap the pointers
27588c2ecf20Sopenharmony_ci			 */
27598c2ecf20Sopenharmony_ci			swap(target->d_name.name, dentry->d_name.name);
27608c2ecf20Sopenharmony_ci		} else {
27618c2ecf20Sopenharmony_ci			/*
27628c2ecf20Sopenharmony_ci			 * dentry:internal, target:external.  Steal target's
27638c2ecf20Sopenharmony_ci			 * storage and make target internal.
27648c2ecf20Sopenharmony_ci			 */
27658c2ecf20Sopenharmony_ci			memcpy(target->d_iname, dentry->d_name.name,
27668c2ecf20Sopenharmony_ci					dentry->d_name.len + 1);
27678c2ecf20Sopenharmony_ci			dentry->d_name.name = target->d_name.name;
27688c2ecf20Sopenharmony_ci			target->d_name.name = target->d_iname;
27698c2ecf20Sopenharmony_ci		}
27708c2ecf20Sopenharmony_ci	} else {
27718c2ecf20Sopenharmony_ci		if (unlikely(dname_external(dentry))) {
27728c2ecf20Sopenharmony_ci			/*
27738c2ecf20Sopenharmony_ci			 * dentry:external, target:internal.  Give dentry's
27748c2ecf20Sopenharmony_ci			 * storage to target and make dentry internal
27758c2ecf20Sopenharmony_ci			 */
27768c2ecf20Sopenharmony_ci			memcpy(dentry->d_iname, target->d_name.name,
27778c2ecf20Sopenharmony_ci					target->d_name.len + 1);
27788c2ecf20Sopenharmony_ci			target->d_name.name = dentry->d_name.name;
27798c2ecf20Sopenharmony_ci			dentry->d_name.name = dentry->d_iname;
27808c2ecf20Sopenharmony_ci		} else {
27818c2ecf20Sopenharmony_ci			/*
27828c2ecf20Sopenharmony_ci			 * Both are internal.
27838c2ecf20Sopenharmony_ci			 */
27848c2ecf20Sopenharmony_ci			unsigned int i;
27858c2ecf20Sopenharmony_ci			BUILD_BUG_ON(!IS_ALIGNED(DNAME_INLINE_LEN, sizeof(long)));
27868c2ecf20Sopenharmony_ci			for (i = 0; i < DNAME_INLINE_LEN / sizeof(long); i++) {
27878c2ecf20Sopenharmony_ci				swap(((long *) &dentry->d_iname)[i],
27888c2ecf20Sopenharmony_ci				     ((long *) &target->d_iname)[i]);
27898c2ecf20Sopenharmony_ci			}
27908c2ecf20Sopenharmony_ci		}
27918c2ecf20Sopenharmony_ci	}
27928c2ecf20Sopenharmony_ci	swap(dentry->d_name.hash_len, target->d_name.hash_len);
27938c2ecf20Sopenharmony_ci}
27948c2ecf20Sopenharmony_ci
27958c2ecf20Sopenharmony_cistatic void copy_name(struct dentry *dentry, struct dentry *target)
27968c2ecf20Sopenharmony_ci{
27978c2ecf20Sopenharmony_ci	struct external_name *old_name = NULL;
27988c2ecf20Sopenharmony_ci	if (unlikely(dname_external(dentry)))
27998c2ecf20Sopenharmony_ci		old_name = external_name(dentry);
28008c2ecf20Sopenharmony_ci	if (unlikely(dname_external(target))) {
28018c2ecf20Sopenharmony_ci		atomic_inc(&external_name(target)->u.count);
28028c2ecf20Sopenharmony_ci		dentry->d_name = target->d_name;
28038c2ecf20Sopenharmony_ci	} else {
28048c2ecf20Sopenharmony_ci		memcpy(dentry->d_iname, target->d_name.name,
28058c2ecf20Sopenharmony_ci				target->d_name.len + 1);
28068c2ecf20Sopenharmony_ci		dentry->d_name.name = dentry->d_iname;
28078c2ecf20Sopenharmony_ci		dentry->d_name.hash_len = target->d_name.hash_len;
28088c2ecf20Sopenharmony_ci	}
28098c2ecf20Sopenharmony_ci	if (old_name && likely(atomic_dec_and_test(&old_name->u.count)))
28108c2ecf20Sopenharmony_ci		kfree_rcu(old_name, u.head);
28118c2ecf20Sopenharmony_ci}
28128c2ecf20Sopenharmony_ci
28138c2ecf20Sopenharmony_ci/*
28148c2ecf20Sopenharmony_ci * __d_move - move a dentry
28158c2ecf20Sopenharmony_ci * @dentry: entry to move
28168c2ecf20Sopenharmony_ci * @target: new dentry
28178c2ecf20Sopenharmony_ci * @exchange: exchange the two dentries
28188c2ecf20Sopenharmony_ci *
28198c2ecf20Sopenharmony_ci * Update the dcache to reflect the move of a file name. Negative
28208c2ecf20Sopenharmony_ci * dcache entries should not be moved in this way. Caller must hold
28218c2ecf20Sopenharmony_ci * rename_lock, the i_mutex of the source and target directories,
28228c2ecf20Sopenharmony_ci * and the sb->s_vfs_rename_mutex if they differ. See lock_rename().
28238c2ecf20Sopenharmony_ci */
28248c2ecf20Sopenharmony_cistatic void __d_move(struct dentry *dentry, struct dentry *target,
28258c2ecf20Sopenharmony_ci		     bool exchange)
28268c2ecf20Sopenharmony_ci{
28278c2ecf20Sopenharmony_ci	struct dentry *old_parent, *p;
28288c2ecf20Sopenharmony_ci	struct inode *dir = NULL;
28298c2ecf20Sopenharmony_ci	unsigned n;
28308c2ecf20Sopenharmony_ci
28318c2ecf20Sopenharmony_ci	WARN_ON(!dentry->d_inode);
28328c2ecf20Sopenharmony_ci	if (WARN_ON(dentry == target))
28338c2ecf20Sopenharmony_ci		return;
28348c2ecf20Sopenharmony_ci
28358c2ecf20Sopenharmony_ci	BUG_ON(d_ancestor(target, dentry));
28368c2ecf20Sopenharmony_ci	old_parent = dentry->d_parent;
28378c2ecf20Sopenharmony_ci	p = d_ancestor(old_parent, target);
28388c2ecf20Sopenharmony_ci	if (IS_ROOT(dentry)) {
28398c2ecf20Sopenharmony_ci		BUG_ON(p);
28408c2ecf20Sopenharmony_ci		spin_lock(&target->d_parent->d_lock);
28418c2ecf20Sopenharmony_ci	} else if (!p) {
28428c2ecf20Sopenharmony_ci		/* target is not a descendent of dentry->d_parent */
28438c2ecf20Sopenharmony_ci		spin_lock(&target->d_parent->d_lock);
28448c2ecf20Sopenharmony_ci		spin_lock_nested(&old_parent->d_lock, DENTRY_D_LOCK_NESTED);
28458c2ecf20Sopenharmony_ci	} else {
28468c2ecf20Sopenharmony_ci		BUG_ON(p == dentry);
28478c2ecf20Sopenharmony_ci		spin_lock(&old_parent->d_lock);
28488c2ecf20Sopenharmony_ci		if (p != target)
28498c2ecf20Sopenharmony_ci			spin_lock_nested(&target->d_parent->d_lock,
28508c2ecf20Sopenharmony_ci					DENTRY_D_LOCK_NESTED);
28518c2ecf20Sopenharmony_ci	}
28528c2ecf20Sopenharmony_ci	spin_lock_nested(&dentry->d_lock, 2);
28538c2ecf20Sopenharmony_ci	spin_lock_nested(&target->d_lock, 3);
28548c2ecf20Sopenharmony_ci
28558c2ecf20Sopenharmony_ci	if (unlikely(d_in_lookup(target))) {
28568c2ecf20Sopenharmony_ci		dir = target->d_parent->d_inode;
28578c2ecf20Sopenharmony_ci		n = start_dir_add(dir);
28588c2ecf20Sopenharmony_ci		__d_lookup_done(target);
28598c2ecf20Sopenharmony_ci	}
28608c2ecf20Sopenharmony_ci
28618c2ecf20Sopenharmony_ci	write_seqcount_begin(&dentry->d_seq);
28628c2ecf20Sopenharmony_ci	write_seqcount_begin_nested(&target->d_seq, DENTRY_D_LOCK_NESTED);
28638c2ecf20Sopenharmony_ci
28648c2ecf20Sopenharmony_ci	/* unhash both */
28658c2ecf20Sopenharmony_ci	if (!d_unhashed(dentry))
28668c2ecf20Sopenharmony_ci		___d_drop(dentry);
28678c2ecf20Sopenharmony_ci	if (!d_unhashed(target))
28688c2ecf20Sopenharmony_ci		___d_drop(target);
28698c2ecf20Sopenharmony_ci
28708c2ecf20Sopenharmony_ci	/* ... and switch them in the tree */
28718c2ecf20Sopenharmony_ci	dentry->d_parent = target->d_parent;
28728c2ecf20Sopenharmony_ci	if (!exchange) {
28738c2ecf20Sopenharmony_ci		copy_name(dentry, target);
28748c2ecf20Sopenharmony_ci		target->d_hash.pprev = NULL;
28758c2ecf20Sopenharmony_ci		dentry->d_parent->d_lockref.count++;
28768c2ecf20Sopenharmony_ci		if (dentry != old_parent) /* wasn't IS_ROOT */
28778c2ecf20Sopenharmony_ci			WARN_ON(!--old_parent->d_lockref.count);
28788c2ecf20Sopenharmony_ci	} else {
28798c2ecf20Sopenharmony_ci		target->d_parent = old_parent;
28808c2ecf20Sopenharmony_ci		swap_names(dentry, target);
28818c2ecf20Sopenharmony_ci		list_move(&target->d_child, &target->d_parent->d_subdirs);
28828c2ecf20Sopenharmony_ci		__d_rehash(target);
28838c2ecf20Sopenharmony_ci		fsnotify_update_flags(target);
28848c2ecf20Sopenharmony_ci	}
28858c2ecf20Sopenharmony_ci	list_move(&dentry->d_child, &dentry->d_parent->d_subdirs);
28868c2ecf20Sopenharmony_ci	__d_rehash(dentry);
28878c2ecf20Sopenharmony_ci	fsnotify_update_flags(dentry);
28888c2ecf20Sopenharmony_ci	fscrypt_handle_d_move(dentry);
28898c2ecf20Sopenharmony_ci
28908c2ecf20Sopenharmony_ci	write_seqcount_end(&target->d_seq);
28918c2ecf20Sopenharmony_ci	write_seqcount_end(&dentry->d_seq);
28928c2ecf20Sopenharmony_ci
28938c2ecf20Sopenharmony_ci	if (dir)
28948c2ecf20Sopenharmony_ci		end_dir_add(dir, n);
28958c2ecf20Sopenharmony_ci
28968c2ecf20Sopenharmony_ci	if (dentry->d_parent != old_parent)
28978c2ecf20Sopenharmony_ci		spin_unlock(&dentry->d_parent->d_lock);
28988c2ecf20Sopenharmony_ci	if (dentry != old_parent)
28998c2ecf20Sopenharmony_ci		spin_unlock(&old_parent->d_lock);
29008c2ecf20Sopenharmony_ci	spin_unlock(&target->d_lock);
29018c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
29028c2ecf20Sopenharmony_ci}
29038c2ecf20Sopenharmony_ci
29048c2ecf20Sopenharmony_ci/*
29058c2ecf20Sopenharmony_ci * d_move - move a dentry
29068c2ecf20Sopenharmony_ci * @dentry: entry to move
29078c2ecf20Sopenharmony_ci * @target: new dentry
29088c2ecf20Sopenharmony_ci *
29098c2ecf20Sopenharmony_ci * Update the dcache to reflect the move of a file name. Negative
29108c2ecf20Sopenharmony_ci * dcache entries should not be moved in this way. See the locking
29118c2ecf20Sopenharmony_ci * requirements for __d_move.
29128c2ecf20Sopenharmony_ci */
29138c2ecf20Sopenharmony_civoid d_move(struct dentry *dentry, struct dentry *target)
29148c2ecf20Sopenharmony_ci{
29158c2ecf20Sopenharmony_ci	write_seqlock(&rename_lock);
29168c2ecf20Sopenharmony_ci	__d_move(dentry, target, false);
29178c2ecf20Sopenharmony_ci	write_sequnlock(&rename_lock);
29188c2ecf20Sopenharmony_ci}
29198c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_move);
29208c2ecf20Sopenharmony_ci
29218c2ecf20Sopenharmony_ci/*
29228c2ecf20Sopenharmony_ci * d_exchange - exchange two dentries
29238c2ecf20Sopenharmony_ci * @dentry1: first dentry
29248c2ecf20Sopenharmony_ci * @dentry2: second dentry
29258c2ecf20Sopenharmony_ci */
29268c2ecf20Sopenharmony_civoid d_exchange(struct dentry *dentry1, struct dentry *dentry2)
29278c2ecf20Sopenharmony_ci{
29288c2ecf20Sopenharmony_ci	write_seqlock(&rename_lock);
29298c2ecf20Sopenharmony_ci
29308c2ecf20Sopenharmony_ci	WARN_ON(!dentry1->d_inode);
29318c2ecf20Sopenharmony_ci	WARN_ON(!dentry2->d_inode);
29328c2ecf20Sopenharmony_ci	WARN_ON(IS_ROOT(dentry1));
29338c2ecf20Sopenharmony_ci	WARN_ON(IS_ROOT(dentry2));
29348c2ecf20Sopenharmony_ci
29358c2ecf20Sopenharmony_ci	__d_move(dentry1, dentry2, true);
29368c2ecf20Sopenharmony_ci
29378c2ecf20Sopenharmony_ci	write_sequnlock(&rename_lock);
29388c2ecf20Sopenharmony_ci}
29398c2ecf20Sopenharmony_ci
29408c2ecf20Sopenharmony_ci/**
29418c2ecf20Sopenharmony_ci * d_ancestor - search for an ancestor
29428c2ecf20Sopenharmony_ci * @p1: ancestor dentry
29438c2ecf20Sopenharmony_ci * @p2: child dentry
29448c2ecf20Sopenharmony_ci *
29458c2ecf20Sopenharmony_ci * Returns the ancestor dentry of p2 which is a child of p1, if p1 is
29468c2ecf20Sopenharmony_ci * an ancestor of p2, else NULL.
29478c2ecf20Sopenharmony_ci */
29488c2ecf20Sopenharmony_cistruct dentry *d_ancestor(struct dentry *p1, struct dentry *p2)
29498c2ecf20Sopenharmony_ci{
29508c2ecf20Sopenharmony_ci	struct dentry *p;
29518c2ecf20Sopenharmony_ci
29528c2ecf20Sopenharmony_ci	for (p = p2; !IS_ROOT(p); p = p->d_parent) {
29538c2ecf20Sopenharmony_ci		if (p->d_parent == p1)
29548c2ecf20Sopenharmony_ci			return p;
29558c2ecf20Sopenharmony_ci	}
29568c2ecf20Sopenharmony_ci	return NULL;
29578c2ecf20Sopenharmony_ci}
29588c2ecf20Sopenharmony_ci
29598c2ecf20Sopenharmony_ci/*
29608c2ecf20Sopenharmony_ci * This helper attempts to cope with remotely renamed directories
29618c2ecf20Sopenharmony_ci *
29628c2ecf20Sopenharmony_ci * It assumes that the caller is already holding
29638c2ecf20Sopenharmony_ci * dentry->d_parent->d_inode->i_mutex, and rename_lock
29648c2ecf20Sopenharmony_ci *
29658c2ecf20Sopenharmony_ci * Note: If ever the locking in lock_rename() changes, then please
29668c2ecf20Sopenharmony_ci * remember to update this too...
29678c2ecf20Sopenharmony_ci */
29688c2ecf20Sopenharmony_cistatic int __d_unalias(struct inode *inode,
29698c2ecf20Sopenharmony_ci		struct dentry *dentry, struct dentry *alias)
29708c2ecf20Sopenharmony_ci{
29718c2ecf20Sopenharmony_ci	struct mutex *m1 = NULL;
29728c2ecf20Sopenharmony_ci	struct rw_semaphore *m2 = NULL;
29738c2ecf20Sopenharmony_ci	int ret = -ESTALE;
29748c2ecf20Sopenharmony_ci
29758c2ecf20Sopenharmony_ci	/* If alias and dentry share a parent, then no extra locks required */
29768c2ecf20Sopenharmony_ci	if (alias->d_parent == dentry->d_parent)
29778c2ecf20Sopenharmony_ci		goto out_unalias;
29788c2ecf20Sopenharmony_ci
29798c2ecf20Sopenharmony_ci	/* See lock_rename() */
29808c2ecf20Sopenharmony_ci	if (!mutex_trylock(&dentry->d_sb->s_vfs_rename_mutex))
29818c2ecf20Sopenharmony_ci		goto out_err;
29828c2ecf20Sopenharmony_ci	m1 = &dentry->d_sb->s_vfs_rename_mutex;
29838c2ecf20Sopenharmony_ci	if (!inode_trylock_shared(alias->d_parent->d_inode))
29848c2ecf20Sopenharmony_ci		goto out_err;
29858c2ecf20Sopenharmony_ci	m2 = &alias->d_parent->d_inode->i_rwsem;
29868c2ecf20Sopenharmony_ciout_unalias:
29878c2ecf20Sopenharmony_ci	__d_move(alias, dentry, false);
29888c2ecf20Sopenharmony_ci	ret = 0;
29898c2ecf20Sopenharmony_ciout_err:
29908c2ecf20Sopenharmony_ci	if (m2)
29918c2ecf20Sopenharmony_ci		up_read(m2);
29928c2ecf20Sopenharmony_ci	if (m1)
29938c2ecf20Sopenharmony_ci		mutex_unlock(m1);
29948c2ecf20Sopenharmony_ci	return ret;
29958c2ecf20Sopenharmony_ci}
29968c2ecf20Sopenharmony_ci
29978c2ecf20Sopenharmony_ci/**
29988c2ecf20Sopenharmony_ci * d_splice_alias - splice a disconnected dentry into the tree if one exists
29998c2ecf20Sopenharmony_ci * @inode:  the inode which may have a disconnected dentry
30008c2ecf20Sopenharmony_ci * @dentry: a negative dentry which we want to point to the inode.
30018c2ecf20Sopenharmony_ci *
30028c2ecf20Sopenharmony_ci * If inode is a directory and has an IS_ROOT alias, then d_move that in
30038c2ecf20Sopenharmony_ci * place of the given dentry and return it, else simply d_add the inode
30048c2ecf20Sopenharmony_ci * to the dentry and return NULL.
30058c2ecf20Sopenharmony_ci *
30068c2ecf20Sopenharmony_ci * If a non-IS_ROOT directory is found, the filesystem is corrupt, and
30078c2ecf20Sopenharmony_ci * we should error out: directories can't have multiple aliases.
30088c2ecf20Sopenharmony_ci *
30098c2ecf20Sopenharmony_ci * This is needed in the lookup routine of any filesystem that is exportable
30108c2ecf20Sopenharmony_ci * (via knfsd) so that we can build dcache paths to directories effectively.
30118c2ecf20Sopenharmony_ci *
30128c2ecf20Sopenharmony_ci * If a dentry was found and moved, then it is returned.  Otherwise NULL
30138c2ecf20Sopenharmony_ci * is returned.  This matches the expected return value of ->lookup.
30148c2ecf20Sopenharmony_ci *
30158c2ecf20Sopenharmony_ci * Cluster filesystems may call this function with a negative, hashed dentry.
30168c2ecf20Sopenharmony_ci * In that case, we know that the inode will be a regular file, and also this
30178c2ecf20Sopenharmony_ci * will only occur during atomic_open. So we need to check for the dentry
30188c2ecf20Sopenharmony_ci * being already hashed only in the final case.
30198c2ecf20Sopenharmony_ci */
30208c2ecf20Sopenharmony_cistruct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry)
30218c2ecf20Sopenharmony_ci{
30228c2ecf20Sopenharmony_ci	if (IS_ERR(inode))
30238c2ecf20Sopenharmony_ci		return ERR_CAST(inode);
30248c2ecf20Sopenharmony_ci
30258c2ecf20Sopenharmony_ci	BUG_ON(!d_unhashed(dentry));
30268c2ecf20Sopenharmony_ci
30278c2ecf20Sopenharmony_ci	if (!inode)
30288c2ecf20Sopenharmony_ci		goto out;
30298c2ecf20Sopenharmony_ci
30308c2ecf20Sopenharmony_ci	security_d_instantiate(dentry, inode);
30318c2ecf20Sopenharmony_ci	spin_lock(&inode->i_lock);
30328c2ecf20Sopenharmony_ci	if (S_ISDIR(inode->i_mode)) {
30338c2ecf20Sopenharmony_ci		struct dentry *new = __d_find_any_alias(inode);
30348c2ecf20Sopenharmony_ci		if (unlikely(new)) {
30358c2ecf20Sopenharmony_ci			/* The reference to new ensures it remains an alias */
30368c2ecf20Sopenharmony_ci			spin_unlock(&inode->i_lock);
30378c2ecf20Sopenharmony_ci			write_seqlock(&rename_lock);
30388c2ecf20Sopenharmony_ci			if (unlikely(d_ancestor(new, dentry))) {
30398c2ecf20Sopenharmony_ci				write_sequnlock(&rename_lock);
30408c2ecf20Sopenharmony_ci				dput(new);
30418c2ecf20Sopenharmony_ci				new = ERR_PTR(-ELOOP);
30428c2ecf20Sopenharmony_ci				pr_warn_ratelimited(
30438c2ecf20Sopenharmony_ci					"VFS: Lookup of '%s' in %s %s"
30448c2ecf20Sopenharmony_ci					" would have caused loop\n",
30458c2ecf20Sopenharmony_ci					dentry->d_name.name,
30468c2ecf20Sopenharmony_ci					inode->i_sb->s_type->name,
30478c2ecf20Sopenharmony_ci					inode->i_sb->s_id);
30488c2ecf20Sopenharmony_ci			} else if (!IS_ROOT(new)) {
30498c2ecf20Sopenharmony_ci				struct dentry *old_parent = dget(new->d_parent);
30508c2ecf20Sopenharmony_ci				int err = __d_unalias(inode, dentry, new);
30518c2ecf20Sopenharmony_ci				write_sequnlock(&rename_lock);
30528c2ecf20Sopenharmony_ci				if (err) {
30538c2ecf20Sopenharmony_ci					dput(new);
30548c2ecf20Sopenharmony_ci					new = ERR_PTR(err);
30558c2ecf20Sopenharmony_ci				}
30568c2ecf20Sopenharmony_ci				dput(old_parent);
30578c2ecf20Sopenharmony_ci			} else {
30588c2ecf20Sopenharmony_ci				__d_move(new, dentry, false);
30598c2ecf20Sopenharmony_ci				write_sequnlock(&rename_lock);
30608c2ecf20Sopenharmony_ci			}
30618c2ecf20Sopenharmony_ci			iput(inode);
30628c2ecf20Sopenharmony_ci			return new;
30638c2ecf20Sopenharmony_ci		}
30648c2ecf20Sopenharmony_ci	}
30658c2ecf20Sopenharmony_ciout:
30668c2ecf20Sopenharmony_ci	__d_add(dentry, inode);
30678c2ecf20Sopenharmony_ci	return NULL;
30688c2ecf20Sopenharmony_ci}
30698c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_splice_alias);
30708c2ecf20Sopenharmony_ci
30718c2ecf20Sopenharmony_ci/*
30728c2ecf20Sopenharmony_ci * Test whether new_dentry is a subdirectory of old_dentry.
30738c2ecf20Sopenharmony_ci *
30748c2ecf20Sopenharmony_ci * Trivially implemented using the dcache structure
30758c2ecf20Sopenharmony_ci */
30768c2ecf20Sopenharmony_ci
30778c2ecf20Sopenharmony_ci/**
30788c2ecf20Sopenharmony_ci * is_subdir - is new dentry a subdirectory of old_dentry
30798c2ecf20Sopenharmony_ci * @new_dentry: new dentry
30808c2ecf20Sopenharmony_ci * @old_dentry: old dentry
30818c2ecf20Sopenharmony_ci *
30828c2ecf20Sopenharmony_ci * Returns true if new_dentry is a subdirectory of the parent (at any depth).
30838c2ecf20Sopenharmony_ci * Returns false otherwise.
30848c2ecf20Sopenharmony_ci * Caller must ensure that "new_dentry" is pinned before calling is_subdir()
30858c2ecf20Sopenharmony_ci */
30868c2ecf20Sopenharmony_ci
30878c2ecf20Sopenharmony_cibool is_subdir(struct dentry *new_dentry, struct dentry *old_dentry)
30888c2ecf20Sopenharmony_ci{
30898c2ecf20Sopenharmony_ci	bool result;
30908c2ecf20Sopenharmony_ci	unsigned seq;
30918c2ecf20Sopenharmony_ci
30928c2ecf20Sopenharmony_ci	if (new_dentry == old_dentry)
30938c2ecf20Sopenharmony_ci		return true;
30948c2ecf20Sopenharmony_ci
30958c2ecf20Sopenharmony_ci	do {
30968c2ecf20Sopenharmony_ci		/* for restarting inner loop in case of seq retry */
30978c2ecf20Sopenharmony_ci		seq = read_seqbegin(&rename_lock);
30988c2ecf20Sopenharmony_ci		/*
30998c2ecf20Sopenharmony_ci		 * Need rcu_readlock to protect against the d_parent trashing
31008c2ecf20Sopenharmony_ci		 * due to d_move
31018c2ecf20Sopenharmony_ci		 */
31028c2ecf20Sopenharmony_ci		rcu_read_lock();
31038c2ecf20Sopenharmony_ci		if (d_ancestor(old_dentry, new_dentry))
31048c2ecf20Sopenharmony_ci			result = true;
31058c2ecf20Sopenharmony_ci		else
31068c2ecf20Sopenharmony_ci			result = false;
31078c2ecf20Sopenharmony_ci		rcu_read_unlock();
31088c2ecf20Sopenharmony_ci	} while (read_seqretry(&rename_lock, seq));
31098c2ecf20Sopenharmony_ci
31108c2ecf20Sopenharmony_ci	return result;
31118c2ecf20Sopenharmony_ci}
31128c2ecf20Sopenharmony_ciEXPORT_SYMBOL(is_subdir);
31138c2ecf20Sopenharmony_ci
31148c2ecf20Sopenharmony_cistatic enum d_walk_ret d_genocide_kill(void *data, struct dentry *dentry)
31158c2ecf20Sopenharmony_ci{
31168c2ecf20Sopenharmony_ci	struct dentry *root = data;
31178c2ecf20Sopenharmony_ci	if (dentry != root) {
31188c2ecf20Sopenharmony_ci		if (d_unhashed(dentry) || !dentry->d_inode)
31198c2ecf20Sopenharmony_ci			return D_WALK_SKIP;
31208c2ecf20Sopenharmony_ci
31218c2ecf20Sopenharmony_ci		if (!(dentry->d_flags & DCACHE_GENOCIDE)) {
31228c2ecf20Sopenharmony_ci			dentry->d_flags |= DCACHE_GENOCIDE;
31238c2ecf20Sopenharmony_ci			dentry->d_lockref.count--;
31248c2ecf20Sopenharmony_ci		}
31258c2ecf20Sopenharmony_ci	}
31268c2ecf20Sopenharmony_ci	return D_WALK_CONTINUE;
31278c2ecf20Sopenharmony_ci}
31288c2ecf20Sopenharmony_ci
31298c2ecf20Sopenharmony_civoid d_genocide(struct dentry *parent)
31308c2ecf20Sopenharmony_ci{
31318c2ecf20Sopenharmony_ci	d_walk(parent, parent, d_genocide_kill);
31328c2ecf20Sopenharmony_ci}
31338c2ecf20Sopenharmony_ci
31348c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_genocide);
31358c2ecf20Sopenharmony_ci
31368c2ecf20Sopenharmony_civoid d_tmpfile(struct dentry *dentry, struct inode *inode)
31378c2ecf20Sopenharmony_ci{
31388c2ecf20Sopenharmony_ci	inode_dec_link_count(inode);
31398c2ecf20Sopenharmony_ci	BUG_ON(dentry->d_name.name != dentry->d_iname ||
31408c2ecf20Sopenharmony_ci		!hlist_unhashed(&dentry->d_u.d_alias) ||
31418c2ecf20Sopenharmony_ci		!d_unlinked(dentry));
31428c2ecf20Sopenharmony_ci	spin_lock(&dentry->d_parent->d_lock);
31438c2ecf20Sopenharmony_ci	spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
31448c2ecf20Sopenharmony_ci	dentry->d_name.len = sprintf(dentry->d_iname, "#%llu",
31458c2ecf20Sopenharmony_ci				(unsigned long long)inode->i_ino);
31468c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_lock);
31478c2ecf20Sopenharmony_ci	spin_unlock(&dentry->d_parent->d_lock);
31488c2ecf20Sopenharmony_ci	d_instantiate(dentry, inode);
31498c2ecf20Sopenharmony_ci}
31508c2ecf20Sopenharmony_ciEXPORT_SYMBOL(d_tmpfile);
31518c2ecf20Sopenharmony_ci
31528c2ecf20Sopenharmony_cistatic __initdata unsigned long dhash_entries;
31538c2ecf20Sopenharmony_cistatic int __init set_dhash_entries(char *str)
31548c2ecf20Sopenharmony_ci{
31558c2ecf20Sopenharmony_ci	if (!str)
31568c2ecf20Sopenharmony_ci		return 0;
31578c2ecf20Sopenharmony_ci	dhash_entries = simple_strtoul(str, &str, 0);
31588c2ecf20Sopenharmony_ci	return 1;
31598c2ecf20Sopenharmony_ci}
31608c2ecf20Sopenharmony_ci__setup("dhash_entries=", set_dhash_entries);
31618c2ecf20Sopenharmony_ci
31628c2ecf20Sopenharmony_cistatic void __init dcache_init_early(void)
31638c2ecf20Sopenharmony_ci{
31648c2ecf20Sopenharmony_ci	/* If hashes are distributed across NUMA nodes, defer
31658c2ecf20Sopenharmony_ci	 * hash allocation until vmalloc space is available.
31668c2ecf20Sopenharmony_ci	 */
31678c2ecf20Sopenharmony_ci	if (hashdist)
31688c2ecf20Sopenharmony_ci		return;
31698c2ecf20Sopenharmony_ci
31708c2ecf20Sopenharmony_ci	dentry_hashtable =
31718c2ecf20Sopenharmony_ci		alloc_large_system_hash("Dentry cache",
31728c2ecf20Sopenharmony_ci					sizeof(struct hlist_bl_head),
31738c2ecf20Sopenharmony_ci					dhash_entries,
31748c2ecf20Sopenharmony_ci					13,
31758c2ecf20Sopenharmony_ci					HASH_EARLY | HASH_ZERO,
31768c2ecf20Sopenharmony_ci					&d_hash_shift,
31778c2ecf20Sopenharmony_ci					NULL,
31788c2ecf20Sopenharmony_ci					0,
31798c2ecf20Sopenharmony_ci					0);
31808c2ecf20Sopenharmony_ci	d_hash_shift = 32 - d_hash_shift;
31818c2ecf20Sopenharmony_ci}
31828c2ecf20Sopenharmony_ci
31838c2ecf20Sopenharmony_cistatic void __init dcache_init(void)
31848c2ecf20Sopenharmony_ci{
31858c2ecf20Sopenharmony_ci	/*
31868c2ecf20Sopenharmony_ci	 * A constructor could be added for stable state like the lists,
31878c2ecf20Sopenharmony_ci	 * but it is probably not worth it because of the cache nature
31888c2ecf20Sopenharmony_ci	 * of the dcache.
31898c2ecf20Sopenharmony_ci	 */
31908c2ecf20Sopenharmony_ci	dentry_cache = KMEM_CACHE_USERCOPY(dentry,
31918c2ecf20Sopenharmony_ci		SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_MEM_SPREAD|SLAB_ACCOUNT,
31928c2ecf20Sopenharmony_ci		d_iname);
31938c2ecf20Sopenharmony_ci
31948c2ecf20Sopenharmony_ci	/* Hash may have been set up in dcache_init_early */
31958c2ecf20Sopenharmony_ci	if (!hashdist)
31968c2ecf20Sopenharmony_ci		return;
31978c2ecf20Sopenharmony_ci
31988c2ecf20Sopenharmony_ci	dentry_hashtable =
31998c2ecf20Sopenharmony_ci		alloc_large_system_hash("Dentry cache",
32008c2ecf20Sopenharmony_ci					sizeof(struct hlist_bl_head),
32018c2ecf20Sopenharmony_ci					dhash_entries,
32028c2ecf20Sopenharmony_ci					13,
32038c2ecf20Sopenharmony_ci					HASH_ZERO,
32048c2ecf20Sopenharmony_ci					&d_hash_shift,
32058c2ecf20Sopenharmony_ci					NULL,
32068c2ecf20Sopenharmony_ci					0,
32078c2ecf20Sopenharmony_ci					0);
32088c2ecf20Sopenharmony_ci	d_hash_shift = 32 - d_hash_shift;
32098c2ecf20Sopenharmony_ci}
32108c2ecf20Sopenharmony_ci
32118c2ecf20Sopenharmony_ci/* SLAB cache for __getname() consumers */
32128c2ecf20Sopenharmony_cistruct kmem_cache *names_cachep __read_mostly;
32138c2ecf20Sopenharmony_ciEXPORT_SYMBOL(names_cachep);
32148c2ecf20Sopenharmony_ci
32158c2ecf20Sopenharmony_civoid __init vfs_caches_init_early(void)
32168c2ecf20Sopenharmony_ci{
32178c2ecf20Sopenharmony_ci	int i;
32188c2ecf20Sopenharmony_ci
32198c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(in_lookup_hashtable); i++)
32208c2ecf20Sopenharmony_ci		INIT_HLIST_BL_HEAD(&in_lookup_hashtable[i]);
32218c2ecf20Sopenharmony_ci
32228c2ecf20Sopenharmony_ci	dcache_init_early();
32238c2ecf20Sopenharmony_ci	inode_init_early();
32248c2ecf20Sopenharmony_ci}
32258c2ecf20Sopenharmony_ci
32268c2ecf20Sopenharmony_civoid __init vfs_caches_init(void)
32278c2ecf20Sopenharmony_ci{
32288c2ecf20Sopenharmony_ci	names_cachep = kmem_cache_create_usercopy("names_cache", PATH_MAX, 0,
32298c2ecf20Sopenharmony_ci			SLAB_HWCACHE_ALIGN|SLAB_PANIC, 0, PATH_MAX, NULL);
32308c2ecf20Sopenharmony_ci
32318c2ecf20Sopenharmony_ci	dcache_init();
32328c2ecf20Sopenharmony_ci	inode_init();
32338c2ecf20Sopenharmony_ci	files_init();
32348c2ecf20Sopenharmony_ci	files_maxfiles_init();
32358c2ecf20Sopenharmony_ci	mnt_init();
32368c2ecf20Sopenharmony_ci	bdev_cache_init();
32378c2ecf20Sopenharmony_ci	chrdev_init();
32388c2ecf20Sopenharmony_ci}
3239