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                        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 */
  74static 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
  93static 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
 106static 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
 113static 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
 125static inline int debugfs_positive(struct dentry *dentry)
 126{
 127        return dentry->d_inode && !d_unhashed(dentry);
 128}
 129
 130struct debugfs_mount_opts {
 131        kuid_t uid;
 132        kgid_t gid;
 133        umode_t mode;
 134};
 135
 136enum {
 137        Opt_uid,
 138        Opt_gid,
 139        Opt_mode,
 140        Opt_err
 141};
 142
 143static 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
 150struct debugfs_fs_info {
 151        struct debugfs_mount_opts mount_opts;
 152};
 153
 154static int debugfs_parse_options(char *data, struct debugfs_mount_opts *opts)
 155{
 156        substring_t args[MAX_OPT_ARGS];
 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
 202static 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
 217static 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
 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};
 303
 304static 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        }
 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 paramater 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 paramater 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 paramater 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;
 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}
 604EXPORT_SYMBOL_GPL(debugfs_remove_recursive);
 605
 606/**
 607 * debugfs_rename - rename a file/directory in the debugfs filesystem
 608 * @old_dir: a pointer to the parent dentry for the renamed object. This
 609 *          should be a directory dentry.
 610 * @old_dentry: dentry of an object to be renamed.
 611 * @new_dir: a pointer to the parent dentry where the object should be
 612 *          moved. This should be a directory dentry.
 613 * @new_name: a pointer to a string containing the target name.
 614 *
 615 * This function renames a file/directory in debugfs.  The target must not
 616 * exist for rename to succeed.
 617 *
 618 * This function will return a pointer to old_dentry (which is updated to
 619 * reflect renaming) if it succeeds. If an error occurs, %NULL will be
 620 * returned.
 621 *
 622 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
 623 * returned.
 624 */
 625struct 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;
 661exit:
 662        if (dentry && !IS_ERR(dentry))
 663                dput(dentry);
 664        unlock_rename(new_dir, old_dir);
 665        return NULL;
 666}
 667EXPORT_SYMBOL_GPL(debugfs_rename);
 668
 669/**
 670 * debugfs_initialized - Tells whether debugfs has been registered
 671 */
 672bool debugfs_initialized(void)
 673{
 674        return debugfs_registered;
 675}
 676EXPORT_SYMBOL_GPL(debugfs_initialized);
 677
 678
 679static struct kobject *debug_kobj;
 680
 681static 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}
 697core_initcall(debugfs_init);
 698
 699
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.