blob: a8028be6cdb7ba25e7e59a2e87092e6f7ebeca5a [file] [log] [blame]
Tejun Heob8441ed2013-11-24 09:54:58 -05001/*
2 * fs/kernfs/dir.c - kernfs directory implementation
3 *
4 * Copyright (c) 2001-3 Patrick Mochel
5 * Copyright (c) 2007 SUSE Linux Products GmbH
6 * Copyright (c) 2007, 2013 Tejun Heo <tj@kernel.org>
7 *
8 * This file is released under the GPLv2.
9 */
Tejun Heofd7b9f72013-11-28 14:54:33 -050010
Tejun Heoea1c4722014-01-10 08:57:19 -050011#include <linux/sched.h>
Tejun Heofd7b9f72013-11-28 14:54:33 -050012#include <linux/fs.h>
13#include <linux/namei.h>
14#include <linux/idr.h>
15#include <linux/slab.h>
16#include <linux/security.h>
17#include <linux/hash.h>
18
19#include "kernfs-internal.h"
20
Tejun Heoa797bfc2013-12-11 14:11:57 -050021DEFINE_MUTEX(kernfs_mutex);
Tejun Heofd7b9f72013-11-28 14:54:33 -050022
Tejun Heoadc5e8b2013-12-11 14:11:54 -050023#define rb_to_kn(X) rb_entry((X), struct kernfs_node, rb)
Tejun Heofd7b9f72013-11-28 14:54:33 -050024
Tejun Heoa69d0012014-01-10 08:57:20 -050025static bool kernfs_lockdep(struct kernfs_node *kn)
26{
27#ifdef CONFIG_DEBUG_LOCK_ALLOC
28 return kn->flags & KERNFS_LOCKDEP;
29#else
30 return false;
31#endif
32}
33
Tejun Heofd7b9f72013-11-28 14:54:33 -050034/**
Tejun Heoc637b8a2013-12-11 14:11:58 -050035 * kernfs_name_hash
Tejun Heofd7b9f72013-11-28 14:54:33 -050036 * @name: Null terminated string to hash
37 * @ns: Namespace tag to hash
38 *
39 * Returns 31 bit hash of ns + name (so it fits in an off_t )
40 */
Tejun Heoc637b8a2013-12-11 14:11:58 -050041static unsigned int kernfs_name_hash(const char *name, const void *ns)
Tejun Heofd7b9f72013-11-28 14:54:33 -050042{
43 unsigned long hash = init_name_hash();
44 unsigned int len = strlen(name);
45 while (len--)
46 hash = partial_name_hash(*name++, hash);
47 hash = (end_name_hash(hash) ^ hash_ptr((void *)ns, 31));
48 hash &= 0x7fffffffU;
49 /* Reserve hash numbers 0, 1 and INT_MAX for magic directory entries */
50 if (hash < 1)
51 hash += 2;
52 if (hash >= INT_MAX)
53 hash = INT_MAX - 1;
54 return hash;
55}
56
Tejun Heoc637b8a2013-12-11 14:11:58 -050057static int kernfs_name_compare(unsigned int hash, const char *name,
58 const void *ns, const struct kernfs_node *kn)
Tejun Heofd7b9f72013-11-28 14:54:33 -050059{
Tejun Heoadc5e8b2013-12-11 14:11:54 -050060 if (hash != kn->hash)
61 return hash - kn->hash;
62 if (ns != kn->ns)
63 return ns - kn->ns;
64 return strcmp(name, kn->name);
Tejun Heofd7b9f72013-11-28 14:54:33 -050065}
66
Tejun Heoc637b8a2013-12-11 14:11:58 -050067static int kernfs_sd_compare(const struct kernfs_node *left,
68 const struct kernfs_node *right)
Tejun Heofd7b9f72013-11-28 14:54:33 -050069{
Tejun Heoc637b8a2013-12-11 14:11:58 -050070 return kernfs_name_compare(left->hash, left->name, left->ns, right);
Tejun Heofd7b9f72013-11-28 14:54:33 -050071}
72
73/**
Tejun Heoc637b8a2013-12-11 14:11:58 -050074 * kernfs_link_sibling - link kernfs_node into sibling rbtree
Tejun Heo324a56e2013-12-11 14:11:53 -050075 * @kn: kernfs_node of interest
Tejun Heofd7b9f72013-11-28 14:54:33 -050076 *
Tejun Heo324a56e2013-12-11 14:11:53 -050077 * Link @kn into its sibling rbtree which starts from
Tejun Heoadc5e8b2013-12-11 14:11:54 -050078 * @kn->parent->dir.children.
Tejun Heofd7b9f72013-11-28 14:54:33 -050079 *
80 * Locking:
Tejun Heoa797bfc2013-12-11 14:11:57 -050081 * mutex_lock(kernfs_mutex)
Tejun Heofd7b9f72013-11-28 14:54:33 -050082 *
83 * RETURNS:
84 * 0 on susccess -EEXIST on failure.
85 */
Tejun Heoc637b8a2013-12-11 14:11:58 -050086static int kernfs_link_sibling(struct kernfs_node *kn)
Tejun Heofd7b9f72013-11-28 14:54:33 -050087{
Tejun Heoadc5e8b2013-12-11 14:11:54 -050088 struct rb_node **node = &kn->parent->dir.children.rb_node;
Tejun Heofd7b9f72013-11-28 14:54:33 -050089 struct rb_node *parent = NULL;
90
Tejun Heodf23fc32013-12-11 14:11:56 -050091 if (kernfs_type(kn) == KERNFS_DIR)
Tejun Heoadc5e8b2013-12-11 14:11:54 -050092 kn->parent->dir.subdirs++;
Tejun Heofd7b9f72013-11-28 14:54:33 -050093
94 while (*node) {
Tejun Heo324a56e2013-12-11 14:11:53 -050095 struct kernfs_node *pos;
Tejun Heofd7b9f72013-11-28 14:54:33 -050096 int result;
97
Tejun Heo324a56e2013-12-11 14:11:53 -050098 pos = rb_to_kn(*node);
Tejun Heofd7b9f72013-11-28 14:54:33 -050099 parent = *node;
Tejun Heoc637b8a2013-12-11 14:11:58 -0500100 result = kernfs_sd_compare(kn, pos);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500101 if (result < 0)
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500102 node = &pos->rb.rb_left;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500103 else if (result > 0)
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500104 node = &pos->rb.rb_right;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500105 else
106 return -EEXIST;
107 }
108 /* add new node and rebalance the tree */
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500109 rb_link_node(&kn->rb, parent, node);
110 rb_insert_color(&kn->rb, &kn->parent->dir.children);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500111 return 0;
112}
113
114/**
Tejun Heoc637b8a2013-12-11 14:11:58 -0500115 * kernfs_unlink_sibling - unlink kernfs_node from sibling rbtree
Tejun Heo324a56e2013-12-11 14:11:53 -0500116 * @kn: kernfs_node of interest
Tejun Heofd7b9f72013-11-28 14:54:33 -0500117 *
Tejun Heo324a56e2013-12-11 14:11:53 -0500118 * Unlink @kn from its sibling rbtree which starts from
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500119 * kn->parent->dir.children.
Tejun Heofd7b9f72013-11-28 14:54:33 -0500120 *
121 * Locking:
Tejun Heoa797bfc2013-12-11 14:11:57 -0500122 * mutex_lock(kernfs_mutex)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500123 */
Tejun Heof601f9a2014-01-10 08:57:23 -0500124static bool kernfs_unlink_sibling(struct kernfs_node *kn)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500125{
Tejun Heof601f9a2014-01-10 08:57:23 -0500126 if (RB_EMPTY_NODE(&kn->rb))
127 return false;
128
Tejun Heodf23fc32013-12-11 14:11:56 -0500129 if (kernfs_type(kn) == KERNFS_DIR)
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500130 kn->parent->dir.subdirs--;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500131
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500132 rb_erase(&kn->rb, &kn->parent->dir.children);
Tejun Heoae343722014-01-10 08:57:21 -0500133 RB_CLEAR_NODE(&kn->rb);
Tejun Heof601f9a2014-01-10 08:57:23 -0500134 return true;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500135}
136
137/**
Tejun Heoc637b8a2013-12-11 14:11:58 -0500138 * kernfs_get_active - get an active reference to kernfs_node
Tejun Heo324a56e2013-12-11 14:11:53 -0500139 * @kn: kernfs_node to get an active reference to
Tejun Heofd7b9f72013-11-28 14:54:33 -0500140 *
Tejun Heo324a56e2013-12-11 14:11:53 -0500141 * Get an active reference of @kn. This function is noop if @kn
Tejun Heofd7b9f72013-11-28 14:54:33 -0500142 * is NULL.
143 *
144 * RETURNS:
Tejun Heo324a56e2013-12-11 14:11:53 -0500145 * Pointer to @kn on success, NULL on failure.
Tejun Heofd7b9f72013-11-28 14:54:33 -0500146 */
Tejun Heoc637b8a2013-12-11 14:11:58 -0500147struct kernfs_node *kernfs_get_active(struct kernfs_node *kn)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500148{
Tejun Heo324a56e2013-12-11 14:11:53 -0500149 if (unlikely(!kn))
Tejun Heofd7b9f72013-11-28 14:54:33 -0500150 return NULL;
151
Tejun Heoa69d0012014-01-10 08:57:20 -0500152 if (kernfs_lockdep(kn))
Tejun Heo324a56e2013-12-11 14:11:53 -0500153 rwsem_acquire_read(&kn->dep_map, 0, 1, _RET_IP_);
Tejun Heo895a0682014-01-10 08:57:25 -0500154
155 /*
156 * Try to obtain an active ref. If @kn is deactivated, we block
157 * till either it's reactivated or killed.
158 */
159 do {
160 if (atomic_inc_unless_negative(&kn->active))
161 return kn;
162
163 wait_event(kernfs_root(kn)->deactivate_waitq,
164 atomic_read(&kn->active) >= 0 ||
165 RB_EMPTY_NODE(&kn->rb));
166 } while (!RB_EMPTY_NODE(&kn->rb));
167
168 if (kernfs_lockdep(kn))
169 rwsem_release(&kn->dep_map, 1, _RET_IP_);
170 return NULL;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500171}
172
173/**
Tejun Heoc637b8a2013-12-11 14:11:58 -0500174 * kernfs_put_active - put an active reference to kernfs_node
Tejun Heo324a56e2013-12-11 14:11:53 -0500175 * @kn: kernfs_node to put an active reference to
Tejun Heofd7b9f72013-11-28 14:54:33 -0500176 *
Tejun Heo324a56e2013-12-11 14:11:53 -0500177 * Put an active reference to @kn. This function is noop if @kn
Tejun Heofd7b9f72013-11-28 14:54:33 -0500178 * is NULL.
179 */
Tejun Heoc637b8a2013-12-11 14:11:58 -0500180void kernfs_put_active(struct kernfs_node *kn)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500181{
Tejun Heoea1c4722014-01-10 08:57:19 -0500182 struct kernfs_root *root = kernfs_root(kn);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500183 int v;
184
Tejun Heo324a56e2013-12-11 14:11:53 -0500185 if (unlikely(!kn))
Tejun Heofd7b9f72013-11-28 14:54:33 -0500186 return;
187
Tejun Heoa69d0012014-01-10 08:57:20 -0500188 if (kernfs_lockdep(kn))
Tejun Heo324a56e2013-12-11 14:11:53 -0500189 rwsem_release(&kn->dep_map, 1, _RET_IP_);
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500190 v = atomic_dec_return(&kn->active);
Tejun Heodf23fc32013-12-11 14:11:56 -0500191 if (likely(v != KN_DEACTIVATED_BIAS))
Tejun Heofd7b9f72013-11-28 14:54:33 -0500192 return;
193
Tejun Heoea1c4722014-01-10 08:57:19 -0500194 wake_up_all(&root->deactivate_waitq);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500195}
196
197/**
Tejun Heoae343722014-01-10 08:57:21 -0500198 * kernfs_drain - drain kernfs_node
199 * @kn: kernfs_node to drain
Tejun Heofd7b9f72013-11-28 14:54:33 -0500200 *
Tejun Heo45a140e2014-01-10 08:57:22 -0500201 * Drain existing usages of @kn. Mutiple removers may invoke this function
202 * concurrently on @kn and all will return after draining is complete.
203 * Returns %true if drain is performed and kernfs_mutex was temporarily
204 * released. %false if @kn was already drained and no operation was
205 * necessary.
206 *
207 * The caller is responsible for ensuring @kn stays pinned while this
208 * function is in progress even if it gets removed by someone else.
Tejun Heofd7b9f72013-11-28 14:54:33 -0500209 */
Tejun Heo45a140e2014-01-10 08:57:22 -0500210static bool kernfs_drain(struct kernfs_node *kn)
211 __releases(&kernfs_mutex) __acquires(&kernfs_mutex)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500212{
Tejun Heoea1c4722014-01-10 08:57:19 -0500213 struct kernfs_root *root = kernfs_root(kn);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500214
Tejun Heo45a140e2014-01-10 08:57:22 -0500215 lockdep_assert_held(&kernfs_mutex);
Tejun Heoae343722014-01-10 08:57:21 -0500216 WARN_ON_ONCE(atomic_read(&kn->active) >= 0);
Tejun Heoea1c4722014-01-10 08:57:19 -0500217
Tejun Heo45a140e2014-01-10 08:57:22 -0500218 /*
219 * We want to go through the active ref lockdep annotation at least
220 * once for all node removals, but the lockdep annotation can't be
221 * nested inside kernfs_mutex and deactivation can't make forward
222 * progress if we keep dropping the mutex. Use JUST_ACTIVATED to
223 * force the slow path once for each deactivation if lockdep is
224 * enabled.
225 */
226 if ((!kernfs_lockdep(kn) || !(kn->flags & KERNFS_JUST_DEACTIVATED)) &&
227 atomic_read(&kn->active) == KN_DEACTIVATED_BIAS)
228 return false;
229
230 kn->flags &= ~KERNFS_JUST_DEACTIVATED;
231 mutex_unlock(&kernfs_mutex);
232
Tejun Heoa69d0012014-01-10 08:57:20 -0500233 if (kernfs_lockdep(kn)) {
234 rwsem_acquire(&kn->dep_map, 0, 0, _RET_IP_);
235 if (atomic_read(&kn->active) != KN_DEACTIVATED_BIAS)
236 lock_contended(&kn->dep_map, _RET_IP_);
237 }
Tejun Heoea1c4722014-01-10 08:57:19 -0500238
239 wait_event(root->deactivate_waitq,
240 atomic_read(&kn->active) == KN_DEACTIVATED_BIAS);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500241
Tejun Heoa69d0012014-01-10 08:57:20 -0500242 if (kernfs_lockdep(kn)) {
243 lock_acquired(&kn->dep_map, _RET_IP_);
244 rwsem_release(&kn->dep_map, 1, _RET_IP_);
245 }
Tejun Heo45a140e2014-01-10 08:57:22 -0500246
247 mutex_lock(&kernfs_mutex);
248 return true;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500249}
250
Tejun Heofd7b9f72013-11-28 14:54:33 -0500251/**
Tejun Heo324a56e2013-12-11 14:11:53 -0500252 * kernfs_get - get a reference count on a kernfs_node
253 * @kn: the target kernfs_node
Tejun Heofd7b9f72013-11-28 14:54:33 -0500254 */
Tejun Heo324a56e2013-12-11 14:11:53 -0500255void kernfs_get(struct kernfs_node *kn)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500256{
Tejun Heo324a56e2013-12-11 14:11:53 -0500257 if (kn) {
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500258 WARN_ON(!atomic_read(&kn->count));
259 atomic_inc(&kn->count);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500260 }
261}
262EXPORT_SYMBOL_GPL(kernfs_get);
263
264/**
Tejun Heo324a56e2013-12-11 14:11:53 -0500265 * kernfs_put - put a reference count on a kernfs_node
266 * @kn: the target kernfs_node
Tejun Heofd7b9f72013-11-28 14:54:33 -0500267 *
Tejun Heo324a56e2013-12-11 14:11:53 -0500268 * Put a reference count of @kn and destroy it if it reached zero.
Tejun Heofd7b9f72013-11-28 14:54:33 -0500269 */
Tejun Heo324a56e2013-12-11 14:11:53 -0500270void kernfs_put(struct kernfs_node *kn)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500271{
Tejun Heo324a56e2013-12-11 14:11:53 -0500272 struct kernfs_node *parent;
Tejun Heoba7443b2013-11-28 14:54:40 -0500273 struct kernfs_root *root;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500274
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500275 if (!kn || !atomic_dec_and_test(&kn->count))
Tejun Heofd7b9f72013-11-28 14:54:33 -0500276 return;
Tejun Heo324a56e2013-12-11 14:11:53 -0500277 root = kernfs_root(kn);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500278 repeat:
Tejun Heoae343722014-01-10 08:57:21 -0500279 /*
280 * Moving/renaming is always done while holding reference.
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500281 * kn->parent won't change beneath us.
Tejun Heofd7b9f72013-11-28 14:54:33 -0500282 */
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500283 parent = kn->parent;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500284
Tejun Heoae343722014-01-10 08:57:21 -0500285 WARN_ONCE(atomic_read(&kn->active) != KN_DEACTIVATED_BIAS,
286 "kernfs_put: %s/%s: released with incorrect active_ref %d\n",
287 parent ? parent->name : "", kn->name, atomic_read(&kn->active));
Tejun Heofd7b9f72013-11-28 14:54:33 -0500288
Tejun Heodf23fc32013-12-11 14:11:56 -0500289 if (kernfs_type(kn) == KERNFS_LINK)
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500290 kernfs_put(kn->symlink.target_kn);
Tejun Heo2063d602013-12-11 16:02:57 -0500291 if (!(kn->flags & KERNFS_STATIC_NAME))
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500292 kfree(kn->name);
293 if (kn->iattr) {
294 if (kn->iattr->ia_secdata)
295 security_release_secctx(kn->iattr->ia_secdata,
296 kn->iattr->ia_secdata_len);
297 simple_xattrs_free(&kn->iattr->xattrs);
Tejun Heo23223922013-11-23 17:40:02 -0500298 }
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500299 kfree(kn->iattr);
300 ida_simple_remove(&root->ino_ida, kn->ino);
Tejun Heoa797bfc2013-12-11 14:11:57 -0500301 kmem_cache_free(kernfs_node_cache, kn);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500302
Tejun Heo324a56e2013-12-11 14:11:53 -0500303 kn = parent;
304 if (kn) {
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500305 if (atomic_dec_and_test(&kn->count))
Tejun Heoba7443b2013-11-28 14:54:40 -0500306 goto repeat;
307 } else {
Tejun Heo324a56e2013-12-11 14:11:53 -0500308 /* just released the root kn, free @root too */
Tejun Heobc755552013-11-28 14:54:41 -0500309 ida_destroy(&root->ino_ida);
Tejun Heoba7443b2013-11-28 14:54:40 -0500310 kfree(root);
311 }
Tejun Heofd7b9f72013-11-28 14:54:33 -0500312}
313EXPORT_SYMBOL_GPL(kernfs_put);
314
Tejun Heoc637b8a2013-12-11 14:11:58 -0500315static int kernfs_dop_revalidate(struct dentry *dentry, unsigned int flags)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500316{
Tejun Heo324a56e2013-12-11 14:11:53 -0500317 struct kernfs_node *kn;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500318
319 if (flags & LOOKUP_RCU)
320 return -ECHILD;
321
Tejun Heo19bbb922013-12-11 16:02:59 -0500322 /* Always perform fresh lookup for negatives */
323 if (!dentry->d_inode)
324 goto out_bad_unlocked;
325
Tejun Heo324a56e2013-12-11 14:11:53 -0500326 kn = dentry->d_fsdata;
Tejun Heoa797bfc2013-12-11 14:11:57 -0500327 mutex_lock(&kernfs_mutex);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500328
Tejun Heoae343722014-01-10 08:57:21 -0500329 /* Force fresh lookup if removed */
330 if (kn->parent && RB_EMPTY_NODE(&kn->rb))
Tejun Heofd7b9f72013-11-28 14:54:33 -0500331 goto out_bad;
332
Tejun Heoc637b8a2013-12-11 14:11:58 -0500333 /* The kernfs node has been moved? */
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500334 if (dentry->d_parent->d_fsdata != kn->parent)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500335 goto out_bad;
336
Tejun Heoc637b8a2013-12-11 14:11:58 -0500337 /* The kernfs node has been renamed */
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500338 if (strcmp(dentry->d_name.name, kn->name) != 0)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500339 goto out_bad;
340
Tejun Heoc637b8a2013-12-11 14:11:58 -0500341 /* The kernfs node has been moved to a different namespace */
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500342 if (kn->parent && kernfs_ns_enabled(kn->parent) &&
Tejun Heoc525aad2013-12-11 14:11:55 -0500343 kernfs_info(dentry->d_sb)->ns != kn->ns)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500344 goto out_bad;
345
Tejun Heoa797bfc2013-12-11 14:11:57 -0500346 mutex_unlock(&kernfs_mutex);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500347out_valid:
348 return 1;
349out_bad:
Tejun Heoa797bfc2013-12-11 14:11:57 -0500350 mutex_unlock(&kernfs_mutex);
Tejun Heo19bbb922013-12-11 16:02:59 -0500351out_bad_unlocked:
352 /*
353 * @dentry doesn't match the underlying kernfs node, drop the
354 * dentry and force lookup. If we have submounts we must allow the
355 * vfs caches to lie about the state of the filesystem to prevent
356 * leaks and other nasty things, so use check_submounts_and_drop()
357 * instead of d_drop().
Tejun Heofd7b9f72013-11-28 14:54:33 -0500358 */
359 if (check_submounts_and_drop(dentry) != 0)
360 goto out_valid;
361
362 return 0;
363}
364
Tejun Heoc637b8a2013-12-11 14:11:58 -0500365static void kernfs_dop_release(struct dentry *dentry)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500366{
367 kernfs_put(dentry->d_fsdata);
368}
369
Tejun Heoa797bfc2013-12-11 14:11:57 -0500370const struct dentry_operations kernfs_dops = {
Tejun Heoc637b8a2013-12-11 14:11:58 -0500371 .d_revalidate = kernfs_dop_revalidate,
Tejun Heoc637b8a2013-12-11 14:11:58 -0500372 .d_release = kernfs_dop_release,
Tejun Heofd7b9f72013-11-28 14:54:33 -0500373};
374
Tejun Heoc637b8a2013-12-11 14:11:58 -0500375struct kernfs_node *kernfs_new_node(struct kernfs_root *root, const char *name,
Tejun Heo2063d602013-12-11 16:02:57 -0500376 umode_t mode, unsigned flags)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500377{
378 char *dup_name = NULL;
Tejun Heo324a56e2013-12-11 14:11:53 -0500379 struct kernfs_node *kn;
Tejun Heobc755552013-11-28 14:54:41 -0500380 int ret;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500381
Tejun Heo2063d602013-12-11 16:02:57 -0500382 if (!(flags & KERNFS_STATIC_NAME)) {
Tejun Heofd7b9f72013-11-28 14:54:33 -0500383 name = dup_name = kstrdup(name, GFP_KERNEL);
384 if (!name)
385 return NULL;
386 }
387
Tejun Heoa797bfc2013-12-11 14:11:57 -0500388 kn = kmem_cache_zalloc(kernfs_node_cache, GFP_KERNEL);
Tejun Heo324a56e2013-12-11 14:11:53 -0500389 if (!kn)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500390 goto err_out1;
391
Tejun Heobc755552013-11-28 14:54:41 -0500392 ret = ida_simple_get(&root->ino_ida, 1, 0, GFP_KERNEL);
393 if (ret < 0)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500394 goto err_out2;
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500395 kn->ino = ret;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500396
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500397 atomic_set(&kn->count, 1);
Tejun Heoae343722014-01-10 08:57:21 -0500398 atomic_set(&kn->active, KN_DEACTIVATED_BIAS);
Tejun Heo9f010c22014-01-10 08:57:26 -0500399 kn->deact_depth = 1;
Tejun Heoae343722014-01-10 08:57:21 -0500400 RB_CLEAR_NODE(&kn->rb);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500401
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500402 kn->name = name;
403 kn->mode = mode;
Tejun Heoae343722014-01-10 08:57:21 -0500404 kn->flags = flags;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500405
Tejun Heo324a56e2013-12-11 14:11:53 -0500406 return kn;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500407
408 err_out2:
Tejun Heoa797bfc2013-12-11 14:11:57 -0500409 kmem_cache_free(kernfs_node_cache, kn);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500410 err_out1:
411 kfree(dup_name);
412 return NULL;
413}
414
415/**
Tejun Heoc637b8a2013-12-11 14:11:58 -0500416 * kernfs_add_one - add kernfs_node to parent without warning
Tejun Heo324a56e2013-12-11 14:11:53 -0500417 * @kn: kernfs_node to be added
418 * @parent: the parent kernfs_node to add @kn to
Tejun Heofd7b9f72013-11-28 14:54:33 -0500419 *
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500420 * Get @parent and set @kn->parent to it and increment nlink of the
421 * parent inode if @kn is a directory and link into the children list
422 * of the parent.
Tejun Heofd7b9f72013-11-28 14:54:33 -0500423 *
Tejun Heofd7b9f72013-11-28 14:54:33 -0500424 * RETURNS:
425 * 0 on success, -EEXIST if entry with the given name already
426 * exists.
427 */
Tejun Heo99177a32014-01-10 08:57:24 -0500428int kernfs_add_one(struct kernfs_node *kn, struct kernfs_node *parent)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500429{
Tejun Heoc525aad2013-12-11 14:11:55 -0500430 struct kernfs_iattrs *ps_iattr;
Tejun Heo99177a32014-01-10 08:57:24 -0500431 bool has_ns;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500432 int ret;
433
Tejun Heo99177a32014-01-10 08:57:24 -0500434 if (!kernfs_get_active(parent))
435 return -ENOENT;
Tejun Heoae343722014-01-10 08:57:21 -0500436
Tejun Heo99177a32014-01-10 08:57:24 -0500437 mutex_lock(&kernfs_mutex);
438
439 ret = -EINVAL;
440 has_ns = kernfs_ns_enabled(parent);
441 if (WARN(has_ns != (bool)kn->ns, KERN_WARNING "kernfs: ns %s in '%s' for '%s'\n",
442 has_ns ? "required" : "invalid", parent->name, kn->name))
443 goto out_unlock;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500444
Tejun Heodf23fc32013-12-11 14:11:56 -0500445 if (kernfs_type(parent) != KERNFS_DIR)
Tejun Heo99177a32014-01-10 08:57:24 -0500446 goto out_unlock;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500447
Tejun Heoc637b8a2013-12-11 14:11:58 -0500448 kn->hash = kernfs_name_hash(kn->name, kn->ns);
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500449 kn->parent = parent;
Tejun Heo324a56e2013-12-11 14:11:53 -0500450 kernfs_get(parent);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500451
Tejun Heoc637b8a2013-12-11 14:11:58 -0500452 ret = kernfs_link_sibling(kn);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500453 if (ret)
Tejun Heo99177a32014-01-10 08:57:24 -0500454 goto out_unlock;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500455
456 /* Update timestamps on the parent */
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500457 ps_iattr = parent->iattr;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500458 if (ps_iattr) {
459 struct iattr *ps_iattrs = &ps_iattr->ia_iattr;
460 ps_iattrs->ia_ctime = ps_iattrs->ia_mtime = CURRENT_TIME;
461 }
462
463 /* Mark the entry added into directory tree */
Tejun Heoae343722014-01-10 08:57:21 -0500464 atomic_sub(KN_DEACTIVATED_BIAS, &kn->active);
Tejun Heo9f010c22014-01-10 08:57:26 -0500465 kn->deact_depth--;
Tejun Heo99177a32014-01-10 08:57:24 -0500466 ret = 0;
467out_unlock:
Tejun Heoa797bfc2013-12-11 14:11:57 -0500468 mutex_unlock(&kernfs_mutex);
Tejun Heo99177a32014-01-10 08:57:24 -0500469 kernfs_put_active(parent);
470 return ret;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500471}
472
473/**
Tejun Heo324a56e2013-12-11 14:11:53 -0500474 * kernfs_find_ns - find kernfs_node with the given name
475 * @parent: kernfs_node to search under
Tejun Heofd7b9f72013-11-28 14:54:33 -0500476 * @name: name to look for
477 * @ns: the namespace tag to use
478 *
Tejun Heo324a56e2013-12-11 14:11:53 -0500479 * Look for kernfs_node with name @name under @parent. Returns pointer to
480 * the found kernfs_node on success, %NULL on failure.
Tejun Heofd7b9f72013-11-28 14:54:33 -0500481 */
Tejun Heo324a56e2013-12-11 14:11:53 -0500482static struct kernfs_node *kernfs_find_ns(struct kernfs_node *parent,
483 const unsigned char *name,
484 const void *ns)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500485{
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500486 struct rb_node *node = parent->dir.children.rb_node;
Tejun Heoac9bba02013-11-29 17:19:09 -0500487 bool has_ns = kernfs_ns_enabled(parent);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500488 unsigned int hash;
489
Tejun Heoa797bfc2013-12-11 14:11:57 -0500490 lockdep_assert_held(&kernfs_mutex);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500491
492 if (has_ns != (bool)ns) {
Tejun Heoc637b8a2013-12-11 14:11:58 -0500493 WARN(1, KERN_WARNING "kernfs: ns %s in '%s' for '%s'\n",
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500494 has_ns ? "required" : "invalid", parent->name, name);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500495 return NULL;
496 }
497
Tejun Heoc637b8a2013-12-11 14:11:58 -0500498 hash = kernfs_name_hash(name, ns);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500499 while (node) {
Tejun Heo324a56e2013-12-11 14:11:53 -0500500 struct kernfs_node *kn;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500501 int result;
502
Tejun Heo324a56e2013-12-11 14:11:53 -0500503 kn = rb_to_kn(node);
Tejun Heoc637b8a2013-12-11 14:11:58 -0500504 result = kernfs_name_compare(hash, name, ns, kn);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500505 if (result < 0)
506 node = node->rb_left;
507 else if (result > 0)
508 node = node->rb_right;
509 else
Tejun Heo324a56e2013-12-11 14:11:53 -0500510 return kn;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500511 }
512 return NULL;
513}
514
515/**
Tejun Heo324a56e2013-12-11 14:11:53 -0500516 * kernfs_find_and_get_ns - find and get kernfs_node with the given name
517 * @parent: kernfs_node to search under
Tejun Heofd7b9f72013-11-28 14:54:33 -0500518 * @name: name to look for
519 * @ns: the namespace tag to use
520 *
Tejun Heo324a56e2013-12-11 14:11:53 -0500521 * Look for kernfs_node with name @name under @parent and get a reference
Tejun Heofd7b9f72013-11-28 14:54:33 -0500522 * if found. This function may sleep and returns pointer to the found
Tejun Heo324a56e2013-12-11 14:11:53 -0500523 * kernfs_node on success, %NULL on failure.
Tejun Heofd7b9f72013-11-28 14:54:33 -0500524 */
Tejun Heo324a56e2013-12-11 14:11:53 -0500525struct kernfs_node *kernfs_find_and_get_ns(struct kernfs_node *parent,
526 const char *name, const void *ns)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500527{
Tejun Heo324a56e2013-12-11 14:11:53 -0500528 struct kernfs_node *kn;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500529
Tejun Heoa797bfc2013-12-11 14:11:57 -0500530 mutex_lock(&kernfs_mutex);
Tejun Heo324a56e2013-12-11 14:11:53 -0500531 kn = kernfs_find_ns(parent, name, ns);
532 kernfs_get(kn);
Tejun Heoa797bfc2013-12-11 14:11:57 -0500533 mutex_unlock(&kernfs_mutex);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500534
Tejun Heo324a56e2013-12-11 14:11:53 -0500535 return kn;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500536}
537EXPORT_SYMBOL_GPL(kernfs_find_and_get_ns);
538
539/**
Tejun Heoba7443b2013-11-28 14:54:40 -0500540 * kernfs_create_root - create a new kernfs hierarchy
Tejun Heo80b9bbe2013-12-11 16:03:00 -0500541 * @kdops: optional directory syscall operations for the hierarchy
Tejun Heoba7443b2013-11-28 14:54:40 -0500542 * @priv: opaque data associated with the new directory
543 *
544 * Returns the root of the new hierarchy on success, ERR_PTR() value on
545 * failure.
546 */
Tejun Heo80b9bbe2013-12-11 16:03:00 -0500547struct kernfs_root *kernfs_create_root(struct kernfs_dir_ops *kdops, void *priv)
Tejun Heoba7443b2013-11-28 14:54:40 -0500548{
549 struct kernfs_root *root;
Tejun Heo324a56e2013-12-11 14:11:53 -0500550 struct kernfs_node *kn;
Tejun Heoba7443b2013-11-28 14:54:40 -0500551
552 root = kzalloc(sizeof(*root), GFP_KERNEL);
553 if (!root)
554 return ERR_PTR(-ENOMEM);
555
Tejun Heobc755552013-11-28 14:54:41 -0500556 ida_init(&root->ino_ida);
557
Tejun Heoc637b8a2013-12-11 14:11:58 -0500558 kn = kernfs_new_node(root, "", S_IFDIR | S_IRUGO | S_IXUGO, KERNFS_DIR);
Tejun Heo324a56e2013-12-11 14:11:53 -0500559 if (!kn) {
Tejun Heobc755552013-11-28 14:54:41 -0500560 ida_destroy(&root->ino_ida);
Tejun Heoba7443b2013-11-28 14:54:40 -0500561 kfree(root);
562 return ERR_PTR(-ENOMEM);
563 }
564
Tejun Heoae343722014-01-10 08:57:21 -0500565 atomic_sub(KN_DEACTIVATED_BIAS, &kn->active);
Tejun Heo9f010c22014-01-10 08:57:26 -0500566 kn->deact_depth--;
Tejun Heo324a56e2013-12-11 14:11:53 -0500567 kn->priv = priv;
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500568 kn->dir.root = root;
Tejun Heoba7443b2013-11-28 14:54:40 -0500569
Tejun Heo80b9bbe2013-12-11 16:03:00 -0500570 root->dir_ops = kdops;
Tejun Heo324a56e2013-12-11 14:11:53 -0500571 root->kn = kn;
Tejun Heoea1c4722014-01-10 08:57:19 -0500572 init_waitqueue_head(&root->deactivate_waitq);
Tejun Heoba7443b2013-11-28 14:54:40 -0500573
574 return root;
575}
576
577/**
578 * kernfs_destroy_root - destroy a kernfs hierarchy
579 * @root: root of the hierarchy to destroy
580 *
581 * Destroy the hierarchy anchored at @root by removing all existing
582 * directories and destroying @root.
583 */
584void kernfs_destroy_root(struct kernfs_root *root)
585{
Tejun Heo324a56e2013-12-11 14:11:53 -0500586 kernfs_remove(root->kn); /* will also free @root */
Tejun Heoba7443b2013-11-28 14:54:40 -0500587}
588
589/**
Tejun Heofd7b9f72013-11-28 14:54:33 -0500590 * kernfs_create_dir_ns - create a directory
591 * @parent: parent in which to create a new directory
592 * @name: name of the new directory
Tejun Heobb8b9d02013-12-11 16:02:55 -0500593 * @mode: mode of the new directory
Tejun Heofd7b9f72013-11-28 14:54:33 -0500594 * @priv: opaque data associated with the new directory
595 * @ns: optional namespace tag of the directory
596 *
597 * Returns the created node on success, ERR_PTR() value on failure.
598 */
Tejun Heo324a56e2013-12-11 14:11:53 -0500599struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent,
Tejun Heobb8b9d02013-12-11 16:02:55 -0500600 const char *name, umode_t mode,
601 void *priv, const void *ns)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500602{
Tejun Heo324a56e2013-12-11 14:11:53 -0500603 struct kernfs_node *kn;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500604 int rc;
605
606 /* allocate */
Tejun Heobb8b9d02013-12-11 16:02:55 -0500607 kn = kernfs_new_node(kernfs_root(parent), name, mode | S_IFDIR,
608 KERNFS_DIR);
Tejun Heo324a56e2013-12-11 14:11:53 -0500609 if (!kn)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500610 return ERR_PTR(-ENOMEM);
611
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500612 kn->dir.root = parent->dir.root;
613 kn->ns = ns;
Tejun Heo324a56e2013-12-11 14:11:53 -0500614 kn->priv = priv;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500615
616 /* link in */
Tejun Heo99177a32014-01-10 08:57:24 -0500617 rc = kernfs_add_one(kn, parent);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500618 if (!rc)
Tejun Heo324a56e2013-12-11 14:11:53 -0500619 return kn;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500620
Tejun Heo324a56e2013-12-11 14:11:53 -0500621 kernfs_put(kn);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500622 return ERR_PTR(rc);
623}
624
Tejun Heoc637b8a2013-12-11 14:11:58 -0500625static struct dentry *kernfs_iop_lookup(struct inode *dir,
626 struct dentry *dentry,
627 unsigned int flags)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500628{
Tejun Heo19bbb922013-12-11 16:02:59 -0500629 struct dentry *ret;
Tejun Heo324a56e2013-12-11 14:11:53 -0500630 struct kernfs_node *parent = dentry->d_parent->d_fsdata;
631 struct kernfs_node *kn;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500632 struct inode *inode;
633 const void *ns = NULL;
634
Tejun Heoa797bfc2013-12-11 14:11:57 -0500635 mutex_lock(&kernfs_mutex);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500636
Tejun Heo324a56e2013-12-11 14:11:53 -0500637 if (kernfs_ns_enabled(parent))
Tejun Heoc525aad2013-12-11 14:11:55 -0500638 ns = kernfs_info(dir->i_sb)->ns;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500639
Tejun Heo324a56e2013-12-11 14:11:53 -0500640 kn = kernfs_find_ns(parent, dentry->d_name.name, ns);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500641
642 /* no such entry */
Tejun Heo324a56e2013-12-11 14:11:53 -0500643 if (!kn) {
Tejun Heo19bbb922013-12-11 16:02:59 -0500644 ret = NULL;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500645 goto out_unlock;
646 }
Tejun Heo324a56e2013-12-11 14:11:53 -0500647 kernfs_get(kn);
648 dentry->d_fsdata = kn;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500649
650 /* attach dentry and inode */
Tejun Heoc637b8a2013-12-11 14:11:58 -0500651 inode = kernfs_get_inode(dir->i_sb, kn);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500652 if (!inode) {
653 ret = ERR_PTR(-ENOMEM);
654 goto out_unlock;
655 }
656
657 /* instantiate and hash dentry */
658 ret = d_materialise_unique(dentry, inode);
659 out_unlock:
Tejun Heoa797bfc2013-12-11 14:11:57 -0500660 mutex_unlock(&kernfs_mutex);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500661 return ret;
662}
663
Tejun Heo80b9bbe2013-12-11 16:03:00 -0500664static int kernfs_iop_mkdir(struct inode *dir, struct dentry *dentry,
665 umode_t mode)
666{
667 struct kernfs_node *parent = dir->i_private;
668 struct kernfs_dir_ops *kdops = kernfs_root(parent)->dir_ops;
669
670 if (!kdops || !kdops->mkdir)
671 return -EPERM;
672
673 return kdops->mkdir(parent, dentry->d_name.name, mode);
674}
675
676static int kernfs_iop_rmdir(struct inode *dir, struct dentry *dentry)
677{
678 struct kernfs_node *kn = dentry->d_fsdata;
679 struct kernfs_dir_ops *kdops = kernfs_root(kn)->dir_ops;
680
681 if (!kdops || !kdops->rmdir)
682 return -EPERM;
683
684 return kdops->rmdir(kn);
685}
686
687static int kernfs_iop_rename(struct inode *old_dir, struct dentry *old_dentry,
688 struct inode *new_dir, struct dentry *new_dentry)
689{
690 struct kernfs_node *kn = old_dentry->d_fsdata;
691 struct kernfs_node *new_parent = new_dir->i_private;
692 struct kernfs_dir_ops *kdops = kernfs_root(kn)->dir_ops;
693
694 if (!kdops || !kdops->rename)
695 return -EPERM;
696
697 return kdops->rename(kn, new_parent, new_dentry->d_name.name);
698}
699
Tejun Heoa797bfc2013-12-11 14:11:57 -0500700const struct inode_operations kernfs_dir_iops = {
Tejun Heoc637b8a2013-12-11 14:11:58 -0500701 .lookup = kernfs_iop_lookup,
702 .permission = kernfs_iop_permission,
703 .setattr = kernfs_iop_setattr,
704 .getattr = kernfs_iop_getattr,
705 .setxattr = kernfs_iop_setxattr,
706 .removexattr = kernfs_iop_removexattr,
707 .getxattr = kernfs_iop_getxattr,
708 .listxattr = kernfs_iop_listxattr,
Tejun Heo80b9bbe2013-12-11 16:03:00 -0500709
710 .mkdir = kernfs_iop_mkdir,
711 .rmdir = kernfs_iop_rmdir,
712 .rename = kernfs_iop_rename,
Tejun Heofd7b9f72013-11-28 14:54:33 -0500713};
714
Tejun Heoc637b8a2013-12-11 14:11:58 -0500715static struct kernfs_node *kernfs_leftmost_descendant(struct kernfs_node *pos)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500716{
Tejun Heo324a56e2013-12-11 14:11:53 -0500717 struct kernfs_node *last;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500718
719 while (true) {
720 struct rb_node *rbn;
721
722 last = pos;
723
Tejun Heodf23fc32013-12-11 14:11:56 -0500724 if (kernfs_type(pos) != KERNFS_DIR)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500725 break;
726
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500727 rbn = rb_first(&pos->dir.children);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500728 if (!rbn)
729 break;
730
Tejun Heo324a56e2013-12-11 14:11:53 -0500731 pos = rb_to_kn(rbn);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500732 }
733
734 return last;
735}
736
737/**
Tejun Heoc637b8a2013-12-11 14:11:58 -0500738 * kernfs_next_descendant_post - find the next descendant for post-order walk
Tejun Heofd7b9f72013-11-28 14:54:33 -0500739 * @pos: the current position (%NULL to initiate traversal)
Tejun Heo324a56e2013-12-11 14:11:53 -0500740 * @root: kernfs_node whose descendants to walk
Tejun Heofd7b9f72013-11-28 14:54:33 -0500741 *
742 * Find the next descendant to visit for post-order traversal of @root's
743 * descendants. @root is included in the iteration and the last node to be
744 * visited.
745 */
Tejun Heoc637b8a2013-12-11 14:11:58 -0500746static struct kernfs_node *kernfs_next_descendant_post(struct kernfs_node *pos,
747 struct kernfs_node *root)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500748{
749 struct rb_node *rbn;
750
Tejun Heoa797bfc2013-12-11 14:11:57 -0500751 lockdep_assert_held(&kernfs_mutex);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500752
753 /* if first iteration, visit leftmost descendant which may be root */
754 if (!pos)
Tejun Heoc637b8a2013-12-11 14:11:58 -0500755 return kernfs_leftmost_descendant(root);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500756
757 /* if we visited @root, we're done */
758 if (pos == root)
759 return NULL;
760
761 /* if there's an unvisited sibling, visit its leftmost descendant */
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500762 rbn = rb_next(&pos->rb);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500763 if (rbn)
Tejun Heoc637b8a2013-12-11 14:11:58 -0500764 return kernfs_leftmost_descendant(rb_to_kn(rbn));
Tejun Heofd7b9f72013-11-28 14:54:33 -0500765
766 /* no sibling left, visit parent */
Tejun Heoadc5e8b2013-12-11 14:11:54 -0500767 return pos->parent;
Tejun Heofd7b9f72013-11-28 14:54:33 -0500768}
769
Tejun Heo45a140e2014-01-10 08:57:22 -0500770static void __kernfs_deactivate(struct kernfs_node *kn)
771{
772 struct kernfs_node *pos;
773
774 lockdep_assert_held(&kernfs_mutex);
775
776 /* prevent any new usage under @kn by deactivating all nodes */
777 pos = NULL;
778 while ((pos = kernfs_next_descendant_post(pos, kn))) {
Tejun Heo9f010c22014-01-10 08:57:26 -0500779 if (!pos->deact_depth++) {
780 WARN_ON_ONCE(atomic_read(&pos->active) < 0);
Tejun Heo45a140e2014-01-10 08:57:22 -0500781 atomic_add(KN_DEACTIVATED_BIAS, &pos->active);
782 pos->flags |= KERNFS_JUST_DEACTIVATED;
783 }
784 }
785
786 /*
787 * Drain the subtree. If kernfs_drain() blocked to drain, which is
788 * indicated by %true return, it temporarily released kernfs_mutex
789 * and the rbtree might have been modified inbetween breaking our
790 * future walk. Restart the walk after each %true return.
791 */
792 pos = NULL;
793 while ((pos = kernfs_next_descendant_post(pos, kn))) {
794 bool drained;
795
796 kernfs_get(pos);
797 drained = kernfs_drain(pos);
798 kernfs_put(pos);
799 if (drained)
800 pos = NULL;
801 }
802}
803
Tejun Heo9f010c22014-01-10 08:57:26 -0500804static void __kernfs_reactivate(struct kernfs_node *kn)
805{
806 struct kernfs_node *pos;
807
808 lockdep_assert_held(&kernfs_mutex);
809
810 pos = NULL;
811 while ((pos = kernfs_next_descendant_post(pos, kn))) {
812 if (!--pos->deact_depth) {
813 WARN_ON_ONCE(atomic_read(&pos->active) >= 0);
814 atomic_sub(KN_DEACTIVATED_BIAS, &pos->active);
815 }
816 WARN_ON_ONCE(pos->deact_depth < 0);
817 }
818
819 /* some nodes reactivated, kick get_active waiters */
820 wake_up_all(&kernfs_root(kn)->deactivate_waitq);
821}
822
823static void __kernfs_deactivate_self(struct kernfs_node *kn)
824{
825 /*
826 * Take out ourself out of the active ref dependency chain and
827 * deactivate. If we're called without an active ref, lockdep will
828 * complain.
829 */
830 kernfs_put_active(kn);
831 __kernfs_deactivate(kn);
832}
833
834static void __kernfs_reactivate_self(struct kernfs_node *kn)
835{
836 __kernfs_reactivate(kn);
837 /*
838 * Restore active ref dropped by deactivate_self() so that it's
839 * balanced on return. put_active() will soon be called on @kn, so
840 * this can't break anything regardless of @kn's state.
841 */
842 atomic_inc(&kn->active);
843 if (kernfs_lockdep(kn))
844 rwsem_acquire(&kn->dep_map, 0, 1, _RET_IP_);
845}
846
847/**
848 * kernfs_deactivate - deactivate subtree of a node
849 * @kn: kernfs_node to deactivate subtree of
850 *
851 * Deactivate the subtree of @kn. On return, there's no active operation
852 * going on under @kn and creation or renaming of a node under @kn is
853 * blocked until @kn is reactivated or removed. This function can be
854 * called multiple times and nests properly. Each invocation should be
855 * paired with kernfs_reactivate().
856 *
857 * For a kernfs user which uses simple locking, the subsystem lock would
858 * nest inside active reference. This becomes problematic if the user
859 * tries to remove nodes while holding the subystem lock as it would create
860 * a reverse locking dependency from the subsystem lock to active ref.
861 * This function can be used to break such reverse dependency. The user
862 * can call this function outside the subsystem lock and then proceed to
863 * invoke kernfs_remove() while holding the subsystem lock without
864 * introducing such reverse dependency.
865 */
866void kernfs_deactivate(struct kernfs_node *kn)
867{
868 mutex_lock(&kernfs_mutex);
869 __kernfs_deactivate(kn);
870 mutex_unlock(&kernfs_mutex);
871}
872
873/**
874 * kernfs_reactivate - reactivate subtree of a node
875 * @kn: kernfs_node to reactivate subtree of
876 *
877 * Undo kernfs_deactivate().
878 */
879void kernfs_reactivate(struct kernfs_node *kn)
880{
881 mutex_lock(&kernfs_mutex);
882 __kernfs_reactivate(kn);
883 mutex_unlock(&kernfs_mutex);
884}
885
886/**
887 * kernfs_deactivate_self - deactivate subtree of a node from its own method
888 * @kn: the self kernfs_node to deactivate subtree of
889 *
890 * The caller must be running off of a kernfs operation which is invoked
891 * with an active reference - e.g. one of kernfs_ops. Once this function
892 * is called, @kn may be removed by someone else while the enclosing method
893 * is in progress. Other than that, this function is equivalent to
894 * kernfs_deactivate() and should be paired with kernfs_reactivate_self().
895 */
896void kernfs_deactivate_self(struct kernfs_node *kn)
897{
898 mutex_lock(&kernfs_mutex);
899 __kernfs_deactivate_self(kn);
900 mutex_unlock(&kernfs_mutex);
901}
902
903/**
904 * kernfs_reactivate_self - reactivate subtree of a node from its own method
905 * @kn: the self kernfs_node to reactivate subtree of
906 *
907 * Undo kernfs_deactivate_self().
908 */
909void kernfs_reactivate_self(struct kernfs_node *kn)
910{
911 mutex_lock(&kernfs_mutex);
912 __kernfs_reactivate_self(kn);
913 mutex_unlock(&kernfs_mutex);
914}
915
Tejun Heo99177a32014-01-10 08:57:24 -0500916static void __kernfs_remove(struct kernfs_node *kn)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500917{
Tejun Heo895a0682014-01-10 08:57:25 -0500918 struct kernfs_root *root = kernfs_root(kn);
Tejun Heo45a140e2014-01-10 08:57:22 -0500919 struct kernfs_node *pos;
920
921 lockdep_assert_held(&kernfs_mutex);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500922
Greg Kroah-Hartmance9b4992014-01-13 13:50:31 -0800923 if (!kn)
924 return;
925
Tejun Heoc637b8a2013-12-11 14:11:58 -0500926 pr_debug("kernfs %s: removing\n", kn->name);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500927
Tejun Heo45a140e2014-01-10 08:57:22 -0500928 __kernfs_deactivate(kn);
929
930 /* unlink the subtree node-by-node */
Tejun Heofd7b9f72013-11-28 14:54:33 -0500931 do {
Tejun Heo45a140e2014-01-10 08:57:22 -0500932 pos = kernfs_leftmost_descendant(kn);
933
Tejun Heof601f9a2014-01-10 08:57:23 -0500934 /*
935 * We're gonna release kernfs_mutex to unmap bin files,
936 * Make sure @pos doesn't go away inbetween.
937 */
938 kernfs_get(pos);
939
940 /*
941 * This must be come before unlinking; otherwise, when
942 * there are multiple removers, some may finish before
943 * unmapping is complete.
944 */
945 if (pos->flags & KERNFS_HAS_MMAP) {
946 mutex_unlock(&kernfs_mutex);
947 kernfs_unmap_file(pos);
948 mutex_lock(&kernfs_mutex);
949 }
950
951 /*
952 * kernfs_unlink_sibling() succeeds once per node. Use it
953 * to decide who's responsible for cleanups.
954 */
955 if (!pos->parent || kernfs_unlink_sibling(pos)) {
956 struct kernfs_iattrs *ps_iattr =
957 pos->parent ? pos->parent->iattr : NULL;
Tejun Heo45a140e2014-01-10 08:57:22 -0500958
959 /* update timestamps on the parent */
Tejun Heo45a140e2014-01-10 08:57:22 -0500960 if (ps_iattr) {
961 ps_iattr->ia_iattr.ia_ctime = CURRENT_TIME;
962 ps_iattr->ia_iattr.ia_mtime = CURRENT_TIME;
963 }
Tejun Heof601f9a2014-01-10 08:57:23 -0500964
Tejun Heo99177a32014-01-10 08:57:24 -0500965 kernfs_put(pos);
Tejun Heo45a140e2014-01-10 08:57:22 -0500966 }
967
Tejun Heof601f9a2014-01-10 08:57:23 -0500968 kernfs_put(pos);
Tejun Heo45a140e2014-01-10 08:57:22 -0500969 } while (pos != kn);
Tejun Heo895a0682014-01-10 08:57:25 -0500970
971 /* some nodes killed, kick get_active waiters */
972 wake_up_all(&root->deactivate_waitq);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500973}
974
975/**
Tejun Heo324a56e2013-12-11 14:11:53 -0500976 * kernfs_remove - remove a kernfs_node recursively
977 * @kn: the kernfs_node to remove
Tejun Heofd7b9f72013-11-28 14:54:33 -0500978 *
Tejun Heo324a56e2013-12-11 14:11:53 -0500979 * Remove @kn along with all its subdirectories and files.
Tejun Heofd7b9f72013-11-28 14:54:33 -0500980 */
Tejun Heo324a56e2013-12-11 14:11:53 -0500981void kernfs_remove(struct kernfs_node *kn)
Tejun Heofd7b9f72013-11-28 14:54:33 -0500982{
Tejun Heo99177a32014-01-10 08:57:24 -0500983 mutex_lock(&kernfs_mutex);
984 __kernfs_remove(kn);
985 mutex_unlock(&kernfs_mutex);
Tejun Heofd7b9f72013-11-28 14:54:33 -0500986}
987
988/**
Tejun Heo1ae06812014-01-10 08:57:27 -0500989 * kernfs_remove_self - remove a kernfs_node from its own method
990 * @kn: the self kernfs_node to remove
991 *
992 * The caller must be running off of a kernfs operation which is invoked
993 * with an active reference - e.g. one of kernfs_ops. This can be used to
994 * implement a file operation which deletes itself.
995 *
996 * For example, the "delete" file for a sysfs device directory can be
997 * implemented by invoking kernfs_remove_self() on the "delete" file
998 * itself. This function breaks the circular dependency of trying to
999 * deactivate self while holding an active ref itself. It isn't necessary
1000 * to modify the usual removal path to use kernfs_remove_self(). The
1001 * "delete" implementation can simply invoke kernfs_remove_self() on self
1002 * before proceeding with the usual removal path. kernfs will ignore later
1003 * kernfs_remove() on self.
1004 *
1005 * kernfs_remove_self() can be called multiple times concurrently on the
1006 * same kernfs_node. Only the first one actually performs removal and
1007 * returns %true. All others will wait until the kernfs operation which
1008 * won self-removal finishes and return %false. Note that the losers wait
1009 * for the completion of not only the winning kernfs_remove_self() but also
1010 * the whole kernfs_ops which won the arbitration. This can be used to
1011 * guarantee, for example, all concurrent writes to a "delete" file to
1012 * finish only after the whole operation is complete.
1013 */
1014bool kernfs_remove_self(struct kernfs_node *kn)
1015{
1016 bool ret;
1017
1018 mutex_lock(&kernfs_mutex);
1019 __kernfs_deactivate_self(kn);
1020
1021 /*
1022 * SUICIDAL is used to arbitrate among competing invocations. Only
1023 * the first one will actually perform removal. When the removal
1024 * is complete, SUICIDED is set and the active ref is restored
1025 * while holding kernfs_mutex. The ones which lost arbitration
1026 * waits for SUICDED && drained which can happen only after the
1027 * enclosing kernfs operation which executed the winning instance
1028 * of kernfs_remove_self() finished.
1029 */
1030 if (!(kn->flags & KERNFS_SUICIDAL)) {
1031 kn->flags |= KERNFS_SUICIDAL;
1032 __kernfs_remove(kn);
1033 kn->flags |= KERNFS_SUICIDED;
1034 ret = true;
1035 } else {
1036 wait_queue_head_t *waitq = &kernfs_root(kn)->deactivate_waitq;
1037 DEFINE_WAIT(wait);
1038
1039 while (true) {
1040 prepare_to_wait(waitq, &wait, TASK_UNINTERRUPTIBLE);
1041
1042 if ((kn->flags & KERNFS_SUICIDED) &&
1043 atomic_read(&kn->active) == KN_DEACTIVATED_BIAS)
1044 break;
1045
1046 mutex_unlock(&kernfs_mutex);
1047 schedule();
1048 mutex_lock(&kernfs_mutex);
1049 }
1050 finish_wait(waitq, &wait);
1051 WARN_ON_ONCE(!RB_EMPTY_NODE(&kn->rb));
1052 ret = false;
1053 }
1054
1055 __kernfs_reactivate_self(kn);
1056 mutex_unlock(&kernfs_mutex);
1057 return ret;
1058}
1059
1060/**
Tejun Heo324a56e2013-12-11 14:11:53 -05001061 * kernfs_remove_by_name_ns - find a kernfs_node by name and remove it
1062 * @parent: parent of the target
1063 * @name: name of the kernfs_node to remove
1064 * @ns: namespace tag of the kernfs_node to remove
Tejun Heofd7b9f72013-11-28 14:54:33 -05001065 *
Tejun Heo324a56e2013-12-11 14:11:53 -05001066 * Look for the kernfs_node with @name and @ns under @parent and remove it.
1067 * Returns 0 on success, -ENOENT if such entry doesn't exist.
Tejun Heofd7b9f72013-11-28 14:54:33 -05001068 */
Tejun Heo324a56e2013-12-11 14:11:53 -05001069int kernfs_remove_by_name_ns(struct kernfs_node *parent, const char *name,
Tejun Heofd7b9f72013-11-28 14:54:33 -05001070 const void *ns)
1071{
Tejun Heo324a56e2013-12-11 14:11:53 -05001072 struct kernfs_node *kn;
Tejun Heofd7b9f72013-11-28 14:54:33 -05001073
Tejun Heo324a56e2013-12-11 14:11:53 -05001074 if (!parent) {
Tejun Heoc637b8a2013-12-11 14:11:58 -05001075 WARN(1, KERN_WARNING "kernfs: can not remove '%s', no directory\n",
Tejun Heofd7b9f72013-11-28 14:54:33 -05001076 name);
1077 return -ENOENT;
1078 }
1079
Tejun Heo99177a32014-01-10 08:57:24 -05001080 mutex_lock(&kernfs_mutex);
Tejun Heofd7b9f72013-11-28 14:54:33 -05001081
Tejun Heo324a56e2013-12-11 14:11:53 -05001082 kn = kernfs_find_ns(parent, name, ns);
1083 if (kn)
Tejun Heo99177a32014-01-10 08:57:24 -05001084 __kernfs_remove(kn);
Tejun Heofd7b9f72013-11-28 14:54:33 -05001085
Tejun Heo99177a32014-01-10 08:57:24 -05001086 mutex_unlock(&kernfs_mutex);
Tejun Heofd7b9f72013-11-28 14:54:33 -05001087
Tejun Heo324a56e2013-12-11 14:11:53 -05001088 if (kn)
Tejun Heofd7b9f72013-11-28 14:54:33 -05001089 return 0;
1090 else
1091 return -ENOENT;
1092}
1093
1094/**
1095 * kernfs_rename_ns - move and rename a kernfs_node
Tejun Heo324a56e2013-12-11 14:11:53 -05001096 * @kn: target node
Tejun Heofd7b9f72013-11-28 14:54:33 -05001097 * @new_parent: new parent to put @sd under
1098 * @new_name: new name
1099 * @new_ns: new namespace tag
1100 */
Tejun Heo324a56e2013-12-11 14:11:53 -05001101int kernfs_rename_ns(struct kernfs_node *kn, struct kernfs_node *new_parent,
Tejun Heofd7b9f72013-11-28 14:54:33 -05001102 const char *new_name, const void *new_ns)
1103{
1104 int error;
1105
Tejun Heod0ae3d42013-12-11 16:02:56 -05001106 error = -ENOENT;
Tejun Heoae343722014-01-10 08:57:21 -05001107 if (!kernfs_get_active(new_parent))
Tejun Heod0ae3d42013-12-11 16:02:56 -05001108 goto out;
Tejun Heoae343722014-01-10 08:57:21 -05001109 if (!kernfs_get_active(kn))
1110 goto out_put_new_parent;
1111
1112 mutex_lock(&kernfs_mutex);
Tejun Heod0ae3d42013-12-11 16:02:56 -05001113
Tejun Heofd7b9f72013-11-28 14:54:33 -05001114 error = 0;
Tejun Heoadc5e8b2013-12-11 14:11:54 -05001115 if ((kn->parent == new_parent) && (kn->ns == new_ns) &&
1116 (strcmp(kn->name, new_name) == 0))
Tejun Heoae343722014-01-10 08:57:21 -05001117 goto out_unlock; /* nothing to rename */
Tejun Heofd7b9f72013-11-28 14:54:33 -05001118
1119 error = -EEXIST;
1120 if (kernfs_find_ns(new_parent, new_name, new_ns))
Tejun Heoae343722014-01-10 08:57:21 -05001121 goto out_unlock;
Tejun Heofd7b9f72013-11-28 14:54:33 -05001122
Tejun Heo324a56e2013-12-11 14:11:53 -05001123 /* rename kernfs_node */
Tejun Heoadc5e8b2013-12-11 14:11:54 -05001124 if (strcmp(kn->name, new_name) != 0) {
Tejun Heofd7b9f72013-11-28 14:54:33 -05001125 error = -ENOMEM;
1126 new_name = kstrdup(new_name, GFP_KERNEL);
1127 if (!new_name)
Tejun Heoae343722014-01-10 08:57:21 -05001128 goto out_unlock;
Tejun Heofd7b9f72013-11-28 14:54:33 -05001129
Tejun Heo47a52e92013-12-11 16:02:58 -05001130 if (kn->flags & KERNFS_STATIC_NAME)
1131 kn->flags &= ~KERNFS_STATIC_NAME;
1132 else
1133 kfree(kn->name);
1134
Tejun Heoadc5e8b2013-12-11 14:11:54 -05001135 kn->name = new_name;
Tejun Heofd7b9f72013-11-28 14:54:33 -05001136 }
1137
1138 /*
1139 * Move to the appropriate place in the appropriate directories rbtree.
1140 */
Tejun Heoc637b8a2013-12-11 14:11:58 -05001141 kernfs_unlink_sibling(kn);
Tejun Heofd7b9f72013-11-28 14:54:33 -05001142 kernfs_get(new_parent);
Tejun Heoadc5e8b2013-12-11 14:11:54 -05001143 kernfs_put(kn->parent);
1144 kn->ns = new_ns;
Tejun Heoc637b8a2013-12-11 14:11:58 -05001145 kn->hash = kernfs_name_hash(kn->name, kn->ns);
Tejun Heoadc5e8b2013-12-11 14:11:54 -05001146 kn->parent = new_parent;
Tejun Heoc637b8a2013-12-11 14:11:58 -05001147 kernfs_link_sibling(kn);
Tejun Heofd7b9f72013-11-28 14:54:33 -05001148
1149 error = 0;
Tejun Heoae343722014-01-10 08:57:21 -05001150out_unlock:
Tejun Heoa797bfc2013-12-11 14:11:57 -05001151 mutex_unlock(&kernfs_mutex);
Tejun Heoae343722014-01-10 08:57:21 -05001152 kernfs_put_active(kn);
1153out_put_new_parent:
1154 kernfs_put_active(new_parent);
1155out:
Tejun Heofd7b9f72013-11-28 14:54:33 -05001156 return error;
1157}
1158
Tejun Heofd7b9f72013-11-28 14:54:33 -05001159/* Relationship between s_mode and the DT_xxx types */
Tejun Heo324a56e2013-12-11 14:11:53 -05001160static inline unsigned char dt_type(struct kernfs_node *kn)
Tejun Heofd7b9f72013-11-28 14:54:33 -05001161{
Tejun Heoadc5e8b2013-12-11 14:11:54 -05001162 return (kn->mode >> 12) & 15;
Tejun Heofd7b9f72013-11-28 14:54:33 -05001163}
1164
Tejun Heoc637b8a2013-12-11 14:11:58 -05001165static int kernfs_dir_fop_release(struct inode *inode, struct file *filp)
Tejun Heofd7b9f72013-11-28 14:54:33 -05001166{
1167 kernfs_put(filp->private_data);
1168 return 0;
1169}
1170
Tejun Heoc637b8a2013-12-11 14:11:58 -05001171static struct kernfs_node *kernfs_dir_pos(const void *ns,
Tejun Heo324a56e2013-12-11 14:11:53 -05001172 struct kernfs_node *parent, loff_t hash, struct kernfs_node *pos)
Tejun Heofd7b9f72013-11-28 14:54:33 -05001173{
1174 if (pos) {
Tejun Heoae343722014-01-10 08:57:21 -05001175 int valid = pos->parent == parent && hash == pos->hash;
Tejun Heofd7b9f72013-11-28 14:54:33 -05001176 kernfs_put(pos);
1177 if (!valid)
1178 pos = NULL;
1179 }
1180 if (!pos && (hash > 1) && (hash < INT_MAX)) {
Tejun Heoadc5e8b2013-12-11 14:11:54 -05001181 struct rb_node *node = parent->dir.children.rb_node;
Tejun Heofd7b9f72013-11-28 14:54:33 -05001182 while (node) {
Tejun Heo324a56e2013-12-11 14:11:53 -05001183 pos = rb_to_kn(node);
Tejun Heofd7b9f72013-11-28 14:54:33 -05001184
Tejun Heoadc5e8b2013-12-11 14:11:54 -05001185 if (hash < pos->hash)
Tejun Heofd7b9f72013-11-28 14:54:33 -05001186 node = node->rb_left;
Tejun Heoadc5e8b2013-12-11 14:11:54 -05001187 else if (hash > pos->hash)
Tejun Heofd7b9f72013-11-28 14:54:33 -05001188 node = node->rb_right;
1189 else
1190 break;
1191 }
1192 }
1193 /* Skip over entries in the wrong namespace */
Tejun Heoadc5e8b2013-12-11 14:11:54 -05001194 while (pos && pos->ns != ns) {
1195 struct rb_node *node = rb_next(&pos->rb);
Tejun Heofd7b9f72013-11-28 14:54:33 -05001196 if (!node)
1197 pos = NULL;
1198 else
Tejun Heo324a56e2013-12-11 14:11:53 -05001199 pos = rb_to_kn(node);
Tejun Heofd7b9f72013-11-28 14:54:33 -05001200 }
1201 return pos;
1202}
1203
Tejun Heoc637b8a2013-12-11 14:11:58 -05001204static struct kernfs_node *kernfs_dir_next_pos(const void *ns,
Tejun Heo324a56e2013-12-11 14:11:53 -05001205 struct kernfs_node *parent, ino_t ino, struct kernfs_node *pos)
Tejun Heofd7b9f72013-11-28 14:54:33 -05001206{
Tejun Heoc637b8a2013-12-11 14:11:58 -05001207 pos = kernfs_dir_pos(ns, parent, ino, pos);
Tejun Heofd7b9f72013-11-28 14:54:33 -05001208 if (pos)
1209 do {
Tejun Heoadc5e8b2013-12-11 14:11:54 -05001210 struct rb_node *node = rb_next(&pos->rb);
Tejun Heofd7b9f72013-11-28 14:54:33 -05001211 if (!node)
1212 pos = NULL;
1213 else
Tejun Heo324a56e2013-12-11 14:11:53 -05001214 pos = rb_to_kn(node);
Tejun Heoadc5e8b2013-12-11 14:11:54 -05001215 } while (pos && pos->ns != ns);
Tejun Heofd7b9f72013-11-28 14:54:33 -05001216 return pos;
1217}
1218
Tejun Heoc637b8a2013-12-11 14:11:58 -05001219static int kernfs_fop_readdir(struct file *file, struct dir_context *ctx)
Tejun Heofd7b9f72013-11-28 14:54:33 -05001220{
1221 struct dentry *dentry = file->f_path.dentry;
Tejun Heo324a56e2013-12-11 14:11:53 -05001222 struct kernfs_node *parent = dentry->d_fsdata;
1223 struct kernfs_node *pos = file->private_data;
Tejun Heofd7b9f72013-11-28 14:54:33 -05001224 const void *ns = NULL;
1225
1226 if (!dir_emit_dots(file, ctx))
1227 return 0;
Tejun Heoa797bfc2013-12-11 14:11:57 -05001228 mutex_lock(&kernfs_mutex);
Tejun Heofd7b9f72013-11-28 14:54:33 -05001229
Tejun Heo324a56e2013-12-11 14:11:53 -05001230 if (kernfs_ns_enabled(parent))
Tejun Heoc525aad2013-12-11 14:11:55 -05001231 ns = kernfs_info(dentry->d_sb)->ns;
Tejun Heofd7b9f72013-11-28 14:54:33 -05001232
Tejun Heoc637b8a2013-12-11 14:11:58 -05001233 for (pos = kernfs_dir_pos(ns, parent, ctx->pos, pos);
Tejun Heofd7b9f72013-11-28 14:54:33 -05001234 pos;
Tejun Heoc637b8a2013-12-11 14:11:58 -05001235 pos = kernfs_dir_next_pos(ns, parent, ctx->pos, pos)) {
Tejun Heoadc5e8b2013-12-11 14:11:54 -05001236 const char *name = pos->name;
Tejun Heofd7b9f72013-11-28 14:54:33 -05001237 unsigned int type = dt_type(pos);
1238 int len = strlen(name);
Tejun Heoadc5e8b2013-12-11 14:11:54 -05001239 ino_t ino = pos->ino;
Tejun Heofd7b9f72013-11-28 14:54:33 -05001240
Tejun Heoadc5e8b2013-12-11 14:11:54 -05001241 ctx->pos = pos->hash;
Tejun Heofd7b9f72013-11-28 14:54:33 -05001242 file->private_data = pos;
1243 kernfs_get(pos);
1244
Tejun Heoa797bfc2013-12-11 14:11:57 -05001245 mutex_unlock(&kernfs_mutex);
Tejun Heofd7b9f72013-11-28 14:54:33 -05001246 if (!dir_emit(ctx, name, len, ino, type))
1247 return 0;
Tejun Heoa797bfc2013-12-11 14:11:57 -05001248 mutex_lock(&kernfs_mutex);
Tejun Heofd7b9f72013-11-28 14:54:33 -05001249 }
Tejun Heoa797bfc2013-12-11 14:11:57 -05001250 mutex_unlock(&kernfs_mutex);
Tejun Heofd7b9f72013-11-28 14:54:33 -05001251 file->private_data = NULL;
1252 ctx->pos = INT_MAX;
1253 return 0;
1254}
1255
Tejun Heoc637b8a2013-12-11 14:11:58 -05001256static loff_t kernfs_dir_fop_llseek(struct file *file, loff_t offset,
1257 int whence)
Tejun Heofd7b9f72013-11-28 14:54:33 -05001258{
1259 struct inode *inode = file_inode(file);
1260 loff_t ret;
1261
1262 mutex_lock(&inode->i_mutex);
1263 ret = generic_file_llseek(file, offset, whence);
1264 mutex_unlock(&inode->i_mutex);
1265
1266 return ret;
1267}
1268
Tejun Heoa797bfc2013-12-11 14:11:57 -05001269const struct file_operations kernfs_dir_fops = {
Tejun Heofd7b9f72013-11-28 14:54:33 -05001270 .read = generic_read_dir,
Tejun Heoc637b8a2013-12-11 14:11:58 -05001271 .iterate = kernfs_fop_readdir,
1272 .release = kernfs_dir_fop_release,
1273 .llseek = kernfs_dir_fop_llseek,
Tejun Heofd7b9f72013-11-28 14:54:33 -05001274};