Merge git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[wrt350n-kernel.git] / fs / debugfs / inode.c
blob525e1ae9d8304f842907c24d204d3ca4e6200d52
1 /*
2 * file.c - part of debugfs, a tiny little debug file system
4 * Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com>
5 * Copyright (C) 2004 IBM Inc.
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.
11 * debugfs is for people to use instead of /proc or /sys.
12 * See Documentation/DocBook/kernel-api for more details.
16 /* uncomment to get debug messages from the debug filesystem, ah the irony. */
17 /* #define DEBUG */
19 #include <linux/module.h>
20 #include <linux/fs.h>
21 #include <linux/mount.h>
22 #include <linux/pagemap.h>
23 #include <linux/init.h>
24 #include <linux/kobject.h>
25 #include <linux/namei.h>
26 #include <linux/debugfs.h>
27 #include <linux/fsnotify.h>
28 #include <linux/string.h>
30 #define DEBUGFS_MAGIC 0x64626720
32 <<<<<<< HEAD:fs/debugfs/inode.c
33 /* declared over in file.c */
34 extern struct file_operations debugfs_file_operations;
35 extern struct inode_operations debugfs_link_operations;
37 =======
38 >>>>>>> 264e3e889d86e552b4191d69bb60f4f3b383135a:fs/debugfs/inode.c
39 static struct vfsmount *debugfs_mount;
40 static int debugfs_mount_count;
42 static struct inode *debugfs_get_inode(struct super_block *sb, int mode, dev_t dev)
44 struct inode *inode = new_inode(sb);
46 if (inode) {
47 inode->i_mode = mode;
48 inode->i_uid = 0;
49 inode->i_gid = 0;
50 inode->i_blocks = 0;
51 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
52 switch (mode & S_IFMT) {
53 default:
54 init_special_inode(inode, mode, dev);
55 break;
56 case S_IFREG:
57 inode->i_fop = &debugfs_file_operations;
58 break;
59 case S_IFLNK:
60 inode->i_op = &debugfs_link_operations;
61 break;
62 case S_IFDIR:
63 inode->i_op = &simple_dir_inode_operations;
64 inode->i_fop = &simple_dir_operations;
66 /* directory inodes start off with i_nlink == 2
67 * (for "." entry) */
68 inc_nlink(inode);
69 break;
72 return inode;
75 /* SMP-safe */
76 static int debugfs_mknod(struct inode *dir, struct dentry *dentry,
77 int mode, dev_t dev)
79 struct inode *inode;
80 int error = -EPERM;
82 if (dentry->d_inode)
83 return -EEXIST;
85 inode = debugfs_get_inode(dir->i_sb, mode, dev);
86 if (inode) {
87 d_instantiate(dentry, inode);
88 dget(dentry);
89 error = 0;
91 return error;
94 static int debugfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
96 int res;
98 mode = (mode & (S_IRWXUGO | S_ISVTX)) | S_IFDIR;
99 res = debugfs_mknod(dir, dentry, mode, 0);
100 if (!res) {
101 inc_nlink(dir);
102 fsnotify_mkdir(dir, dentry);
104 return res;
107 static int debugfs_link(struct inode *dir, struct dentry *dentry, int mode)
109 mode = (mode & S_IALLUGO) | S_IFLNK;
110 return debugfs_mknod(dir, dentry, mode, 0);
113 static int debugfs_create(struct inode *dir, struct dentry *dentry, int mode)
115 int res;
117 mode = (mode & S_IALLUGO) | S_IFREG;
118 res = debugfs_mknod(dir, dentry, mode, 0);
119 if (!res)
120 fsnotify_create(dir, dentry);
121 return res;
124 static inline int debugfs_positive(struct dentry *dentry)
126 return dentry->d_inode && !d_unhashed(dentry);
129 static int debug_fill_super(struct super_block *sb, void *data, int silent)
131 static struct tree_descr debug_files[] = {{""}};
133 return simple_fill_super(sb, DEBUGFS_MAGIC, debug_files);
136 static int debug_get_sb(struct file_system_type *fs_type,
137 int flags, const char *dev_name,
138 void *data, struct vfsmount *mnt)
140 return get_sb_single(fs_type, flags, data, debug_fill_super, mnt);
143 static struct file_system_type debug_fs_type = {
144 .owner = THIS_MODULE,
145 .name = "debugfs",
146 .get_sb = debug_get_sb,
147 .kill_sb = kill_litter_super,
150 static int debugfs_create_by_name(const char *name, mode_t mode,
151 struct dentry *parent,
152 struct dentry **dentry)
154 int error = 0;
156 /* If the parent is not specified, we create it in the root.
157 * We need the root dentry to do this, which is in the super
158 * block. A pointer to that is in the struct vfsmount that we
159 * have around.
161 if (!parent) {
162 if (debugfs_mount && debugfs_mount->mnt_sb) {
163 parent = debugfs_mount->mnt_sb->s_root;
166 if (!parent) {
167 pr_debug("debugfs: Ah! can not find a parent!\n");
168 return -EFAULT;
171 *dentry = NULL;
172 mutex_lock(&parent->d_inode->i_mutex);
173 *dentry = lookup_one_len(name, parent, strlen(name));
174 if (!IS_ERR(*dentry)) {
175 switch (mode & S_IFMT) {
176 case S_IFDIR:
177 error = debugfs_mkdir(parent->d_inode, *dentry, mode);
178 break;
179 case S_IFLNK:
180 error = debugfs_link(parent->d_inode, *dentry, mode);
181 break;
182 default:
183 error = debugfs_create(parent->d_inode, *dentry, mode);
184 break;
186 dput(*dentry);
187 } else
188 error = PTR_ERR(*dentry);
189 mutex_unlock(&parent->d_inode->i_mutex);
191 return error;
195 * debugfs_create_file - create a file in the debugfs filesystem
196 * @name: a pointer to a string containing the name of the file to create.
197 * @mode: the permission that the file should have
198 * @parent: a pointer to the parent dentry for this file. This should be a
199 * directory dentry if set. If this paramater is NULL, then the
200 * file will be created in the root of the debugfs filesystem.
201 * @data: a pointer to something that the caller will want to get to later
202 * on. The inode.i_private pointer will point to this value on
203 * the open() call.
204 * @fops: a pointer to a struct file_operations that should be used for
205 * this file.
207 * This is the basic "create a file" function for debugfs. It allows for a
208 * wide range of flexibility in createing a file, or a directory (if you
209 * want to create a directory, the debugfs_create_dir() function is
210 * recommended to be used instead.)
212 * This function will return a pointer to a dentry if it succeeds. This
213 * pointer must be passed to the debugfs_remove() function when the file is
214 * to be removed (no automatic cleanup happens if your module is unloaded,
215 * you are responsible here.) If an error occurs, %NULL will be returned.
217 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
218 * returned.
220 struct dentry *debugfs_create_file(const char *name, mode_t mode,
221 struct dentry *parent, void *data,
222 const struct file_operations *fops)
224 struct dentry *dentry = NULL;
225 int error;
227 pr_debug("debugfs: creating file '%s'\n",name);
229 error = simple_pin_fs(&debug_fs_type, &debugfs_mount,
230 &debugfs_mount_count);
231 if (error)
232 goto exit;
234 error = debugfs_create_by_name(name, mode, parent, &dentry);
235 if (error) {
236 dentry = NULL;
237 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
238 goto exit;
241 if (dentry->d_inode) {
242 if (data)
243 dentry->d_inode->i_private = data;
244 if (fops)
245 dentry->d_inode->i_fop = fops;
247 exit:
248 return dentry;
250 EXPORT_SYMBOL_GPL(debugfs_create_file);
253 * debugfs_create_dir - create a directory in the debugfs filesystem
254 * @name: a pointer to a string containing the name of the directory to
255 * create.
256 * @parent: a pointer to the parent dentry for this file. This should be a
257 * directory dentry if set. If this paramater is NULL, then the
258 * directory will be created in the root of the debugfs filesystem.
260 * This function creates a directory in debugfs with the given name.
262 * This function will return a pointer to a dentry if it succeeds. This
263 * pointer must be passed to the debugfs_remove() function when the file is
264 * to be removed (no automatic cleanup happens if your module is unloaded,
265 * you are responsible here.) If an error occurs, %NULL will be returned.
267 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
268 * returned.
270 struct dentry *debugfs_create_dir(const char *name, struct dentry *parent)
272 return debugfs_create_file(name,
273 S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO,
274 parent, NULL, NULL);
276 EXPORT_SYMBOL_GPL(debugfs_create_dir);
279 * debugfs_create_symlink- create a symbolic link in the debugfs filesystem
280 * @name: a pointer to a string containing the name of the symbolic link to
281 * create.
282 * @parent: a pointer to the parent dentry for this symbolic link. This
283 * should be a directory dentry if set. If this paramater is NULL,
284 * then the symbolic link will be created in the root of the debugfs
285 * filesystem.
286 * @target: a pointer to a string containing the path to the target of the
287 * symbolic link.
289 * This function creates a symbolic link with the given name in debugfs that
290 * links to the given target path.
292 * This function will return a pointer to a dentry if it succeeds. This
293 * pointer must be passed to the debugfs_remove() function when the symbolic
294 * link is to be removed (no automatic cleanup happens if your module is
295 * unloaded, you are responsible here.) If an error occurs, %NULL will be
296 * returned.
298 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
299 * returned.
301 struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent,
302 const char *target)
304 struct dentry *result;
305 char *link;
307 link = kstrdup(target, GFP_KERNEL);
308 if (!link)
309 return NULL;
311 result = debugfs_create_file(name, S_IFLNK | S_IRWXUGO, parent, link,
312 NULL);
313 if (!result)
314 kfree(link);
315 return result;
317 EXPORT_SYMBOL_GPL(debugfs_create_symlink);
320 * debugfs_remove - removes a file or directory from the debugfs filesystem
321 * @dentry: a pointer to a the dentry of the file or directory to be
322 * removed.
324 * This function removes a file or directory in debugfs that was previously
325 * created with a call to another debugfs function (like
326 * debugfs_create_file() or variants thereof.)
328 * This function is required to be called in order for the file to be
329 * removed, no automatic cleanup of files will happen when a module is
330 * removed, you are responsible here.
332 void debugfs_remove(struct dentry *dentry)
334 struct dentry *parent;
335 int ret = 0;
337 if (!dentry)
338 return;
340 parent = dentry->d_parent;
341 if (!parent || !parent->d_inode)
342 return;
344 mutex_lock(&parent->d_inode->i_mutex);
345 if (debugfs_positive(dentry)) {
346 if (dentry->d_inode) {
347 dget(dentry);
348 switch (dentry->d_inode->i_mode & S_IFMT) {
349 case S_IFDIR:
350 ret = simple_rmdir(parent->d_inode, dentry);
351 break;
352 case S_IFLNK:
353 kfree(dentry->d_inode->i_private);
354 /* fall through */
355 default:
356 simple_unlink(parent->d_inode, dentry);
357 break;
359 if (!ret)
360 d_delete(dentry);
361 dput(dentry);
364 mutex_unlock(&parent->d_inode->i_mutex);
365 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
367 EXPORT_SYMBOL_GPL(debugfs_remove);
370 * debugfs_rename - rename a file/directory in the debugfs filesystem
371 * @old_dir: a pointer to the parent dentry for the renamed object. This
372 * should be a directory dentry.
373 * @old_dentry: dentry of an object to be renamed.
374 * @new_dir: a pointer to the parent dentry where the object should be
375 * moved. This should be a directory dentry.
376 * @new_name: a pointer to a string containing the target name.
378 * This function renames a file/directory in debugfs. The target must not
379 * exist for rename to succeed.
381 * This function will return a pointer to old_dentry (which is updated to
382 * reflect renaming) if it succeeds. If an error occurs, %NULL will be
383 * returned.
385 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
386 * returned.
388 struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
389 struct dentry *new_dir, const char *new_name)
391 int error;
392 struct dentry *dentry = NULL, *trap;
393 const char *old_name;
395 trap = lock_rename(new_dir, old_dir);
396 /* Source or destination directories don't exist? */
397 if (!old_dir->d_inode || !new_dir->d_inode)
398 goto exit;
399 /* Source does not exist, cyclic rename, or mountpoint? */
400 if (!old_dentry->d_inode || old_dentry == trap ||
401 d_mountpoint(old_dentry))
402 goto exit;
403 dentry = lookup_one_len(new_name, new_dir, strlen(new_name));
404 /* Lookup failed, cyclic rename or target exists? */
405 if (IS_ERR(dentry) || dentry == trap || dentry->d_inode)
406 goto exit;
408 old_name = fsnotify_oldname_init(old_dentry->d_name.name);
410 error = simple_rename(old_dir->d_inode, old_dentry, new_dir->d_inode,
411 dentry);
412 if (error) {
413 fsnotify_oldname_free(old_name);
414 goto exit;
416 d_move(old_dentry, dentry);
417 fsnotify_move(old_dir->d_inode, new_dir->d_inode, old_name,
418 old_dentry->d_name.name, S_ISDIR(old_dentry->d_inode->i_mode),
419 NULL, old_dentry);
420 fsnotify_oldname_free(old_name);
421 unlock_rename(new_dir, old_dir);
422 dput(dentry);
423 return old_dentry;
424 exit:
425 if (dentry && !IS_ERR(dentry))
426 dput(dentry);
427 unlock_rename(new_dir, old_dir);
428 return NULL;
430 EXPORT_SYMBOL_GPL(debugfs_rename);
432 static struct kobject *debug_kobj;
434 static int __init debugfs_init(void)
436 int retval;
438 debug_kobj = kobject_create_and_add("debug", kernel_kobj);
439 if (!debug_kobj)
440 return -EINVAL;
442 retval = register_filesystem(&debug_fs_type);
443 if (retval)
444 kobject_put(debug_kobj);
445 return retval;
448 static void __exit debugfs_exit(void)
450 simple_release_fs(&debugfs_mount, &debugfs_mount_count);
451 unregister_filesystem(&debug_fs_type);
452 kobject_put(debug_kobj);
455 core_initcall(debugfs_init);
456 module_exit(debugfs_exit);
457 MODULE_LICENSE("GPL");