linux/fs/debugfs/inode.c
<<
>>
Prefs
   1/*
   2 *  inode.c - part of debugfs, a tiny little debug file system
   3 *
   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
  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/magic.h>
  27#include <linux/slab.h>
  28
  29static struct vfsmount *debugfs_mount;
  30static int debugfs_mount_count;
  31static bool debugfs_registered;
  32
  33static struct inode *debugfs_get_inode(struct super_block *sb, umode_t mode, dev_t dev,
  34                                       void *data, const struct file_operations *fops)
  35
  36{
  37        struct inode *inode = new_inode(sb);
  38
  39        if (inode) {
  40                inode->i_ino = get_next_ino();
  41                inode->i_mode = mode;
  42                inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
  43                switch (mode & S_IFMT) {
  44                default:
  45                        init_special_inode(inode, mode, dev);
  46                        break;
  47                case S_IFREG:
  48                        inode->i_fop = fops ? fops : &debugfs_file_operations;
  49                        inode->i_private = data;
  50                        break;
  51                case S_IFLNK:
  52                        inode->i_op = &debugfs_link_operations;
  53                        inode->i_fop = fops;
  54                        inode->i_private = data;
  55                        break;
  56                case S_IFDIR:
  57                        inode->i_op = &simple_dir_inode_operations;
  58                        inode->i_fop = fops ? fops : &simple_dir_operations;
  59                        inode->i_private = data;
  60
  61                        /* directory inodes start off with i_nlink == 2
  62                         * (for "." entry) */
  63                        inc_nlink(inode);
  64                        break;
  65                }
  66        }
  67        return inode; 
  68}
  69
  70/* SMP-safe */
  71static int debugfs_mknod(struct inode *dir, struct dentry *dentry,
  72                         umode_t mode, dev_t dev, void *data,
  73                         const struct file_operations *fops)
  74{
  75        struct inode *inode;
  76        int error = -EPERM;
  77
  78        if (dentry->d_inode)
  79                return -EEXIST;
  80
  81        inode = debugfs_get_inode(dir->i_sb, mode, dev, data, fops);
  82        if (inode) {
  83                d_instantiate(dentry, inode);
  84                dget(dentry);
  85                error = 0;
  86        }
  87        return error;
  88}
  89
  90static int debugfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode,
  91                         void *data, const struct file_operations *fops)
  92{
  93        int res;
  94
  95        mode = (mode & (S_IRWXUGO | S_ISVTX)) | S_IFDIR;
  96        res = debugfs_mknod(dir, dentry, mode, 0, data, fops);
  97        if (!res) {
  98                inc_nlink(dir);
  99                fsnotify_mkdir(dir, dentry);
 100        }
 101        return res;
 102}
 103
 104static int debugfs_link(struct inode *dir, struct dentry *dentry, umode_t mode,
 105                        void *data, const struct file_operations *fops)
 106{
 107        mode = (mode & S_IALLUGO) | S_IFLNK;
 108        return debugfs_mknod(dir, dentry, mode, 0, data, fops);
 109}
 110
 111static int debugfs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
 112                          void *data, const struct file_operations *fops)
 113{
 114        int res;
 115
 116        mode = (mode & S_IALLUGO) | S_IFREG;
 117        res = debugfs_mknod(dir, dentry, mode, 0, data, fops);
 118        if (!res)
 119                fsnotify_create(dir, dentry);
 120        return res;
 121}
 122
 123static inline int debugfs_positive(struct dentry *dentry)
 124{
 125        return dentry->d_inode && !d_unhashed(dentry);
 126}
 127
 128static int debug_fill_super(struct super_block *sb, void *data, int silent)
 129{
 130        static struct tree_descr debug_files[] = {{""}};
 131
 132        return simple_fill_super(sb, DEBUGFS_MAGIC, debug_files);
 133}
 134
 135static struct dentry *debug_mount(struct file_system_type *fs_type,
 136                        int flags, const char *dev_name,
 137                        void *data)
 138{
 139        return mount_single(fs_type, flags, data, debug_fill_super);
 140}
 141
 142static struct file_system_type debug_fs_type = {
 143        .owner =        THIS_MODULE,
 144        .name =         "debugfs",
 145        .mount =        debug_mount,
 146        .kill_sb =      kill_litter_super,
 147};
 148
 149static int debugfs_create_by_name(const char *name, umode_t mode,
 150                                  struct dentry *parent,
 151                                  struct dentry **dentry,
 152                                  void *data,
 153                                  const struct file_operations *fops)
 154{
 155        int error = 0;
 156
 157        /* If the parent is not specified, we create it in the root.
 158         * We need the root dentry to do this, which is in the super 
 159         * block. A pointer to that is in the struct vfsmount that we
 160         * have around.
 161         */
 162        if (!parent)
 163                parent = debugfs_mount->mnt_root;
 164
 165        *dentry = NULL;
 166        mutex_lock(&parent->d_inode->i_mutex);
 167        *dentry = lookup_one_len(name, parent, strlen(name));
 168        if (!IS_ERR(*dentry)) {
 169                switch (mode & S_IFMT) {
 170                case S_IFDIR:
 171                        error = debugfs_mkdir(parent->d_inode, *dentry, mode,
 172                                              data, fops);
 173                        break;
 174                case S_IFLNK:
 175                        error = debugfs_link(parent->d_inode, *dentry, mode,
 176                                             data, fops);
 177                        break;
 178                default:
 179                        error = debugfs_create(parent->d_inode, *dentry, mode,
 180                                               data, fops);
 181                        break;
 182                }
 183                dput(*dentry);
 184        } else
 185                error = PTR_ERR(*dentry);
 186        mutex_unlock(&parent->d_inode->i_mutex);
 187
 188        return error;
 189}
 190
 191/**
 192 * debugfs_create_file - create a file in the debugfs filesystem
 193 * @name: a pointer to a string containing the name of the file to create.
 194 * @mode: the permission that the file should have.
 195 * @parent: a pointer to the parent dentry for this file.  This should be a
 196 *          directory dentry if set.  If this paramater is NULL, then the
 197 *          file will be created in the root of the debugfs filesystem.
 198 * @data: a pointer to something that the caller will want to get to later
 199 *        on.  The inode.i_private pointer will point to this value on
 200 *        the open() call.
 201 * @fops: a pointer to a struct file_operations that should be used for
 202 *        this file.
 203 *
 204 * This is the basic "create a file" function for debugfs.  It allows for a
 205 * wide range of flexibility in creating a file, or a directory (if you want
 206 * to create a directory, the debugfs_create_dir() function is
 207 * recommended to be used instead.)
 208 *
 209 * This function will return a pointer to a dentry if it succeeds.  This
 210 * pointer must be passed to the debugfs_remove() function when the file is
 211 * to be removed (no automatic cleanup happens if your module is unloaded,
 212 * you are responsible here.)  If an error occurs, %NULL will be returned.
 213 *
 214 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
 215 * returned.
 216 */
 217struct dentry *debugfs_create_file(const char *name, umode_t mode,
 218                                   struct dentry *parent, void *data,
 219                                   const struct file_operations *fops)
 220{
 221        struct dentry *dentry = NULL;
 222        int error;
 223
 224        pr_debug("debugfs: creating file '%s'\n",name);
 225
 226        error = simple_pin_fs(&debug_fs_type, &debugfs_mount,
 227                              &debugfs_mount_count);
 228        if (error)
 229                goto exit;
 230
 231        error = debugfs_create_by_name(name, mode, parent, &dentry,
 232                                       data, fops);
 233        if (error) {
 234                dentry = NULL;
 235                simple_release_fs(&debugfs_mount, &debugfs_mount_count);
 236                goto exit;
 237        }
 238exit:
 239        return dentry;
 240}
 241EXPORT_SYMBOL_GPL(debugfs_create_file);
 242
 243/**
 244 * debugfs_create_dir - create a directory in the debugfs filesystem
 245 * @name: a pointer to a string containing the name of the directory to
 246 *        create.
 247 * @parent: a pointer to the parent dentry for this file.  This should be a
 248 *          directory dentry if set.  If this paramater is NULL, then the
 249 *          directory will be created in the root of the debugfs filesystem.
 250 *
 251 * This function creates a directory in debugfs with the given name.
 252 *
 253 * This function will return a pointer to a dentry if it succeeds.  This
 254 * pointer must be passed to the debugfs_remove() function when the file is
 255 * to be removed (no automatic cleanup happens if your module is unloaded,
 256 * you are responsible here.)  If an error occurs, %NULL will be returned.
 257 *
 258 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
 259 * returned.
 260 */
 261struct dentry *debugfs_create_dir(const char *name, struct dentry *parent)
 262{
 263        return debugfs_create_file(name, 
 264                                   S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO,
 265                                   parent, NULL, NULL);
 266}
 267EXPORT_SYMBOL_GPL(debugfs_create_dir);
 268
 269/**
 270 * debugfs_create_symlink- create a symbolic link in the debugfs filesystem
 271 * @name: a pointer to a string containing the name of the symbolic link to
 272 *        create.
 273 * @parent: a pointer to the parent dentry for this symbolic link.  This
 274 *          should be a directory dentry if set.  If this paramater is NULL,
 275 *          then the symbolic link will be created in the root of the debugfs
 276 *          filesystem.
 277 * @target: a pointer to a string containing the path to the target of the
 278 *          symbolic link.
 279 *
 280 * This function creates a symbolic link with the given name in debugfs that
 281 * links to the given target path.
 282 *
 283 * This function will return a pointer to a dentry if it succeeds.  This
 284 * pointer must be passed to the debugfs_remove() function when the symbolic
 285 * link is to be removed (no automatic cleanup happens if your module is
 286 * unloaded, you are responsible here.)  If an error occurs, %NULL will be
 287 * returned.
 288 *
 289 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
 290 * returned.
 291 */
 292struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent,
 293                                      const char *target)
 294{
 295        struct dentry *result;
 296        char *link;
 297
 298        link = kstrdup(target, GFP_KERNEL);
 299        if (!link)
 300                return NULL;
 301
 302        result = debugfs_create_file(name, S_IFLNK | S_IRWXUGO, parent, link,
 303                                     NULL);
 304        if (!result)
 305                kfree(link);
 306        return result;
 307}
 308EXPORT_SYMBOL_GPL(debugfs_create_symlink);
 309
 310static int __debugfs_remove(struct dentry *dentry, struct dentry *parent)
 311{
 312        int ret = 0;
 313
 314        if (debugfs_positive(dentry)) {
 315                if (dentry->d_inode) {
 316                        dget(dentry);
 317                        switch (dentry->d_inode->i_mode & S_IFMT) {
 318                        case S_IFDIR:
 319                                ret = simple_rmdir(parent->d_inode, dentry);
 320                                break;
 321                        case S_IFLNK:
 322                                kfree(dentry->d_inode->i_private);
 323                                /* fall through */
 324                        default:
 325                                simple_unlink(parent->d_inode, dentry);
 326                                break;
 327                        }
 328                        if (!ret)
 329                                d_delete(dentry);
 330                        dput(dentry);
 331                }
 332        }
 333        return ret;
 334}
 335
 336/**
 337 * debugfs_remove - removes a file or directory from the debugfs filesystem
 338 * @dentry: a pointer to a the dentry of the file or directory to be
 339 *          removed.
 340 *
 341 * This function removes a file or directory in debugfs that was previously
 342 * created with a call to another debugfs function (like
 343 * debugfs_create_file() or variants thereof.)
 344 *
 345 * This function is required to be called in order for the file to be
 346 * removed, no automatic cleanup of files will happen when a module is
 347 * removed, you are responsible here.
 348 */
 349void debugfs_remove(struct dentry *dentry)
 350{
 351        struct dentry *parent;
 352        int ret;
 353
 354        if (!dentry)
 355                return;
 356
 357        parent = dentry->d_parent;
 358        if (!parent || !parent->d_inode)
 359                return;
 360
 361        mutex_lock(&parent->d_inode->i_mutex);
 362        ret = __debugfs_remove(dentry, parent);
 363        mutex_unlock(&parent->d_inode->i_mutex);
 364        if (!ret)
 365                simple_release_fs(&debugfs_mount, &debugfs_mount_count);
 366}
 367EXPORT_SYMBOL_GPL(debugfs_remove);
 368
 369/**
 370 * debugfs_remove_recursive - recursively removes a directory
 371 * @dentry: a pointer to a the dentry of the directory to be removed.
 372 *
 373 * This function recursively removes a directory tree in debugfs that
 374 * was previously created with a call to another debugfs function
 375 * (like debugfs_create_file() or variants thereof.)
 376 *
 377 * This function is required to be called in order for the file to be
 378 * removed, no automatic cleanup of files will happen when a module is
 379 * removed, you are responsible here.
 380 */
 381void debugfs_remove_recursive(struct dentry *dentry)
 382{
 383        struct dentry *child;
 384        struct dentry *parent;
 385
 386        if (!dentry)
 387                return;
 388
 389        parent = dentry->d_parent;
 390        if (!parent || !parent->d_inode)
 391                return;
 392
 393        parent = dentry;
 394        mutex_lock(&parent->d_inode->i_mutex);
 395
 396        while (1) {
 397                /*
 398                 * When all dentries under "parent" has been removed,
 399                 * walk up the tree until we reach our starting point.
 400                 */
 401                if (list_empty(&parent->d_subdirs)) {
 402                        mutex_unlock(&parent->d_inode->i_mutex);
 403                        if (parent == dentry)
 404                                break;
 405                        parent = parent->d_parent;
 406                        mutex_lock(&parent->d_inode->i_mutex);
 407                }
 408                child = list_entry(parent->d_subdirs.next, struct dentry,
 409                                d_u.d_child);
 410 next_sibling:
 411
 412                /*
 413                 * If "child" isn't empty, walk down the tree and
 414                 * remove all its descendants first.
 415                 */
 416                if (!list_empty(&child->d_subdirs)) {
 417                        mutex_unlock(&parent->d_inode->i_mutex);
 418                        parent = child;
 419                        mutex_lock(&parent->d_inode->i_mutex);
 420                        continue;
 421                }
 422                __debugfs_remove(child, parent);
 423                if (parent->d_subdirs.next == &child->d_u.d_child) {
 424                        /*
 425                         * Try the next sibling.
 426                         */
 427                        if (child->d_u.d_child.next != &parent->d_subdirs) {
 428                                child = list_entry(child->d_u.d_child.next,
 429                                                   struct dentry,
 430                                                   d_u.d_child);
 431                                goto next_sibling;
 432                        }
 433
 434                        /*
 435                         * Avoid infinite loop if we fail to remove
 436                         * one dentry.
 437                         */
 438                        mutex_unlock(&parent->d_inode->i_mutex);
 439                        break;
 440                }
 441                simple_release_fs(&debugfs_mount, &debugfs_mount_count);
 442        }
 443
 444        parent = dentry->d_parent;
 445        mutex_lock(&parent->d_inode->i_mutex);
 446        __debugfs_remove(dentry, parent);
 447        mutex_unlock(&parent->d_inode->i_mutex);
 448        simple_release_fs(&debugfs_mount, &debugfs_mount_count);
 449}
 450EXPORT_SYMBOL_GPL(debugfs_remove_recursive);
 451
 452/**
 453 * debugfs_rename - rename a file/directory in the debugfs filesystem
 454 * @old_dir: a pointer to the parent dentry for the renamed object. This
 455 *          should be a directory dentry.
 456 * @old_dentry: dentry of an object to be renamed.
 457 * @new_dir: a pointer to the parent dentry where the object should be
 458 *          moved. This should be a directory dentry.
 459 * @new_name: a pointer to a string containing the target name.
 460 *
 461 * This function renames a file/directory in debugfs.  The target must not
 462 * exist for rename to succeed.
 463 *
 464 * This function will return a pointer to old_dentry (which is updated to
 465 * reflect renaming) if it succeeds. If an error occurs, %NULL will be
 466 * returned.
 467 *
 468 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
 469 * returned.
 470 */
 471struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
 472                struct dentry *new_dir, const char *new_name)
 473{
 474        int error;
 475        struct dentry *dentry = NULL, *trap;
 476        const char *old_name;
 477
 478        trap = lock_rename(new_dir, old_dir);
 479        /* Source or destination directories don't exist? */
 480        if (!old_dir->d_inode || !new_dir->d_inode)
 481                goto exit;
 482        /* Source does not exist, cyclic rename, or mountpoint? */
 483        if (!old_dentry->d_inode || old_dentry == trap ||
 484            d_mountpoint(old_dentry))
 485                goto exit;
 486        dentry = lookup_one_len(new_name, new_dir, strlen(new_name));
 487        /* Lookup failed, cyclic rename or target exists? */
 488        if (IS_ERR(dentry) || dentry == trap || dentry->d_inode)
 489                goto exit;
 490
 491        old_name = fsnotify_oldname_init(old_dentry->d_name.name);
 492
 493        error = simple_rename(old_dir->d_inode, old_dentry, new_dir->d_inode,
 494                dentry);
 495        if (error) {
 496                fsnotify_oldname_free(old_name);
 497                goto exit;
 498        }
 499        d_move(old_dentry, dentry);
 500        fsnotify_move(old_dir->d_inode, new_dir->d_inode, old_name,
 501                S_ISDIR(old_dentry->d_inode->i_mode),
 502                NULL, old_dentry);
 503        fsnotify_oldname_free(old_name);
 504        unlock_rename(new_dir, old_dir);
 505        dput(dentry);
 506        return old_dentry;
 507exit:
 508        if (dentry && !IS_ERR(dentry))
 509                dput(dentry);
 510        unlock_rename(new_dir, old_dir);
 511        return NULL;
 512}
 513EXPORT_SYMBOL_GPL(debugfs_rename);
 514
 515/**
 516 * debugfs_initialized - Tells whether debugfs has been registered
 517 */
 518bool debugfs_initialized(void)
 519{
 520        return debugfs_registered;
 521}
 522EXPORT_SYMBOL_GPL(debugfs_initialized);
 523
 524
 525static struct kobject *debug_kobj;
 526
 527static int __init debugfs_init(void)
 528{
 529        int retval;
 530
 531        debug_kobj = kobject_create_and_add("debug", kernel_kobj);
 532        if (!debug_kobj)
 533                return -EINVAL;
 534
 535        retval = register_filesystem(&debug_fs_type);
 536        if (retval)
 537                kobject_put(debug_kobj);
 538        else
 539                debugfs_registered = true;
 540
 541        return retval;
 542}
 543core_initcall(debugfs_init);
 544
 545