blob: 61e9a6815a194f1247a293dff3c88d65ae31edd1 [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>
Linus Torvalds1da177e2005-04-16 15:20:36 -070030
Kees Cook82aceae42012-08-27 13:32:15 -070031#define DEBUGFS_DEFAULT_MODE 0700
Ludwig Nusseld6e48682012-01-25 11:52:28 +010032
Linus Torvalds1da177e2005-04-16 15:20:36 -070033static struct vfsmount *debugfs_mount;
34static int debugfs_mount_count;
Frederic Weisbeckerc0f92ba2009-03-22 23:10:44 +010035static bool debugfs_registered;
Linus Torvalds1da177e2005-04-16 15:20:36 -070036
Al Viroedac65e2015-01-25 14:36:18 -050037static struct inode *debugfs_get_inode(struct super_block *sb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070038{
39 struct inode *inode = new_inode(sb);
Linus Torvalds1da177e2005-04-16 15:20:36 -070040 if (inode) {
Christoph Hellwig85fe4022010-10-23 11:19:54 -040041 inode->i_ino = get_next_ino();
Linus Torvalds1da177e2005-04-16 15:20:36 -070042 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
Linus Torvalds1da177e2005-04-16 15:20:36 -070043 }
Rahul Bedarkar88e412e2014-06-06 23:12:04 +053044 return inode;
Linus Torvalds1da177e2005-04-16 15:20:36 -070045}
46
Linus Torvalds1da177e2005-04-16 15:20:36 -070047static inline int debugfs_positive(struct dentry *dentry)
48{
49 return dentry->d_inode && !d_unhashed(dentry);
50}
51
Ludwig Nusseld6e48682012-01-25 11:52:28 +010052struct debugfs_mount_opts {
Eric W. Biederman7dc05882012-04-03 14:01:31 -070053 kuid_t uid;
54 kgid_t gid;
Ludwig Nusseld6e48682012-01-25 11:52:28 +010055 umode_t mode;
56};
57
58enum {
59 Opt_uid,
60 Opt_gid,
61 Opt_mode,
62 Opt_err
63};
64
65static const match_table_t tokens = {
66 {Opt_uid, "uid=%u"},
67 {Opt_gid, "gid=%u"},
68 {Opt_mode, "mode=%o"},
69 {Opt_err, NULL}
70};
71
72struct debugfs_fs_info {
73 struct debugfs_mount_opts mount_opts;
74};
75
76static int debugfs_parse_options(char *data, struct debugfs_mount_opts *opts)
77{
78 substring_t args[MAX_OPT_ARGS];
79 int option;
80 int token;
Eric W. Biederman7dc05882012-04-03 14:01:31 -070081 kuid_t uid;
82 kgid_t gid;
Ludwig Nusseld6e48682012-01-25 11:52:28 +010083 char *p;
84
85 opts->mode = DEBUGFS_DEFAULT_MODE;
86
87 while ((p = strsep(&data, ",")) != NULL) {
88 if (!*p)
89 continue;
90
91 token = match_token(p, tokens, args);
92 switch (token) {
93 case Opt_uid:
94 if (match_int(&args[0], &option))
95 return -EINVAL;
Eric W. Biederman7dc05882012-04-03 14:01:31 -070096 uid = make_kuid(current_user_ns(), option);
97 if (!uid_valid(uid))
98 return -EINVAL;
99 opts->uid = uid;
Ludwig Nusseld6e48682012-01-25 11:52:28 +0100100 break;
101 case Opt_gid:
Dave Reisnerf1688e02013-01-02 08:54:37 -0500102 if (match_int(&args[0], &option))
Ludwig Nusseld6e48682012-01-25 11:52:28 +0100103 return -EINVAL;
Eric W. Biederman7dc05882012-04-03 14:01:31 -0700104 gid = make_kgid(current_user_ns(), option);
105 if (!gid_valid(gid))
106 return -EINVAL;
107 opts->gid = gid;
Ludwig Nusseld6e48682012-01-25 11:52:28 +0100108 break;
109 case Opt_mode:
110 if (match_octal(&args[0], &option))
111 return -EINVAL;
112 opts->mode = option & S_IALLUGO;
113 break;
114 /*
115 * We might like to report bad mount options here;
116 * but traditionally debugfs has ignored all mount options
117 */
118 }
119 }
120
121 return 0;
122}
123
124static int debugfs_apply_options(struct super_block *sb)
125{
126 struct debugfs_fs_info *fsi = sb->s_fs_info;
127 struct inode *inode = sb->s_root->d_inode;
128 struct debugfs_mount_opts *opts = &fsi->mount_opts;
129
130 inode->i_mode &= ~S_IALLUGO;
131 inode->i_mode |= opts->mode;
132
133 inode->i_uid = opts->uid;
134 inode->i_gid = opts->gid;
135
136 return 0;
137}
138
139static int debugfs_remount(struct super_block *sb, int *flags, char *data)
140{
141 int err;
142 struct debugfs_fs_info *fsi = sb->s_fs_info;
143
Theodore Ts'o02b99842014-03-13 10:14:33 -0400144 sync_filesystem(sb);
Ludwig Nusseld6e48682012-01-25 11:52:28 +0100145 err = debugfs_parse_options(data, &fsi->mount_opts);
146 if (err)
147 goto fail;
148
149 debugfs_apply_options(sb);
150
151fail:
152 return err;
153}
154
155static int debugfs_show_options(struct seq_file *m, struct dentry *root)
156{
157 struct debugfs_fs_info *fsi = root->d_sb->s_fs_info;
158 struct debugfs_mount_opts *opts = &fsi->mount_opts;
159
Eric W. Biederman7dc05882012-04-03 14:01:31 -0700160 if (!uid_eq(opts->uid, GLOBAL_ROOT_UID))
161 seq_printf(m, ",uid=%u",
162 from_kuid_munged(&init_user_ns, opts->uid));
163 if (!gid_eq(opts->gid, GLOBAL_ROOT_GID))
164 seq_printf(m, ",gid=%u",
165 from_kgid_munged(&init_user_ns, opts->gid));
Ludwig Nusseld6e48682012-01-25 11:52:28 +0100166 if (opts->mode != DEBUGFS_DEFAULT_MODE)
167 seq_printf(m, ",mode=%o", opts->mode);
168
169 return 0;
170}
171
172static const struct super_operations debugfs_super_operations = {
173 .statfs = simple_statfs,
174 .remount_fs = debugfs_remount,
175 .show_options = debugfs_show_options,
176};
177
Linus Torvalds1da177e2005-04-16 15:20:36 -0700178static int debug_fill_super(struct super_block *sb, void *data, int silent)
179{
180 static struct tree_descr debug_files[] = {{""}};
Ludwig Nusseld6e48682012-01-25 11:52:28 +0100181 struct debugfs_fs_info *fsi;
182 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700183
Ludwig Nusseld6e48682012-01-25 11:52:28 +0100184 save_mount_options(sb, data);
185
186 fsi = kzalloc(sizeof(struct debugfs_fs_info), GFP_KERNEL);
187 sb->s_fs_info = fsi;
188 if (!fsi) {
189 err = -ENOMEM;
190 goto fail;
191 }
192
193 err = debugfs_parse_options(data, &fsi->mount_opts);
194 if (err)
195 goto fail;
196
197 err = simple_fill_super(sb, DEBUGFS_MAGIC, debug_files);
198 if (err)
199 goto fail;
200
201 sb->s_op = &debugfs_super_operations;
202
203 debugfs_apply_options(sb);
204
205 return 0;
206
207fail:
208 kfree(fsi);
209 sb->s_fs_info = NULL;
210 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211}
212
Al Virofc14f2f2010-07-25 01:48:30 +0400213static struct dentry *debug_mount(struct file_system_type *fs_type,
David Howells454e2392006-06-23 02:02:57 -0700214 int flags, const char *dev_name,
Al Virofc14f2f2010-07-25 01:48:30 +0400215 void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700216{
Al Virofc14f2f2010-07-25 01:48:30 +0400217 return mount_single(fs_type, flags, data, debug_fill_super);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700218}
219
220static struct file_system_type debug_fs_type = {
221 .owner = THIS_MODULE,
222 .name = "debugfs",
Al Virofc14f2f2010-07-25 01:48:30 +0400223 .mount = debug_mount,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700224 .kill_sb = kill_litter_super,
225};
Eric W. Biederman7f78e032013-03-02 19:39:14 -0800226MODULE_ALIAS_FS("debugfs");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700227
Al Viro190afd82015-01-25 13:55:55 -0500228static struct dentry *start_creating(const char *name, struct dentry *parent)
Al Viroc3b1a352012-06-09 20:28:22 -0400229{
Al Viro190afd82015-01-25 13:55:55 -0500230 struct dentry *dentry;
Al Viroc3b1a352012-06-09 20:28:22 -0400231 int error;
232
233 pr_debug("debugfs: creating file '%s'\n",name);
234
235 error = simple_pin_fs(&debug_fs_type, &debugfs_mount,
236 &debugfs_mount_count);
237 if (error)
Al Viro190afd82015-01-25 13:55:55 -0500238 return ERR_PTR(error);
Al Viroc3b1a352012-06-09 20:28:22 -0400239
Al Virocfa57c12012-06-09 20:33:28 -0400240 /* If the parent is not specified, we create it in the root.
Rahul Bedarkar88e412e2014-06-06 23:12:04 +0530241 * We need the root dentry to do this, which is in the super
Al Virocfa57c12012-06-09 20:33:28 -0400242 * block. A pointer to that is in the struct vfsmount that we
243 * have around.
244 */
245 if (!parent)
246 parent = debugfs_mount->mnt_root;
247
Al Virocfa57c12012-06-09 20:33:28 -0400248 mutex_lock(&parent->d_inode->i_mutex);
249 dentry = lookup_one_len(name, parent, strlen(name));
Al Viro190afd82015-01-25 13:55:55 -0500250 if (!IS_ERR(dentry) && dentry->d_inode) {
Al Virocfa57c12012-06-09 20:33:28 -0400251 dput(dentry);
Al Viro190afd82015-01-25 13:55:55 -0500252 dentry = ERR_PTR(-EEXIST);
253 }
254 if (IS_ERR(dentry))
255 mutex_unlock(&parent->d_inode->i_mutex);
256 return dentry;
257}
258
259static struct dentry *end_creating(struct dentry *dentry, int error)
260{
261 mutex_unlock(&dentry->d_parent->d_inode->i_mutex);
262 dput(dentry);
Al Virocfa57c12012-06-09 20:33:28 -0400263
Al Viroc3b1a352012-06-09 20:28:22 -0400264 if (error) {
265 dentry = NULL;
266 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
267 }
Al Viroc3b1a352012-06-09 20:28:22 -0400268 return dentry;
269}
270
Linus Torvalds1da177e2005-04-16 15:20:36 -0700271/**
272 * debugfs_create_file - create a file in the debugfs filesystem
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273 * @name: a pointer to a string containing the name of the file to create.
Alberto Bertoglibe030e62009-10-31 18:26:52 -0300274 * @mode: the permission that the file should have.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700275 * @parent: a pointer to the parent dentry for this file. This should be a
Masanari Iidae2278672014-02-18 22:54:36 +0900276 * directory dentry if set. If this parameter is NULL, then the
Linus Torvalds1da177e2005-04-16 15:20:36 -0700277 * file will be created in the root of the debugfs filesystem.
278 * @data: a pointer to something that the caller will want to get to later
Theodore Ts'o8e18e292006-09-27 01:50:46 -0700279 * on. The inode.i_private pointer will point to this value on
Linus Torvalds1da177e2005-04-16 15:20:36 -0700280 * the open() call.
281 * @fops: a pointer to a struct file_operations that should be used for
282 * this file.
283 *
284 * This is the basic "create a file" function for debugfs. It allows for a
Alberto Bertoglibe030e62009-10-31 18:26:52 -0300285 * wide range of flexibility in creating a file, or a directory (if you want
286 * to create a directory, the debugfs_create_dir() function is
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287 * recommended to be used instead.)
288 *
289 * This function will return a pointer to a dentry if it succeeds. This
290 * pointer must be passed to the debugfs_remove() function when the file is
291 * to be removed (no automatic cleanup happens if your module is unloaded,
Randy Dunlap6468b3a2006-07-20 08:16:42 -0700292 * you are responsible here.) If an error occurs, %NULL will be returned.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700293 *
Randy Dunlap6468b3a2006-07-20 08:16:42 -0700294 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
Cornelia Huck873760f2007-02-14 07:57:47 +0100295 * returned.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296 */
Al Virof4ae40a2011-07-24 04:33:43 -0400297struct dentry *debugfs_create_file(const char *name, umode_t mode,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700298 struct dentry *parent, void *data,
Arjan van de Ven99ac48f2006-03-28 01:56:41 -0800299 const struct file_operations *fops)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700300{
Al Viroad5abd52015-01-25 14:02:31 -0500301 struct dentry *dentry;
Al Viro680b3022015-01-25 14:31:32 -0500302 struct inode *inode;
Al Viroc3b1a352012-06-09 20:28:22 -0400303
Al Viroad5abd52015-01-25 14:02:31 -0500304 if (!(mode & S_IFMT))
305 mode |= S_IFREG;
306 BUG_ON(!S_ISREG(mode));
307 dentry = start_creating(name, parent);
308
309 if (IS_ERR(dentry))
310 return NULL;
311
Al Viroedac65e2015-01-25 14:36:18 -0500312 inode = debugfs_get_inode(dentry->d_sb);
Al Viro680b3022015-01-25 14:31:32 -0500313 if (unlikely(!inode))
314 return end_creating(dentry, -ENOMEM);
315
Al Viroedac65e2015-01-25 14:36:18 -0500316 inode->i_mode = mode;
317 inode->i_fop = fops ? fops : &debugfs_file_operations;
318 inode->i_private = data;
Al Viro680b3022015-01-25 14:31:32 -0500319 d_instantiate(dentry, inode);
320 dget(dentry);
321 fsnotify_create(dentry->d_parent->d_inode, dentry);
322 return end_creating(dentry, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700323}
324EXPORT_SYMBOL_GPL(debugfs_create_file);
325
326/**
327 * debugfs_create_dir - create a directory in the debugfs filesystem
Linus Torvalds1da177e2005-04-16 15:20:36 -0700328 * @name: a pointer to a string containing the name of the directory to
329 * create.
330 * @parent: a pointer to the parent dentry for this file. This should be a
Masanari Iidae2278672014-02-18 22:54:36 +0900331 * directory dentry if set. If this parameter is NULL, then the
Linus Torvalds1da177e2005-04-16 15:20:36 -0700332 * directory will be created in the root of the debugfs filesystem.
333 *
334 * This function creates a directory in debugfs with the given name.
335 *
336 * This function will return a pointer to a dentry if it succeeds. This
337 * pointer must be passed to the debugfs_remove() function when the file is
338 * to be removed (no automatic cleanup happens if your module is unloaded,
Randy Dunlap6468b3a2006-07-20 08:16:42 -0700339 * you are responsible here.) If an error occurs, %NULL will be returned.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700340 *
Randy Dunlap6468b3a2006-07-20 08:16:42 -0700341 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
Cornelia Huck873760f2007-02-14 07:57:47 +0100342 * returned.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700343 */
344struct dentry *debugfs_create_dir(const char *name, struct dentry *parent)
345{
Al Viroad5abd52015-01-25 14:02:31 -0500346 struct dentry *dentry = start_creating(name, parent);
Al Viro680b3022015-01-25 14:31:32 -0500347 struct inode *inode;
Al Viroad5abd52015-01-25 14:02:31 -0500348
349 if (IS_ERR(dentry))
350 return NULL;
351
Al Viroedac65e2015-01-25 14:36:18 -0500352 inode = debugfs_get_inode(dentry->d_sb);
Al Viro680b3022015-01-25 14:31:32 -0500353 if (unlikely(!inode))
354 return end_creating(dentry, -ENOMEM);
355
Al Viroedac65e2015-01-25 14:36:18 -0500356 inode->i_mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO;
357 inode->i_op = &simple_dir_inode_operations;
358 inode->i_fop = &simple_dir_operations;
359
360 /* directory inodes start off with i_nlink == 2 (for "." entry) */
361 inc_nlink(inode);
Al Viro680b3022015-01-25 14:31:32 -0500362 d_instantiate(dentry, inode);
363 dget(dentry);
364 inc_nlink(dentry->d_parent->d_inode);
365 fsnotify_mkdir(dentry->d_parent->d_inode, dentry);
366 return end_creating(dentry, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700367}
368EXPORT_SYMBOL_GPL(debugfs_create_dir);
369
370/**
Peter Oberparleiter66f54962007-02-13 12:13:54 +0100371 * debugfs_create_symlink- create a symbolic link in the debugfs filesystem
372 * @name: a pointer to a string containing the name of the symbolic link to
373 * create.
374 * @parent: a pointer to the parent dentry for this symbolic link. This
Masanari Iidae2278672014-02-18 22:54:36 +0900375 * should be a directory dentry if set. If this parameter is NULL,
Peter Oberparleiter66f54962007-02-13 12:13:54 +0100376 * then the symbolic link will be created in the root of the debugfs
377 * filesystem.
378 * @target: a pointer to a string containing the path to the target of the
379 * symbolic link.
380 *
381 * This function creates a symbolic link with the given name in debugfs that
382 * links to the given target path.
383 *
384 * This function will return a pointer to a dentry if it succeeds. This
385 * pointer must be passed to the debugfs_remove() function when the symbolic
386 * link is to be removed (no automatic cleanup happens if your module is
387 * unloaded, you are responsible here.) If an error occurs, %NULL will be
388 * returned.
389 *
390 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
Cornelia Huck873760f2007-02-14 07:57:47 +0100391 * returned.
Peter Oberparleiter66f54962007-02-13 12:13:54 +0100392 */
393struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent,
394 const char *target)
395{
Al Viroad5abd52015-01-25 14:02:31 -0500396 struct dentry *dentry;
Al Viro680b3022015-01-25 14:31:32 -0500397 struct inode *inode;
398 char *link = kstrdup(target, GFP_KERNEL);
Peter Oberparleiter66f54962007-02-13 12:13:54 +0100399 if (!link)
400 return NULL;
401
Al Viroad5abd52015-01-25 14:02:31 -0500402 dentry = start_creating(name, parent);
Al Viroad5abd52015-01-25 14:02:31 -0500403 if (IS_ERR(dentry)) {
Peter Oberparleiter66f54962007-02-13 12:13:54 +0100404 kfree(link);
Al Viroad5abd52015-01-25 14:02:31 -0500405 return NULL;
406 }
407
Al Viroedac65e2015-01-25 14:36:18 -0500408 inode = debugfs_get_inode(dentry->d_sb);
Al Viro680b3022015-01-25 14:31:32 -0500409 if (unlikely(!inode)) {
Al Viroad5abd52015-01-25 14:02:31 -0500410 kfree(link);
Al Viro680b3022015-01-25 14:31:32 -0500411 return end_creating(dentry, -ENOMEM);
412 }
Al Viroedac65e2015-01-25 14:36:18 -0500413 inode->i_mode = S_IFLNK | S_IRWXUGO;
414 inode->i_op = &debugfs_link_operations;
415 inode->i_private = link;
Al Viro680b3022015-01-25 14:31:32 -0500416 d_instantiate(dentry, inode);
417 dget(dentry);
418 return end_creating(dentry, 0);
Peter Oberparleiter66f54962007-02-13 12:13:54 +0100419}
420EXPORT_SYMBOL_GPL(debugfs_create_symlink);
421
Jan Kara25d41d82011-02-07 15:00:27 +0100422static int __debugfs_remove(struct dentry *dentry, struct dentry *parent)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700423{
Mathieu Desnoyers65c33332006-11-24 13:50:09 -0500424 int ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700425
Linus Torvalds1da177e2005-04-16 15:20:36 -0700426 if (debugfs_positive(dentry)) {
427 if (dentry->d_inode) {
Mathieu Desnoyers29a7f3a2006-11-24 13:51:14 -0500428 dget(dentry);
Peter Oberparleiter66f54962007-02-13 12:13:54 +0100429 switch (dentry->d_inode->i_mode & S_IFMT) {
430 case S_IFDIR:
Mathieu Desnoyers65c33332006-11-24 13:50:09 -0500431 ret = simple_rmdir(parent->d_inode, dentry);
Peter Oberparleiter66f54962007-02-13 12:13:54 +0100432 break;
433 case S_IFLNK:
434 kfree(dentry->d_inode->i_private);
435 /* fall through */
436 default:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700437 simple_unlink(parent->d_inode, dentry);
Peter Oberparleiter66f54962007-02-13 12:13:54 +0100438 break;
439 }
Mathieu Desnoyers29a7f3a2006-11-24 13:51:14 -0500440 if (!ret)
441 d_delete(dentry);
442 dput(dentry);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700443 }
444 }
Jan Kara25d41d82011-02-07 15:00:27 +0100445 return ret;
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200446}
447
448/**
449 * debugfs_remove - removes a file or directory from the debugfs filesystem
450 * @dentry: a pointer to a the dentry of the file or directory to be
451 * removed.
452 *
453 * This function removes a file or directory in debugfs that was previously
454 * created with a call to another debugfs function (like
455 * debugfs_create_file() or variants thereof.)
456 *
457 * This function is required to be called in order for the file to be
458 * removed, no automatic cleanup of files will happen when a module is
459 * removed, you are responsible here.
460 */
461void debugfs_remove(struct dentry *dentry)
462{
463 struct dentry *parent;
Jan Kara25d41d82011-02-07 15:00:27 +0100464 int ret;
465
Arend van Spriela59d6292012-05-23 15:13:07 +0200466 if (IS_ERR_OR_NULL(dentry))
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200467 return;
468
469 parent = dentry->d_parent;
470 if (!parent || !parent->d_inode)
471 return;
472
473 mutex_lock(&parent->d_inode->i_mutex);
Jan Kara25d41d82011-02-07 15:00:27 +0100474 ret = __debugfs_remove(dentry, parent);
Jes Sorensen1b1dcc12006-01-09 15:59:24 -0800475 mutex_unlock(&parent->d_inode->i_mutex);
Jan Kara25d41d82011-02-07 15:00:27 +0100476 if (!ret)
477 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700478}
479EXPORT_SYMBOL_GPL(debugfs_remove);
480
Jan Karacfc94cd2007-05-09 13:19:52 +0200481/**
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200482 * debugfs_remove_recursive - recursively removes a directory
483 * @dentry: a pointer to a the dentry of the directory to be removed.
484 *
485 * This function recursively removes a directory tree in debugfs that
486 * was previously created with a call to another debugfs function
487 * (like debugfs_create_file() or variants thereof.)
488 *
489 * This function is required to be called in order for the file to be
490 * removed, no automatic cleanup of files will happen when a module is
491 * removed, you are responsible here.
492 */
493void debugfs_remove_recursive(struct dentry *dentry)
494{
Steven Rostedt485d4402014-06-09 14:06:07 -0400495 struct dentry *child, *parent;
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200496
Arend van Spriela59d6292012-05-23 15:13:07 +0200497 if (IS_ERR_OR_NULL(dentry))
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200498 return;
499
500 parent = dentry->d_parent;
501 if (!parent || !parent->d_inode)
502 return;
503
504 parent = dentry;
Oleg Nesterov776164c2013-07-26 17:12:56 +0200505 down:
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200506 mutex_lock(&parent->d_inode->i_mutex);
Steven Rostedt485d4402014-06-09 14:06:07 -0400507 loop:
508 /*
509 * The parent->d_subdirs is protected by the d_lock. Outside that
510 * lock, the child can be unlinked and set to be freed which can
511 * use the d_u.d_child as the rcu head and corrupt this list.
512 */
513 spin_lock(&parent->d_lock);
Al Viro946e51f2014-10-26 19:19:16 -0400514 list_for_each_entry(child, &parent->d_subdirs, d_child) {
Oleg Nesterov776164c2013-07-26 17:12:56 +0200515 if (!debugfs_positive(child))
516 continue;
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200517
Oleg Nesterov776164c2013-07-26 17:12:56 +0200518 /* perhaps simple_empty(child) makes more sense */
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200519 if (!list_empty(&child->d_subdirs)) {
Steven Rostedt485d4402014-06-09 14:06:07 -0400520 spin_unlock(&parent->d_lock);
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200521 mutex_unlock(&parent->d_inode->i_mutex);
522 parent = child;
Oleg Nesterov776164c2013-07-26 17:12:56 +0200523 goto down;
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200524 }
Steven Rostedt485d4402014-06-09 14:06:07 -0400525
526 spin_unlock(&parent->d_lock);
527
Oleg Nesterov776164c2013-07-26 17:12:56 +0200528 if (!__debugfs_remove(child, parent))
529 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
Steven Rostedt485d4402014-06-09 14:06:07 -0400530
531 /*
532 * The parent->d_lock protects agaist child from unlinking
533 * from d_subdirs. When releasing the parent->d_lock we can
534 * no longer trust that the next pointer is valid.
535 * Restart the loop. We'll skip this one with the
536 * debugfs_positive() check.
537 */
538 goto loop;
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200539 }
Steven Rostedt485d4402014-06-09 14:06:07 -0400540 spin_unlock(&parent->d_lock);
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200541
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200542 mutex_unlock(&parent->d_inode->i_mutex);
Oleg Nesterov776164c2013-07-26 17:12:56 +0200543 child = parent;
544 parent = parent->d_parent;
545 mutex_lock(&parent->d_inode->i_mutex);
546
Steven Rostedt485d4402014-06-09 14:06:07 -0400547 if (child != dentry)
548 /* go up */
549 goto loop;
Oleg Nesterov776164c2013-07-26 17:12:56 +0200550
551 if (!__debugfs_remove(child, parent))
552 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
553 mutex_unlock(&parent->d_inode->i_mutex);
Haavard Skinnemoen9505e632008-07-01 15:14:51 +0200554}
555EXPORT_SYMBOL_GPL(debugfs_remove_recursive);
556
557/**
Jan Karacfc94cd2007-05-09 13:19:52 +0200558 * debugfs_rename - rename a file/directory in the debugfs filesystem
559 * @old_dir: a pointer to the parent dentry for the renamed object. This
560 * should be a directory dentry.
561 * @old_dentry: dentry of an object to be renamed.
562 * @new_dir: a pointer to the parent dentry where the object should be
563 * moved. This should be a directory dentry.
564 * @new_name: a pointer to a string containing the target name.
565 *
566 * This function renames a file/directory in debugfs. The target must not
567 * exist for rename to succeed.
568 *
569 * This function will return a pointer to old_dentry (which is updated to
570 * reflect renaming) if it succeeds. If an error occurs, %NULL will be
571 * returned.
572 *
573 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
574 * returned.
575 */
576struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
577 struct dentry *new_dir, const char *new_name)
578{
579 int error;
580 struct dentry *dentry = NULL, *trap;
581 const char *old_name;
582
583 trap = lock_rename(new_dir, old_dir);
584 /* Source or destination directories don't exist? */
585 if (!old_dir->d_inode || !new_dir->d_inode)
586 goto exit;
587 /* Source does not exist, cyclic rename, or mountpoint? */
588 if (!old_dentry->d_inode || old_dentry == trap ||
589 d_mountpoint(old_dentry))
590 goto exit;
591 dentry = lookup_one_len(new_name, new_dir, strlen(new_name));
592 /* Lookup failed, cyclic rename or target exists? */
593 if (IS_ERR(dentry) || dentry == trap || dentry->d_inode)
594 goto exit;
595
596 old_name = fsnotify_oldname_init(old_dentry->d_name.name);
597
598 error = simple_rename(old_dir->d_inode, old_dentry, new_dir->d_inode,
599 dentry);
600 if (error) {
601 fsnotify_oldname_free(old_name);
602 goto exit;
603 }
604 d_move(old_dentry, dentry);
605 fsnotify_move(old_dir->d_inode, new_dir->d_inode, old_name,
Al Viro123df292009-12-25 04:57:57 -0500606 S_ISDIR(old_dentry->d_inode->i_mode),
Al Viro5a190ae2007-06-07 12:19:32 -0400607 NULL, old_dentry);
Jan Karacfc94cd2007-05-09 13:19:52 +0200608 fsnotify_oldname_free(old_name);
609 unlock_rename(new_dir, old_dir);
610 dput(dentry);
611 return old_dentry;
612exit:
613 if (dentry && !IS_ERR(dentry))
614 dput(dentry);
615 unlock_rename(new_dir, old_dir);
616 return NULL;
617}
618EXPORT_SYMBOL_GPL(debugfs_rename);
619
Frederic Weisbeckerc0f92ba2009-03-22 23:10:44 +0100620/**
621 * debugfs_initialized - Tells whether debugfs has been registered
622 */
623bool debugfs_initialized(void)
624{
625 return debugfs_registered;
626}
627EXPORT_SYMBOL_GPL(debugfs_initialized);
628
629
Greg Kroah-Hartman191e1862007-10-29 20:13:17 +0100630static struct kobject *debug_kobj;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700631
632static int __init debugfs_init(void)
633{
634 int retval;
635
Greg Kroah-Hartman0ff21e42007-11-06 10:36:58 -0800636 debug_kobj = kobject_create_and_add("debug", kernel_kobj);
Greg Kroah-Hartman191e1862007-10-29 20:13:17 +0100637 if (!debug_kobj)
638 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700639
640 retval = register_filesystem(&debug_fs_type);
641 if (retval)
Greg Kroah-Hartman197b12d2007-12-20 08:13:05 -0800642 kobject_put(debug_kobj);
Frederic Weisbeckerc0f92ba2009-03-22 23:10:44 +0100643 else
644 debugfs_registered = true;
645
Linus Torvalds1da177e2005-04-16 15:20:36 -0700646 return retval;
647}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648core_initcall(debugfs_init);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700649