blob: 01cde9fb3943524041cc78561bc60d97266184a8 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Harry Weibd33d122011-07-16 16:45:13 +08002 * inode.c - part of debugfs, a tiny little debug file system
Linus Torvalds1da177e2005-04-16 15:20:36 -07003 *
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/DocBook/kernel-api for more details.
13 *
14 */
15
Linus Torvalds1da177e2005-04-16 15:20:36 -070016#include <linux/module.h>
17#include <linux/fs.h>
18#include <linux/mount.h>
19#include <linux/pagemap.h>
20#include <linux/init.h>
Randy Dunlap4d8ebdd2006-11-25 11:09:26 -080021#include <linux/kobject.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070022#include <linux/namei.h>
23#include <linux/debugfs.h>
Mathieu Desnoyers4f365572006-11-24 13:45:37 -050024#include <linux/fsnotify.h>
Peter Oberparleiter66f54962007-02-13 12:13:54 +010025#include <linux/string.h>
Ludwig Nusseld6e48682012-01-25 11:52:28 +010026#include <linux/seq_file.h>
27#include <linux/parser.h>
Mimi Zohar92562922008-10-07 14:00:12 -040028#include <linux/magic.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090029#include <linux/slab.h>
Nicolai Stange9fd4dce2016-03-22 14:11:13 +010030
31#include "internal.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070032
Kees Cook82aceae42012-08-27 13:32:15 -070033#define DEBUGFS_DEFAULT_MODE 0700
Ludwig Nusseld6e48682012-01-25 11:52:28 +010034
Linus Torvalds1da177e2005-04-16 15:20:36 -070035static struct vfsmount *debugfs_mount;
36static int debugfs_mount_count;
Frederic Weisbeckerc0f92ba2009-03-22 23:10:44 +010037static bool debugfs_registered;
Linus Torvalds1da177e2005-04-16 15:20:36 -070038
Al Viroedac65e2015-01-25 14:36:18 -050039static struct inode *debugfs_get_inode(struct super_block *sb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070040{
41 struct inode *inode = new_inode(sb);
Linus Torvalds1da177e2005-04-16 15:20:36 -070042 if (inode) {
Christoph Hellwig85fe4022010-10-23 11:19:54 -040043 inode->i_ino = get_next_ino();
Deepa Dinamani1b48b532016-02-22 07:17:47 -080044 inode->i_atime = inode->i_mtime =
Deepa Dinamanic2050a42016-09-14 07:48:06 -070045 inode->i_ctime = current_time(inode);
Linus Torvalds1da177e2005-04-16 15:20:36 -070046 }
Rahul Bedarkar88e412e2014-06-06 23:12:04 +053047 return inode;
Linus Torvalds1da177e2005-04-16 15:20:36 -070048}
49
Ludwig Nusseld6e48682012-01-25 11:52:28 +010050struct debugfs_mount_opts {
Eric W. Biederman7dc05882012-04-03 14:01:31 -070051 kuid_t uid;
52 kgid_t gid;
Ludwig Nusseld6e48682012-01-25 11:52:28 +010053 umode_t mode;
54};
55
56enum {
57 Opt_uid,
58 Opt_gid,
59 Opt_mode,
60 Opt_err
61};
62
63static 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
70struct debugfs_fs_info {
71 struct debugfs_mount_opts mount_opts;
72};
73
74static 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;
Eric W. Biederman7dc05882012-04-03 14:01:31 -070079 kuid_t uid;
80 kgid_t gid;
Ludwig Nusseld6e48682012-01-25 11:52:28 +010081 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;
Eric W. Biederman7dc05882012-04-03 14:01:31 -070094 uid = make_kuid(current_user_ns(), option);
95 if (!uid_valid(uid))
96 return -EINVAL;
97 opts->uid = uid;
Ludwig Nusseld6e48682012-01-25 11:52:28 +010098 break;
99 case Opt_gid:
Dave Reisnerf1688e02013-01-02 08:54:37 -0500100 if (match_int(&args[0], &option))
Ludwig Nusseld6e48682012-01-25 11:52:28 +0100101 return -EINVAL;
Eric W. Biederman7dc05882012-04-03 14:01:31 -0700102 gid = make_kgid(current_user_ns(), option);
103 if (!gid_valid(gid))
104 return -EINVAL;
105 opts->gid = gid;
Ludwig Nusseld6e48682012-01-25 11:52:28 +0100106 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
122static int debugfs_apply_options(struct super_block *sb)
123{
124 struct debugfs_fs_info *fsi = sb->s_fs_info;
David Howells2b0143b2015-03-17 22:25:59 +0000125 struct inode *inode = d_inode(sb->s_root);
Ludwig Nusseld6e48682012-01-25 11:52:28 +0100126 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
137static 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
Theodore Ts'o02b99842014-03-13 10:14:33 -0400142 sync_filesystem(sb);
Ludwig Nusseld6e48682012-01-25 11:52:28 +0100143 err = debugfs_parse_options(data, &fsi->mount_opts);
144 if (err)
145 goto fail;
146
147 debugfs_apply_options(sb);
148
149fail:
150 return err;
151}
152
153static 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
Eric W. Biederman7dc05882012-04-03 14:01:31 -0700158 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));
Ludwig Nusseld6e48682012-01-25 11:52:28 +0100164 if (opts->mode != DEBUGFS_DEFAULT_MODE)
165 seq_printf(m, ",mode=%o", opts->mode);
166
167 return 0;
168}
169
Al Viro1ef84472019-03-26 01:43:37 +0000170static void debugfs_i_callback(struct rcu_head *head)
Al Viro0db59e52015-02-21 22:05:11 -0500171{
Al Viro1ef84472019-03-26 01:43:37 +0000172 struct inode *inode = container_of(head, struct inode, i_rcu);
Al Viro0db59e52015-02-21 22:05:11 -0500173 if (S_ISLNK(inode->i_mode))
Al Viro5723cb02015-05-02 10:27:18 -0400174 kfree(inode->i_link);
Al Viro1ef84472019-03-26 01:43:37 +0000175 free_inode_nonrcu(inode);
176}
177
178static void debugfs_destroy_inode(struct inode *inode)
179{
180 call_rcu(&inode->i_rcu, debugfs_i_callback);
Al Viro0db59e52015-02-21 22:05:11 -0500181}
182
Ludwig Nusseld6e48682012-01-25 11:52:28 +0100183static const struct super_operations debugfs_super_operations = {
184 .statfs = simple_statfs,
185 .remount_fs = debugfs_remount,
186 .show_options = debugfs_show_options,
Al Viro1ef84472019-03-26 01:43:37 +0000187 .destroy_inode = debugfs_destroy_inode,
Ludwig Nusseld6e48682012-01-25 11:52:28 +0100188};
189
Nicolai Stangec492dd32017-10-31 00:15:47 +0100190static void debugfs_release_dentry(struct dentry *dentry)
191{
Nicolai Stange5455f7b2017-10-31 00:15:54 +0100192 void *fsd = dentry->d_fsdata;
193
194 if (!((unsigned long)fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT))
195 kfree(dentry->d_fsdata);
Nicolai Stangec492dd32017-10-31 00:15:47 +0100196}
197
Al Viro77b3da62015-01-25 15:10:32 -0500198static struct vfsmount *debugfs_automount(struct path *path)
199{
Eric W. Biedermand3381fa2017-02-01 06:06:16 +1300200 debugfs_automount_t f;
201 f = (debugfs_automount_t)path->dentry->d_fsdata;
202 return f(path->dentry, d_inode(path->dentry)->i_private);
Al Viro77b3da62015-01-25 15:10:32 -0500203}
204
205static const struct dentry_operations debugfs_dops = {
206 .d_delete = always_delete_dentry,
Nicolai Stangec492dd32017-10-31 00:15:47 +0100207 .d_release = debugfs_release_dentry,
Al Viro77b3da62015-01-25 15:10:32 -0500208 .d_automount = debugfs_automount,
209};
210
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211static int debug_fill_super(struct super_block *sb, void *data, int silent)
212{
213 static struct tree_descr debug_files[] = {{""}};
Ludwig Nusseld6e48682012-01-25 11:52:28 +0100214 struct debugfs_fs_info *fsi;
215 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700216
Ludwig Nusseld6e48682012-01-25 11:52:28 +0100217 save_mount_options(sb, data);
218
219 fsi = kzalloc(sizeof(struct debugfs_fs_info), GFP_KERNEL);
220 sb->s_fs_info = fsi;
221 if (!fsi) {
222 err = -ENOMEM;
223 goto fail;
224 }
225
226 err = debugfs_parse_options(data, &fsi->mount_opts);
227 if (err)
228 goto fail;
229
230 err = simple_fill_super(sb, DEBUGFS_MAGIC, debug_files);
231 if (err)
232 goto fail;
233
234 sb->s_op = &debugfs_super_operations;
Al Viro77b3da62015-01-25 15:10:32 -0500235 sb->s_d_op = &debugfs_dops;
Ludwig Nusseld6e48682012-01-25 11:52:28 +0100236
237 debugfs_apply_options(sb);
238
239 return 0;
240
241fail:
242 kfree(fsi);
243 sb->s_fs_info = NULL;
244 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700245}
246
Al Virofc14f2f2010-07-25 01:48:30 +0400247static struct dentry *debug_mount(struct file_system_type *fs_type,
David Howells454e2392006-06-23 02:02:57 -0700248 int flags, const char *dev_name,
Al Virofc14f2f2010-07-25 01:48:30 +0400249 void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700250{
Al Virofc14f2f2010-07-25 01:48:30 +0400251 return mount_single(fs_type, flags, data, debug_fill_super);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700252}
253
254static struct file_system_type debug_fs_type = {
255 .owner = THIS_MODULE,
256 .name = "debugfs",
Al Virofc14f2f2010-07-25 01:48:30 +0400257 .mount = debug_mount,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700258 .kill_sb = kill_litter_super,
259};
Eric W. Biederman7f78e032013-03-02 19:39:14 -0800260MODULE_ALIAS_FS("debugfs");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700261
Al Viro190afd82015-01-25 13:55:55 -0500262static struct dentry *start_creating(const char *name, struct dentry *parent)
Al Viroc3b1a352012-06-09 20:28:22 -0400263{
Al Viro190afd82015-01-25 13:55:55 -0500264 struct dentry *dentry;
Al Viroc3b1a352012-06-09 20:28:22 -0400265 int error;
266
267 pr_debug("debugfs: creating file '%s'\n",name);
268
Greg KHc9e15f22015-03-30 14:59:15 +0200269 if (IS_ERR(parent))
270 return parent;
271
Al Viroc3b1a352012-06-09 20:28:22 -0400272 error = simple_pin_fs(&debug_fs_type, &debugfs_mount,
273 &debugfs_mount_count);
274 if (error)
Al Viro190afd82015-01-25 13:55:55 -0500275 return ERR_PTR(error);
Al Viroc3b1a352012-06-09 20:28:22 -0400276
Al Virocfa57c12012-06-09 20:33:28 -0400277 /* If the parent is not specified, we create it in the root.
Rahul Bedarkar88e412e2014-06-06 23:12:04 +0530278 * We need the root dentry to do this, which is in the super
Al Virocfa57c12012-06-09 20:33:28 -0400279 * block. A pointer to that is in the struct vfsmount that we
280 * have around.
281 */
282 if (!parent)
283 parent = debugfs_mount->mnt_root;
284
Al Viro59551022016-01-22 15:40:57 -0500285 inode_lock(d_inode(parent));
Al Virocfa57c12012-06-09 20:33:28 -0400286 dentry = lookup_one_len(name, parent, strlen(name));
David Howells2b0143b2015-03-17 22:25:59 +0000287 if (!IS_ERR(dentry) && d_really_is_positive(dentry)) {
Al Virocfa57c12012-06-09 20:33:28 -0400288 dput(dentry);
Al Viro190afd82015-01-25 13:55:55 -0500289 dentry = ERR_PTR(-EEXIST);
290 }
Daniel Borkmann0ee96082015-11-05 00:01:51 +0100291
292 if (IS_ERR(dentry)) {
Al Viro59551022016-01-22 15:40:57 -0500293 inode_unlock(d_inode(parent));
Daniel Borkmann0ee96082015-11-05 00:01:51 +0100294 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
295 }
296
Al Viro190afd82015-01-25 13:55:55 -0500297 return dentry;
298}
299
Al Viro5233e312015-01-25 14:39:49 -0500300static struct dentry *failed_creating(struct dentry *dentry)
Al Viro190afd82015-01-25 13:55:55 -0500301{
Al Viro59551022016-01-22 15:40:57 -0500302 inode_unlock(d_inode(dentry->d_parent));
Al Viro190afd82015-01-25 13:55:55 -0500303 dput(dentry);
Al Viro5233e312015-01-25 14:39:49 -0500304 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
305 return NULL;
306}
Al Virocfa57c12012-06-09 20:33:28 -0400307
Al Viro5233e312015-01-25 14:39:49 -0500308static struct dentry *end_creating(struct dentry *dentry)
309{
Al Viro59551022016-01-22 15:40:57 -0500310 inode_unlock(d_inode(dentry->d_parent));
Al Viroc3b1a352012-06-09 20:28:22 -0400311 return dentry;
312}
313
Nicolai Stange49d200d2016-03-22 14:11:14 +0100314static struct dentry *__debugfs_create_file(const char *name, umode_t mode,
315 struct dentry *parent, void *data,
316 const struct file_operations *proxy_fops,
317 const struct file_operations *real_fops)
318{
319 struct dentry *dentry;
320 struct inode *inode;
321
322 if (!(mode & S_IFMT))
323 mode |= S_IFREG;
324 BUG_ON(!S_ISREG(mode));
325 dentry = start_creating(name, parent);
326
Nicolai Stange5455f7b2017-10-31 00:15:54 +0100327 if (IS_ERR(dentry))
Nicolai Stange49d200d2016-03-22 14:11:14 +0100328 return NULL;
329
330 inode = debugfs_get_inode(dentry->d_sb);
Nicolai Stange5455f7b2017-10-31 00:15:54 +0100331 if (unlikely(!inode))
Nicolai Stange49d200d2016-03-22 14:11:14 +0100332 return failed_creating(dentry);
333
334 inode->i_mode = mode;
335 inode->i_private = data;
336
337 inode->i_fop = proxy_fops;
Nicolai Stange5455f7b2017-10-31 00:15:54 +0100338 dentry->d_fsdata = (void *)((unsigned long)real_fops |
339 DEBUGFS_FSDATA_IS_REAL_FOPS_BIT);
Nicolai Stange49d200d2016-03-22 14:11:14 +0100340
341 d_instantiate(dentry, inode);
342 fsnotify_create(d_inode(dentry->d_parent), dentry);
343 return end_creating(dentry);
344}
345
Linus Torvalds1da177e2005-04-16 15:20:36 -0700346/**
347 * debugfs_create_file - create a file in the debugfs filesystem
Linus Torvalds1da177e2005-04-16 15:20:36 -0700348 * @name: a pointer to a string containing the name of the file to create.
Alberto Bertoglibe030e62009-10-31 18:26:52 -0300349 * @mode: the permission that the file should have.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700350 * @parent: a pointer to the parent dentry for this file. This should be a
Masanari Iidae2278672014-02-18 22:54:36 +0900351 * directory dentry if set. If this parameter is NULL, then the
Linus Torvalds1da177e2005-04-16 15:20:36 -0700352 * file will be created in the root of the debugfs filesystem.
353 * @data: a pointer to something that the caller will want to get to later
Theodore Ts'o8e18e292006-09-27 01:50:46 -0700354 * on. The inode.i_private pointer will point to this value on
Linus Torvalds1da177e2005-04-16 15:20:36 -0700355 * the open() call.
356 * @fops: a pointer to a struct file_operations that should be used for
357 * this file.
358 *
359 * This is the basic "create a file" function for debugfs. It allows for a
Alberto Bertoglibe030e62009-10-31 18:26:52 -0300360 * wide range of flexibility in creating a file, or a directory (if you want
361 * to create a directory, the debugfs_create_dir() function is
Linus Torvalds1da177e2005-04-16 15:20:36 -0700362 * recommended to be used instead.)
363 *
364 * This function will return a pointer to a dentry if it succeeds. This
365 * pointer must be passed to the debugfs_remove() function when the file is
366 * to be removed (no automatic cleanup happens if your module is unloaded,
Randy Dunlap6468b3a2006-07-20 08:16:42 -0700367 * you are responsible here.) If an error occurs, %NULL will be returned.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700368 *
Randy Dunlap6468b3a2006-07-20 08:16:42 -0700369 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
Cornelia Huck873760f2007-02-14 07:57:47 +0100370 * returned.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700371 */
Al Virof4ae40a2011-07-24 04:33:43 -0400372struct dentry *debugfs_create_file(const char *name, umode_t mode,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700373 struct dentry *parent, void *data,
Arjan van de Ven99ac48f2006-03-28 01:56:41 -0800374 const struct file_operations *fops)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700375{
Al Viroc3b1a352012-06-09 20:28:22 -0400376
Nicolai Stange49d200d2016-03-22 14:11:14 +0100377 return __debugfs_create_file(name, mode, parent, data,
378 fops ? &debugfs_full_proxy_file_operations :
379 &debugfs_noop_file_operations,
380 fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700381}
382EXPORT_SYMBOL_GPL(debugfs_create_file);
383
Nicolai Stangec6468802016-03-22 14:11:15 +0100384/**
385 * debugfs_create_file_unsafe - create a file in the debugfs filesystem
386 * @name: a pointer to a string containing the name of the file to create.
387 * @mode: the permission that the file should have.
388 * @parent: a pointer to the parent dentry for this file. This should be a
389 * directory dentry if set. If this parameter is NULL, then the
390 * file will be created in the root of the debugfs filesystem.
391 * @data: a pointer to something that the caller will want to get to later
392 * on. The inode.i_private pointer will point to this value on
393 * the open() call.
394 * @fops: a pointer to a struct file_operations that should be used for
395 * this file.
396 *
397 * debugfs_create_file_unsafe() is completely analogous to
398 * debugfs_create_file(), the only difference being that the fops
399 * handed it will not get protected against file removals by the
400 * debugfs core.
401 *
402 * It is your responsibility to protect your struct file_operation
403 * methods against file removals by means of debugfs_use_file_start()
404 * and debugfs_use_file_finish(). ->open() is still protected by
405 * debugfs though.
406 *
407 * Any struct file_operations defined by means of
408 * DEFINE_DEBUGFS_ATTRIBUTE() is protected against file removals and
409 * thus, may be used here.
410 */
Nicolai Stange49d200d2016-03-22 14:11:14 +0100411struct dentry *debugfs_create_file_unsafe(const char *name, umode_t mode,
412 struct dentry *parent, void *data,
413 const struct file_operations *fops)
414{
415
416 return __debugfs_create_file(name, mode, parent, data,
417 fops ? &debugfs_open_proxy_file_operations :
418 &debugfs_noop_file_operations,
419 fops);
420}
Nicolai Stangec6468802016-03-22 14:11:15 +0100421EXPORT_SYMBOL_GPL(debugfs_create_file_unsafe);
Nicolai Stange49d200d2016-03-22 14:11:14 +0100422
Linus Torvalds1da177e2005-04-16 15:20:36 -0700423/**
David Howellse59b4e92015-01-21 20:03:40 +0000424 * debugfs_create_file_size - create a file in the debugfs filesystem
425 * @name: a pointer to a string containing the name of the file to create.
426 * @mode: the permission that the file should have.
427 * @parent: a pointer to the parent dentry for this file. This should be a
428 * directory dentry if set. If this parameter is NULL, then the
429 * file will be created in the root of the debugfs filesystem.
430 * @data: a pointer to something that the caller will want to get to later
431 * on. The inode.i_private pointer will point to this value on
432 * the open() call.
433 * @fops: a pointer to a struct file_operations that should be used for
434 * this file.
435 * @file_size: initial file size
436 *
437 * This is the basic "create a file" function for debugfs. It allows for a
438 * wide range of flexibility in creating a file, or a directory (if you want
439 * to create a directory, the debugfs_create_dir() function is
440 * recommended to be used instead.)
441 *
442 * This function will return a pointer to a dentry if it succeeds. This
443 * pointer must be passed to the debugfs_remove() function when the file is
444 * to be removed (no automatic cleanup happens if your module is unloaded,
445 * you are responsible here.) If an error occurs, %NULL will be returned.
446 *
447 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
448 * returned.
449 */
450struct dentry *debugfs_create_file_size(const char *name, umode_t mode,
451 struct dentry *parent, void *data,
452 const struct file_operations *fops,
453 loff_t file_size)
454{
455 struct dentry *de = debugfs_create_file(name, mode, parent, data, fops);
456
457 if (de)
David Howells2b0143b2015-03-17 22:25:59 +0000458 d_inode(de)->i_size = file_size;
David Howellse59b4e92015-01-21 20:03:40 +0000459 return de;
460}
461EXPORT_SYMBOL_GPL(debugfs_create_file_size);
462
463/**
Linus Torvalds1da177e2005-04-16 15:20:36 -0700464 * debugfs_create_dir - create a directory in the debugfs filesystem
Linus Torvalds1da177e2005-04-16 15:20:36 -0700465 * @name: a pointer to a string containing the name of the directory to
466 * create.
467 * @parent: a pointer to the parent dentry for this file. This should be a
Masanari Iidae2278672014-02-18 22:54:36 +0900468 * directory dentry if set. If this parameter is NULL, then the
Linus Torvalds1da177e2005-04-16 15:20:36 -0700469 * directory will be created in the root of the debugfs filesystem.
470 *
471 * This function creates a directory in debugfs with the given name.
472 *
473 * This function will return a pointer to a dentry if it succeeds. This
474 * pointer must be passed to the debugfs_remove() function when the file is
475 * to be removed (no automatic cleanup happens if your module is unloaded,
Randy Dunlap6468b3a2006-07-20 08:16:42 -0700476 * you are responsible here.) If an error occurs, %NULL will be returned.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700477 *
Randy Dunlap6468b3a2006-07-20 08:16:42 -0700478 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
Cornelia Huck873760f2007-02-14 07:57:47 +0100479 * returned.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700480 */
481struct dentry *debugfs_create_dir(const char *name, struct dentry *parent)
482{
Al Viroad5abd52015-01-25 14:02:31 -0500483 struct dentry *dentry = start_creating(name, parent);
Al Viro680b3022015-01-25 14:31:32 -0500484 struct inode *inode;
Al Viroad5abd52015-01-25 14:02:31 -0500485
486 if (IS_ERR(dentry))
487 return NULL;
488
Al Viroedac65e2015-01-25 14:36:18 -0500489 inode = debugfs_get_inode(dentry->d_sb);
Al Viro680b3022015-01-25 14:31:32 -0500490 if (unlikely(!inode))
Al Viro5233e312015-01-25 14:39:49 -0500491 return failed_creating(dentry);
Al Viro680b3022015-01-25 14:31:32 -0500492
Al Viroedac65e2015-01-25 14:36:18 -0500493 inode->i_mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO;
494 inode->i_op = &simple_dir_inode_operations;
495 inode->i_fop = &simple_dir_operations;
496
497 /* directory inodes start off with i_nlink == 2 (for "." entry) */
498 inc_nlink(inode);
Al Viro680b3022015-01-25 14:31:32 -0500499 d_instantiate(dentry, inode);
David Howells2b0143b2015-03-17 22:25:59 +0000500 inc_nlink(d_inode(dentry->d_parent));
501 fsnotify_mkdir(d_inode(dentry->d_parent), dentry);
Al Viro5233e312015-01-25 14:39:49 -0500502 return end_creating(dentry);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700503}
504EXPORT_SYMBOL_GPL(debugfs_create_dir);
505
506/**
Al Viro77b3da62015-01-25 15:10:32 -0500507 * debugfs_create_automount - create automount point in the debugfs filesystem
508 * @name: a pointer to a string containing the name of the file to create.
509 * @parent: a pointer to the parent dentry for this file. This should be a
510 * directory dentry if set. If this parameter is NULL, then the
511 * file will be created in the root of the debugfs filesystem.
512 * @f: function to be called when pathname resolution steps on that one.
513 * @data: opaque argument to pass to f().
514 *
515 * @f should return what ->d_automount() would.
516 */
517struct dentry *debugfs_create_automount(const char *name,
518 struct dentry *parent,
Eric W. Biedermand3381fa2017-02-01 06:06:16 +1300519 debugfs_automount_t f,
Al Viro77b3da62015-01-25 15:10:32 -0500520 void *data)
521{
522 struct dentry *dentry = start_creating(name, parent);
523 struct inode *inode;
524
525 if (IS_ERR(dentry))
526 return NULL;
527
528 inode = debugfs_get_inode(dentry->d_sb);
529 if (unlikely(!inode))
530 return failed_creating(dentry);
531
Seth Forshee87243de2016-03-09 09:18:07 -0600532 make_empty_dir_inode(inode);
Al Viro77b3da62015-01-25 15:10:32 -0500533 inode->i_flags |= S_AUTOMOUNT;
534 inode->i_private = data;
535 dentry->d_fsdata = (void *)f;
Roman Pena8f324a2016-02-09 11:30:29 +0100536 /* directory inodes start off with i_nlink == 2 (for "." entry) */
537 inc_nlink(inode);
Al Viro77b3da62015-01-25 15:10:32 -0500538 d_instantiate(dentry, inode);
Roman Pena8f324a2016-02-09 11:30:29 +0100539 inc_nlink(d_inode(dentry->d_parent));
540 fsnotify_mkdir(d_inode(dentry->d_parent), dentry);
Al Viro77b3da62015-01-25 15:10:32 -0500541 return end_creating(dentry);
542}
543EXPORT_SYMBOL(debugfs_create_automount);
544
545/**
Peter Oberparleiter66f54962007-02-13 12:13:54 +0100546 * debugfs_create_symlink- create a symbolic link in the debugfs filesystem
547 * @name: a pointer to a string containing the name of the symbolic link to
548 * create.
549 * @parent: a pointer to the parent dentry for this symbolic link. This
Masanari Iidae2278672014-02-18 22:54:36 +0900550 * should be a directory dentry if set. If this parameter is NULL,
Peter Oberparleiter66f54962007-02-13 12:13:54 +0100551 * then the symbolic link will be created in the root of the debugfs
552 * filesystem.
553 * @target: a pointer to a string containing the path to the target of the
554 * symbolic link.
555 *
556 * This function creates a symbolic link with the given name in debugfs that
557 * links to the given target path.
558 *
559 * This function will return a pointer to a dentry if it succeeds. This
560 * pointer must be passed to the debugfs_remove() function when the symbolic
561 * link is to be removed (no automatic cleanup happens if your module is
562 * unloaded, you are responsible here.) If an error occurs, %NULL will be
563 * returned.
564 *
565 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
Cornelia Huck873760f2007-02-14 07:57:47 +0100566 * returned.
Peter Oberparleiter66f54962007-02-13 12:13:54 +0100567 */
568struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent,
569 const char *target)
570{
Al Viroad5abd52015-01-25 14:02:31 -0500571 struct dentry *dentry;
Al Viro680b3022015-01-25 14:31:32 -0500572 struct inode *inode;
573 char *link = kstrdup(target, GFP_KERNEL);
Peter Oberparleiter66f54962007-02-13 12:13:54 +0100574 if (!link)
575 return NULL;
576
Al Viroad5abd52015-01-25 14:02:31 -0500577 dentry = start_creating(name, parent);
Al Viroad5abd52015-01-25 14:02:31 -0500578 if (IS_ERR(dentry)) {
Peter Oberparleiter66f54962007-02-13 12:13:54 +0100579 kfree(link);
Al Viroad5abd52015-01-25 14:02:31 -0500580 return NULL;
581 }
582
Al Viroedac65e2015-01-25 14:36:18 -0500583 inode = debugfs_get_inode(dentry->d_sb);
Al Viro680b3022015-01-25 14:31:32 -0500584 if (unlikely(!inode)) {
Al Viroad5abd52015-01-25 14:02:31 -0500585 kfree(link);
Al Viro5233e312015-01-25 14:39:49 -0500586 return failed_creating(dentry);
Al Viro680b3022015-01-25 14:31:32 -0500587 }
Al Viroedac65e2015-01-25 14:36:18 -0500588 inode->i_mode = S_IFLNK | S_IRWXUGO;
Al Viro5723cb02015-05-02 10:27:18 -0400589 inode->i_op = &simple_symlink_inode_operations;
590 inode->i_link = link;
Al Viro680b3022015-01-25 14:31:32 -0500591 d_instantiate(dentry, inode);
Al Viro5233e312015-01-25 14:39:49 -0500592 return end_creating(dentry);
Peter Oberparleiter66f54962007-02-13 12:13:54 +0100593}
594EXPORT_SYMBOL_GPL(debugfs_create_symlink);
595
Nicolai Stanged1b20632017-10-31 00:15:48 +0100596static void __debugfs_remove_file(struct dentry *dentry, struct dentry *parent)
597{
598 struct debugfs_fsdata *fsd;
599
600 simple_unlink(d_inode(parent), dentry);
601 d_delete(dentry);
Nicolai Stange5455f7b2017-10-31 00:15:54 +0100602
603 /*
604 * Paired with the closing smp_mb() implied by a successful
605 * cmpxchg() in debugfs_file_get(): either
606 * debugfs_file_get() must see a dead dentry or we must see a
607 * debugfs_fsdata instance at ->d_fsdata here (or both).
608 */
609 smp_mb();
610 fsd = READ_ONCE(dentry->d_fsdata);
611 if ((unsigned long)fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT)
612 return;
Nicolai Stanged1b20632017-10-31 00:15:48 +0100613 if (!refcount_dec_and_test(&fsd->active_users))
614 wait_for_completion(&fsd->active_users_drained);
615}
616
Jan Kara25d41d82011-02-07 15:00:27 +0100617static int __debugfs_remove(struct dentry *dentry, struct dentry *parent)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700618{
Mathieu Desnoyers65c33332006-11-24 13:50:09 -0500619 int ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700620
Al Virodc3f4192015-05-18 10:10:34 -0400621 if (simple_positive(dentry)) {
Al Viro0db59e52015-02-21 22:05:11 -0500622 dget(dentry);
Nicolai Stanged1b20632017-10-31 00:15:48 +0100623 if (!d_is_reg(dentry)) {
624 if (d_is_dir(dentry))
625 ret = simple_rmdir(d_inode(parent), dentry);
626 else
627 simple_unlink(d_inode(parent), dentry);
628 if (!ret)
629 d_delete(dentry);
630 } else {
631 __debugfs_remove_file(dentry, parent);
632 }
Al Viro0db59e52015-02-21 22:05:11 -0500633 dput(dentry);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700634 }
Jan Kara25d41d82011-02-07 15:00:27 +0100635 return ret;
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200636}
637
638/**
639 * debugfs_remove - removes a file or directory from the debugfs filesystem
640 * @dentry: a pointer to a the dentry of the file or directory to be
Ulf Magnusson398dc4a2015-09-07 19:03:15 +0200641 * removed. If this parameter is NULL or an error value, nothing
642 * will be done.
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200643 *
644 * This function removes a file or directory in debugfs that was previously
645 * created with a call to another debugfs function (like
646 * debugfs_create_file() or variants thereof.)
647 *
648 * This function is required to be called in order for the file to be
649 * removed, no automatic cleanup of files will happen when a module is
650 * removed, you are responsible here.
651 */
652void debugfs_remove(struct dentry *dentry)
653{
654 struct dentry *parent;
Jan Kara25d41d82011-02-07 15:00:27 +0100655 int ret;
656
Arend van Spriela59d6292012-05-23 15:13:07 +0200657 if (IS_ERR_OR_NULL(dentry))
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200658 return;
659
660 parent = dentry->d_parent;
Al Viro59551022016-01-22 15:40:57 -0500661 inode_lock(d_inode(parent));
Jan Kara25d41d82011-02-07 15:00:27 +0100662 ret = __debugfs_remove(dentry, parent);
Al Viro59551022016-01-22 15:40:57 -0500663 inode_unlock(d_inode(parent));
Jan Kara25d41d82011-02-07 15:00:27 +0100664 if (!ret)
665 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700666}
667EXPORT_SYMBOL_GPL(debugfs_remove);
668
Jan Karacfc94cd2007-05-09 13:19:52 +0200669/**
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200670 * debugfs_remove_recursive - recursively removes a directory
Ulf Magnusson398dc4a2015-09-07 19:03:15 +0200671 * @dentry: a pointer to a the dentry of the directory to be removed. If this
672 * parameter is NULL or an error value, nothing will be done.
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200673 *
674 * This function recursively removes a directory tree in debugfs that
675 * was previously created with a call to another debugfs function
676 * (like debugfs_create_file() or variants thereof.)
677 *
678 * This function is required to be called in order for the file to be
679 * removed, no automatic cleanup of files will happen when a module is
680 * removed, you are responsible here.
681 */
682void debugfs_remove_recursive(struct dentry *dentry)
683{
Steven Rostedt485d4402014-06-09 14:06:07 -0400684 struct dentry *child, *parent;
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200685
Arend van Spriela59d6292012-05-23 15:13:07 +0200686 if (IS_ERR_OR_NULL(dentry))
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200687 return;
688
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200689 parent = dentry;
Oleg Nesterov776164c2013-07-26 17:12:56 +0200690 down:
Al Viro59551022016-01-22 15:40:57 -0500691 inode_lock(d_inode(parent));
Steven Rostedt485d4402014-06-09 14:06:07 -0400692 loop:
693 /*
694 * The parent->d_subdirs is protected by the d_lock. Outside that
695 * lock, the child can be unlinked and set to be freed which can
696 * use the d_u.d_child as the rcu head and corrupt this list.
697 */
698 spin_lock(&parent->d_lock);
Al Viro946e51f2014-10-26 19:19:16 -0400699 list_for_each_entry(child, &parent->d_subdirs, d_child) {
Al Virodc3f4192015-05-18 10:10:34 -0400700 if (!simple_positive(child))
Oleg Nesterov776164c2013-07-26 17:12:56 +0200701 continue;
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200702
Oleg Nesterov776164c2013-07-26 17:12:56 +0200703 /* perhaps simple_empty(child) makes more sense */
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200704 if (!list_empty(&child->d_subdirs)) {
Steven Rostedt485d4402014-06-09 14:06:07 -0400705 spin_unlock(&parent->d_lock);
Al Viro59551022016-01-22 15:40:57 -0500706 inode_unlock(d_inode(parent));
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200707 parent = child;
Oleg Nesterov776164c2013-07-26 17:12:56 +0200708 goto down;
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200709 }
Steven Rostedt485d4402014-06-09 14:06:07 -0400710
711 spin_unlock(&parent->d_lock);
712
Oleg Nesterov776164c2013-07-26 17:12:56 +0200713 if (!__debugfs_remove(child, parent))
714 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
Steven Rostedt485d4402014-06-09 14:06:07 -0400715
716 /*
717 * The parent->d_lock protects agaist child from unlinking
718 * from d_subdirs. When releasing the parent->d_lock we can
719 * no longer trust that the next pointer is valid.
720 * Restart the loop. We'll skip this one with the
Al Virodc3f4192015-05-18 10:10:34 -0400721 * simple_positive() check.
Steven Rostedt485d4402014-06-09 14:06:07 -0400722 */
723 goto loop;
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200724 }
Steven Rostedt485d4402014-06-09 14:06:07 -0400725 spin_unlock(&parent->d_lock);
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200726
Al Viro59551022016-01-22 15:40:57 -0500727 inode_unlock(d_inode(parent));
Oleg Nesterov776164c2013-07-26 17:12:56 +0200728 child = parent;
729 parent = parent->d_parent;
Al Viro59551022016-01-22 15:40:57 -0500730 inode_lock(d_inode(parent));
Oleg Nesterov776164c2013-07-26 17:12:56 +0200731
Steven Rostedt485d4402014-06-09 14:06:07 -0400732 if (child != dentry)
733 /* go up */
734 goto loop;
Oleg Nesterov776164c2013-07-26 17:12:56 +0200735
736 if (!__debugfs_remove(child, parent))
737 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
Al Viro59551022016-01-22 15:40:57 -0500738 inode_unlock(d_inode(parent));
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200739}
740EXPORT_SYMBOL_GPL(debugfs_remove_recursive);
741
742/**
Jan Karacfc94cd2007-05-09 13:19:52 +0200743 * debugfs_rename - rename a file/directory in the debugfs filesystem
744 * @old_dir: a pointer to the parent dentry for the renamed object. This
745 * should be a directory dentry.
746 * @old_dentry: dentry of an object to be renamed.
747 * @new_dir: a pointer to the parent dentry where the object should be
748 * moved. This should be a directory dentry.
749 * @new_name: a pointer to a string containing the target name.
750 *
751 * This function renames a file/directory in debugfs. The target must not
752 * exist for rename to succeed.
753 *
754 * This function will return a pointer to old_dentry (which is updated to
755 * reflect renaming) if it succeeds. If an error occurs, %NULL will be
756 * returned.
757 *
758 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
759 * returned.
760 */
761struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
762 struct dentry *new_dir, const char *new_name)
763{
764 int error;
765 struct dentry *dentry = NULL, *trap;
Al Viroad25f112017-07-07 14:51:19 -0400766 struct name_snapshot old_name;
Jan Karacfc94cd2007-05-09 13:19:52 +0200767
Greg Kroah-Hartmanb0131172019-01-23 11:27:02 +0100768 if (IS_ERR(old_dir))
769 return old_dir;
770 if (IS_ERR(new_dir))
771 return new_dir;
772 if (IS_ERR_OR_NULL(old_dentry))
773 return old_dentry;
774
Jan Karacfc94cd2007-05-09 13:19:52 +0200775 trap = lock_rename(new_dir, old_dir);
776 /* Source or destination directories don't exist? */
David Howells2b0143b2015-03-17 22:25:59 +0000777 if (d_really_is_negative(old_dir) || d_really_is_negative(new_dir))
Jan Karacfc94cd2007-05-09 13:19:52 +0200778 goto exit;
779 /* Source does not exist, cyclic rename, or mountpoint? */
David Howells2b0143b2015-03-17 22:25:59 +0000780 if (d_really_is_negative(old_dentry) || old_dentry == trap ||
Jan Karacfc94cd2007-05-09 13:19:52 +0200781 d_mountpoint(old_dentry))
782 goto exit;
783 dentry = lookup_one_len(new_name, new_dir, strlen(new_name));
784 /* Lookup failed, cyclic rename or target exists? */
David Howells2b0143b2015-03-17 22:25:59 +0000785 if (IS_ERR(dentry) || dentry == trap || d_really_is_positive(dentry))
Jan Karacfc94cd2007-05-09 13:19:52 +0200786 goto exit;
787
Al Viroad25f112017-07-07 14:51:19 -0400788 take_dentry_name_snapshot(&old_name, old_dentry);
Jan Karacfc94cd2007-05-09 13:19:52 +0200789
David Howells2b0143b2015-03-17 22:25:59 +0000790 error = simple_rename(d_inode(old_dir), old_dentry, d_inode(new_dir),
Miklos Szeredie0e0be82016-09-27 11:03:57 +0200791 dentry, 0);
Jan Karacfc94cd2007-05-09 13:19:52 +0200792 if (error) {
Al Viroad25f112017-07-07 14:51:19 -0400793 release_dentry_name_snapshot(&old_name);
Jan Karacfc94cd2007-05-09 13:19:52 +0200794 goto exit;
795 }
796 d_move(old_dentry, dentry);
Al Viroad25f112017-07-07 14:51:19 -0400797 fsnotify_move(d_inode(old_dir), d_inode(new_dir), old_name.name,
David Howellse36cb0b2015-01-29 12:02:35 +0000798 d_is_dir(old_dentry),
Al Viro5a190ae2007-06-07 12:19:32 -0400799 NULL, old_dentry);
Al Viroad25f112017-07-07 14:51:19 -0400800 release_dentry_name_snapshot(&old_name);
Jan Karacfc94cd2007-05-09 13:19:52 +0200801 unlock_rename(new_dir, old_dir);
802 dput(dentry);
803 return old_dentry;
804exit:
805 if (dentry && !IS_ERR(dentry))
806 dput(dentry);
807 unlock_rename(new_dir, old_dir);
808 return NULL;
809}
810EXPORT_SYMBOL_GPL(debugfs_rename);
811
Frederic Weisbeckerc0f92ba2009-03-22 23:10:44 +0100812/**
813 * debugfs_initialized - Tells whether debugfs has been registered
814 */
815bool debugfs_initialized(void)
816{
817 return debugfs_registered;
818}
819EXPORT_SYMBOL_GPL(debugfs_initialized);
820
Linus Torvalds1da177e2005-04-16 15:20:36 -0700821static int __init debugfs_init(void)
822{
823 int retval;
824
Eric W. Biedermanf9bb4882015-05-13 17:35:41 -0500825 retval = sysfs_create_mount_point(kernel_kobj, "debug");
826 if (retval)
827 return retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700828
829 retval = register_filesystem(&debug_fs_type);
830 if (retval)
Eric W. Biedermanf9bb4882015-05-13 17:35:41 -0500831 sysfs_remove_mount_point(kernel_kobj, "debug");
Frederic Weisbeckerc0f92ba2009-03-22 23:10:44 +0100832 else
833 debugfs_registered = true;
834
Linus Torvalds1da177e2005-04-16 15:20:36 -0700835 return retval;
836}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700837core_initcall(debugfs_init);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700838