1
2
3
4
5
6
7
8
9
10
11
12
13#define pr_fmt(fmt) "debugfs: " fmt
14
15#include <linux/module.h>
16#include <linux/fs.h>
17#include <linux/mount.h>
18#include <linux/pagemap.h>
19#include <linux/init.h>
20#include <linux/kobject.h>
21#include <linux/namei.h>
22#include <linux/debugfs.h>
23#include <linux/fsnotify.h>
24#include <linux/string.h>
25#include <linux/seq_file.h>
26#include <linux/parser.h>
27#include <linux/magic.h>
28#include <linux/slab.h>
29#include <linux/security.h>
30
31#include "internal.h"
32
33#define DEBUGFS_DEFAULT_MODE 0700
34
35static struct vfsmount *debugfs_mount;
36static int debugfs_mount_count;
37static bool debugfs_registered;
38
39
40
41
42
43
44static int debugfs_setattr(struct dentry *dentry, struct iattr *ia)
45{
46 int ret = security_locked_down(LOCKDOWN_DEBUGFS);
47
48 if (ret && (ia->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID)))
49 return ret;
50 return simple_setattr(dentry, ia);
51}
52
53static const struct inode_operations debugfs_file_inode_operations = {
54 .setattr = debugfs_setattr,
55};
56static const struct inode_operations debugfs_dir_inode_operations = {
57 .lookup = simple_lookup,
58 .setattr = debugfs_setattr,
59};
60static const struct inode_operations debugfs_symlink_inode_operations = {
61 .get_link = simple_get_link,
62 .setattr = debugfs_setattr,
63};
64
65static struct inode *debugfs_get_inode(struct super_block *sb)
66{
67 struct inode *inode = new_inode(sb);
68 if (inode) {
69 inode->i_ino = get_next_ino();
70 inode->i_atime = inode->i_mtime =
71 inode->i_ctime = current_time(inode);
72 }
73 return inode;
74}
75
76struct debugfs_mount_opts {
77 kuid_t uid;
78 kgid_t gid;
79 umode_t mode;
80};
81
82enum {
83 Opt_uid,
84 Opt_gid,
85 Opt_mode,
86 Opt_err
87};
88
89static const match_table_t tokens = {
90 {Opt_uid, "uid=%u"},
91 {Opt_gid, "gid=%u"},
92 {Opt_mode, "mode=%o"},
93 {Opt_err, NULL}
94};
95
96struct debugfs_fs_info {
97 struct debugfs_mount_opts mount_opts;
98};
99
100static int debugfs_parse_options(char *data, struct debugfs_mount_opts *opts)
101{
102 substring_t args[MAX_OPT_ARGS];
103 int option;
104 int token;
105 kuid_t uid;
106 kgid_t gid;
107 char *p;
108
109 opts->mode = DEBUGFS_DEFAULT_MODE;
110
111 while ((p = strsep(&data, ",")) != NULL) {
112 if (!*p)
113 continue;
114
115 token = match_token(p, tokens, args);
116 switch (token) {
117 case Opt_uid:
118 if (match_int(&args[0], &option))
119 return -EINVAL;
120 uid = make_kuid(current_user_ns(), option);
121 if (!uid_valid(uid))
122 return -EINVAL;
123 opts->uid = uid;
124 break;
125 case Opt_gid:
126 if (match_int(&args[0], &option))
127 return -EINVAL;
128 gid = make_kgid(current_user_ns(), option);
129 if (!gid_valid(gid))
130 return -EINVAL;
131 opts->gid = gid;
132 break;
133 case Opt_mode:
134 if (match_octal(&args[0], &option))
135 return -EINVAL;
136 opts->mode = option & S_IALLUGO;
137 break;
138
139
140
141
142 }
143 }
144
145 return 0;
146}
147
148static int debugfs_apply_options(struct super_block *sb)
149{
150 struct debugfs_fs_info *fsi = sb->s_fs_info;
151 struct inode *inode = d_inode(sb->s_root);
152 struct debugfs_mount_opts *opts = &fsi->mount_opts;
153
154 inode->i_mode &= ~S_IALLUGO;
155 inode->i_mode |= opts->mode;
156
157 inode->i_uid = opts->uid;
158 inode->i_gid = opts->gid;
159
160 return 0;
161}
162
163static int debugfs_remount(struct super_block *sb, int *flags, char *data)
164{
165 int err;
166 struct debugfs_fs_info *fsi = sb->s_fs_info;
167
168 sync_filesystem(sb);
169 err = debugfs_parse_options(data, &fsi->mount_opts);
170 if (err)
171 goto fail;
172
173 debugfs_apply_options(sb);
174
175fail:
176 return err;
177}
178
179static int debugfs_show_options(struct seq_file *m, struct dentry *root)
180{
181 struct debugfs_fs_info *fsi = root->d_sb->s_fs_info;
182 struct debugfs_mount_opts *opts = &fsi->mount_opts;
183
184 if (!uid_eq(opts->uid, GLOBAL_ROOT_UID))
185 seq_printf(m, ",uid=%u",
186 from_kuid_munged(&init_user_ns, opts->uid));
187 if (!gid_eq(opts->gid, GLOBAL_ROOT_GID))
188 seq_printf(m, ",gid=%u",
189 from_kgid_munged(&init_user_ns, opts->gid));
190 if (opts->mode != DEBUGFS_DEFAULT_MODE)
191 seq_printf(m, ",mode=%o", opts->mode);
192
193 return 0;
194}
195
196static void debugfs_free_inode(struct inode *inode)
197{
198 if (S_ISLNK(inode->i_mode))
199 kfree(inode->i_link);
200 free_inode_nonrcu(inode);
201}
202
203static const struct super_operations debugfs_super_operations = {
204 .statfs = simple_statfs,
205 .remount_fs = debugfs_remount,
206 .show_options = debugfs_show_options,
207 .free_inode = debugfs_free_inode,
208};
209
210static void debugfs_release_dentry(struct dentry *dentry)
211{
212 void *fsd = dentry->d_fsdata;
213
214 if (!((unsigned long)fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT))
215 kfree(dentry->d_fsdata);
216}
217
218static struct vfsmount *debugfs_automount(struct path *path)
219{
220 debugfs_automount_t f;
221 f = (debugfs_automount_t)path->dentry->d_fsdata;
222 return f(path->dentry, d_inode(path->dentry)->i_private);
223}
224
225static const struct dentry_operations debugfs_dops = {
226 .d_delete = always_delete_dentry,
227 .d_release = debugfs_release_dentry,
228 .d_automount = debugfs_automount,
229};
230
231static int debug_fill_super(struct super_block *sb, void *data, int silent)
232{
233 static const struct tree_descr debug_files[] = {{""}};
234 struct debugfs_fs_info *fsi;
235 int err;
236
237 fsi = kzalloc(sizeof(struct debugfs_fs_info), GFP_KERNEL);
238 sb->s_fs_info = fsi;
239 if (!fsi) {
240 err = -ENOMEM;
241 goto fail;
242 }
243
244 err = debugfs_parse_options(data, &fsi->mount_opts);
245 if (err)
246 goto fail;
247
248 err = simple_fill_super(sb, DEBUGFS_MAGIC, debug_files);
249 if (err)
250 goto fail;
251
252 sb->s_op = &debugfs_super_operations;
253 sb->s_d_op = &debugfs_dops;
254
255 debugfs_apply_options(sb);
256
257 return 0;
258
259fail:
260 kfree(fsi);
261 sb->s_fs_info = NULL;
262 return err;
263}
264
265static struct dentry *debug_mount(struct file_system_type *fs_type,
266 int flags, const char *dev_name,
267 void *data)
268{
269 return mount_single(fs_type, flags, data, debug_fill_super);
270}
271
272static struct file_system_type debug_fs_type = {
273 .owner = THIS_MODULE,
274 .name = "debugfs",
275 .mount = debug_mount,
276 .kill_sb = kill_litter_super,
277};
278MODULE_ALIAS_FS("debugfs");
279
280
281
282
283
284
285
286
287
288
289
290
291
292struct dentry *debugfs_lookup(const char *name, struct dentry *parent)
293{
294 struct dentry *dentry;
295
296 if (IS_ERR(parent))
297 return NULL;
298
299 if (!parent)
300 parent = debugfs_mount->mnt_root;
301
302 dentry = lookup_one_len_unlocked(name, parent, strlen(name));
303 if (IS_ERR(dentry))
304 return NULL;
305 if (!d_really_is_positive(dentry)) {
306 dput(dentry);
307 return NULL;
308 }
309 return dentry;
310}
311EXPORT_SYMBOL_GPL(debugfs_lookup);
312
313static struct dentry *start_creating(const char *name, struct dentry *parent)
314{
315 struct dentry *dentry;
316 int error;
317
318 pr_debug("creating file '%s'\n", name);
319
320 if (IS_ERR(parent))
321 return parent;
322
323 error = simple_pin_fs(&debug_fs_type, &debugfs_mount,
324 &debugfs_mount_count);
325 if (error) {
326 pr_err("Unable to pin filesystem for file '%s'\n", name);
327 return ERR_PTR(error);
328 }
329
330
331
332
333
334
335 if (!parent)
336 parent = debugfs_mount->mnt_root;
337
338 inode_lock(d_inode(parent));
339 dentry = lookup_one_len(name, parent, strlen(name));
340 if (!IS_ERR(dentry) && d_really_is_positive(dentry)) {
341 if (d_is_dir(dentry))
342 pr_err("Directory '%s' with parent '%s' already present!\n",
343 name, parent->d_name.name);
344 else
345 pr_err("File '%s' in directory '%s' already present!\n",
346 name, parent->d_name.name);
347 dput(dentry);
348 dentry = ERR_PTR(-EEXIST);
349 }
350
351 if (IS_ERR(dentry)) {
352 inode_unlock(d_inode(parent));
353 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
354 }
355
356 return dentry;
357}
358
359static struct dentry *failed_creating(struct dentry *dentry)
360{
361 inode_unlock(d_inode(dentry->d_parent));
362 dput(dentry);
363 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
364 return ERR_PTR(-ENOMEM);
365}
366
367static struct dentry *end_creating(struct dentry *dentry)
368{
369 inode_unlock(d_inode(dentry->d_parent));
370 return dentry;
371}
372
373static struct dentry *__debugfs_create_file(const char *name, umode_t mode,
374 struct dentry *parent, void *data,
375 const struct file_operations *proxy_fops,
376 const struct file_operations *real_fops)
377{
378 struct dentry *dentry;
379 struct inode *inode;
380
381 if (!(mode & S_IFMT))
382 mode |= S_IFREG;
383 BUG_ON(!S_ISREG(mode));
384 dentry = start_creating(name, parent);
385
386 if (IS_ERR(dentry))
387 return dentry;
388
389 inode = debugfs_get_inode(dentry->d_sb);
390 if (unlikely(!inode)) {
391 pr_err("out of free dentries, can not create file '%s'\n",
392 name);
393 return failed_creating(dentry);
394 }
395
396 inode->i_mode = mode;
397 inode->i_private = data;
398
399 inode->i_op = &debugfs_file_inode_operations;
400 inode->i_fop = proxy_fops;
401 dentry->d_fsdata = (void *)((unsigned long)real_fops |
402 DEBUGFS_FSDATA_IS_REAL_FOPS_BIT);
403
404 d_instantiate(dentry, inode);
405 fsnotify_create(d_inode(dentry->d_parent), dentry);
406 return end_creating(dentry);
407}
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436struct dentry *debugfs_create_file(const char *name, umode_t mode,
437 struct dentry *parent, void *data,
438 const struct file_operations *fops)
439{
440
441 return __debugfs_create_file(name, mode, parent, data,
442 fops ? &debugfs_full_proxy_file_operations :
443 &debugfs_noop_file_operations,
444 fops);
445}
446EXPORT_SYMBOL_GPL(debugfs_create_file);
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475struct dentry *debugfs_create_file_unsafe(const char *name, umode_t mode,
476 struct dentry *parent, void *data,
477 const struct file_operations *fops)
478{
479
480 return __debugfs_create_file(name, mode, parent, data,
481 fops ? &debugfs_open_proxy_file_operations :
482 &debugfs_noop_file_operations,
483 fops);
484}
485EXPORT_SYMBOL_GPL(debugfs_create_file_unsafe);
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515struct dentry *debugfs_create_file_size(const char *name, umode_t mode,
516 struct dentry *parent, void *data,
517 const struct file_operations *fops,
518 loff_t file_size)
519{
520 struct dentry *de = debugfs_create_file(name, mode, parent, data, fops);
521
522 if (de)
523 d_inode(de)->i_size = file_size;
524 return de;
525}
526EXPORT_SYMBOL_GPL(debugfs_create_file_size);
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547struct dentry *debugfs_create_dir(const char *name, struct dentry *parent)
548{
549 struct dentry *dentry = start_creating(name, parent);
550 struct inode *inode;
551
552 if (IS_ERR(dentry))
553 return dentry;
554
555 inode = debugfs_get_inode(dentry->d_sb);
556 if (unlikely(!inode)) {
557 pr_err("out of free dentries, can not create directory '%s'\n",
558 name);
559 return failed_creating(dentry);
560 }
561
562 inode->i_mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO;
563 inode->i_op = &debugfs_dir_inode_operations;
564 inode->i_fop = &simple_dir_operations;
565
566
567 inc_nlink(inode);
568 d_instantiate(dentry, inode);
569 inc_nlink(d_inode(dentry->d_parent));
570 fsnotify_mkdir(d_inode(dentry->d_parent), dentry);
571 return end_creating(dentry);
572}
573EXPORT_SYMBOL_GPL(debugfs_create_dir);
574
575
576
577
578
579
580
581
582
583
584
585
586struct dentry *debugfs_create_automount(const char *name,
587 struct dentry *parent,
588 debugfs_automount_t f,
589 void *data)
590{
591 struct dentry *dentry = start_creating(name, parent);
592 struct inode *inode;
593
594 if (IS_ERR(dentry))
595 return dentry;
596
597 inode = debugfs_get_inode(dentry->d_sb);
598 if (unlikely(!inode)) {
599 pr_err("out of free dentries, can not create automount '%s'\n",
600 name);
601 return failed_creating(dentry);
602 }
603
604 make_empty_dir_inode(inode);
605 inode->i_flags |= S_AUTOMOUNT;
606 inode->i_private = data;
607 dentry->d_fsdata = (void *)f;
608
609 inc_nlink(inode);
610 d_instantiate(dentry, inode);
611 inc_nlink(d_inode(dentry->d_parent));
612 fsnotify_mkdir(d_inode(dentry->d_parent), dentry);
613 return end_creating(dentry);
614}
615EXPORT_SYMBOL(debugfs_create_automount);
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent,
641 const char *target)
642{
643 struct dentry *dentry;
644 struct inode *inode;
645 char *link = kstrdup(target, GFP_KERNEL);
646 if (!link)
647 return ERR_PTR(-ENOMEM);
648
649 dentry = start_creating(name, parent);
650 if (IS_ERR(dentry)) {
651 kfree(link);
652 return dentry;
653 }
654
655 inode = debugfs_get_inode(dentry->d_sb);
656 if (unlikely(!inode)) {
657 pr_err("out of free dentries, can not create symlink '%s'\n",
658 name);
659 kfree(link);
660 return failed_creating(dentry);
661 }
662 inode->i_mode = S_IFLNK | S_IRWXUGO;
663 inode->i_op = &debugfs_symlink_inode_operations;
664 inode->i_link = link;
665 d_instantiate(dentry, inode);
666 return end_creating(dentry);
667}
668EXPORT_SYMBOL_GPL(debugfs_create_symlink);
669
670static void __debugfs_file_removed(struct dentry *dentry)
671{
672 struct debugfs_fsdata *fsd;
673
674
675
676
677
678
679
680 smp_mb();
681 fsd = READ_ONCE(dentry->d_fsdata);
682 if ((unsigned long)fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT)
683 return;
684 if (!refcount_dec_and_test(&fsd->active_users))
685 wait_for_completion(&fsd->active_users_drained);
686}
687
688static int __debugfs_remove(struct dentry *dentry, struct dentry *parent)
689{
690 int ret = 0;
691
692 if (simple_positive(dentry)) {
693 dget(dentry);
694 if (d_is_dir(dentry)) {
695 ret = simple_rmdir(d_inode(parent), dentry);
696 if (!ret)
697 fsnotify_rmdir(d_inode(parent), dentry);
698 } else {
699 simple_unlink(d_inode(parent), dentry);
700 fsnotify_unlink(d_inode(parent), dentry);
701 }
702 if (!ret)
703 d_delete(dentry);
704 if (d_is_reg(dentry))
705 __debugfs_file_removed(dentry);
706 dput(dentry);
707 }
708 return ret;
709}
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725void debugfs_remove(struct dentry *dentry)
726{
727 struct dentry *parent;
728 int ret;
729
730 if (IS_ERR_OR_NULL(dentry))
731 return;
732
733 parent = dentry->d_parent;
734 inode_lock(d_inode(parent));
735 ret = __debugfs_remove(dentry, parent);
736 inode_unlock(d_inode(parent));
737 if (!ret)
738 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
739}
740EXPORT_SYMBOL_GPL(debugfs_remove);
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755void debugfs_remove_recursive(struct dentry *dentry)
756{
757 struct dentry *child, *parent;
758
759 if (IS_ERR_OR_NULL(dentry))
760 return;
761
762 parent = dentry;
763 down:
764 inode_lock(d_inode(parent));
765 loop:
766
767
768
769
770
771 spin_lock(&parent->d_lock);
772 list_for_each_entry(child, &parent->d_subdirs, d_child) {
773 if (!simple_positive(child))
774 continue;
775
776
777 if (!list_empty(&child->d_subdirs)) {
778 spin_unlock(&parent->d_lock);
779 inode_unlock(d_inode(parent));
780 parent = child;
781 goto down;
782 }
783
784 spin_unlock(&parent->d_lock);
785
786 if (!__debugfs_remove(child, parent))
787 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
788
789
790
791
792
793
794
795
796 goto loop;
797 }
798 spin_unlock(&parent->d_lock);
799
800 inode_unlock(d_inode(parent));
801 child = parent;
802 parent = parent->d_parent;
803 inode_lock(d_inode(parent));
804
805 if (child != dentry)
806
807 goto loop;
808
809 if (!__debugfs_remove(child, parent))
810 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
811 inode_unlock(d_inode(parent));
812}
813EXPORT_SYMBOL_GPL(debugfs_remove_recursive);
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
835 struct dentry *new_dir, const char *new_name)
836{
837 int error;
838 struct dentry *dentry = NULL, *trap;
839 struct name_snapshot old_name;
840
841 if (IS_ERR(old_dir))
842 return old_dir;
843 if (IS_ERR(new_dir))
844 return new_dir;
845 if (IS_ERR_OR_NULL(old_dentry))
846 return old_dentry;
847
848 trap = lock_rename(new_dir, old_dir);
849
850 if (d_really_is_negative(old_dir) || d_really_is_negative(new_dir))
851 goto exit;
852
853 if (d_really_is_negative(old_dentry) || old_dentry == trap ||
854 d_mountpoint(old_dentry))
855 goto exit;
856 dentry = lookup_one_len(new_name, new_dir, strlen(new_name));
857
858 if (IS_ERR(dentry) || dentry == trap || d_really_is_positive(dentry))
859 goto exit;
860
861 take_dentry_name_snapshot(&old_name, old_dentry);
862
863 error = simple_rename(d_inode(old_dir), old_dentry, d_inode(new_dir),
864 dentry, 0);
865 if (error) {
866 release_dentry_name_snapshot(&old_name);
867 goto exit;
868 }
869 d_move(old_dentry, dentry);
870 fsnotify_move(d_inode(old_dir), d_inode(new_dir), &old_name.name,
871 d_is_dir(old_dentry),
872 NULL, old_dentry);
873 release_dentry_name_snapshot(&old_name);
874 unlock_rename(new_dir, old_dir);
875 dput(dentry);
876 return old_dentry;
877exit:
878 if (dentry && !IS_ERR(dentry))
879 dput(dentry);
880 unlock_rename(new_dir, old_dir);
881 if (IS_ERR(dentry))
882 return dentry;
883 return ERR_PTR(-EINVAL);
884}
885EXPORT_SYMBOL_GPL(debugfs_rename);
886
887
888
889
890bool debugfs_initialized(void)
891{
892 return debugfs_registered;
893}
894EXPORT_SYMBOL_GPL(debugfs_initialized);
895
896static int __init debugfs_init(void)
897{
898 int retval;
899
900 retval = sysfs_create_mount_point(kernel_kobj, "debug");
901 if (retval)
902 return retval;
903
904 retval = register_filesystem(&debug_fs_type);
905 if (retval)
906 sysfs_remove_mount_point(kernel_kobj, "debug");
907 else
908 debugfs_registered = true;
909
910 return retval;
911}
912core_initcall(debugfs_init);
913
914