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 }