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/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
  33static struct vfsmount *debugfs_mount;
  34static int debugfs_mount_count;
  35static bool debugfs_registered;
  36
  37static 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:
  60                        inode->i_op = &simple_dir_inode_operations;
  61                        inode->i_fop = &simple_dir_operations;
  62
  63                        /* directory inodes start off with i_nlink == 2
  64                         * (for "." entry) */
  65                        inc_nlink(inode);
  66                        break;
  67                }
  68        }
  69        return inode;
  70}
  71
  72/* SMP-safe */
  73static int debugfs_mknod(struct inode *dir, struct dentry *dentry,
  74                         umode_t mode, dev_t dev, void *data,
  75                         const struct file_operations *fops)
  76{
  77        struct inode *inode;
  78        int error = -EPERM;
  79
  80        if (dentry->d_inode)
  81                return -EEXIST;
  82
  83        inode = debugfs_get_inode(dir->i_sb, mode, dev, data, fops);
  84        if (inode) {
  85                d_instantiate(dentry, inode);
  86                dget(dentry);
  87                error = 0;
  88        }
  89        return error;
  90}
  91
  92static int debugfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
  93{
  94        int res;
  95
  96        mode = (mode & (S_IRWXUGO | S_ISVTX)) | S_IFDIR;
  97        res = debugfs_mknod(dir, dentry, mode, 0, NULL, NULL);
  98        if (!res) {
  99                inc_nlink(dir);
 100                fsnotify_mkdir(dir, dentry);
 101        }
 102        return res;
 103}
 104
 105static int debugfs_link(struct inode *dir, struct dentry *dentry, umode_t mode,
 106                        void *data)
 107{
 108        mode = (mode & S_IALLUGO) | S_IFLNK;
 109        return debugfs_mknod(dir, dentry, mode, 0, data, NULL);
 110}
 111
 112static int debugfs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
 113                          void *data, const struct file_operations *fops)
 114{
 115        int res;
 116
 117        mode = (mode & S_IALLUGO) | S_IFREG;
 118        res = debugfs_mknod(dir, dentry, mode, 0, data, fops);
 119        if (!res)
 120                fsnotify_create(dir, dentry);
 121        return res;
 122}
 123
 124static inline int debugfs_positive(struct dentry *dentry)
 125{
 126        return dentry->d_inode && !d_unhashed(dentry);
 127}
 128
 129struct debugfs_mount_opts {
 130        kuid_t uid;
 131        kgid_t gid;
 132        umode_t mode;
 133};
 134
 135enum {
 136        Opt_uid,
 137        Opt_gid,
 138        Opt_mode,
 139        Opt_err
 140};
 141
 142static const match_table_t tokens = {
 143        {Opt_uid, "uid=%u"},
 144        {Opt_gid, "gid=%u"},
 145        {Opt_mode, "mode=%o"},
 146        {Opt_err, NULL}
 147};
 148
 149struct debugfs_fs_info {
 150        struct debugfs_mount_opts mount_opts;
 151};
 152
 153static int debugfs_parse_options(char *data, struct debugfs_mount_opts *opts)
 154{
 155        substring_t args[MAX_OPT_ARGS];
 156        int option;
 157        int token;
 158        kuid_t uid;
 159        kgid_t gid;
 160        char *p;
 161
 162        opts->mode = DEBUGFS_DEFAULT_MODE;
 163
 164        while ((p = strsep(&data, ",")) != NULL) {
 165                if (!*p)
 166                        continue;
 167
 168                token = match_token(p, tokens, args);
 169                switch (token) {
 170                case Opt_uid:
 171                        if (match_int(&args[0], &option))
 172                                return -EINVAL;
 173                        uid = make_kuid(current_user_ns(), option);
 174                        if (!uid_valid(uid))
 175                                return -EINVAL;
 176                        opts->uid = uid;
 177                        break;
 178                case Opt_gid:
 179                        if (match_int(&args[0], &option))
 180                                return -EINVAL;
 181                        gid = make_kgid(current_user_ns(), option);
 182                        if (!gid_valid(gid))
 183                                return -EINVAL;
 184                        opts->gid = gid;
 185                        break;
 186                case Opt_mode:
 187                        if (match_octal(&args[0], &option))
 188                                return -EINVAL;
 189                        opts->mode = option & S_IALLUGO;
 190                        break;
 191                /*
 192                 * We might like to report bad mount options here;
 193                 * but traditionally debugfs has ignored all mount options
 194                 */
 195                }
 196        }
 197
 198        return 0;
 199}
 200
 201static int debugfs_apply_options(struct super_block *sb)
 202{
 203        struct debugfs_fs_info *fsi = sb->s_fs_info;
 204        struct inode *inode = sb->s_root->d_inode;
 205        struct debugfs_mount_opts *opts = &fsi->mount_opts;
 206
 207        inode->i_mode &= ~S_IALLUGO;
 208        inode->i_mode |= opts->mode;
 209
 210        inode->i_uid = opts->uid;
 211        inode->i_gid = opts->gid;
 212
 213        return 0;
 214}
 215
 216static int debugfs_remount(struct super_block *sb, int *flags, char *data)
 217{
 218        int err;
 219        struct debugfs_fs_info *fsi = sb->s_fs_info;
 220
 221        sync_filesystem(sb);
 222        err = debugfs_parse_options(data, &fsi->mount_opts);
 223        if (err)
 224                goto fail;
 225
 226        debugfs_apply_options(sb);
 227
 228fail:
 229        return err;
 230}
 231
 232static 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",
 239                           from_kuid_munged(&init_user_ns, opts->uid));
 240        if (!gid_eq(opts->gid, GLOBAL_ROOT_GID))
 241                seq_printf(m, ",gid=%u",
 242                           from_kgid_munged(&init_user_ns, opts->gid));
 243        if (opts->mode != DEBUGFS_DEFAULT_MODE)
 244                seq_printf(m, ",mode=%o", opts->mode);
 245
 246        return 0;
 247}
 248
 249static const struct super_operations debugfs_super_operations = {
 250        .statfs         = simple_statfs,
 251        .remount_fs     = debugfs_remount,
 252        .show_options   = debugfs_show_options,
 253};
 254
 255static 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
 284fail:
 285        kfree(fsi);
 286        sb->s_fs_info = NULL;
 287        return err;
 288}
 289
 290static 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
 297static 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};
 303MODULE_ALIAS_FS("debugfs");
 304
 305static struct dentry *__create_file(const char *name, umode_t mode,
 306                                    struct dentry *parent, void *data,
 307                                    const struct file_operations *fops)
 308{
 309        struct dentry *dentry = NULL;
 310        int error;
 311
 312        pr_debug("debugfs: creating file '%s'\n",name);
 313
 314        error = simple_pin_fs(&debug_fs_type, &debugfs_mount,
 315                              &debugfs_mount_count);
 316        if (error)
 317                goto exit;
 318
 319        /* If the parent is not specified, we create it in the root.
 320         * We need the root dentry to do this, which is in the super
 321         * block. A pointer to that is in the struct vfsmount that we
 322         * have around.
 323         */
 324        if (!parent)
 325                parent = debugfs_mount->mnt_root;
 326
 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        }
 353exit:
 354        return dentry;
 355}
 356
 357/**
 358 * debugfs_create_file - create a file in the debugfs filesystem
 359 * @name: a pointer to a string containing the name of the file to create.
 360 * @mode: the permission that the file should have.
 361 * @parent: a pointer to the parent dentry for this file.  This should be a
 362 *          directory dentry if set.  If this parameter is NULL, then the
 363 *          file will be created in the root of the debugfs filesystem.
 364 * @data: a pointer to something that the caller will want to get to later
 365 *        on.  The inode.i_private pointer will point to this value on
 366 *        the open() call.
 367 * @fops: a pointer to a struct file_operations that should be used for
 368 *        this file.
 369 *
 370 * This is the basic "create a file" function for debugfs.  It allows for a
 371 * wide range of flexibility in creating a file, or a directory (if you want
 372 * to create a directory, the debugfs_create_dir() function is
 373 * recommended to be used instead.)
 374 *
 375 * This function will return a pointer to a dentry if it succeeds.  This
 376 * pointer must be passed to the debugfs_remove() function when the file is
 377 * to be removed (no automatic cleanup happens if your module is unloaded,
 378 * you are responsible here.)  If an error occurs, %NULL will be returned.
 379 *
 380 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
 381 * returned.
 382 */
 383struct 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}
 397EXPORT_SYMBOL_GPL(debugfs_create_file);
 398
 399/**
 400 * debugfs_create_dir - create a directory in the debugfs filesystem
 401 * @name: a pointer to a string containing the name of the directory to
 402 *        create.
 403 * @parent: a pointer to the parent dentry for this file.  This should be a
 404 *          directory dentry if set.  If this parameter is NULL, then the
 405 *          directory will be created in the root of the debugfs filesystem.
 406 *
 407 * This function creates a directory in debugfs with the given name.
 408 *
 409 * This function will return a pointer to a dentry if it succeeds.  This
 410 * pointer must be passed to the debugfs_remove() function when the file is
 411 * to be removed (no automatic cleanup happens if your module is unloaded,
 412 * you are responsible here.)  If an error occurs, %NULL will be returned.
 413 *
 414 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
 415 * returned.
 416 */
 417struct 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}
 422EXPORT_SYMBOL_GPL(debugfs_create_dir);
 423
 424/**
 425 * debugfs_create_symlink- create a symbolic link in the debugfs filesystem
 426 * @name: a pointer to a string containing the name of the symbolic link to
 427 *        create.
 428 * @parent: a pointer to the parent dentry for this symbolic link.  This
 429 *          should be a directory dentry if set.  If this parameter is NULL,
 430 *          then the symbolic link will be created in the root of the debugfs
 431 *          filesystem.
 432 * @target: a pointer to a string containing the path to the target of the
 433 *          symbolic link.
 434 *
 435 * This function creates a symbolic link with the given name in debugfs that
 436 * links to the given target path.
 437 *
 438 * This function will return a pointer to a dentry if it succeeds.  This
 439 * pointer must be passed to the debugfs_remove() function when the symbolic
 440 * link is to be removed (no automatic cleanup happens if your module is
 441 * unloaded, you are responsible here.)  If an error occurs, %NULL will be
 442 * returned.
 443 *
 444 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
 445 * returned.
 446 */
 447struct 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}
 462EXPORT_SYMBOL_GPL(debugfs_create_symlink);
 463
 464static 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
 490/**
 491 * debugfs_remove - removes a file or directory from the debugfs filesystem
 492 * @dentry: a pointer to a the dentry of the file or directory to be
 493 *          removed.
 494 *
 495 * This function removes a file or directory in debugfs that was previously
 496 * created with a call to another debugfs function (like
 497 * debugfs_create_file() or variants thereof.)
 498 *
 499 * This function is required to be called in order for the file to be
 500 * removed, no automatic cleanup of files will happen when a module is
 501 * removed, you are responsible here.
 502 */
 503void 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}
 521EXPORT_SYMBOL_GPL(debugfs_remove);
 522
 523/**
 524 * debugfs_remove_recursive - recursively removes a directory
 525 * @dentry: a pointer to a the dentry of the directory to be removed.
 526 *
 527 * This function recursively removes a directory tree in debugfs that
 528 * was previously created with a call to another debugfs function
 529 * (like debugfs_create_file() or variants thereof.)
 530 *
 531 * This function is required to be called in order for the file to be
 532 * removed, no automatic cleanup of files will happen when a module is
 533 * removed, you are responsible here.
 534 */
 535void debugfs_remove_recursive(struct dentry *dentry)
 536{
 537        struct dentry *child, *parent;
 538
 539        if (IS_ERR_OR_NULL(dentry))
 540                return;
 541
 542        parent = dentry->d_parent;
 543        if (!parent || !parent->d_inode)
 544                return;
 545
 546        parent = dentry;
 547 down:
 548        mutex_lock(&parent->d_inode->i_mutex);
 549 loop:
 550        /*
 551         * The parent->d_subdirs is protected by the d_lock. Outside that
 552         * lock, the child can be unlinked and set to be freed which can
 553         * use the d_u.d_child as the rcu head and corrupt this list.
 554         */
 555        spin_lock(&parent->d_lock);
 556        list_for_each_entry(child, &parent->d_subdirs, d_child) {
 557                if (!debugfs_positive(child))
 558                        continue;
 559
 560                /* perhaps simple_empty(child) makes more sense */
 561                if (!list_empty(&child->d_subdirs)) {
 562                        spin_unlock(&parent->d_lock);
 563                        mutex_unlock(&parent->d_inode->i_mutex);
 564                        parent = child;
 565                        goto down;
 566                }
 567
 568                spin_unlock(&parent->d_lock);
 569
 570                if (!__debugfs_remove(child, parent))
 571                        simple_release_fs(&debugfs_mount, &debugfs_mount_count);
 572
 573                /*
 574                 * The parent->d_lock protects agaist child from unlinking
 575                 * from d_subdirs. When releasing the parent->d_lock we can
 576                 * no longer trust that the next pointer is valid.
 577                 * Restart the loop. We'll skip this one with the
 578                 * debugfs_positive() check.
 579                 */
 580                goto loop;
 581        }
 582        spin_unlock(&parent->d_lock);
 583
 584        mutex_unlock(&parent->d_inode->i_mutex);
 585        child = parent;
 586        parent = parent->d_parent;
 587        mutex_lock(&parent->d_inode->i_mutex);
 588
 589        if (child != dentry)
 590                /* go up */
 591                goto loop;
 592
 593        if (!__debugfs_remove(child, parent))
 594                simple_release_fs(&debugfs_mount, &debugfs_mount_count);
 595        mutex_unlock(&parent->d_inode->i_mutex);
 596}
 597EXPORT_SYMBOL_GPL(debugfs_remove_recursive);
 598
 599/**
 600 * debugfs_rename - rename a file/directory in the debugfs filesystem
 601 * @old_dir: a pointer to the parent dentry for the renamed object. This
 602 *          should be a directory dentry.
 603 * @old_dentry: dentry of an object to be renamed.
 604 * @new_dir: a pointer to the parent dentry where the object should be
 605 *          moved. This should be a directory dentry.
 606 * @new_name: a pointer to a string containing the target name.
 607 *
 608 * This function renames a file/directory in debugfs.  The target must not
 609 * exist for rename to succeed.
 610 *
 611 * This function will return a pointer to old_dentry (which is updated to
 612 * reflect renaming) if it succeeds. If an error occurs, %NULL will be
 613 * returned.
 614 *
 615 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
 616 * returned.
 617 */
 618struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
 619                struct dentry *new_dir, const char *new_name)
 620{
 621        int error;
 622        struct dentry *dentry = NULL, *trap;
 623        const char *old_name;
 624
 625        trap = lock_rename(new_dir, old_dir);
 626        /* Source or destination directories don't exist? */
 627        if (!old_dir->d_inode || !new_dir->d_inode)
 628                goto exit;
 629        /* Source does not exist, cyclic rename, or mountpoint? */
 630        if (!old_dentry->d_inode || old_dentry == trap ||
 631            d_mountpoint(old_dentry))
 632                goto exit;
 633        dentry = lookup_one_len(new_name, new_dir, strlen(new_name));
 634        /* Lookup failed, cyclic rename or target exists? */
 635        if (IS_ERR(dentry) || dentry == trap || dentry->d_inode)
 636                goto exit;
 637
 638        old_name = fsnotify_oldname_init(old_dentry->d_name.name);
 639
 640        error = simple_rename(old_dir->d_inode, old_dentry, new_dir->d_inode,
 641                dentry);
 642        if (error) {
 643                fsnotify_oldname_free(old_name);
 644                goto exit;
 645        }
 646        d_move(old_dentry, dentry);
 647        fsnotify_move(old_dir->d_inode, new_dir->d_inode, old_name,
 648                S_ISDIR(old_dentry->d_inode->i_mode),
 649                NULL, old_dentry);
 650        fsnotify_oldname_free(old_name);
 651        unlock_rename(new_dir, old_dir);
 652        dput(dentry);
 653        return old_dentry;
 654exit:
 655        if (dentry && !IS_ERR(dentry))
 656                dput(dentry);
 657        unlock_rename(new_dir, old_dir);
 658        return NULL;
 659}
 660EXPORT_SYMBOL_GPL(debugfs_rename);
 661
 662/**
 663 * debugfs_initialized - Tells whether debugfs has been registered
 664 */
 665bool debugfs_initialized(void)
 666{
 667        return debugfs_registered;
 668}
 669EXPORT_SYMBOL_GPL(debugfs_initialized);
 670
 671
 672static struct kobject *debug_kobj;
 673
 674static int __init debugfs_init(void)
 675{
 676        int retval;
 677
 678        debug_kobj = kobject_create_and_add("debug", kernel_kobj);
 679        if (!debug_kobj)
 680                return -EINVAL;
 681
 682        retval = register_filesystem(&debug_fs_type);
 683        if (retval)
 684                kobject_put(debug_kobj);
 685        else
 686                debugfs_registered = true;
 687
 688        return retval;
 689}
 690core_initcall(debugfs_init);
 691
 692