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        err = debugfs_parse_options(data, &fsi->mount_opts);
 222        if (err)
 223                goto fail;
 224
 225        debugfs_apply_options(sb);
 226
 227fail:
 228        return err;
 229}
 230
 231static int debugfs_show_options(struct seq_file *m, struct dentry *root)
 232{
 233        struct debugfs_fs_info *fsi = root->d_sb->s_fs_info;
 234        struct debugfs_mount_opts *opts = &fsi->mount_opts;
 235
 236        if (!uid_eq(opts->uid, GLOBAL_ROOT_UID))
 237                seq_printf(m, ",uid=%u",
 238                           from_kuid_munged(&init_user_ns, opts->uid));
 239        if (!gid_eq(opts->gid, GLOBAL_ROOT_GID))
 240                seq_printf(m, ",gid=%u",
 241                           from_kgid_munged(&init_user_ns, opts->gid));
 242        if (opts->mode != DEBUGFS_DEFAULT_MODE)
 243                seq_printf(m, ",mode=%o", opts->mode);
 244
 245        return 0;
 246}
 247
 248static const struct super_operations debugfs_super_operations = {
 249        .statfs         = simple_statfs,
 250        .remount_fs     = debugfs_remount,
 251        .show_options   = debugfs_show_options,
 252};
 253
 254static int debug_fill_super(struct super_block *sb, void *data, int silent)
 255{
 256        static struct tree_descr debug_files[] = {{""}};
 257        struct debugfs_fs_info *fsi;
 258        int err;
 259
 260        save_mount_options(sb, data);
 261
 262        fsi = kzalloc(sizeof(struct debugfs_fs_info), GFP_KERNEL);
 263        sb->s_fs_info = fsi;
 264        if (!fsi) {
 265                err = -ENOMEM;
 266                goto fail;
 267        }
 268
 269        err = debugfs_parse_options(data, &fsi->mount_opts);
 270        if (err)
 271                goto fail;
 272
 273        err  =  simple_fill_super(sb, DEBUGFS_MAGIC, debug_files);
 274        if (err)
 275                goto fail;
 276
 277        sb->s_op = &debugfs_super_operations;
 278
 279        debugfs_apply_options(sb);
 280
 281        return 0;
 282
 283fail:
 284        kfree(fsi);
 285        sb->s_fs_info = NULL;
 286        return err;
 287}
 288
 289static struct dentry *debug_mount(struct file_system_type *fs_type,
 290                        int flags, const char *dev_name,
 291                        void *data)
 292{
 293        return mount_single(fs_type, flags, data, debug_fill_super);
 294}
 295
 296static struct file_system_type debug_fs_type = {
 297        .owner =        THIS_MODULE,
 298        .name =         "debugfs",
 299        .mount =        debug_mount,
 300        .kill_sb =      kill_litter_super,
 301};
 302MODULE_ALIAS_FS("debugfs");
 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        mutex_lock(&parent->d_inode->i_mutex);
 327        dentry = lookup_one_len(name, parent, strlen(name));
 328        if (!IS_ERR(dentry)) {
 329                switch (mode & S_IFMT) {
 330                case S_IFDIR:
 331                        error = debugfs_mkdir(parent->d_inode, dentry, mode);
 332                                              
 333                        break;
 334                case S_IFLNK:
 335                        error = debugfs_link(parent->d_inode, dentry, mode,
 336                                             data);
 337                        break;
 338                default:
 339                        error = debugfs_create(parent->d_inode, dentry, mode,
 340                                               data, fops);
 341                        break;
 342                }
 343                dput(dentry);
 344        } else
 345                error = PTR_ERR(dentry);
 346        mutex_unlock(&parent->d_inode->i_mutex);
 347
 348        if (error) {
 349                dentry = NULL;
 350                simple_release_fs(&debugfs_mount, &debugfs_mount_count);
 351        }
 352exit:
 353        return dentry;
 354}
 355
 356/**
 357 * debugfs_create_file - create a file in the debugfs filesystem
 358 * @name: a pointer to a string containing the name of the file to create.
 359 * @mode: the permission that the file should have.
 360 * @parent: a pointer to the parent dentry for this file.  This should be a
 361 *          directory dentry if set.  If this paramater is NULL, then the
 362 *          file will be created in the root of the debugfs filesystem.
 363 * @data: a pointer to something that the caller will want to get to later
 364 *        on.  The inode.i_private pointer will point to this value on
 365 *        the open() call.
 366 * @fops: a pointer to a struct file_operations that should be used for
 367 *        this file.
 368 *
 369 * This is the basic "create a file" function for debugfs.  It allows for a
 370 * wide range of flexibility in creating a file, or a directory (if you want
 371 * to create a directory, the debugfs_create_dir() function is
 372 * recommended to be used instead.)
 373 *
 374 * This function will return a pointer to a dentry if it succeeds.  This
 375 * pointer must be passed to the debugfs_remove() function when the file is
 376 * to be removed (no automatic cleanup happens if your module is unloaded,
 377 * you are responsible here.)  If an error occurs, %NULL will be returned.
 378 *
 379 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
 380 * returned.
 381 */
 382struct dentry *debugfs_create_file(const char *name, umode_t mode,
 383                                   struct dentry *parent, void *data,
 384                                   const struct file_operations *fops)
 385{
 386        switch (mode & S_IFMT) {
 387        case S_IFREG:
 388        case 0:
 389                break;
 390        default:
 391                BUG();
 392        }
 393
 394        return __create_file(name, mode, parent, data, fops);
 395}
 396EXPORT_SYMBOL_GPL(debugfs_create_file);
 397
 398/**
 399 * debugfs_create_dir - create a directory in the debugfs filesystem
 400 * @name: a pointer to a string containing the name of the directory to
 401 *        create.
 402 * @parent: a pointer to the parent dentry for this file.  This should be a
 403 *          directory dentry if set.  If this paramater is NULL, then the
 404 *          directory will be created in the root of the debugfs filesystem.
 405 *
 406 * This function creates a directory in debugfs with the given name.
 407 *
 408 * This function will return a pointer to a dentry if it succeeds.  This
 409 * pointer must be passed to the debugfs_remove() function when the file is
 410 * to be removed (no automatic cleanup happens if your module is unloaded,
 411 * you are responsible here.)  If an error occurs, %NULL will be returned.
 412 *
 413 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
 414 * returned.
 415 */
 416struct dentry *debugfs_create_dir(const char *name, struct dentry *parent)
 417{
 418        return __create_file(name, S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO,
 419                                   parent, NULL, NULL);
 420}
 421EXPORT_SYMBOL_GPL(debugfs_create_dir);
 422
 423/**
 424 * debugfs_create_symlink- create a symbolic link in the debugfs filesystem
 425 * @name: a pointer to a string containing the name of the symbolic link to
 426 *        create.
 427 * @parent: a pointer to the parent dentry for this symbolic link.  This
 428 *          should be a directory dentry if set.  If this paramater is NULL,
 429 *          then the symbolic link will be created in the root of the debugfs
 430 *          filesystem.
 431 * @target: a pointer to a string containing the path to the target of the
 432 *          symbolic link.
 433 *
 434 * This function creates a symbolic link with the given name in debugfs that
 435 * links to the given target path.
 436 *
 437 * This function will return a pointer to a dentry if it succeeds.  This
 438 * pointer must be passed to the debugfs_remove() function when the symbolic
 439 * link is to be removed (no automatic cleanup happens if your module is
 440 * unloaded, you are responsible here.)  If an error occurs, %NULL will be
 441 * returned.
 442 *
 443 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
 444 * returned.
 445 */
 446struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent,
 447                                      const char *target)
 448{
 449        struct dentry *result;
 450        char *link;
 451
 452        link = kstrdup(target, GFP_KERNEL);
 453        if (!link)
 454                return NULL;
 455
 456        result = __create_file(name, S_IFLNK | S_IRWXUGO, parent, link, NULL);
 457        if (!result)
 458                kfree(link);
 459        return result;
 460}
 461EXPORT_SYMBOL_GPL(debugfs_create_symlink);
 462
 463static int __debugfs_remove(struct dentry *dentry, struct dentry *parent)
 464{
 465        int ret = 0;
 466
 467        if (debugfs_positive(dentry)) {
 468                if (dentry->d_inode) {
 469                        dget(dentry);
 470                        switch (dentry->d_inode->i_mode & S_IFMT) {
 471                        case S_IFDIR:
 472                                ret = simple_rmdir(parent->d_inode, dentry);
 473                                break;
 474                        case S_IFLNK:
 475                                kfree(dentry->d_inode->i_private);
 476                                /* fall through */
 477                        default:
 478                                simple_unlink(parent->d_inode, dentry);
 479                                break;
 480                        }
 481                        if (!ret)
 482                                d_delete(dentry);
 483                        dput(dentry);
 484                }
 485        }
 486        return ret;
 487}
 488
 489/**
 490 * debugfs_remove - removes a file or directory from the debugfs filesystem
 491 * @dentry: a pointer to a the dentry of the file or directory to be
 492 *          removed.
 493 *
 494 * This function removes a file or directory in debugfs that was previously
 495 * created with a call to another debugfs function (like
 496 * debugfs_create_file() or variants thereof.)
 497 *
 498 * This function is required to be called in order for the file to be
 499 * removed, no automatic cleanup of files will happen when a module is
 500 * removed, you are responsible here.
 501 */
 502void debugfs_remove(struct dentry *dentry)
 503{
 504        struct dentry *parent;
 505        int ret;
 506
 507        if (IS_ERR_OR_NULL(dentry))
 508                return;
 509
 510        parent = dentry->d_parent;
 511        if (!parent || !parent->d_inode)
 512                return;
 513
 514        mutex_lock(&parent->d_inode->i_mutex);
 515        ret = __debugfs_remove(dentry, parent);
 516        mutex_unlock(&parent->d_inode->i_mutex);
 517        if (!ret)
 518                simple_release_fs(&debugfs_mount, &debugfs_mount_count);
 519}
 520EXPORT_SYMBOL_GPL(debugfs_remove);
 521
 522/**
 523 * debugfs_remove_recursive - recursively removes a directory
 524 * @dentry: a pointer to a the dentry of the directory to be removed.
 525 *
 526 * This function recursively removes a directory tree in debugfs that
 527 * was previously created with a call to another debugfs function
 528 * (like debugfs_create_file() or variants thereof.)
 529 *
 530 * This function is required to be called in order for the file to be
 531 * removed, no automatic cleanup of files will happen when a module is
 532 * removed, you are responsible here.
 533 */
 534void debugfs_remove_recursive(struct dentry *dentry)
 535{
 536        struct dentry *child, *next, *parent;
 537
 538        if (IS_ERR_OR_NULL(dentry))
 539                return;
 540
 541        parent = dentry->d_parent;
 542        if (!parent || !parent->d_inode)
 543                return;
 544
 545        parent = dentry;
 546 down:
 547        mutex_lock(&parent->d_inode->i_mutex);
 548        list_for_each_entry_safe(child, next, &parent->d_subdirs, d_u.d_child) {
 549                if (!debugfs_positive(child))
 550                        continue;
 551
 552                /* perhaps simple_empty(child) makes more sense */
 553                if (!list_empty(&child->d_subdirs)) {
 554                        mutex_unlock(&parent->d_inode->i_mutex);
 555                        parent = child;
 556                        goto down;
 557                }
 558 up:
 559                if (!__debugfs_remove(child, parent))
 560                        simple_release_fs(&debugfs_mount, &debugfs_mount_count);
 561        }
 562
 563        mutex_unlock(&parent->d_inode->i_mutex);
 564        child = parent;
 565        parent = parent->d_parent;
 566        mutex_lock(&parent->d_inode->i_mutex);
 567
 568        if (child != dentry) {
 569                next = list_entry(child->d_u.d_child.next, struct dentry,
 570                                        d_u.d_child);
 571                goto up;
 572        }
 573
 574        if (!__debugfs_remove(child, parent))
 575                simple_release_fs(&debugfs_mount, &debugfs_mount_count);
 576        mutex_unlock(&parent->d_inode->i_mutex);
 577}
 578EXPORT_SYMBOL_GPL(debugfs_remove_recursive);
 579
 580/**
 581 * debugfs_rename - rename a file/directory in the debugfs filesystem
 582 * @old_dir: a pointer to the parent dentry for the renamed object. This
 583 *          should be a directory dentry.
 584 * @old_dentry: dentry of an object to be renamed.
 585 * @new_dir: a pointer to the parent dentry where the object should be
 586 *          moved. This should be a directory dentry.
 587 * @new_name: a pointer to a string containing the target name.
 588 *
 589 * This function renames a file/directory in debugfs.  The target must not
 590 * exist for rename to succeed.
 591 *
 592 * This function will return a pointer to old_dentry (which is updated to
 593 * reflect renaming) if it succeeds. If an error occurs, %NULL will be
 594 * returned.
 595 *
 596 * If debugfs is not enabled in the kernel, the value -%ENODEV will be
 597 * returned.
 598 */
 599struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
 600                struct dentry *new_dir, const char *new_name)
 601{
 602        int error;
 603        struct dentry *dentry = NULL, *trap;
 604        const char *old_name;
 605
 606        trap = lock_rename(new_dir, old_dir);
 607        /* Source or destination directories don't exist? */
 608        if (!old_dir->d_inode || !new_dir->d_inode)
 609                goto exit;
 610        /* Source does not exist, cyclic rename, or mountpoint? */
 611        if (!old_dentry->d_inode || old_dentry == trap ||
 612            d_mountpoint(old_dentry))
 613                goto exit;
 614        dentry = lookup_one_len(new_name, new_dir, strlen(new_name));
 615        /* Lookup failed, cyclic rename or target exists? */
 616        if (IS_ERR(dentry) || dentry == trap || dentry->d_inode)
 617                goto exit;
 618
 619        old_name = fsnotify_oldname_init(old_dentry->d_name.name);
 620
 621        error = simple_rename(old_dir->d_inode, old_dentry, new_dir->d_inode,
 622                dentry);
 623        if (error) {
 624                fsnotify_oldname_free(old_name);
 625                goto exit;
 626        }
 627        d_move(old_dentry, dentry);
 628        fsnotify_move(old_dir->d_inode, new_dir->d_inode, old_name,
 629                S_ISDIR(old_dentry->d_inode->i_mode),
 630                NULL, old_dentry);
 631        fsnotify_oldname_free(old_name);
 632        unlock_rename(new_dir, old_dir);
 633        dput(dentry);
 634        return old_dentry;
 635exit:
 636        if (dentry && !IS_ERR(dentry))
 637                dput(dentry);
 638        unlock_rename(new_dir, old_dir);
 639        return NULL;
 640}
 641EXPORT_SYMBOL_GPL(debugfs_rename);
 642
 643/**
 644 * debugfs_initialized - Tells whether debugfs has been registered
 645 */
 646bool debugfs_initialized(void)
 647{
 648        return debugfs_registered;
 649}
 650EXPORT_SYMBOL_GPL(debugfs_initialized);
 651
 652
 653static struct kobject *debug_kobj;
 654
 655static int __init debugfs_init(void)
 656{
 657        int retval;
 658
 659        debug_kobj = kobject_create_and_add("debug", kernel_kobj);
 660        if (!debug_kobj)
 661                return -EINVAL;
 662
 663        retval = register_filesystem(&debug_fs_type);
 664        if (retval)
 665                kobject_put(debug_kobj);
 666        else
 667                debugfs_registered = true;
 668
 669        return retval;
 670}
 671core_initcall(debugfs_init);
 672
 673
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.