This source file includes following definitions.
- is_empty_dir
- set_empty_dir
- clear_empty_dir
- proc_sys_poll_notify
- sysctl_print_dir
- namecmp
- find_entry
- insert_entry
- erase_entry
- init_header
- erase_header
- insert_header
- use_table
- unuse_table
- proc_sys_prune_dcache
- start_unregistering
- sysctl_head_grab
- sysctl_head_finish
- lookup_header_set
- lookup_entry
- first_usable_entry
- first_entry
- next_entry
- test_perm
- sysctl_perm
- proc_sys_make_inode
- proc_sys_evict_inode
- grab_header
- proc_sys_lookup
- proc_sys_call_handler
- proc_sys_read
- proc_sys_write
- proc_sys_open
- proc_sys_poll
- proc_sys_fill_cache
- proc_sys_link_fill_cache
- scan
- proc_sys_readdir
- proc_sys_permission
- proc_sys_setattr
- proc_sys_getattr
- proc_sys_revalidate
- proc_sys_delete
- sysctl_is_seen
- proc_sys_compare
- find_subdir
- new_dir
- get_subdir
- xlate_dir
- sysctl_follow_link
- sysctl_err
- sysctl_check_table_array
- sysctl_check_table
- new_links
- get_links
- insert_links
- __register_sysctl_table
- register_sysctl
- append_path
- count_subheaders
- register_leaf_sysctl_tables
- __register_sysctl_paths
- register_sysctl_paths
- register_sysctl_table
- put_links
- drop_sysctl_table
- unregister_sysctl_table
- setup_sysctl_set
- retire_sysctl_set
- proc_sys_init
   1 
   2 
   3 
   4 
   5 #include <linux/init.h>
   6 #include <linux/sysctl.h>
   7 #include <linux/poll.h>
   8 #include <linux/proc_fs.h>
   9 #include <linux/printk.h>
  10 #include <linux/security.h>
  11 #include <linux/sched.h>
  12 #include <linux/cred.h>
  13 #include <linux/namei.h>
  14 #include <linux/mm.h>
  15 #include <linux/module.h>
  16 #include <linux/bpf-cgroup.h>
  17 #include "internal.h"
  18 
  19 static const struct dentry_operations proc_sys_dentry_operations;
  20 static const struct file_operations proc_sys_file_operations;
  21 static const struct inode_operations proc_sys_inode_operations;
  22 static const struct file_operations proc_sys_dir_file_operations;
  23 static const struct inode_operations proc_sys_dir_operations;
  24 
  25 
  26 const int sysctl_vals[] = { 0, 1, INT_MAX };
  27 EXPORT_SYMBOL(sysctl_vals);
  28 
  29 
  30 
  31 struct ctl_table sysctl_mount_point[] = {
  32         { }
  33 };
  34 
  35 static bool is_empty_dir(struct ctl_table_header *head)
  36 {
  37         return head->ctl_table[0].child == sysctl_mount_point;
  38 }
  39 
  40 static void set_empty_dir(struct ctl_dir *dir)
  41 {
  42         dir->header.ctl_table[0].child = sysctl_mount_point;
  43 }
  44 
  45 static void clear_empty_dir(struct ctl_dir *dir)
  46 
  47 {
  48         dir->header.ctl_table[0].child = NULL;
  49 }
  50 
  51 void proc_sys_poll_notify(struct ctl_table_poll *poll)
  52 {
  53         if (!poll)
  54                 return;
  55 
  56         atomic_inc(&poll->event);
  57         wake_up_interruptible(&poll->wait);
  58 }
  59 
  60 static struct ctl_table root_table[] = {
  61         {
  62                 .procname = "",
  63                 .mode = S_IFDIR|S_IRUGO|S_IXUGO,
  64         },
  65         { }
  66 };
  67 static struct ctl_table_root sysctl_table_root = {
  68         .default_set.dir.header = {
  69                 {{.count = 1,
  70                   .nreg = 1,
  71                   .ctl_table = root_table }},
  72                 .ctl_table_arg = root_table,
  73                 .root = &sysctl_table_root,
  74                 .set = &sysctl_table_root.default_set,
  75         },
  76 };
  77 
  78 static DEFINE_SPINLOCK(sysctl_lock);
  79 
  80 static void drop_sysctl_table(struct ctl_table_header *header);
  81 static int sysctl_follow_link(struct ctl_table_header **phead,
  82         struct ctl_table **pentry);
  83 static int insert_links(struct ctl_table_header *head);
  84 static void put_links(struct ctl_table_header *header);
  85 
  86 static void sysctl_print_dir(struct ctl_dir *dir)
  87 {
  88         if (dir->header.parent)
  89                 sysctl_print_dir(dir->header.parent);
  90         pr_cont("%s/", dir->header.ctl_table[0].procname);
  91 }
  92 
  93 static int namecmp(const char *name1, int len1, const char *name2, int len2)
  94 {
  95         int minlen;
  96         int cmp;
  97 
  98         minlen = len1;
  99         if (minlen > len2)
 100                 minlen = len2;
 101 
 102         cmp = memcmp(name1, name2, minlen);
 103         if (cmp == 0)
 104                 cmp = len1 - len2;
 105         return cmp;
 106 }
 107 
 108 
 109 static struct ctl_table *find_entry(struct ctl_table_header **phead,
 110         struct ctl_dir *dir, const char *name, int namelen)
 111 {
 112         struct ctl_table_header *head;
 113         struct ctl_table *entry;
 114         struct rb_node *node = dir->root.rb_node;
 115 
 116         while (node)
 117         {
 118                 struct ctl_node *ctl_node;
 119                 const char *procname;
 120                 int cmp;
 121 
 122                 ctl_node = rb_entry(node, struct ctl_node, node);
 123                 head = ctl_node->header;
 124                 entry = &head->ctl_table[ctl_node - head->node];
 125                 procname = entry->procname;
 126 
 127                 cmp = namecmp(name, namelen, procname, strlen(procname));
 128                 if (cmp < 0)
 129                         node = node->rb_left;
 130                 else if (cmp > 0)
 131                         node = node->rb_right;
 132                 else {
 133                         *phead = head;
 134                         return entry;
 135                 }
 136         }
 137         return NULL;
 138 }
 139 
 140 static int insert_entry(struct ctl_table_header *head, struct ctl_table *entry)
 141 {
 142         struct rb_node *node = &head->node[entry - head->ctl_table].node;
 143         struct rb_node **p = &head->parent->root.rb_node;
 144         struct rb_node *parent = NULL;
 145         const char *name = entry->procname;
 146         int namelen = strlen(name);
 147 
 148         while (*p) {
 149                 struct ctl_table_header *parent_head;
 150                 struct ctl_table *parent_entry;
 151                 struct ctl_node *parent_node;
 152                 const char *parent_name;
 153                 int cmp;
 154 
 155                 parent = *p;
 156                 parent_node = rb_entry(parent, struct ctl_node, node);
 157                 parent_head = parent_node->header;
 158                 parent_entry = &parent_head->ctl_table[parent_node - parent_head->node];
 159                 parent_name = parent_entry->procname;
 160 
 161                 cmp = namecmp(name, namelen, parent_name, strlen(parent_name));
 162                 if (cmp < 0)
 163                         p = &(*p)->rb_left;
 164                 else if (cmp > 0)
 165                         p = &(*p)->rb_right;
 166                 else {
 167                         pr_err("sysctl duplicate entry: ");
 168                         sysctl_print_dir(head->parent);
 169                         pr_cont("/%s\n", entry->procname);
 170                         return -EEXIST;
 171                 }
 172         }
 173 
 174         rb_link_node(node, parent, p);
 175         rb_insert_color(node, &head->parent->root);
 176         return 0;
 177 }
 178 
 179 static void erase_entry(struct ctl_table_header *head, struct ctl_table *entry)
 180 {
 181         struct rb_node *node = &head->node[entry - head->ctl_table].node;
 182 
 183         rb_erase(node, &head->parent->root);
 184 }
 185 
 186 static void init_header(struct ctl_table_header *head,
 187         struct ctl_table_root *root, struct ctl_table_set *set,
 188         struct ctl_node *node, struct ctl_table *table)
 189 {
 190         head->ctl_table = table;
 191         head->ctl_table_arg = table;
 192         head->used = 0;
 193         head->count = 1;
 194         head->nreg = 1;
 195         head->unregistering = NULL;
 196         head->root = root;
 197         head->set = set;
 198         head->parent = NULL;
 199         head->node = node;
 200         INIT_HLIST_HEAD(&head->inodes);
 201         if (node) {
 202                 struct ctl_table *entry;
 203                 for (entry = table; entry->procname; entry++, node++)
 204                         node->header = head;
 205         }
 206 }
 207 
 208 static void erase_header(struct ctl_table_header *head)
 209 {
 210         struct ctl_table *entry;
 211         for (entry = head->ctl_table; entry->procname; entry++)
 212                 erase_entry(head, entry);
 213 }
 214 
 215 static int insert_header(struct ctl_dir *dir, struct ctl_table_header *header)
 216 {
 217         struct ctl_table *entry;
 218         int err;
 219 
 220         
 221         if (is_empty_dir(&dir->header))
 222                 return -EROFS;
 223 
 224         
 225         if (header->ctl_table == sysctl_mount_point) {
 226                 if (!RB_EMPTY_ROOT(&dir->root))
 227                         return -EINVAL;
 228                 set_empty_dir(dir);
 229         }
 230 
 231         dir->header.nreg++;
 232         header->parent = dir;
 233         err = insert_links(header);
 234         if (err)
 235                 goto fail_links;
 236         for (entry = header->ctl_table; entry->procname; entry++) {
 237                 err = insert_entry(header, entry);
 238                 if (err)
 239                         goto fail;
 240         }
 241         return 0;
 242 fail:
 243         erase_header(header);
 244         put_links(header);
 245 fail_links:
 246         if (header->ctl_table == sysctl_mount_point)
 247                 clear_empty_dir(dir);
 248         header->parent = NULL;
 249         drop_sysctl_table(&dir->header);
 250         return err;
 251 }
 252 
 253 
 254 static int use_table(struct ctl_table_header *p)
 255 {
 256         if (unlikely(p->unregistering))
 257                 return 0;
 258         p->used++;
 259         return 1;
 260 }
 261 
 262 
 263 static void unuse_table(struct ctl_table_header *p)
 264 {
 265         if (!--p->used)
 266                 if (unlikely(p->unregistering))
 267                         complete(p->unregistering);
 268 }
 269 
 270 static void proc_sys_prune_dcache(struct ctl_table_header *head)
 271 {
 272         struct inode *inode;
 273         struct proc_inode *ei;
 274         struct hlist_node *node;
 275         struct super_block *sb;
 276 
 277         rcu_read_lock();
 278         for (;;) {
 279                 node = hlist_first_rcu(&head->inodes);
 280                 if (!node)
 281                         break;
 282                 ei = hlist_entry(node, struct proc_inode, sysctl_inodes);
 283                 spin_lock(&sysctl_lock);
 284                 hlist_del_init_rcu(&ei->sysctl_inodes);
 285                 spin_unlock(&sysctl_lock);
 286 
 287                 inode = &ei->vfs_inode;
 288                 sb = inode->i_sb;
 289                 if (!atomic_inc_not_zero(&sb->s_active))
 290                         continue;
 291                 inode = igrab(inode);
 292                 rcu_read_unlock();
 293                 if (unlikely(!inode)) {
 294                         deactivate_super(sb);
 295                         rcu_read_lock();
 296                         continue;
 297                 }
 298 
 299                 d_prune_aliases(inode);
 300                 iput(inode);
 301                 deactivate_super(sb);
 302 
 303                 rcu_read_lock();
 304         }
 305         rcu_read_unlock();
 306 }
 307 
 308 
 309 static void start_unregistering(struct ctl_table_header *p)
 310 {
 311         
 312 
 313 
 314 
 315         if (unlikely(p->used)) {
 316                 struct completion wait;
 317                 init_completion(&wait);
 318                 p->unregistering = &wait;
 319                 spin_unlock(&sysctl_lock);
 320                 wait_for_completion(&wait);
 321         } else {
 322                 
 323                 p->unregistering = ERR_PTR(-EINVAL);
 324                 spin_unlock(&sysctl_lock);
 325         }
 326         
 327 
 328 
 329 
 330         proc_sys_prune_dcache(p);
 331         
 332 
 333 
 334 
 335         spin_lock(&sysctl_lock);
 336         erase_header(p);
 337 }
 338 
 339 static struct ctl_table_header *sysctl_head_grab(struct ctl_table_header *head)
 340 {
 341         BUG_ON(!head);
 342         spin_lock(&sysctl_lock);
 343         if (!use_table(head))
 344                 head = ERR_PTR(-ENOENT);
 345         spin_unlock(&sysctl_lock);
 346         return head;
 347 }
 348 
 349 static void sysctl_head_finish(struct ctl_table_header *head)
 350 {
 351         if (!head)
 352                 return;
 353         spin_lock(&sysctl_lock);
 354         unuse_table(head);
 355         spin_unlock(&sysctl_lock);
 356 }
 357 
 358 static struct ctl_table_set *
 359 lookup_header_set(struct ctl_table_root *root)
 360 {
 361         struct ctl_table_set *set = &root->default_set;
 362         if (root->lookup)
 363                 set = root->lookup(root);
 364         return set;
 365 }
 366 
 367 static struct ctl_table *lookup_entry(struct ctl_table_header **phead,
 368                                       struct ctl_dir *dir,
 369                                       const char *name, int namelen)
 370 {
 371         struct ctl_table_header *head;
 372         struct ctl_table *entry;
 373 
 374         spin_lock(&sysctl_lock);
 375         entry = find_entry(&head, dir, name, namelen);
 376         if (entry && use_table(head))
 377                 *phead = head;
 378         else
 379                 entry = NULL;
 380         spin_unlock(&sysctl_lock);
 381         return entry;
 382 }
 383 
 384 static struct ctl_node *first_usable_entry(struct rb_node *node)
 385 {
 386         struct ctl_node *ctl_node;
 387 
 388         for (;node; node = rb_next(node)) {
 389                 ctl_node = rb_entry(node, struct ctl_node, node);
 390                 if (use_table(ctl_node->header))
 391                         return ctl_node;
 392         }
 393         return NULL;
 394 }
 395 
 396 static void first_entry(struct ctl_dir *dir,
 397         struct ctl_table_header **phead, struct ctl_table **pentry)
 398 {
 399         struct ctl_table_header *head = NULL;
 400         struct ctl_table *entry = NULL;
 401         struct ctl_node *ctl_node;
 402 
 403         spin_lock(&sysctl_lock);
 404         ctl_node = first_usable_entry(rb_first(&dir->root));
 405         spin_unlock(&sysctl_lock);
 406         if (ctl_node) {
 407                 head = ctl_node->header;
 408                 entry = &head->ctl_table[ctl_node - head->node];
 409         }
 410         *phead = head;
 411         *pentry = entry;
 412 }
 413 
 414 static void next_entry(struct ctl_table_header **phead, struct ctl_table **pentry)
 415 {
 416         struct ctl_table_header *head = *phead;
 417         struct ctl_table *entry = *pentry;
 418         struct ctl_node *ctl_node = &head->node[entry - head->ctl_table];
 419 
 420         spin_lock(&sysctl_lock);
 421         unuse_table(head);
 422 
 423         ctl_node = first_usable_entry(rb_next(&ctl_node->node));
 424         spin_unlock(&sysctl_lock);
 425         head = NULL;
 426         if (ctl_node) {
 427                 head = ctl_node->header;
 428                 entry = &head->ctl_table[ctl_node - head->node];
 429         }
 430         *phead = head;
 431         *pentry = entry;
 432 }
 433 
 434 
 435 
 436 
 437 
 438 
 439 static int test_perm(int mode, int op)
 440 {
 441         if (uid_eq(current_euid(), GLOBAL_ROOT_UID))
 442                 mode >>= 6;
 443         else if (in_egroup_p(GLOBAL_ROOT_GID))
 444                 mode >>= 3;
 445         if ((op & ~mode & (MAY_READ|MAY_WRITE|MAY_EXEC)) == 0)
 446                 return 0;
 447         return -EACCES;
 448 }
 449 
 450 static int sysctl_perm(struct ctl_table_header *head, struct ctl_table *table, int op)
 451 {
 452         struct ctl_table_root *root = head->root;
 453         int mode;
 454 
 455         if (root->permissions)
 456                 mode = root->permissions(head, table);
 457         else
 458                 mode = table->mode;
 459 
 460         return test_perm(mode, op);
 461 }
 462 
 463 static struct inode *proc_sys_make_inode(struct super_block *sb,
 464                 struct ctl_table_header *head, struct ctl_table *table)
 465 {
 466         struct ctl_table_root *root = head->root;
 467         struct inode *inode;
 468         struct proc_inode *ei;
 469 
 470         inode = new_inode(sb);
 471         if (!inode)
 472                 return ERR_PTR(-ENOMEM);
 473 
 474         inode->i_ino = get_next_ino();
 475 
 476         ei = PROC_I(inode);
 477 
 478         spin_lock(&sysctl_lock);
 479         if (unlikely(head->unregistering)) {
 480                 spin_unlock(&sysctl_lock);
 481                 iput(inode);
 482                 return ERR_PTR(-ENOENT);
 483         }
 484         ei->sysctl = head;
 485         ei->sysctl_entry = table;
 486         hlist_add_head_rcu(&ei->sysctl_inodes, &head->inodes);
 487         head->count++;
 488         spin_unlock(&sysctl_lock);
 489 
 490         inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
 491         inode->i_mode = table->mode;
 492         if (!S_ISDIR(table->mode)) {
 493                 inode->i_mode |= S_IFREG;
 494                 inode->i_op = &proc_sys_inode_operations;
 495                 inode->i_fop = &proc_sys_file_operations;
 496         } else {
 497                 inode->i_mode |= S_IFDIR;
 498                 inode->i_op = &proc_sys_dir_operations;
 499                 inode->i_fop = &proc_sys_dir_file_operations;
 500                 if (is_empty_dir(head))
 501                         make_empty_dir_inode(inode);
 502         }
 503 
 504         if (root->set_ownership)
 505                 root->set_ownership(head, table, &inode->i_uid, &inode->i_gid);
 506         else {
 507                 inode->i_uid = GLOBAL_ROOT_UID;
 508                 inode->i_gid = GLOBAL_ROOT_GID;
 509         }
 510 
 511         return inode;
 512 }
 513 
 514 void proc_sys_evict_inode(struct inode *inode, struct ctl_table_header *head)
 515 {
 516         spin_lock(&sysctl_lock);
 517         hlist_del_init_rcu(&PROC_I(inode)->sysctl_inodes);
 518         if (!--head->count)
 519                 kfree_rcu(head, rcu);
 520         spin_unlock(&sysctl_lock);
 521 }
 522 
 523 static struct ctl_table_header *grab_header(struct inode *inode)
 524 {
 525         struct ctl_table_header *head = PROC_I(inode)->sysctl;
 526         if (!head)
 527                 head = &sysctl_table_root.default_set.dir.header;
 528         return sysctl_head_grab(head);
 529 }
 530 
 531 static struct dentry *proc_sys_lookup(struct inode *dir, struct dentry *dentry,
 532                                         unsigned int flags)
 533 {
 534         struct ctl_table_header *head = grab_header(dir);
 535         struct ctl_table_header *h = NULL;
 536         const struct qstr *name = &dentry->d_name;
 537         struct ctl_table *p;
 538         struct inode *inode;
 539         struct dentry *err = ERR_PTR(-ENOENT);
 540         struct ctl_dir *ctl_dir;
 541         int ret;
 542 
 543         if (IS_ERR(head))
 544                 return ERR_CAST(head);
 545 
 546         ctl_dir = container_of(head, struct ctl_dir, header);
 547 
 548         p = lookup_entry(&h, ctl_dir, name->name, name->len);
 549         if (!p)
 550                 goto out;
 551 
 552         if (S_ISLNK(p->mode)) {
 553                 ret = sysctl_follow_link(&h, &p);
 554                 err = ERR_PTR(ret);
 555                 if (ret)
 556                         goto out;
 557         }
 558 
 559         inode = proc_sys_make_inode(dir->i_sb, h ? h : head, p);
 560         if (IS_ERR(inode)) {
 561                 err = ERR_CAST(inode);
 562                 goto out;
 563         }
 564 
 565         d_set_d_op(dentry, &proc_sys_dentry_operations);
 566         err = d_splice_alias(inode, dentry);
 567 
 568 out:
 569         if (h)
 570                 sysctl_head_finish(h);
 571         sysctl_head_finish(head);
 572         return err;
 573 }
 574 
 575 static ssize_t proc_sys_call_handler(struct file *filp, void __user *buf,
 576                 size_t count, loff_t *ppos, int write)
 577 {
 578         struct inode *inode = file_inode(filp);
 579         struct ctl_table_header *head = grab_header(inode);
 580         struct ctl_table *table = PROC_I(inode)->sysctl_entry;
 581         void *new_buf = NULL;
 582         ssize_t error;
 583 
 584         if (IS_ERR(head))
 585                 return PTR_ERR(head);
 586 
 587         
 588 
 589 
 590 
 591         error = -EPERM;
 592         if (sysctl_perm(head, table, write ? MAY_WRITE : MAY_READ))
 593                 goto out;
 594 
 595         
 596         error = -EINVAL;
 597         if (!table->proc_handler)
 598                 goto out;
 599 
 600         error = BPF_CGROUP_RUN_PROG_SYSCTL(head, table, write, buf, &count,
 601                                            ppos, &new_buf);
 602         if (error)
 603                 goto out;
 604 
 605         
 606         if (new_buf) {
 607                 mm_segment_t old_fs;
 608 
 609                 old_fs = get_fs();
 610                 set_fs(KERNEL_DS);
 611                 error = table->proc_handler(table, write, (void __user *)new_buf,
 612                                             &count, ppos);
 613                 set_fs(old_fs);
 614                 kfree(new_buf);
 615         } else {
 616                 error = table->proc_handler(table, write, buf, &count, ppos);
 617         }
 618 
 619         if (!error)
 620                 error = count;
 621 out:
 622         sysctl_head_finish(head);
 623 
 624         return error;
 625 }
 626 
 627 static ssize_t proc_sys_read(struct file *filp, char __user *buf,
 628                                 size_t count, loff_t *ppos)
 629 {
 630         return proc_sys_call_handler(filp, (void __user *)buf, count, ppos, 0);
 631 }
 632 
 633 static ssize_t proc_sys_write(struct file *filp, const char __user *buf,
 634                                 size_t count, loff_t *ppos)
 635 {
 636         return proc_sys_call_handler(filp, (void __user *)buf, count, ppos, 1);
 637 }
 638 
 639 static int proc_sys_open(struct inode *inode, struct file *filp)
 640 {
 641         struct ctl_table_header *head = grab_header(inode);
 642         struct ctl_table *table = PROC_I(inode)->sysctl_entry;
 643 
 644         
 645         if (IS_ERR(head))
 646                 return PTR_ERR(head);
 647 
 648         if (table->poll)
 649                 filp->private_data = proc_sys_poll_event(table->poll);
 650 
 651         sysctl_head_finish(head);
 652 
 653         return 0;
 654 }
 655 
 656 static __poll_t proc_sys_poll(struct file *filp, poll_table *wait)
 657 {
 658         struct inode *inode = file_inode(filp);
 659         struct ctl_table_header *head = grab_header(inode);
 660         struct ctl_table *table = PROC_I(inode)->sysctl_entry;
 661         __poll_t ret = DEFAULT_POLLMASK;
 662         unsigned long event;
 663 
 664         
 665         if (IS_ERR(head))
 666                 return EPOLLERR | EPOLLHUP;
 667 
 668         if (!table->proc_handler)
 669                 goto out;
 670 
 671         if (!table->poll)
 672                 goto out;
 673 
 674         event = (unsigned long)filp->private_data;
 675         poll_wait(filp, &table->poll->wait, wait);
 676 
 677         if (event != atomic_read(&table->poll->event)) {
 678                 filp->private_data = proc_sys_poll_event(table->poll);
 679                 ret = EPOLLIN | EPOLLRDNORM | EPOLLERR | EPOLLPRI;
 680         }
 681 
 682 out:
 683         sysctl_head_finish(head);
 684 
 685         return ret;
 686 }
 687 
 688 static bool proc_sys_fill_cache(struct file *file,
 689                                 struct dir_context *ctx,
 690                                 struct ctl_table_header *head,
 691                                 struct ctl_table *table)
 692 {
 693         struct dentry *child, *dir = file->f_path.dentry;
 694         struct inode *inode;
 695         struct qstr qname;
 696         ino_t ino = 0;
 697         unsigned type = DT_UNKNOWN;
 698 
 699         qname.name = table->procname;
 700         qname.len  = strlen(table->procname);
 701         qname.hash = full_name_hash(dir, qname.name, qname.len);
 702 
 703         child = d_lookup(dir, &qname);
 704         if (!child) {
 705                 DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
 706                 child = d_alloc_parallel(dir, &qname, &wq);
 707                 if (IS_ERR(child))
 708                         return false;
 709                 if (d_in_lookup(child)) {
 710                         struct dentry *res;
 711                         inode = proc_sys_make_inode(dir->d_sb, head, table);
 712                         if (IS_ERR(inode)) {
 713                                 d_lookup_done(child);
 714                                 dput(child);
 715                                 return false;
 716                         }
 717                         d_set_d_op(child, &proc_sys_dentry_operations);
 718                         res = d_splice_alias(inode, child);
 719                         d_lookup_done(child);
 720                         if (unlikely(res)) {
 721                                 if (IS_ERR(res)) {
 722                                         dput(child);
 723                                         return false;
 724                                 }
 725                                 dput(child);
 726                                 child = res;
 727                         }
 728                 }
 729         }
 730         inode = d_inode(child);
 731         ino  = inode->i_ino;
 732         type = inode->i_mode >> 12;
 733         dput(child);
 734         return dir_emit(ctx, qname.name, qname.len, ino, type);
 735 }
 736 
 737 static bool proc_sys_link_fill_cache(struct file *file,
 738                                     struct dir_context *ctx,
 739                                     struct ctl_table_header *head,
 740                                     struct ctl_table *table)
 741 {
 742         bool ret = true;
 743 
 744         head = sysctl_head_grab(head);
 745         if (IS_ERR(head))
 746                 return false;
 747 
 748         
 749         if (sysctl_follow_link(&head, &table))
 750                 goto out;
 751 
 752         ret = proc_sys_fill_cache(file, ctx, head, table);
 753 out:
 754         sysctl_head_finish(head);
 755         return ret;
 756 }
 757 
 758 static int scan(struct ctl_table_header *head, struct ctl_table *table,
 759                 unsigned long *pos, struct file *file,
 760                 struct dir_context *ctx)
 761 {
 762         bool res;
 763 
 764         if ((*pos)++ < ctx->pos)
 765                 return true;
 766 
 767         if (unlikely(S_ISLNK(table->mode)))
 768                 res = proc_sys_link_fill_cache(file, ctx, head, table);
 769         else
 770                 res = proc_sys_fill_cache(file, ctx, head, table);
 771 
 772         if (res)
 773                 ctx->pos = *pos;
 774 
 775         return res;
 776 }
 777 
 778 static int proc_sys_readdir(struct file *file, struct dir_context *ctx)
 779 {
 780         struct ctl_table_header *head = grab_header(file_inode(file));
 781         struct ctl_table_header *h = NULL;
 782         struct ctl_table *entry;
 783         struct ctl_dir *ctl_dir;
 784         unsigned long pos;
 785 
 786         if (IS_ERR(head))
 787                 return PTR_ERR(head);
 788 
 789         ctl_dir = container_of(head, struct ctl_dir, header);
 790 
 791         if (!dir_emit_dots(file, ctx))
 792                 goto out;
 793 
 794         pos = 2;
 795 
 796         for (first_entry(ctl_dir, &h, &entry); h; next_entry(&h, &entry)) {
 797                 if (!scan(h, entry, &pos, file, ctx)) {
 798                         sysctl_head_finish(h);
 799                         break;
 800                 }
 801         }
 802 out:
 803         sysctl_head_finish(head);
 804         return 0;
 805 }
 806 
 807 static int proc_sys_permission(struct inode *inode, int mask)
 808 {
 809         
 810 
 811 
 812 
 813         struct ctl_table_header *head;
 814         struct ctl_table *table;
 815         int error;
 816 
 817         
 818         if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))
 819                 return -EACCES;
 820 
 821         head = grab_header(inode);
 822         if (IS_ERR(head))
 823                 return PTR_ERR(head);
 824 
 825         table = PROC_I(inode)->sysctl_entry;
 826         if (!table) 
 827                 error = mask & MAY_WRITE ? -EACCES : 0;
 828         else 
 829                 error = sysctl_perm(head, table, mask & ~MAY_NOT_BLOCK);
 830 
 831         sysctl_head_finish(head);
 832         return error;
 833 }
 834 
 835 static int proc_sys_setattr(struct dentry *dentry, struct iattr *attr)
 836 {
 837         struct inode *inode = d_inode(dentry);
 838         int error;
 839 
 840         if (attr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID))
 841                 return -EPERM;
 842 
 843         error = setattr_prepare(dentry, attr);
 844         if (error)
 845                 return error;
 846 
 847         setattr_copy(inode, attr);
 848         mark_inode_dirty(inode);
 849         return 0;
 850 }
 851 
 852 static int proc_sys_getattr(const struct path *path, struct kstat *stat,
 853                             u32 request_mask, unsigned int query_flags)
 854 {
 855         struct inode *inode = d_inode(path->dentry);
 856         struct ctl_table_header *head = grab_header(inode);
 857         struct ctl_table *table = PROC_I(inode)->sysctl_entry;
 858 
 859         if (IS_ERR(head))
 860                 return PTR_ERR(head);
 861 
 862         generic_fillattr(inode, stat);
 863         if (table)
 864                 stat->mode = (stat->mode & S_IFMT) | table->mode;
 865 
 866         sysctl_head_finish(head);
 867         return 0;
 868 }
 869 
 870 static const struct file_operations proc_sys_file_operations = {
 871         .open           = proc_sys_open,
 872         .poll           = proc_sys_poll,
 873         .read           = proc_sys_read,
 874         .write          = proc_sys_write,
 875         .llseek         = default_llseek,
 876 };
 877 
 878 static const struct file_operations proc_sys_dir_file_operations = {
 879         .read           = generic_read_dir,
 880         .iterate_shared = proc_sys_readdir,
 881         .llseek         = generic_file_llseek,
 882 };
 883 
 884 static const struct inode_operations proc_sys_inode_operations = {
 885         .permission     = proc_sys_permission,
 886         .setattr        = proc_sys_setattr,
 887         .getattr        = proc_sys_getattr,
 888 };
 889 
 890 static const struct inode_operations proc_sys_dir_operations = {
 891         .lookup         = proc_sys_lookup,
 892         .permission     = proc_sys_permission,
 893         .setattr        = proc_sys_setattr,
 894         .getattr        = proc_sys_getattr,
 895 };
 896 
 897 static int proc_sys_revalidate(struct dentry *dentry, unsigned int flags)
 898 {
 899         if (flags & LOOKUP_RCU)
 900                 return -ECHILD;
 901         return !PROC_I(d_inode(dentry))->sysctl->unregistering;
 902 }
 903 
 904 static int proc_sys_delete(const struct dentry *dentry)
 905 {
 906         return !!PROC_I(d_inode(dentry))->sysctl->unregistering;
 907 }
 908 
 909 static int sysctl_is_seen(struct ctl_table_header *p)
 910 {
 911         struct ctl_table_set *set = p->set;
 912         int res;
 913         spin_lock(&sysctl_lock);
 914         if (p->unregistering)
 915                 res = 0;
 916         else if (!set->is_seen)
 917                 res = 1;
 918         else
 919                 res = set->is_seen(set);
 920         spin_unlock(&sysctl_lock);
 921         return res;
 922 }
 923 
 924 static int proc_sys_compare(const struct dentry *dentry,
 925                 unsigned int len, const char *str, const struct qstr *name)
 926 {
 927         struct ctl_table_header *head;
 928         struct inode *inode;
 929 
 930         
 931 
 932         
 933         inode = d_inode_rcu(dentry);
 934         if (!inode)
 935                 return 1;
 936         if (name->len != len)
 937                 return 1;
 938         if (memcmp(name->name, str, len))
 939                 return 1;
 940         head = rcu_dereference(PROC_I(inode)->sysctl);
 941         return !head || !sysctl_is_seen(head);
 942 }
 943 
 944 static const struct dentry_operations proc_sys_dentry_operations = {
 945         .d_revalidate   = proc_sys_revalidate,
 946         .d_delete       = proc_sys_delete,
 947         .d_compare      = proc_sys_compare,
 948 };
 949 
 950 static struct ctl_dir *find_subdir(struct ctl_dir *dir,
 951                                    const char *name, int namelen)
 952 {
 953         struct ctl_table_header *head;
 954         struct ctl_table *entry;
 955 
 956         entry = find_entry(&head, dir, name, namelen);
 957         if (!entry)
 958                 return ERR_PTR(-ENOENT);
 959         if (!S_ISDIR(entry->mode))
 960                 return ERR_PTR(-ENOTDIR);
 961         return container_of(head, struct ctl_dir, header);
 962 }
 963 
 964 static struct ctl_dir *new_dir(struct ctl_table_set *set,
 965                                const char *name, int namelen)
 966 {
 967         struct ctl_table *table;
 968         struct ctl_dir *new;
 969         struct ctl_node *node;
 970         char *new_name;
 971 
 972         new = kzalloc(sizeof(*new) + sizeof(struct ctl_node) +
 973                       sizeof(struct ctl_table)*2 +  namelen + 1,
 974                       GFP_KERNEL);
 975         if (!new)
 976                 return NULL;
 977 
 978         node = (struct ctl_node *)(new + 1);
 979         table = (struct ctl_table *)(node + 1);
 980         new_name = (char *)(table + 2);
 981         memcpy(new_name, name, namelen);
 982         new_name[namelen] = '\0';
 983         table[0].procname = new_name;
 984         table[0].mode = S_IFDIR|S_IRUGO|S_IXUGO;
 985         init_header(&new->header, set->dir.header.root, set, node, table);
 986 
 987         return new;
 988 }
 989 
 990 
 991 
 992 
 993 
 994 
 995 
 996 
 997 
 998 
 999 
1000 
1001 
1002 static struct ctl_dir *get_subdir(struct ctl_dir *dir,
1003                                   const char *name, int namelen)
1004 {
1005         struct ctl_table_set *set = dir->header.set;
1006         struct ctl_dir *subdir, *new = NULL;
1007         int err;
1008 
1009         spin_lock(&sysctl_lock);
1010         subdir = find_subdir(dir, name, namelen);
1011         if (!IS_ERR(subdir))
1012                 goto found;
1013         if (PTR_ERR(subdir) != -ENOENT)
1014                 goto failed;
1015 
1016         spin_unlock(&sysctl_lock);
1017         new = new_dir(set, name, namelen);
1018         spin_lock(&sysctl_lock);
1019         subdir = ERR_PTR(-ENOMEM);
1020         if (!new)
1021                 goto failed;
1022 
1023         
1024         subdir = find_subdir(dir, name, namelen);
1025         if (!IS_ERR(subdir))
1026                 goto found;
1027         if (PTR_ERR(subdir) != -ENOENT)
1028                 goto failed;
1029 
1030         
1031         err = insert_header(dir, &new->header);
1032         subdir = ERR_PTR(err);
1033         if (err)
1034                 goto failed;
1035         subdir = new;
1036 found:
1037         subdir->header.nreg++;
1038 failed:
1039         if (IS_ERR(subdir)) {
1040                 pr_err("sysctl could not get directory: ");
1041                 sysctl_print_dir(dir);
1042                 pr_cont("/%*.*s %ld\n",
1043                         namelen, namelen, name, PTR_ERR(subdir));
1044         }
1045         drop_sysctl_table(&dir->header);
1046         if (new)
1047                 drop_sysctl_table(&new->header);
1048         spin_unlock(&sysctl_lock);
1049         return subdir;
1050 }
1051 
1052 static struct ctl_dir *xlate_dir(struct ctl_table_set *set, struct ctl_dir *dir)
1053 {
1054         struct ctl_dir *parent;
1055         const char *procname;
1056         if (!dir->header.parent)
1057                 return &set->dir;
1058         parent = xlate_dir(set, dir->header.parent);
1059         if (IS_ERR(parent))
1060                 return parent;
1061         procname = dir->header.ctl_table[0].procname;
1062         return find_subdir(parent, procname, strlen(procname));
1063 }
1064 
1065 static int sysctl_follow_link(struct ctl_table_header **phead,
1066         struct ctl_table **pentry)
1067 {
1068         struct ctl_table_header *head;
1069         struct ctl_table_root *root;
1070         struct ctl_table_set *set;
1071         struct ctl_table *entry;
1072         struct ctl_dir *dir;
1073         int ret;
1074 
1075         ret = 0;
1076         spin_lock(&sysctl_lock);
1077         root = (*pentry)->data;
1078         set = lookup_header_set(root);
1079         dir = xlate_dir(set, (*phead)->parent);
1080         if (IS_ERR(dir))
1081                 ret = PTR_ERR(dir);
1082         else {
1083                 const char *procname = (*pentry)->procname;
1084                 head = NULL;
1085                 entry = find_entry(&head, dir, procname, strlen(procname));
1086                 ret = -ENOENT;
1087                 if (entry && use_table(head)) {
1088                         unuse_table(*phead);
1089                         *phead = head;
1090                         *pentry = entry;
1091                         ret = 0;
1092                 }
1093         }
1094 
1095         spin_unlock(&sysctl_lock);
1096         return ret;
1097 }
1098 
1099 static int sysctl_err(const char *path, struct ctl_table *table, char *fmt, ...)
1100 {
1101         struct va_format vaf;
1102         va_list args;
1103 
1104         va_start(args, fmt);
1105         vaf.fmt = fmt;
1106         vaf.va = &args;
1107 
1108         pr_err("sysctl table check failed: %s/%s %pV\n",
1109                path, table->procname, &vaf);
1110 
1111         va_end(args);
1112         return -EINVAL;
1113 }
1114 
1115 static int sysctl_check_table_array(const char *path, struct ctl_table *table)
1116 {
1117         int err = 0;
1118 
1119         if ((table->proc_handler == proc_douintvec) ||
1120             (table->proc_handler == proc_douintvec_minmax)) {
1121                 if (table->maxlen != sizeof(unsigned int))
1122                         err |= sysctl_err(path, table, "array not allowed");
1123         }
1124 
1125         return err;
1126 }
1127 
1128 static int sysctl_check_table(const char *path, struct ctl_table *table)
1129 {
1130         int err = 0;
1131         for (; table->procname; table++) {
1132                 if (table->child)
1133                         err |= sysctl_err(path, table, "Not a file");
1134 
1135                 if ((table->proc_handler == proc_dostring) ||
1136                     (table->proc_handler == proc_dointvec) ||
1137                     (table->proc_handler == proc_douintvec) ||
1138                     (table->proc_handler == proc_douintvec_minmax) ||
1139                     (table->proc_handler == proc_dointvec_minmax) ||
1140                     (table->proc_handler == proc_dointvec_jiffies) ||
1141                     (table->proc_handler == proc_dointvec_userhz_jiffies) ||
1142                     (table->proc_handler == proc_dointvec_ms_jiffies) ||
1143                     (table->proc_handler == proc_doulongvec_minmax) ||
1144                     (table->proc_handler == proc_doulongvec_ms_jiffies_minmax)) {
1145                         if (!table->data)
1146                                 err |= sysctl_err(path, table, "No data");
1147                         if (!table->maxlen)
1148                                 err |= sysctl_err(path, table, "No maxlen");
1149                         else
1150                                 err |= sysctl_check_table_array(path, table);
1151                 }
1152                 if (!table->proc_handler)
1153                         err |= sysctl_err(path, table, "No proc_handler");
1154 
1155                 if ((table->mode & (S_IRUGO|S_IWUGO)) != table->mode)
1156                         err |= sysctl_err(path, table, "bogus .mode 0%o",
1157                                 table->mode);
1158         }
1159         return err;
1160 }
1161 
1162 static struct ctl_table_header *new_links(struct ctl_dir *dir, struct ctl_table *table,
1163         struct ctl_table_root *link_root)
1164 {
1165         struct ctl_table *link_table, *entry, *link;
1166         struct ctl_table_header *links;
1167         struct ctl_node *node;
1168         char *link_name;
1169         int nr_entries, name_bytes;
1170 
1171         name_bytes = 0;
1172         nr_entries = 0;
1173         for (entry = table; entry->procname; entry++) {
1174                 nr_entries++;
1175                 name_bytes += strlen(entry->procname) + 1;
1176         }
1177 
1178         links = kzalloc(sizeof(struct ctl_table_header) +
1179                         sizeof(struct ctl_node)*nr_entries +
1180                         sizeof(struct ctl_table)*(nr_entries + 1) +
1181                         name_bytes,
1182                         GFP_KERNEL);
1183 
1184         if (!links)
1185                 return NULL;
1186 
1187         node = (struct ctl_node *)(links + 1);
1188         link_table = (struct ctl_table *)(node + nr_entries);
1189         link_name = (char *)&link_table[nr_entries + 1];
1190 
1191         for (link = link_table, entry = table; entry->procname; link++, entry++) {
1192                 int len = strlen(entry->procname) + 1;
1193                 memcpy(link_name, entry->procname, len);
1194                 link->procname = link_name;
1195                 link->mode = S_IFLNK|S_IRWXUGO;
1196                 link->data = link_root;
1197                 link_name += len;
1198         }
1199         init_header(links, dir->header.root, dir->header.set, node, link_table);
1200         links->nreg = nr_entries;
1201 
1202         return links;
1203 }
1204 
1205 static bool get_links(struct ctl_dir *dir,
1206         struct ctl_table *table, struct ctl_table_root *link_root)
1207 {
1208         struct ctl_table_header *head;
1209         struct ctl_table *entry, *link;
1210 
1211         
1212         for (entry = table; entry->procname; entry++) {
1213                 const char *procname = entry->procname;
1214                 link = find_entry(&head, dir, procname, strlen(procname));
1215                 if (!link)
1216                         return false;
1217                 if (S_ISDIR(link->mode) && S_ISDIR(entry->mode))
1218                         continue;
1219                 if (S_ISLNK(link->mode) && (link->data == link_root))
1220                         continue;
1221                 return false;
1222         }
1223 
1224         
1225         for (entry = table; entry->procname; entry++) {
1226                 const char *procname = entry->procname;
1227                 link = find_entry(&head, dir, procname, strlen(procname));
1228                 head->nreg++;
1229         }
1230         return true;
1231 }
1232 
1233 static int insert_links(struct ctl_table_header *head)
1234 {
1235         struct ctl_table_set *root_set = &sysctl_table_root.default_set;
1236         struct ctl_dir *core_parent = NULL;
1237         struct ctl_table_header *links;
1238         int err;
1239 
1240         if (head->set == root_set)
1241                 return 0;
1242 
1243         core_parent = xlate_dir(root_set, head->parent);
1244         if (IS_ERR(core_parent))
1245                 return 0;
1246 
1247         if (get_links(core_parent, head->ctl_table, head->root))
1248                 return 0;
1249 
1250         core_parent->header.nreg++;
1251         spin_unlock(&sysctl_lock);
1252 
1253         links = new_links(core_parent, head->ctl_table, head->root);
1254 
1255         spin_lock(&sysctl_lock);
1256         err = -ENOMEM;
1257         if (!links)
1258                 goto out;
1259 
1260         err = 0;
1261         if (get_links(core_parent, head->ctl_table, head->root)) {
1262                 kfree(links);
1263                 goto out;
1264         }
1265 
1266         err = insert_header(core_parent, links);
1267         if (err)
1268                 kfree(links);
1269 out:
1270         drop_sysctl_table(&core_parent->header);
1271         return err;
1272 }
1273 
1274 
1275 
1276 
1277 
1278 
1279 
1280 
1281 
1282 
1283 
1284 
1285 
1286 
1287 
1288 
1289 
1290 
1291 
1292 
1293 
1294 
1295 
1296 
1297 
1298 
1299 
1300 
1301 
1302 
1303 
1304 
1305 
1306 
1307 
1308 
1309 
1310 
1311 
1312 
1313 
1314 
1315 
1316 struct ctl_table_header *__register_sysctl_table(
1317         struct ctl_table_set *set,
1318         const char *path, struct ctl_table *table)
1319 {
1320         struct ctl_table_root *root = set->dir.header.root;
1321         struct ctl_table_header *header;
1322         const char *name, *nextname;
1323         struct ctl_dir *dir;
1324         struct ctl_table *entry;
1325         struct ctl_node *node;
1326         int nr_entries = 0;
1327 
1328         for (entry = table; entry->procname; entry++)
1329                 nr_entries++;
1330 
1331         header = kzalloc(sizeof(struct ctl_table_header) +
1332                          sizeof(struct ctl_node)*nr_entries, GFP_KERNEL);
1333         if (!header)
1334                 return NULL;
1335 
1336         node = (struct ctl_node *)(header + 1);
1337         init_header(header, root, set, node, table);
1338         if (sysctl_check_table(path, table))
1339                 goto fail;
1340 
1341         spin_lock(&sysctl_lock);
1342         dir = &set->dir;
1343         
1344         dir->header.nreg++;
1345         spin_unlock(&sysctl_lock);
1346 
1347         
1348         for (name = path; name; name = nextname) {
1349                 int namelen;
1350                 nextname = strchr(name, '/');
1351                 if (nextname) {
1352                         namelen = nextname - name;
1353                         nextname++;
1354                 } else {
1355                         namelen = strlen(name);
1356                 }
1357                 if (namelen == 0)
1358                         continue;
1359 
1360                 dir = get_subdir(dir, name, namelen);
1361                 if (IS_ERR(dir))
1362                         goto fail;
1363         }
1364 
1365         spin_lock(&sysctl_lock);
1366         if (insert_header(dir, header))
1367                 goto fail_put_dir_locked;
1368 
1369         drop_sysctl_table(&dir->header);
1370         spin_unlock(&sysctl_lock);
1371 
1372         return header;
1373 
1374 fail_put_dir_locked:
1375         drop_sysctl_table(&dir->header);
1376         spin_unlock(&sysctl_lock);
1377 fail:
1378         kfree(header);
1379         dump_stack();
1380         return NULL;
1381 }
1382 
1383 
1384 
1385 
1386 
1387 
1388 
1389 
1390 
1391 
1392 
1393 struct ctl_table_header *register_sysctl(const char *path, struct ctl_table *table)
1394 {
1395         return __register_sysctl_table(&sysctl_table_root.default_set,
1396                                         path, table);
1397 }
1398 EXPORT_SYMBOL(register_sysctl);
1399 
1400 static char *append_path(const char *path, char *pos, const char *name)
1401 {
1402         int namelen;
1403         namelen = strlen(name);
1404         if (((pos - path) + namelen + 2) >= PATH_MAX)
1405                 return NULL;
1406         memcpy(pos, name, namelen);
1407         pos[namelen] = '/';
1408         pos[namelen + 1] = '\0';
1409         pos += namelen + 1;
1410         return pos;
1411 }
1412 
1413 static int count_subheaders(struct ctl_table *table)
1414 {
1415         int has_files = 0;
1416         int nr_subheaders = 0;
1417         struct ctl_table *entry;
1418 
1419         
1420         if (!table || !table->procname)
1421                 return 1;
1422 
1423         for (entry = table; entry->procname; entry++) {
1424                 if (entry->child)
1425                         nr_subheaders += count_subheaders(entry->child);
1426                 else
1427                         has_files = 1;
1428         }
1429         return nr_subheaders + has_files;
1430 }
1431 
1432 static int register_leaf_sysctl_tables(const char *path, char *pos,
1433         struct ctl_table_header ***subheader, struct ctl_table_set *set,
1434         struct ctl_table *table)
1435 {
1436         struct ctl_table *ctl_table_arg = NULL;
1437         struct ctl_table *entry, *files;
1438         int nr_files = 0;
1439         int nr_dirs = 0;
1440         int err = -ENOMEM;
1441 
1442         for (entry = table; entry->procname; entry++) {
1443                 if (entry->child)
1444                         nr_dirs++;
1445                 else
1446                         nr_files++;
1447         }
1448 
1449         files = table;
1450         
1451         if (nr_dirs && nr_files) {
1452                 struct ctl_table *new;
1453                 files = kcalloc(nr_files + 1, sizeof(struct ctl_table),
1454                                 GFP_KERNEL);
1455                 if (!files)
1456                         goto out;
1457 
1458                 ctl_table_arg = files;
1459                 for (new = files, entry = table; entry->procname; entry++) {
1460                         if (entry->child)
1461                                 continue;
1462                         *new = *entry;
1463                         new++;
1464                 }
1465         }
1466 
1467         
1468         if (nr_files || !nr_dirs) {
1469                 struct ctl_table_header *header;
1470                 header = __register_sysctl_table(set, path, files);
1471                 if (!header) {
1472                         kfree(ctl_table_arg);
1473                         goto out;
1474                 }
1475 
1476                 
1477                 header->ctl_table_arg = ctl_table_arg;
1478                 **subheader = header;
1479                 (*subheader)++;
1480         }
1481 
1482         
1483         for (entry = table; entry->procname; entry++) {
1484                 char *child_pos;
1485 
1486                 if (!entry->child)
1487                         continue;
1488 
1489                 err = -ENAMETOOLONG;
1490                 child_pos = append_path(path, pos, entry->procname);
1491                 if (!child_pos)
1492                         goto out;
1493 
1494                 err = register_leaf_sysctl_tables(path, child_pos, subheader,
1495                                                   set, entry->child);
1496                 pos[0] = '\0';
1497                 if (err)
1498                         goto out;
1499         }
1500         err = 0;
1501 out:
1502         
1503         return err;
1504 }
1505 
1506 
1507 
1508 
1509 
1510 
1511 
1512 
1513 
1514 
1515 
1516 
1517 struct ctl_table_header *__register_sysctl_paths(
1518         struct ctl_table_set *set,
1519         const struct ctl_path *path, struct ctl_table *table)
1520 {
1521         struct ctl_table *ctl_table_arg = table;
1522         int nr_subheaders = count_subheaders(table);
1523         struct ctl_table_header *header = NULL, **subheaders, **subheader;
1524         const struct ctl_path *component;
1525         char *new_path, *pos;
1526 
1527         pos = new_path = kmalloc(PATH_MAX, GFP_KERNEL);
1528         if (!new_path)
1529                 return NULL;
1530 
1531         pos[0] = '\0';
1532         for (component = path; component->procname; component++) {
1533                 pos = append_path(new_path, pos, component->procname);
1534                 if (!pos)
1535                         goto out;
1536         }
1537         while (table->procname && table->child && !table[1].procname) {
1538                 pos = append_path(new_path, pos, table->procname);
1539                 if (!pos)
1540                         goto out;
1541                 table = table->child;
1542         }
1543         if (nr_subheaders == 1) {
1544                 header = __register_sysctl_table(set, new_path, table);
1545                 if (header)
1546                         header->ctl_table_arg = ctl_table_arg;
1547         } else {
1548                 header = kzalloc(sizeof(*header) +
1549                                  sizeof(*subheaders)*nr_subheaders, GFP_KERNEL);
1550                 if (!header)
1551                         goto out;
1552 
1553                 subheaders = (struct ctl_table_header **) (header + 1);
1554                 subheader = subheaders;
1555                 header->ctl_table_arg = ctl_table_arg;
1556 
1557                 if (register_leaf_sysctl_tables(new_path, pos, &subheader,
1558                                                 set, table))
1559                         goto err_register_leaves;
1560         }
1561 
1562 out:
1563         kfree(new_path);
1564         return header;
1565 
1566 err_register_leaves:
1567         while (subheader > subheaders) {
1568                 struct ctl_table_header *subh = *(--subheader);
1569                 struct ctl_table *table = subh->ctl_table_arg;
1570                 unregister_sysctl_table(subh);
1571                 kfree(table);
1572         }
1573         kfree(header);
1574         header = NULL;
1575         goto out;
1576 }
1577 
1578 
1579 
1580 
1581 
1582 
1583 
1584 
1585 
1586 
1587 
1588 struct ctl_table_header *register_sysctl_paths(const struct ctl_path *path,
1589                                                 struct ctl_table *table)
1590 {
1591         return __register_sysctl_paths(&sysctl_table_root.default_set,
1592                                         path, table);
1593 }
1594 EXPORT_SYMBOL(register_sysctl_paths);
1595 
1596 
1597 
1598 
1599 
1600 
1601 
1602 
1603 
1604 
1605 struct ctl_table_header *register_sysctl_table(struct ctl_table *table)
1606 {
1607         static const struct ctl_path null_path[] = { {} };
1608 
1609         return register_sysctl_paths(null_path, table);
1610 }
1611 EXPORT_SYMBOL(register_sysctl_table);
1612 
1613 static void put_links(struct ctl_table_header *header)
1614 {
1615         struct ctl_table_set *root_set = &sysctl_table_root.default_set;
1616         struct ctl_table_root *root = header->root;
1617         struct ctl_dir *parent = header->parent;
1618         struct ctl_dir *core_parent;
1619         struct ctl_table *entry;
1620 
1621         if (header->set == root_set)
1622                 return;
1623 
1624         core_parent = xlate_dir(root_set, parent);
1625         if (IS_ERR(core_parent))
1626                 return;
1627 
1628         for (entry = header->ctl_table; entry->procname; entry++) {
1629                 struct ctl_table_header *link_head;
1630                 struct ctl_table *link;
1631                 const char *name = entry->procname;
1632 
1633                 link = find_entry(&link_head, core_parent, name, strlen(name));
1634                 if (link &&
1635                     ((S_ISDIR(link->mode) && S_ISDIR(entry->mode)) ||
1636                      (S_ISLNK(link->mode) && (link->data == root)))) {
1637                         drop_sysctl_table(link_head);
1638                 }
1639                 else {
1640                         pr_err("sysctl link missing during unregister: ");
1641                         sysctl_print_dir(parent);
1642                         pr_cont("/%s\n", name);
1643                 }
1644         }
1645 }
1646 
1647 static void drop_sysctl_table(struct ctl_table_header *header)
1648 {
1649         struct ctl_dir *parent = header->parent;
1650 
1651         if (--header->nreg)
1652                 return;
1653 
1654         if (parent) {
1655                 put_links(header);
1656                 start_unregistering(header);
1657         }
1658 
1659         if (!--header->count)
1660                 kfree_rcu(header, rcu);
1661 
1662         if (parent)
1663                 drop_sysctl_table(&parent->header);
1664 }
1665 
1666 
1667 
1668 
1669 
1670 
1671 
1672 
1673 void unregister_sysctl_table(struct ctl_table_header * header)
1674 {
1675         int nr_subheaders;
1676         might_sleep();
1677 
1678         if (header == NULL)
1679                 return;
1680 
1681         nr_subheaders = count_subheaders(header->ctl_table_arg);
1682         if (unlikely(nr_subheaders > 1)) {
1683                 struct ctl_table_header **subheaders;
1684                 int i;
1685 
1686                 subheaders = (struct ctl_table_header **)(header + 1);
1687                 for (i = nr_subheaders -1; i >= 0; i--) {
1688                         struct ctl_table_header *subh = subheaders[i];
1689                         struct ctl_table *table = subh->ctl_table_arg;
1690                         unregister_sysctl_table(subh);
1691                         kfree(table);
1692                 }
1693                 kfree(header);
1694                 return;
1695         }
1696 
1697         spin_lock(&sysctl_lock);
1698         drop_sysctl_table(header);
1699         spin_unlock(&sysctl_lock);
1700 }
1701 EXPORT_SYMBOL(unregister_sysctl_table);
1702 
1703 void setup_sysctl_set(struct ctl_table_set *set,
1704         struct ctl_table_root *root,
1705         int (*is_seen)(struct ctl_table_set *))
1706 {
1707         memset(set, 0, sizeof(*set));
1708         set->is_seen = is_seen;
1709         init_header(&set->dir.header, root, set, NULL, root_table);
1710 }
1711 
1712 void retire_sysctl_set(struct ctl_table_set *set)
1713 {
1714         WARN_ON(!RB_EMPTY_ROOT(&set->dir.root));
1715 }
1716 
1717 int __init proc_sys_init(void)
1718 {
1719         struct proc_dir_entry *proc_sys_root;
1720 
1721         proc_sys_root = proc_mkdir("sys", NULL);
1722         proc_sys_root->proc_iops = &proc_sys_dir_operations;
1723         proc_sys_root->proc_fops = &proc_sys_dir_file_operations;
1724         proc_sys_root->nlink = 0;
1725 
1726         return sysctl_init();
1727 }