defconfig: exynos9610: Re-add dropped Wi-Fi AP options lost
[GitHub/LineageOS/android_kernel_motorola_exynos9610.git] / fs / debugfs / inode.c
1 /*
2 * inode.c - part of debugfs, a tiny little debug file system
3 *
4 * Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com>
5 * Copyright (C) 2004 IBM Inc.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License version
9 * 2 as published by the Free Software Foundation.
10 *
11 * debugfs is for people to use instead of /proc or /sys.
12 * See ./Documentation/core-api/kernel-api.rst for more details.
13 *
14 */
15
16 #include <linux/module.h>
17 #include <linux/fs.h>
18 #include <linux/mount.h>
19 #include <linux/pagemap.h>
20 #include <linux/init.h>
21 #include <linux/kobject.h>
22 #include <linux/namei.h>
23 #include <linux/debugfs.h>
24 #include <linux/fsnotify.h>
25 #include <linux/string.h>
26 #include <linux/seq_file.h>
27 #include <linux/parser.h>
28 #include <linux/magic.h>
29 #include <linux/slab.h>
30
31 #include "internal.h"
32
33 #define DEBUGFS_DEFAULT_MODE 0700
34
35 static struct vfsmount *debugfs_mount;
36 static int debugfs_mount_count;
37 static bool debugfs_registered;
38
39 static struct inode *debugfs_get_inode(struct super_block *sb)
40 {
41 struct inode *inode = new_inode(sb);
42 if (inode) {
43 inode->i_ino = get_next_ino();
44 inode->i_atime = inode->i_mtime =
45 inode->i_ctime = current_time(inode);
46 }
47 return inode;
48 }
49
50 struct debugfs_mount_opts {
51 kuid_t uid;
52 kgid_t gid;
53 umode_t mode;
54 };
55
56 enum {
57 Opt_uid,
58 Opt_gid,
59 Opt_mode,
60 Opt_err
61 };
62
63 static const match_table_t tokens = {
64 {Opt_uid, "uid=%u"},
65 {Opt_gid, "gid=%u"},
66 {Opt_mode, "mode=%o"},
67 {Opt_err, NULL}
68 };
69
70 struct debugfs_fs_info {
71 struct debugfs_mount_opts mount_opts;
72 };
73
74 static int debugfs_parse_options(char *data, struct debugfs_mount_opts *opts)
75 {
76 substring_t args[MAX_OPT_ARGS];
77 int option;
78 int token;
79 kuid_t uid;
80 kgid_t gid;
81 char *p;
82
83 opts->mode = DEBUGFS_DEFAULT_MODE;
84
85 while ((p = strsep(&data, ",")) != NULL) {
86 if (!*p)
87 continue;
88
89 token = match_token(p, tokens, args);
90 switch (token) {
91 case Opt_uid:
92 if (match_int(&args[0], &option))
93 return -EINVAL;
94 uid = make_kuid(current_user_ns(), option);
95 if (!uid_valid(uid))
96 return -EINVAL;
97 opts->uid = uid;
98 break;
99 case Opt_gid:
100 if (match_int(&args[0], &option))
101 return -EINVAL;
102 gid = make_kgid(current_user_ns(), option);
103 if (!gid_valid(gid))
104 return -EINVAL;
105 opts->gid = gid;
106 break;
107 case Opt_mode:
108 if (match_octal(&args[0], &option))
109 return -EINVAL;
110 opts->mode = option & S_IALLUGO;
111 break;
112 /*
113 * We might like to report bad mount options here;
114 * but traditionally debugfs has ignored all mount options
115 */
116 }
117 }
118
119 return 0;
120 }
121
122 static int debugfs_apply_options(struct super_block *sb)
123 {
124 struct debugfs_fs_info *fsi = sb->s_fs_info;
125 struct inode *inode = d_inode(sb->s_root);
126 struct debugfs_mount_opts *opts = &fsi->mount_opts;
127
128 inode->i_mode &= ~S_IALLUGO;
129 inode->i_mode |= opts->mode;
130
131 inode->i_uid = opts->uid;
132 inode->i_gid = opts->gid;
133
134 return 0;
135 }
136
137 static int debugfs_remount(struct super_block *sb, int *flags, char *data)
138 {
139 int err;
140 struct debugfs_fs_info *fsi = sb->s_fs_info;
141
142 sync_filesystem(sb);
143 err = debugfs_parse_options(data, &fsi->mount_opts);
144 if (err)
145 goto fail;
146
147 debugfs_apply_options(sb);
148
149 fail:
150 return err;
151 }
152
153 static int debugfs_show_options(struct seq_file *m, struct dentry *root)
154 {
155 struct debugfs_fs_info *fsi = root->d_sb->s_fs_info;
156 struct debugfs_mount_opts *opts = &fsi->mount_opts;
157
158 if (!uid_eq(opts->uid, GLOBAL_ROOT_UID))
159 seq_printf(m, ",uid=%u",
160 from_kuid_munged(&init_user_ns, opts->uid));
161 if (!gid_eq(opts->gid, GLOBAL_ROOT_GID))
162 seq_printf(m, ",gid=%u",
163 from_kgid_munged(&init_user_ns, opts->gid));
164 if (opts->mode != DEBUGFS_DEFAULT_MODE)
165 seq_printf(m, ",mode=%o", opts->mode);
166
167 return 0;
168 }
169
170 static void debugfs_evict_inode(struct inode *inode)
171 {
172 truncate_inode_pages_final(&inode->i_data);
173 clear_inode(inode);
174 if (S_ISLNK(inode->i_mode))
175 kfree(inode->i_link);
176 }
177
178 static const struct super_operations debugfs_super_operations = {
179 .statfs = simple_statfs,
180 .remount_fs = debugfs_remount,
181 .show_options = debugfs_show_options,
182 .evict_inode = debugfs_evict_inode,
183 };
184
185 static void debugfs_release_dentry(struct dentry *dentry)
186 {
187 void *fsd = dentry->d_fsdata;
188
189 if (!((unsigned long)fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT))
190 kfree(dentry->d_fsdata);
191 }
192
193 static struct vfsmount *debugfs_automount(struct path *path)
194 {
195 debugfs_automount_t f;
196 f = (debugfs_automount_t)path->dentry->d_fsdata;
197 return f(path->dentry, d_inode(path->dentry)->i_private);
198 }
199
200 static const struct dentry_operations debugfs_dops = {
201 .d_delete = always_delete_dentry,
202 .d_release = debugfs_release_dentry,
203 .d_automount = debugfs_automount,
204 };
205
206 static int debug_fill_super(struct super_block *sb, void *data, int silent)
207 {
208 static const struct tree_descr debug_files[] = {{""}};
209 struct debugfs_fs_info *fsi;
210 int err;
211
212 fsi = kzalloc(sizeof(struct debugfs_fs_info), GFP_KERNEL);
213 sb->s_fs_info = fsi;
214 if (!fsi) {
215 err = -ENOMEM;
216 goto fail;
217 }
218
219 err = debugfs_parse_options(data, &fsi->mount_opts);
220 if (err)
221 goto fail;
222
223 err = simple_fill_super(sb, DEBUGFS_MAGIC, debug_files);
224 if (err)
225 goto fail;
226
227 sb->s_op = &debugfs_super_operations;
228 sb->s_d_op = &debugfs_dops;
229
230 debugfs_apply_options(sb);
231
232 return 0;
233
234 fail:
235 kfree(fsi);
236 sb->s_fs_info = NULL;
237 return err;
238 }
239
240 static struct dentry *debug_mount(struct file_system_type *fs_type,
241 int flags, const char *dev_name,
242 void *data)
243 {
244 return mount_single(fs_type, flags, data, debug_fill_super);
245 }
246
247 static struct file_system_type debug_fs_type = {
248 .owner = THIS_MODULE,
249 .name = "debugfs",
250 .mount = debug_mount,
251 .kill_sb = kill_litter_super,
252 };
253 MODULE_ALIAS_FS("debugfs");
254
255 /**
256 * debugfs_lookup() - look up an existing debugfs file
257 * @name: a pointer to a string containing the name of the file to look up.
258 * @parent: a pointer to the parent dentry of the file.
259 *
260 * This function will return a pointer to a dentry if it succeeds. If the file
261 * doesn't exist or an error occurs, %NULL will be returned. The returned
262 * dentry must be passed to dput() when it is no longer needed.
263 *
264 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
265 * returned.
266 */
267 struct dentry *debugfs_lookup(const char *name, struct dentry *parent)
268 {
269 struct dentry *dentry;
270
271 if (IS_ERR(parent))
272 return NULL;
273
274 if (!parent)
275 parent = debugfs_mount->mnt_root;
276
277 inode_lock(d_inode(parent));
278 dentry = lookup_one_len(name, parent, strlen(name));
279 inode_unlock(d_inode(parent));
280
281 if (IS_ERR(dentry))
282 return NULL;
283 if (!d_really_is_positive(dentry)) {
284 dput(dentry);
285 return NULL;
286 }
287 return dentry;
288 }
289 EXPORT_SYMBOL_GPL(debugfs_lookup);
290
291 static struct dentry *start_creating(const char *name, struct dentry *parent)
292 {
293 struct dentry *dentry;
294 int error;
295
296 pr_debug("debugfs: creating file '%s'\n",name);
297
298 if (IS_ERR(parent))
299 return parent;
300
301 error = simple_pin_fs(&debug_fs_type, &debugfs_mount,
302 &debugfs_mount_count);
303 if (error)
304 return ERR_PTR(error);
305
306 /* If the parent is not specified, we create it in the root.
307 * We need the root dentry to do this, which is in the super
308 * block. A pointer to that is in the struct vfsmount that we
309 * have around.
310 */
311 if (!parent)
312 parent = debugfs_mount->mnt_root;
313
314 inode_lock(d_inode(parent));
315 dentry = lookup_one_len(name, parent, strlen(name));
316 if (!IS_ERR(dentry) && d_really_is_positive(dentry)) {
317 dput(dentry);
318 dentry = ERR_PTR(-EEXIST);
319 }
320
321 if (IS_ERR(dentry)) {
322 inode_unlock(d_inode(parent));
323 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
324 }
325
326 return dentry;
327 }
328
329 static struct dentry *failed_creating(struct dentry *dentry)
330 {
331 inode_unlock(d_inode(dentry->d_parent));
332 dput(dentry);
333 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
334 return NULL;
335 }
336
337 static struct dentry *end_creating(struct dentry *dentry)
338 {
339 inode_unlock(d_inode(dentry->d_parent));
340 return dentry;
341 }
342
343 static struct dentry *__debugfs_create_file(const char *name, umode_t mode,
344 struct dentry *parent, void *data,
345 const struct file_operations *proxy_fops,
346 const struct file_operations *real_fops)
347 {
348 struct dentry *dentry;
349 struct inode *inode;
350
351 if (!(mode & S_IFMT))
352 mode |= S_IFREG;
353 BUG_ON(!S_ISREG(mode));
354 dentry = start_creating(name, parent);
355
356 if (IS_ERR(dentry))
357 return NULL;
358
359 inode = debugfs_get_inode(dentry->d_sb);
360 if (unlikely(!inode))
361 return failed_creating(dentry);
362
363 inode->i_mode = mode;
364 inode->i_private = data;
365
366 inode->i_fop = proxy_fops;
367 dentry->d_fsdata = (void *)((unsigned long)real_fops |
368 DEBUGFS_FSDATA_IS_REAL_FOPS_BIT);
369
370 d_instantiate(dentry, inode);
371 fsnotify_create(d_inode(dentry->d_parent), dentry);
372 return end_creating(dentry);
373 }
374
375 /**
376 * debugfs_create_file - create a file in the debugfs filesystem
377 * @name: a pointer to a string containing the name of the file to create.
378 * @mode: the permission that the file should have.
379 * @parent: a pointer to the parent dentry for this file. This should be a
380 * directory dentry if set. If this parameter is NULL, then the
381 * file will be created in the root of the debugfs filesystem.
382 * @data: a pointer to something that the caller will want to get to later
383 * on. The inode.i_private pointer will point to this value on
384 * the open() call.
385 * @fops: a pointer to a struct file_operations that should be used for
386 * this file.
387 *
388 * This is the basic "create a file" function for debugfs. It allows for a
389 * wide range of flexibility in creating a file, or a directory (if you want
390 * to create a directory, the debugfs_create_dir() function is
391 * recommended to be used instead.)
392 *
393 * This function will return a pointer to a dentry if it succeeds. This
394 * pointer must be passed to the debugfs_remove() function when the file is
395 * to be removed (no automatic cleanup happens if your module is unloaded,
396 * you are responsible here.) If an error occurs, %NULL will be returned.
397 *
398 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
399 * returned.
400 */
401 struct dentry *debugfs_create_file(const char *name, umode_t mode,
402 struct dentry *parent, void *data,
403 const struct file_operations *fops)
404 {
405
406 return __debugfs_create_file(name, mode, parent, data,
407 fops ? &debugfs_full_proxy_file_operations :
408 &debugfs_noop_file_operations,
409 fops);
410 }
411 EXPORT_SYMBOL_GPL(debugfs_create_file);
412
413 /**
414 * debugfs_create_file_unsafe - create a file in the debugfs filesystem
415 * @name: a pointer to a string containing the name of the file to create.
416 * @mode: the permission that the file should have.
417 * @parent: a pointer to the parent dentry for this file. This should be a
418 * directory dentry if set. If this parameter is NULL, then the
419 * file will be created in the root of the debugfs filesystem.
420 * @data: a pointer to something that the caller will want to get to later
421 * on. The inode.i_private pointer will point to this value on
422 * the open() call.
423 * @fops: a pointer to a struct file_operations that should be used for
424 * this file.
425 *
426 * debugfs_create_file_unsafe() is completely analogous to
427 * debugfs_create_file(), the only difference being that the fops
428 * handed it will not get protected against file removals by the
429 * debugfs core.
430 *
431 * It is your responsibility to protect your struct file_operation
432 * methods against file removals by means of debugfs_use_file_start()
433 * and debugfs_use_file_finish(). ->open() is still protected by
434 * debugfs though.
435 *
436 * Any struct file_operations defined by means of
437 * DEFINE_DEBUGFS_ATTRIBUTE() is protected against file removals and
438 * thus, may be used here.
439 */
440 struct dentry *debugfs_create_file_unsafe(const char *name, umode_t mode,
441 struct dentry *parent, void *data,
442 const struct file_operations *fops)
443 {
444
445 return __debugfs_create_file(name, mode, parent, data,
446 fops ? &debugfs_open_proxy_file_operations :
447 &debugfs_noop_file_operations,
448 fops);
449 }
450 EXPORT_SYMBOL_GPL(debugfs_create_file_unsafe);
451
452 /**
453 * debugfs_create_file_size - create a file in the debugfs filesystem
454 * @name: a pointer to a string containing the name of the file to create.
455 * @mode: the permission that the file should have.
456 * @parent: a pointer to the parent dentry for this file. This should be a
457 * directory dentry if set. If this parameter is NULL, then the
458 * file will be created in the root of the debugfs filesystem.
459 * @data: a pointer to something that the caller will want to get to later
460 * on. The inode.i_private pointer will point to this value on
461 * the open() call.
462 * @fops: a pointer to a struct file_operations that should be used for
463 * this file.
464 * @file_size: initial file size
465 *
466 * This is the basic "create a file" function for debugfs. It allows for a
467 * wide range of flexibility in creating a file, or a directory (if you want
468 * to create a directory, the debugfs_create_dir() function is
469 * recommended to be used instead.)
470 *
471 * This function will return a pointer to a dentry if it succeeds. This
472 * pointer must be passed to the debugfs_remove() function when the file is
473 * to be removed (no automatic cleanup happens if your module is unloaded,
474 * you are responsible here.) If an error occurs, %NULL will be returned.
475 *
476 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
477 * returned.
478 */
479 struct dentry *debugfs_create_file_size(const char *name, umode_t mode,
480 struct dentry *parent, void *data,
481 const struct file_operations *fops,
482 loff_t file_size)
483 {
484 struct dentry *de = debugfs_create_file(name, mode, parent, data, fops);
485
486 if (de)
487 d_inode(de)->i_size = file_size;
488 return de;
489 }
490 EXPORT_SYMBOL_GPL(debugfs_create_file_size);
491
492 /**
493 * debugfs_create_dir - create a directory in the debugfs filesystem
494 * @name: a pointer to a string containing the name of the directory to
495 * create.
496 * @parent: a pointer to the parent dentry for this file. This should be a
497 * directory dentry if set. If this parameter is NULL, then the
498 * directory will be created in the root of the debugfs filesystem.
499 *
500 * This function creates a directory in debugfs with the given name.
501 *
502 * This function will return a pointer to a dentry if it succeeds. This
503 * pointer must be passed to the debugfs_remove() function when the file is
504 * to be removed (no automatic cleanup happens if your module is unloaded,
505 * you are responsible here.) If an error occurs, %NULL will be returned.
506 *
507 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
508 * returned.
509 */
510 struct dentry *debugfs_create_dir(const char *name, struct dentry *parent)
511 {
512 struct dentry *dentry = start_creating(name, parent);
513 struct inode *inode;
514
515 if (IS_ERR(dentry))
516 return NULL;
517
518 inode = debugfs_get_inode(dentry->d_sb);
519 if (unlikely(!inode))
520 return failed_creating(dentry);
521
522 inode->i_mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO;
523 inode->i_op = &simple_dir_inode_operations;
524 inode->i_fop = &simple_dir_operations;
525
526 /* directory inodes start off with i_nlink == 2 (for "." entry) */
527 inc_nlink(inode);
528 d_instantiate(dentry, inode);
529 inc_nlink(d_inode(dentry->d_parent));
530 fsnotify_mkdir(d_inode(dentry->d_parent), dentry);
531 return end_creating(dentry);
532 }
533 EXPORT_SYMBOL_GPL(debugfs_create_dir);
534
535 /**
536 * debugfs_create_automount - create automount point in the debugfs filesystem
537 * @name: a pointer to a string containing the name of the file to create.
538 * @parent: a pointer to the parent dentry for this file. This should be a
539 * directory dentry if set. If this parameter is NULL, then the
540 * file will be created in the root of the debugfs filesystem.
541 * @f: function to be called when pathname resolution steps on that one.
542 * @data: opaque argument to pass to f().
543 *
544 * @f should return what ->d_automount() would.
545 */
546 struct dentry *debugfs_create_automount(const char *name,
547 struct dentry *parent,
548 debugfs_automount_t f,
549 void *data)
550 {
551 struct dentry *dentry = start_creating(name, parent);
552 struct inode *inode;
553
554 if (IS_ERR(dentry))
555 return NULL;
556
557 inode = debugfs_get_inode(dentry->d_sb);
558 if (unlikely(!inode))
559 return failed_creating(dentry);
560
561 make_empty_dir_inode(inode);
562 inode->i_flags |= S_AUTOMOUNT;
563 inode->i_private = data;
564 dentry->d_fsdata = (void *)f;
565 /* directory inodes start off with i_nlink == 2 (for "." entry) */
566 inc_nlink(inode);
567 d_instantiate(dentry, inode);
568 inc_nlink(d_inode(dentry->d_parent));
569 fsnotify_mkdir(d_inode(dentry->d_parent), dentry);
570 return end_creating(dentry);
571 }
572 EXPORT_SYMBOL(debugfs_create_automount);
573
574 /**
575 * debugfs_create_symlink- create a symbolic link in the debugfs filesystem
576 * @name: a pointer to a string containing the name of the symbolic link to
577 * create.
578 * @parent: a pointer to the parent dentry for this symbolic link. This
579 * should be a directory dentry if set. If this parameter is NULL,
580 * then the symbolic link will be created in the root of the debugfs
581 * filesystem.
582 * @target: a pointer to a string containing the path to the target of the
583 * symbolic link.
584 *
585 * This function creates a symbolic link with the given name in debugfs that
586 * links to the given target path.
587 *
588 * This function will return a pointer to a dentry if it succeeds. This
589 * pointer must be passed to the debugfs_remove() function when the symbolic
590 * link is to be removed (no automatic cleanup happens if your module is
591 * unloaded, you are responsible here.) If an error occurs, %NULL will be
592 * returned.
593 *
594 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
595 * returned.
596 */
597 struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent,
598 const char *target)
599 {
600 struct dentry *dentry;
601 struct inode *inode;
602 char *link = kstrdup(target, GFP_KERNEL);
603 if (!link)
604 return NULL;
605
606 dentry = start_creating(name, parent);
607 if (IS_ERR(dentry)) {
608 kfree(link);
609 return NULL;
610 }
611
612 inode = debugfs_get_inode(dentry->d_sb);
613 if (unlikely(!inode)) {
614 kfree(link);
615 return failed_creating(dentry);
616 }
617 inode->i_mode = S_IFLNK | S_IRWXUGO;
618 inode->i_op = &simple_symlink_inode_operations;
619 inode->i_link = link;
620 d_instantiate(dentry, inode);
621 return end_creating(dentry);
622 }
623 EXPORT_SYMBOL_GPL(debugfs_create_symlink);
624
625 static void __debugfs_remove_file(struct dentry *dentry, struct dentry *parent)
626 {
627 struct debugfs_fsdata *fsd;
628
629 simple_unlink(d_inode(parent), dentry);
630 d_delete(dentry);
631
632 /*
633 * Paired with the closing smp_mb() implied by a successful
634 * cmpxchg() in debugfs_file_get(): either
635 * debugfs_file_get() must see a dead dentry or we must see a
636 * debugfs_fsdata instance at ->d_fsdata here (or both).
637 */
638 smp_mb();
639 fsd = READ_ONCE(dentry->d_fsdata);
640 if ((unsigned long)fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT)
641 return;
642 if (!refcount_dec_and_test(&fsd->active_users))
643 wait_for_completion(&fsd->active_users_drained);
644 }
645
646 static int __debugfs_remove(struct dentry *dentry, struct dentry *parent)
647 {
648 int ret = 0;
649
650 if (simple_positive(dentry)) {
651 dget(dentry);
652 if (!d_is_reg(dentry)) {
653 if (d_is_dir(dentry))
654 ret = simple_rmdir(d_inode(parent), dentry);
655 else
656 simple_unlink(d_inode(parent), dentry);
657 if (!ret)
658 d_delete(dentry);
659 } else {
660 __debugfs_remove_file(dentry, parent);
661 }
662 dput(dentry);
663 }
664 return ret;
665 }
666
667 /**
668 * debugfs_remove - removes a file or directory from the debugfs filesystem
669 * @dentry: a pointer to a the dentry of the file or directory to be
670 * removed. If this parameter is NULL or an error value, nothing
671 * will be done.
672 *
673 * This function removes a file or directory in debugfs that was previously
674 * created with a call to another debugfs function (like
675 * debugfs_create_file() or variants thereof.)
676 *
677 * This function is required to be called in order for the file to be
678 * removed, no automatic cleanup of files will happen when a module is
679 * removed, you are responsible here.
680 */
681 void debugfs_remove(struct dentry *dentry)
682 {
683 struct dentry *parent;
684 int ret;
685
686 if (IS_ERR_OR_NULL(dentry))
687 return;
688
689 parent = dentry->d_parent;
690 inode_lock(d_inode(parent));
691 ret = __debugfs_remove(dentry, parent);
692 inode_unlock(d_inode(parent));
693 if (!ret)
694 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
695 }
696 EXPORT_SYMBOL_GPL(debugfs_remove);
697
698 /**
699 * debugfs_remove_recursive - recursively removes a directory
700 * @dentry: a pointer to a the dentry of the directory to be removed. If this
701 * parameter is NULL or an error value, nothing will be done.
702 *
703 * This function recursively removes a directory tree in debugfs that
704 * was previously created with a call to another debugfs function
705 * (like debugfs_create_file() or variants thereof.)
706 *
707 * This function is required to be called in order for the file to be
708 * removed, no automatic cleanup of files will happen when a module is
709 * removed, you are responsible here.
710 */
711 void debugfs_remove_recursive(struct dentry *dentry)
712 {
713 struct dentry *child, *parent;
714
715 if (IS_ERR_OR_NULL(dentry))
716 return;
717
718 parent = dentry;
719 down:
720 inode_lock(d_inode(parent));
721 loop:
722 /*
723 * The parent->d_subdirs is protected by the d_lock. Outside that
724 * lock, the child can be unlinked and set to be freed which can
725 * use the d_u.d_child as the rcu head and corrupt this list.
726 */
727 spin_lock(&parent->d_lock);
728 list_for_each_entry(child, &parent->d_subdirs, d_child) {
729 if (!simple_positive(child))
730 continue;
731
732 /* perhaps simple_empty(child) makes more sense */
733 if (!list_empty(&child->d_subdirs)) {
734 spin_unlock(&parent->d_lock);
735 inode_unlock(d_inode(parent));
736 parent = child;
737 goto down;
738 }
739
740 spin_unlock(&parent->d_lock);
741
742 if (!__debugfs_remove(child, parent))
743 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
744
745 /*
746 * The parent->d_lock protects agaist child from unlinking
747 * from d_subdirs. When releasing the parent->d_lock we can
748 * no longer trust that the next pointer is valid.
749 * Restart the loop. We'll skip this one with the
750 * simple_positive() check.
751 */
752 goto loop;
753 }
754 spin_unlock(&parent->d_lock);
755
756 inode_unlock(d_inode(parent));
757 child = parent;
758 parent = parent->d_parent;
759 inode_lock(d_inode(parent));
760
761 if (child != dentry)
762 /* go up */
763 goto loop;
764
765 if (!__debugfs_remove(child, parent))
766 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
767 inode_unlock(d_inode(parent));
768 }
769 EXPORT_SYMBOL_GPL(debugfs_remove_recursive);
770
771 /**
772 * debugfs_rename - rename a file/directory in the debugfs filesystem
773 * @old_dir: a pointer to the parent dentry for the renamed object. This
774 * should be a directory dentry.
775 * @old_dentry: dentry of an object to be renamed.
776 * @new_dir: a pointer to the parent dentry where the object should be
777 * moved. This should be a directory dentry.
778 * @new_name: a pointer to a string containing the target name.
779 *
780 * This function renames a file/directory in debugfs. The target must not
781 * exist for rename to succeed.
782 *
783 * This function will return a pointer to old_dentry (which is updated to
784 * reflect renaming) if it succeeds. If an error occurs, %NULL will be
785 * returned.
786 *
787 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
788 * returned.
789 */
790 struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
791 struct dentry *new_dir, const char *new_name)
792 {
793 int error;
794 struct dentry *dentry = NULL, *trap;
795 struct name_snapshot old_name;
796
797 if (IS_ERR(old_dir))
798 return old_dir;
799 if (IS_ERR(new_dir))
800 return new_dir;
801 if (IS_ERR_OR_NULL(old_dentry))
802 return old_dentry;
803
804 trap = lock_rename(new_dir, old_dir);
805 /* Source or destination directories don't exist? */
806 if (d_really_is_negative(old_dir) || d_really_is_negative(new_dir))
807 goto exit;
808 /* Source does not exist, cyclic rename, or mountpoint? */
809 if (d_really_is_negative(old_dentry) || old_dentry == trap ||
810 d_mountpoint(old_dentry))
811 goto exit;
812 dentry = lookup_one_len(new_name, new_dir, strlen(new_name));
813 /* Lookup failed, cyclic rename or target exists? */
814 if (IS_ERR(dentry) || dentry == trap || d_really_is_positive(dentry))
815 goto exit;
816
817 take_dentry_name_snapshot(&old_name, old_dentry);
818
819 error = simple_rename(d_inode(old_dir), old_dentry, d_inode(new_dir),
820 dentry, 0);
821 if (error) {
822 release_dentry_name_snapshot(&old_name);
823 goto exit;
824 }
825 d_move(old_dentry, dentry);
826 fsnotify_move(d_inode(old_dir), d_inode(new_dir), old_name.name,
827 d_is_dir(old_dentry),
828 NULL, old_dentry);
829 release_dentry_name_snapshot(&old_name);
830 unlock_rename(new_dir, old_dir);
831 dput(dentry);
832 return old_dentry;
833 exit:
834 if (dentry && !IS_ERR(dentry))
835 dput(dentry);
836 unlock_rename(new_dir, old_dir);
837 return NULL;
838 }
839 EXPORT_SYMBOL_GPL(debugfs_rename);
840
841 /**
842 * debugfs_initialized - Tells whether debugfs has been registered
843 */
844 bool debugfs_initialized(void)
845 {
846 return debugfs_registered;
847 }
848 EXPORT_SYMBOL_GPL(debugfs_initialized);
849
850 static int __init debugfs_init(void)
851 {
852 int retval;
853
854 retval = sysfs_create_mount_point(kernel_kobj, "debug");
855 if (retval)
856 return retval;
857
858 retval = register_filesystem(&debug_fs_type);
859 if (retval)
860 sysfs_remove_mount_point(kernel_kobj, "debug");
861 else
862 debugfs_registered = true;
863
864 return retval;
865 }
866 core_initcall(debugfs_init);
867