Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
inode.c
Go to the documentation of this file.
1 /*
2  * inode.c - part of debugfs, a tiny little debug file system
3  *
4  * Copyright (C) 2004 Greg Kroah-Hartman <[email protected]>
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 
16 #include <linux/module.h>
17 #include <linux/fs.h>
18 #include <linux/mount.h>
19 #include <linux/pagemap.h>
20 #include <linux/init.h>
21 #include <linux/kobject.h>
22 #include <linux/namei.h>
23 #include <linux/debugfs.h>
24 #include <linux/fsnotify.h>
25 #include <linux/string.h>
26 #include <linux/seq_file.h>
27 #include <linux/parser.h>
28 #include <linux/magic.h>
29 #include <linux/slab.h>
30 
31 #define DEBUGFS_DEFAULT_MODE 0700
32 
33 static struct vfsmount *debugfs_mount;
34 static int debugfs_mount_count;
35 static bool debugfs_registered;
36 
37 static struct inode *debugfs_get_inode(struct super_block *sb, umode_t mode, dev_t dev,
38  void *data, const struct file_operations *fops)
39 
40 {
41  struct inode *inode = new_inode(sb);
42 
43  if (inode) {
44  inode->i_ino = get_next_ino();
45  inode->i_mode = mode;
46  inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
47  switch (mode & S_IFMT) {
48  default:
49  init_special_inode(inode, mode, dev);
50  break;
51  case S_IFREG:
52  inode->i_fop = fops ? fops : &debugfs_file_operations;
53  inode->i_private = data;
54  break;
55  case S_IFLNK:
56  inode->i_op = &debugfs_link_operations;
57  inode->i_private = data;
58  break;
59  case S_IFDIR:
61  inode->i_fop = &simple_dir_operations;
62  inode->i_private = NULL;
63 
64  /* directory inodes start off with i_nlink == 2
65  * (for "." entry) */
66  inc_nlink(inode);
67  break;
68  }
69  }
70  return inode;
71 }
72 
73 /* SMP-safe */
74 static int debugfs_mknod(struct inode *dir, struct dentry *dentry,
75  umode_t mode, dev_t dev, void *data,
76  const struct file_operations *fops)
77 {
78  struct inode *inode;
79  int error = -EPERM;
80 
81  if (dentry->d_inode)
82  return -EEXIST;
83 
84  inode = debugfs_get_inode(dir->i_sb, mode, dev, data, fops);
85  if (inode) {
86  d_instantiate(dentry, inode);
87  dget(dentry);
88  error = 0;
89  }
90  return error;
91 }
92 
93 static int debugfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
94 {
95  int res;
96 
97  mode = (mode & (S_IRWXUGO | S_ISVTX)) | S_IFDIR;
98  res = debugfs_mknod(dir, dentry, mode, 0, NULL, NULL);
99  if (!res) {
100  inc_nlink(dir);
101  fsnotify_mkdir(dir, dentry);
102  }
103  return res;
104 }
105 
106 static int debugfs_link(struct inode *dir, struct dentry *dentry, umode_t mode,
107  void *data)
108 {
109  mode = (mode & S_IALLUGO) | S_IFLNK;
110  return debugfs_mknod(dir, dentry, mode, 0, data, NULL);
111 }
112 
113 static int debugfs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
114  void *data, const struct file_operations *fops)
115 {
116  int res;
117 
118  mode = (mode & S_IALLUGO) | S_IFREG;
119  res = debugfs_mknod(dir, dentry, mode, 0, data, fops);
120  if (!res)
121  fsnotify_create(dir, dentry);
122  return res;
123 }
124 
125 static inline int debugfs_positive(struct dentry *dentry)
126 {
127  return dentry->d_inode && !d_unhashed(dentry);
128 }
129 
134 };
135 
136 enum {
141 };
142 
143 static const match_table_t tokens = {
144  {Opt_uid, "uid=%u"},
145  {Opt_gid, "gid=%u"},
146  {Opt_mode, "mode=%o"},
147  {Opt_err, NULL}
148 };
149 
152 };
153 
154 static int debugfs_parse_options(char *data, struct debugfs_mount_opts *opts)
155 {
157  int option;
158  int token;
159  kuid_t uid;
160  kgid_t gid;
161  char *p;
162 
163  opts->mode = DEBUGFS_DEFAULT_MODE;
164 
165  while ((p = strsep(&data, ",")) != NULL) {
166  if (!*p)
167  continue;
168 
169  token = match_token(p, tokens, args);
170  switch (token) {
171  case Opt_uid:
172  if (match_int(&args[0], &option))
173  return -EINVAL;
174  uid = make_kuid(current_user_ns(), option);
175  if (!uid_valid(uid))
176  return -EINVAL;
177  opts->uid = uid;
178  break;
179  case Opt_gid:
180  if (match_octal(&args[0], &option))
181  return -EINVAL;
182  gid = make_kgid(current_user_ns(), option);
183  if (!gid_valid(gid))
184  return -EINVAL;
185  opts->gid = gid;
186  break;
187  case Opt_mode:
188  if (match_octal(&args[0], &option))
189  return -EINVAL;
190  opts->mode = option & S_IALLUGO;
191  break;
192  /*
193  * We might like to report bad mount options here;
194  * but traditionally debugfs has ignored all mount options
195  */
196  }
197  }
198 
199  return 0;
200 }
201 
202 static int debugfs_apply_options(struct super_block *sb)
203 {
204  struct debugfs_fs_info *fsi = sb->s_fs_info;
205  struct inode *inode = sb->s_root->d_inode;
206  struct debugfs_mount_opts *opts = &fsi->mount_opts;
207 
208  inode->i_mode &= ~S_IALLUGO;
209  inode->i_mode |= opts->mode;
210 
211  inode->i_uid = opts->uid;
212  inode->i_gid = opts->gid;
213 
214  return 0;
215 }
216 
217 static int debugfs_remount(struct super_block *sb, int *flags, char *data)
218 {
219  int err;
220  struct debugfs_fs_info *fsi = sb->s_fs_info;
221 
222  err = debugfs_parse_options(data, &fsi->mount_opts);
223  if (err)
224  goto fail;
225 
226  debugfs_apply_options(sb);
227 
228 fail:
229  return err;
230 }
231 
232 static int debugfs_show_options(struct seq_file *m, struct dentry *root)
233 {
234  struct debugfs_fs_info *fsi = root->d_sb->s_fs_info;
235  struct debugfs_mount_opts *opts = &fsi->mount_opts;
236 
237  if (!uid_eq(opts->uid, GLOBAL_ROOT_UID))
238  seq_printf(m, ",uid=%u",
240  if (!gid_eq(opts->gid, GLOBAL_ROOT_GID))
241  seq_printf(m, ",gid=%u",
243  if (opts->mode != DEBUGFS_DEFAULT_MODE)
244  seq_printf(m, ",mode=%o", opts->mode);
245 
246  return 0;
247 }
248 
249 static const struct super_operations debugfs_super_operations = {
250  .statfs = simple_statfs,
251  .remount_fs = debugfs_remount,
252  .show_options = debugfs_show_options,
253 };
254 
255 static int debug_fill_super(struct super_block *sb, void *data, int silent)
256 {
257  static struct tree_descr debug_files[] = {{""}};
258  struct debugfs_fs_info *fsi;
259  int err;
260 
261  save_mount_options(sb, data);
262 
263  fsi = kzalloc(sizeof(struct debugfs_fs_info), GFP_KERNEL);
264  sb->s_fs_info = fsi;
265  if (!fsi) {
266  err = -ENOMEM;
267  goto fail;
268  }
269 
270  err = debugfs_parse_options(data, &fsi->mount_opts);
271  if (err)
272  goto fail;
273 
274  err = simple_fill_super(sb, DEBUGFS_MAGIC, debug_files);
275  if (err)
276  goto fail;
277 
278  sb->s_op = &debugfs_super_operations;
279 
280  debugfs_apply_options(sb);
281 
282  return 0;
283 
284 fail:
285  kfree(fsi);
286  sb->s_fs_info = NULL;
287  return err;
288 }
289 
290 static struct dentry *debug_mount(struct file_system_type *fs_type,
291  int flags, const char *dev_name,
292  void *data)
293 {
294  return mount_single(fs_type, flags, data, debug_fill_super);
295 }
296 
297 static struct file_system_type debug_fs_type = {
298  .owner = THIS_MODULE,
299  .name = "debugfs",
300  .mount = debug_mount,
301  .kill_sb = kill_litter_super,
302 };
303 
304 static struct dentry *__create_file(const char *name, umode_t mode,
305  struct dentry *parent, void *data,
306  const struct file_operations *fops)
307 {
308  struct dentry *dentry = NULL;
309  int error;
310 
311  pr_debug("debugfs: creating file '%s'\n",name);
312 
313  error = simple_pin_fs(&debug_fs_type, &debugfs_mount,
314  &debugfs_mount_count);
315  if (error)
316  goto exit;
317 
318  /* If the parent is not specified, we create it in the root.
319  * We need the root dentry to do this, which is in the super
320  * block. A pointer to that is in the struct vfsmount that we
321  * have around.
322  */
323  if (!parent)
324  parent = debugfs_mount->mnt_root;
325 
326  dentry = NULL;
327  mutex_lock(&parent->d_inode->i_mutex);
328  dentry = lookup_one_len(name, parent, strlen(name));
329  if (!IS_ERR(dentry)) {
330  switch (mode & S_IFMT) {
331  case S_IFDIR:
332  error = debugfs_mkdir(parent->d_inode, dentry, mode);
333 
334  break;
335  case S_IFLNK:
336  error = debugfs_link(parent->d_inode, dentry, mode,
337  data);
338  break;
339  default:
340  error = debugfs_create(parent->d_inode, dentry, mode,
341  data, fops);
342  break;
343  }
344  dput(dentry);
345  } else
346  error = PTR_ERR(dentry);
347  mutex_unlock(&parent->d_inode->i_mutex);
348 
349  if (error) {
350  dentry = NULL;
351  simple_release_fs(&debugfs_mount, &debugfs_mount_count);
352  }
353 exit:
354  return dentry;
355 }
356 
383 struct dentry *debugfs_create_file(const char *name, umode_t mode,
384  struct dentry *parent, void *data,
385  const struct file_operations *fops)
386 {
387  switch (mode & S_IFMT) {
388  case S_IFREG:
389  case 0:
390  break;
391  default:
392  BUG();
393  }
394 
395  return __create_file(name, mode, parent, data, fops);
396 }
398 
417 struct dentry *debugfs_create_dir(const char *name, struct dentry *parent)
418 {
419  return __create_file(name, S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO,
420  parent, NULL, NULL);
421 }
423 
447 struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent,
448  const char *target)
449 {
450  struct dentry *result;
451  char *link;
452 
453  link = kstrdup(target, GFP_KERNEL);
454  if (!link)
455  return NULL;
456 
457  result = __create_file(name, S_IFLNK | S_IRWXUGO, parent, link, NULL);
458  if (!result)
459  kfree(link);
460  return result;
461 }
463 
464 static int __debugfs_remove(struct dentry *dentry, struct dentry *parent)
465 {
466  int ret = 0;
467 
468  if (debugfs_positive(dentry)) {
469  if (dentry->d_inode) {
470  dget(dentry);
471  switch (dentry->d_inode->i_mode & S_IFMT) {
472  case S_IFDIR:
473  ret = simple_rmdir(parent->d_inode, dentry);
474  break;
475  case S_IFLNK:
476  kfree(dentry->d_inode->i_private);
477  /* fall through */
478  default:
479  simple_unlink(parent->d_inode, dentry);
480  break;
481  }
482  if (!ret)
483  d_delete(dentry);
484  dput(dentry);
485  }
486  }
487  return ret;
488 }
489 
503 void debugfs_remove(struct dentry *dentry)
504 {
505  struct dentry *parent;
506  int ret;
507 
508  if (IS_ERR_OR_NULL(dentry))
509  return;
510 
511  parent = dentry->d_parent;
512  if (!parent || !parent->d_inode)
513  return;
514 
515  mutex_lock(&parent->d_inode->i_mutex);
516  ret = __debugfs_remove(dentry, parent);
517  mutex_unlock(&parent->d_inode->i_mutex);
518  if (!ret)
519  simple_release_fs(&debugfs_mount, &debugfs_mount_count);
520 }
522 
535 void debugfs_remove_recursive(struct dentry *dentry)
536 {
537  struct dentry *child;
538  struct dentry *parent;
539 
540  if (IS_ERR_OR_NULL(dentry))
541  return;
542 
543  parent = dentry->d_parent;
544  if (!parent || !parent->d_inode)
545  return;
546 
547  parent = dentry;
548  mutex_lock(&parent->d_inode->i_mutex);
549 
550  while (1) {
551  /*
552  * When all dentries under "parent" has been removed,
553  * walk up the tree until we reach our starting point.
554  */
555  if (list_empty(&parent->d_subdirs)) {
556  mutex_unlock(&parent->d_inode->i_mutex);
557  if (parent == dentry)
558  break;
559  parent = parent->d_parent;
560  mutex_lock(&parent->d_inode->i_mutex);
561  }
562  child = list_entry(parent->d_subdirs.next, struct dentry,
563  d_u.d_child);
564  next_sibling:
565 
566  /*
567  * If "child" isn't empty, walk down the tree and
568  * remove all its descendants first.
569  */
570  if (!list_empty(&child->d_subdirs)) {
571  mutex_unlock(&parent->d_inode->i_mutex);
572  parent = child;
573  mutex_lock(&parent->d_inode->i_mutex);
574  continue;
575  }
576  __debugfs_remove(child, parent);
577  if (parent->d_subdirs.next == &child->d_u.d_child) {
578  /*
579  * Try the next sibling.
580  */
581  if (child->d_u.d_child.next != &parent->d_subdirs) {
582  child = list_entry(child->d_u.d_child.next,
583  struct dentry,
584  d_u.d_child);
585  goto next_sibling;
586  }
587 
588  /*
589  * Avoid infinite loop if we fail to remove
590  * one dentry.
591  */
592  mutex_unlock(&parent->d_inode->i_mutex);
593  break;
594  }
595  simple_release_fs(&debugfs_mount, &debugfs_mount_count);
596  }
597 
598  parent = dentry->d_parent;
599  mutex_lock(&parent->d_inode->i_mutex);
600  __debugfs_remove(dentry, parent);
601  mutex_unlock(&parent->d_inode->i_mutex);
602  simple_release_fs(&debugfs_mount, &debugfs_mount_count);
603 }
605 
625 struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
626  struct dentry *new_dir, const char *new_name)
627 {
628  int error;
629  struct dentry *dentry = NULL, *trap;
630  const char *old_name;
631 
632  trap = lock_rename(new_dir, old_dir);
633  /* Source or destination directories don't exist? */
634  if (!old_dir->d_inode || !new_dir->d_inode)
635  goto exit;
636  /* Source does not exist, cyclic rename, or mountpoint? */
637  if (!old_dentry->d_inode || old_dentry == trap ||
638  d_mountpoint(old_dentry))
639  goto exit;
640  dentry = lookup_one_len(new_name, new_dir, strlen(new_name));
641  /* Lookup failed, cyclic rename or target exists? */
642  if (IS_ERR(dentry) || dentry == trap || dentry->d_inode)
643  goto exit;
644 
645  old_name = fsnotify_oldname_init(old_dentry->d_name.name);
646 
647  error = simple_rename(old_dir->d_inode, old_dentry, new_dir->d_inode,
648  dentry);
649  if (error) {
650  fsnotify_oldname_free(old_name);
651  goto exit;
652  }
653  d_move(old_dentry, dentry);
654  fsnotify_move(old_dir->d_inode, new_dir->d_inode, old_name,
655  S_ISDIR(old_dentry->d_inode->i_mode),
656  NULL, old_dentry);
657  fsnotify_oldname_free(old_name);
658  unlock_rename(new_dir, old_dir);
659  dput(dentry);
660  return old_dentry;
661 exit:
662  if (dentry && !IS_ERR(dentry))
663  dput(dentry);
664  unlock_rename(new_dir, old_dir);
665  return NULL;
666 }
668 
673 {
674  return debugfs_registered;
675 }
677 
678 
679 static struct kobject *debug_kobj;
680 
681 static int __init debugfs_init(void)
682 {
683  int retval;
684 
685  debug_kobj = kobject_create_and_add("debug", kernel_kobj);
686  if (!debug_kobj)
687  return -EINVAL;
688 
689  retval = register_filesystem(&debug_fs_type);
690  if (retval)
691  kobject_put(debug_kobj);
692  else
693  debugfs_registered = true;
694 
695  return retval;
696 }
697 core_initcall(debugfs_init);
698