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