linux/fs/proc/generic.c
<<
>>
Prefs
   1/*
   2 * proc/fs/generic.c --- generic routines for the proc-fs
   3 *
   4 * This file contains generic proc-fs routines for handling
   5 * directories and files.
   6 * 
   7 * Copyright (C) 1991, 1992 Linus Torvalds.
   8 * Copyright (C) 1997 Theodore Ts'o
   9 */
  10
  11#include <linux/errno.h>
  12#include <linux/time.h>
  13#include <linux/proc_fs.h>
  14#include <linux/stat.h>
  15#include <linux/mm.h>
  16#include <linux/module.h>
  17#include <linux/slab.h>
  18#include <linux/printk.h>
  19#include <linux/mount.h>
  20#include <linux/init.h>
  21#include <linux/idr.h>
  22#include <linux/namei.h>
  23#include <linux/bitops.h>
  24#include <linux/spinlock.h>
  25#include <linux/completion.h>
  26#include <asm/uaccess.h>
  27
  28#include "internal.h"
  29
  30DEFINE_SPINLOCK(proc_subdir_lock);
  31
  32static int proc_match(unsigned int len, const char *name, struct proc_dir_entry *de)
  33{
  34        if (de->namelen != len)
  35                return 0;
  36        return !memcmp(name, de->name, len);
  37}
  38
  39static int proc_notify_change(struct dentry *dentry, struct iattr *iattr)
  40{
  41        struct inode *inode = dentry->d_inode;
  42        struct proc_dir_entry *de = PDE(inode);
  43        int error;
  44
  45        error = inode_change_ok(inode, iattr);
  46        if (error)
  47                return error;
  48
  49        setattr_copy(inode, iattr);
  50        mark_inode_dirty(inode);
  51
  52        proc_set_user(de, inode->i_uid, inode->i_gid);
  53        de->mode = inode->i_mode;
  54        return 0;
  55}
  56
  57static int proc_getattr(struct vfsmount *mnt, struct dentry *dentry,
  58                        struct kstat *stat)
  59{
  60        struct inode *inode = dentry->d_inode;
  61        struct proc_dir_entry *de = PROC_I(inode)->pde;
  62        if (de && de->nlink)
  63                set_nlink(inode, de->nlink);
  64
  65        generic_fillattr(inode, stat);
  66        return 0;
  67}
  68
  69static const struct inode_operations proc_file_inode_operations = {
  70        .setattr        = proc_notify_change,
  71};
  72
  73/*
  74 * This function parses a name such as "tty/driver/serial", and
  75 * returns the struct proc_dir_entry for "/proc/tty/driver", and
  76 * returns "serial" in residual.
  77 */
  78static int __xlate_proc_name(const char *name, struct proc_dir_entry **ret,
  79                             const char **residual)
  80{
  81        const char              *cp = name, *next;
  82        struct proc_dir_entry   *de;
  83        unsigned int            len;
  84
  85        de = *ret;
  86        if (!de)
  87                de = &proc_root;
  88
  89        while (1) {
  90                next = strchr(cp, '/');
  91                if (!next)
  92                        break;
  93
  94                len = next - cp;
  95                for (de = de->subdir; de ; de = de->next) {
  96                        if (proc_match(len, cp, de))
  97                                break;
  98                }
  99                if (!de) {
 100                        WARN(1, "name '%s'\n", name);
 101                        return -ENOENT;
 102                }
 103                cp += len + 1;
 104        }
 105        *residual = cp;
 106        *ret = de;
 107        return 0;
 108}
 109
 110static int xlate_proc_name(const char *name, struct proc_dir_entry **ret,
 111                           const char **residual)
 112{
 113        int rv;
 114
 115        spin_lock(&proc_subdir_lock);
 116        rv = __xlate_proc_name(name, ret, residual);
 117        spin_unlock(&proc_subdir_lock);
 118        return rv;
 119}
 120
 121static DEFINE_IDA(proc_inum_ida);
 122static DEFINE_SPINLOCK(proc_inum_lock); /* protects the above */
 123
 124#define PROC_DYNAMIC_FIRST 0xF0000000U
 125
 126/*
 127 * Return an inode number between PROC_DYNAMIC_FIRST and
 128 * 0xffffffff, or zero on failure.
 129 */
 130int proc_alloc_inum(unsigned int *inum)
 131{
 132        unsigned int i;
 133        int error;
 134
 135retry:
 136        if (!ida_pre_get(&proc_inum_ida, GFP_KERNEL))
 137                return -ENOMEM;
 138
 139        spin_lock_irq(&proc_inum_lock);
 140        error = ida_get_new(&proc_inum_ida, &i);
 141        spin_unlock_irq(&proc_inum_lock);
 142        if (error == -EAGAIN)
 143                goto retry;
 144        else if (error)
 145                return error;
 146
 147        if (i > UINT_MAX - PROC_DYNAMIC_FIRST) {
 148                spin_lock_irq(&proc_inum_lock);
 149                ida_remove(&proc_inum_ida, i);
 150                spin_unlock_irq(&proc_inum_lock);
 151                return -ENOSPC;
 152        }
 153        *inum = PROC_DYNAMIC_FIRST + i;
 154        return 0;
 155}
 156
 157void proc_free_inum(unsigned int inum)
 158{
 159        unsigned long flags;
 160        spin_lock_irqsave(&proc_inum_lock, flags);
 161        ida_remove(&proc_inum_ida, inum - PROC_DYNAMIC_FIRST);
 162        spin_unlock_irqrestore(&proc_inum_lock, flags);
 163}
 164
 165static void *proc_follow_link(struct dentry *dentry, struct nameidata *nd)
 166{
 167        nd_set_link(nd, __PDE_DATA(dentry->d_inode));
 168        return NULL;
 169}
 170
 171static const struct inode_operations proc_link_inode_operations = {
 172        .readlink       = generic_readlink,
 173        .follow_link    = proc_follow_link,
 174};
 175
 176/*
 177 * Don't create negative dentries here, return -ENOENT by hand
 178 * instead.
 179 */
 180struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *dir,
 181                struct dentry *dentry)
 182{
 183        struct inode *inode;
 184
 185        spin_lock(&proc_subdir_lock);
 186        for (de = de->subdir; de ; de = de->next) {
 187                if (de->namelen != dentry->d_name.len)
 188                        continue;
 189                if (!memcmp(dentry->d_name.name, de->name, de->namelen)) {
 190                        pde_get(de);
 191                        spin_unlock(&proc_subdir_lock);
 192                        inode = proc_get_inode(dir->i_sb, de);
 193                        if (!inode)
 194                                return ERR_PTR(-ENOMEM);
 195                        d_set_d_op(dentry, &simple_dentry_operations);
 196                        d_add(dentry, inode);
 197                        return NULL;
 198                }
 199        }
 200        spin_unlock(&proc_subdir_lock);
 201        return ERR_PTR(-ENOENT);
 202}
 203
 204struct dentry *proc_lookup(struct inode *dir, struct dentry *dentry,
 205                unsigned int flags)
 206{
 207        return proc_lookup_de(PDE(dir), dir, dentry);
 208}
 209
 210/*
 211 * This returns non-zero if at EOF, so that the /proc
 212 * root directory can use this and check if it should
 213 * continue with the <pid> entries..
 214 *
 215 * Note that the VFS-layer doesn't care about the return
 216 * value of the readdir() call, as long as it's non-negative
 217 * for success..
 218 */
 219int proc_readdir_de(struct proc_dir_entry *de, struct file *file,
 220                    struct dir_context *ctx)
 221{
 222        int i;
 223
 224        if (!dir_emit_dots(file, ctx))
 225                return 0;
 226
 227        spin_lock(&proc_subdir_lock);
 228        de = de->subdir;
 229        i = ctx->pos - 2;
 230        for (;;) {
 231                if (!de) {
 232                        spin_unlock(&proc_subdir_lock);
 233                        return 0;
 234                }
 235                if (!i)
 236                        break;
 237                de = de->next;
 238                i--;
 239        }
 240
 241        do {
 242                struct proc_dir_entry *next;
 243                pde_get(de);
 244                spin_unlock(&proc_subdir_lock);
 245                if (!dir_emit(ctx, de->name, de->namelen,
 246                            de->low_ino, de->mode >> 12)) {
 247                        pde_put(de);
 248                        return 0;
 249                }
 250                spin_lock(&proc_subdir_lock);
 251                ctx->pos++;
 252                next = de->next;
 253                pde_put(de);
 254                de = next;
 255        } while (de);
 256        spin_unlock(&proc_subdir_lock);
 257        return 1;
 258}
 259
 260int proc_readdir(struct file *file, struct dir_context *ctx)
 261{
 262        struct inode *inode = file_inode(file);
 263
 264        return proc_readdir_de(PDE(inode), file, ctx);
 265}
 266
 267/*
 268 * These are the generic /proc directory operations. They
 269 * use the in-memory "struct proc_dir_entry" tree to parse
 270 * the /proc directory.
 271 */
 272static const struct file_operations proc_dir_operations = {
 273        .llseek                 = generic_file_llseek,
 274        .read                   = generic_read_dir,
 275        .iterate                = proc_readdir,
 276};
 277
 278/*
 279 * proc directories can do almost nothing..
 280 */
 281static const struct inode_operations proc_dir_inode_operations = {
 282        .lookup         = proc_lookup,
 283        .getattr        = proc_getattr,
 284        .setattr        = proc_notify_change,
 285};
 286
 287static int proc_register(struct proc_dir_entry * dir, struct proc_dir_entry * dp)
 288{
 289        struct proc_dir_entry *tmp;
 290        int ret;
 291        
 292        ret = proc_alloc_inum(&dp->low_ino);
 293        if (ret)
 294                return ret;
 295
 296        if (S_ISDIR(dp->mode)) {
 297                dp->proc_fops = &proc_dir_operations;
 298                dp->proc_iops = &proc_dir_inode_operations;
 299                dir->nlink++;
 300        } else if (S_ISLNK(dp->mode)) {
 301                dp->proc_iops = &proc_link_inode_operations;
 302        } else if (S_ISREG(dp->mode)) {
 303                BUG_ON(dp->proc_fops == NULL);
 304                dp->proc_iops = &proc_file_inode_operations;
 305        } else {
 306                WARN_ON(1);
 307                return -EINVAL;
 308        }
 309
 310        spin_lock(&proc_subdir_lock);
 311
 312        for (tmp = dir->subdir; tmp; tmp = tmp->next)
 313                if (strcmp(tmp->name, dp->name) == 0) {
 314                        WARN(1, "proc_dir_entry '%s/%s' already registered\n",
 315                                dir->name, dp->name);
 316                        break;
 317                }
 318
 319        dp->next = dir->subdir;
 320        dp->parent = dir;
 321        dir->subdir = dp;
 322        spin_unlock(&proc_subdir_lock);
 323
 324        return 0;
 325}
 326
 327static struct proc_dir_entry *__proc_create(struct proc_dir_entry **parent,
 328                                          const char *name,
 329                                          umode_t mode,
 330                                          nlink_t nlink)
 331{
 332        struct proc_dir_entry *ent = NULL;
 333        const char *fn = name;
 334        unsigned int len;
 335
 336        /* make sure name is valid */
 337        if (!name || !strlen(name))
 338                goto out;
 339
 340        if (xlate_proc_name(name, parent, &fn) != 0)
 341                goto out;
 342
 343        /* At this point there must not be any '/' characters beyond *fn */
 344        if (strchr(fn, '/'))
 345                goto out;
 346
 347        len = strlen(fn);
 348
 349        ent = kzalloc(sizeof(struct proc_dir_entry) + len + 1, GFP_KERNEL);
 350        if (!ent)
 351                goto out;
 352
 353        memcpy(ent->name, fn, len + 1);
 354        ent->namelen = len;
 355        ent->mode = mode;
 356        ent->nlink = nlink;
 357        atomic_set(&ent->count, 1);
 358        spin_lock_init(&ent->pde_unload_lock);
 359        INIT_LIST_HEAD(&ent->pde_openers);
 360out:
 361        return ent;
 362}
 363
 364struct proc_dir_entry *proc_symlink(const char *name,
 365                struct proc_dir_entry *parent, const char *dest)
 366{
 367        struct proc_dir_entry *ent;
 368
 369        ent = __proc_create(&parent, name,
 370                          (S_IFLNK | S_IRUGO | S_IWUGO | S_IXUGO),1);
 371
 372        if (ent) {
 373                ent->data = kmalloc((ent->size=strlen(dest))+1, GFP_KERNEL);
 374                if (ent->data) {
 375                        strcpy((char*)ent->data,dest);
 376                        if (proc_register(parent, ent) < 0) {
 377                                kfree(ent->data);
 378                                kfree(ent);
 379                                ent = NULL;
 380                        }
 381                } else {
 382                        kfree(ent);
 383                        ent = NULL;
 384                }
 385        }
 386        return ent;
 387}
 388EXPORT_SYMBOL(proc_symlink);
 389
 390struct proc_dir_entry *proc_mkdir_data(const char *name, umode_t mode,
 391                struct proc_dir_entry *parent, void *data)
 392{
 393        struct proc_dir_entry *ent;
 394
 395        if (mode == 0)
 396                mode = S_IRUGO | S_IXUGO;
 397
 398        ent = __proc_create(&parent, name, S_IFDIR | mode, 2);
 399        if (ent) {
 400                ent->data = data;
 401                if (proc_register(parent, ent) < 0) {
 402                        kfree(ent);
 403                        ent = NULL;
 404                }
 405        }
 406        return ent;
 407}
 408EXPORT_SYMBOL_GPL(proc_mkdir_data);
 409
 410struct proc_dir_entry *proc_mkdir_mode(const char *name, umode_t mode,
 411                                       struct proc_dir_entry *parent)
 412{
 413        return proc_mkdir_data(name, mode, parent, NULL);
 414}
 415EXPORT_SYMBOL(proc_mkdir_mode);
 416
 417struct proc_dir_entry *proc_mkdir(const char *name,
 418                struct proc_dir_entry *parent)
 419{
 420        return proc_mkdir_data(name, 0, parent, NULL);
 421}
 422EXPORT_SYMBOL(proc_mkdir);
 423
 424struct proc_dir_entry *proc_create_data(const char *name, umode_t mode,
 425                                        struct proc_dir_entry *parent,
 426                                        const struct file_operations *proc_fops,
 427                                        void *data)
 428{
 429        struct proc_dir_entry *pde;
 430        if ((mode & S_IFMT) == 0)
 431                mode |= S_IFREG;
 432
 433        if (!S_ISREG(mode)) {
 434                WARN_ON(1);     /* use proc_mkdir() */
 435                return NULL;
 436        }
 437
 438        if ((mode & S_IALLUGO) == 0)
 439                mode |= S_IRUGO;
 440        pde = __proc_create(&parent, name, mode, 1);
 441        if (!pde)
 442                goto out;
 443        pde->proc_fops = proc_fops;
 444        pde->data = data;
 445        if (proc_register(parent, pde) < 0)
 446                goto out_free;
 447        return pde;
 448out_free:
 449        kfree(pde);
 450out:
 451        return NULL;
 452}
 453EXPORT_SYMBOL(proc_create_data);
 454 
 455void proc_set_size(struct proc_dir_entry *de, loff_t size)
 456{
 457        de->size = size;
 458}
 459EXPORT_SYMBOL(proc_set_size);
 460
 461void proc_set_user(struct proc_dir_entry *de, kuid_t uid, kgid_t gid)
 462{
 463        de->uid = uid;
 464        de->gid = gid;
 465}
 466EXPORT_SYMBOL(proc_set_user);
 467
 468static void free_proc_entry(struct proc_dir_entry *de)
 469{
 470        proc_free_inum(de->low_ino);
 471
 472        if (S_ISLNK(de->mode))
 473                kfree(de->data);
 474        kfree(de);
 475}
 476
 477void pde_put(struct proc_dir_entry *pde)
 478{
 479        if (atomic_dec_and_test(&pde->count))
 480                free_proc_entry(pde);
 481}
 482
 483/*
 484 * Remove a /proc entry and free it if it's not currently in use.
 485 */
 486void remove_proc_entry(const char *name, struct proc_dir_entry *parent)
 487{
 488        struct proc_dir_entry **p;
 489        struct proc_dir_entry *de = NULL;
 490        const char *fn = name;
 491        unsigned int len;
 492
 493        spin_lock(&proc_subdir_lock);
 494        if (__xlate_proc_name(name, &parent, &fn) != 0) {
 495                spin_unlock(&proc_subdir_lock);
 496                return;
 497        }
 498        len = strlen(fn);
 499
 500        for (p = &parent->subdir; *p; p=&(*p)->next ) {
 501                if (proc_match(len, fn, *p)) {
 502                        de = *p;
 503                        *p = de->next;
 504                        de->next = NULL;
 505                        break;
 506                }
 507        }
 508        spin_unlock(&proc_subdir_lock);
 509        if (!de) {
 510                WARN(1, "name '%s'\n", name);
 511                return;
 512        }
 513
 514        proc_entry_rundown(de);
 515
 516        if (S_ISDIR(de->mode))
 517                parent->nlink--;
 518        de->nlink = 0;
 519        WARN(de->subdir, "%s: removing non-empty directory "
 520                         "'%s/%s', leaking at least '%s'\n", __func__,
 521                         de->parent->name, de->name, de->subdir->name);
 522        pde_put(de);
 523}
 524EXPORT_SYMBOL(remove_proc_entry);
 525
 526int remove_proc_subtree(const char *name, struct proc_dir_entry *parent)
 527{
 528        struct proc_dir_entry **p;
 529        struct proc_dir_entry *root = NULL, *de, *next;
 530        const char *fn = name;
 531        unsigned int len;
 532
 533        spin_lock(&proc_subdir_lock);
 534        if (__xlate_proc_name(name, &parent, &fn) != 0) {
 535                spin_unlock(&proc_subdir_lock);
 536                return -ENOENT;
 537        }
 538        len = strlen(fn);
 539
 540        for (p = &parent->subdir; *p; p=&(*p)->next ) {
 541                if (proc_match(len, fn, *p)) {
 542                        root = *p;
 543                        *p = root->next;
 544                        root->next = NULL;
 545                        break;
 546                }
 547        }
 548        if (!root) {
 549                spin_unlock(&proc_subdir_lock);
 550                return -ENOENT;
 551        }
 552        de = root;
 553        while (1) {
 554                next = de->subdir;
 555                if (next) {
 556                        de->subdir = next->next;
 557                        next->next = NULL;
 558                        de = next;
 559                        continue;
 560                }
 561                spin_unlock(&proc_subdir_lock);
 562
 563                proc_entry_rundown(de);
 564                next = de->parent;
 565                if (S_ISDIR(de->mode))
 566                        next->nlink--;
 567                de->nlink = 0;
 568                if (de == root)
 569                        break;
 570                pde_put(de);
 571
 572                spin_lock(&proc_subdir_lock);
 573                de = next;
 574        }
 575        pde_put(root);
 576        return 0;
 577}
 578EXPORT_SYMBOL(remove_proc_subtree);
 579
 580void *proc_get_parent_data(const struct inode *inode)
 581{
 582        struct proc_dir_entry *de = PDE(inode);
 583        return de->parent->data;
 584}
 585EXPORT_SYMBOL_GPL(proc_get_parent_data);
 586
 587void proc_remove(struct proc_dir_entry *de)
 588{
 589        if (de)
 590                remove_proc_subtree(de->name, de->parent);
 591}
 592EXPORT_SYMBOL(proc_remove);
 593
 594void *PDE_DATA(const struct inode *inode)
 595{
 596        return __PDE_DATA(inode);
 597}
 598EXPORT_SYMBOL(PDE_DATA);
 599