diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/cgroup.c | 4 | ||||
| -rw-r--r-- | kernel/kprobes.c | 52 | ||||
| -rw-r--r-- | kernel/marker.c | 9 | ||||
| -rw-r--r-- | kernel/res_counter.c | 1 |
4 files changed, 38 insertions, 28 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index d8abe996e009..e9c2fb01e89b 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
| @@ -2232,7 +2232,6 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, | |||
| 2232 | 2232 | ||
| 2233 | mutex_lock(&cgroup_mutex); | 2233 | mutex_lock(&cgroup_mutex); |
| 2234 | 2234 | ||
| 2235 | cgrp->flags = 0; | ||
| 2236 | INIT_LIST_HEAD(&cgrp->sibling); | 2235 | INIT_LIST_HEAD(&cgrp->sibling); |
| 2237 | INIT_LIST_HEAD(&cgrp->children); | 2236 | INIT_LIST_HEAD(&cgrp->children); |
| 2238 | INIT_LIST_HEAD(&cgrp->css_sets); | 2237 | INIT_LIST_HEAD(&cgrp->css_sets); |
| @@ -2242,6 +2241,9 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, | |||
| 2242 | cgrp->root = parent->root; | 2241 | cgrp->root = parent->root; |
| 2243 | cgrp->top_cgroup = parent->top_cgroup; | 2242 | cgrp->top_cgroup = parent->top_cgroup; |
| 2244 | 2243 | ||
| 2244 | if (notify_on_release(parent)) | ||
| 2245 | set_bit(CGRP_NOTIFY_ON_RELEASE, &cgrp->flags); | ||
| 2246 | |||
| 2245 | for_each_subsys(root, ss) { | 2247 | for_each_subsys(root, ss) { |
| 2246 | struct cgroup_subsys_state *css = ss->create(ss, cgrp); | 2248 | struct cgroup_subsys_state *css = ss->create(ss, cgrp); |
| 2247 | if (IS_ERR(css)) { | 2249 | if (IS_ERR(css)) { |
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 7a86e6432338..fcfb580c3afc 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
| @@ -498,27 +498,36 @@ static int __kprobes in_kprobes_functions(unsigned long addr) | |||
| 498 | return 0; | 498 | return 0; |
| 499 | } | 499 | } |
| 500 | 500 | ||
| 501 | /* | ||
| 502 | * If we have a symbol_name argument, look it up and add the offset field | ||
| 503 | * to it. This way, we can specify a relative address to a symbol. | ||
| 504 | */ | ||
| 505 | static kprobe_opcode_t __kprobes *kprobe_addr(struct kprobe *p) | ||
| 506 | { | ||
| 507 | kprobe_opcode_t *addr = p->addr; | ||
| 508 | if (p->symbol_name) { | ||
| 509 | if (addr) | ||
| 510 | return NULL; | ||
| 511 | kprobe_lookup_name(p->symbol_name, addr); | ||
| 512 | } | ||
| 513 | |||
| 514 | if (!addr) | ||
| 515 | return NULL; | ||
| 516 | return (kprobe_opcode_t *)(((char *)addr) + p->offset); | ||
| 517 | } | ||
| 518 | |||
| 501 | static int __kprobes __register_kprobe(struct kprobe *p, | 519 | static int __kprobes __register_kprobe(struct kprobe *p, |
| 502 | unsigned long called_from) | 520 | unsigned long called_from) |
| 503 | { | 521 | { |
| 504 | int ret = 0; | 522 | int ret = 0; |
| 505 | struct kprobe *old_p; | 523 | struct kprobe *old_p; |
| 506 | struct module *probed_mod; | 524 | struct module *probed_mod; |
| 525 | kprobe_opcode_t *addr; | ||
| 507 | 526 | ||
| 508 | /* | 527 | addr = kprobe_addr(p); |
| 509 | * If we have a symbol_name argument look it up, | 528 | if (!addr) |
| 510 | * and add it to the address. That way the addr | ||
| 511 | * field can either be global or relative to a symbol. | ||
| 512 | */ | ||
| 513 | if (p->symbol_name) { | ||
| 514 | if (p->addr) | ||
| 515 | return -EINVAL; | ||
| 516 | kprobe_lookup_name(p->symbol_name, p->addr); | ||
| 517 | } | ||
| 518 | |||
| 519 | if (!p->addr) | ||
| 520 | return -EINVAL; | 529 | return -EINVAL; |
| 521 | p->addr = (kprobe_opcode_t *)(((char *)p->addr)+ p->offset); | 530 | p->addr = addr; |
| 522 | 531 | ||
| 523 | if (!kernel_text_address((unsigned long) p->addr) || | 532 | if (!kernel_text_address((unsigned long) p->addr) || |
| 524 | in_kprobes_functions((unsigned long) p->addr)) | 533 | in_kprobes_functions((unsigned long) p->addr)) |
| @@ -678,8 +687,7 @@ void __kprobes unregister_jprobe(struct jprobe *jp) | |||
| 678 | unregister_kprobe(&jp->kp); | 687 | unregister_kprobe(&jp->kp); |
| 679 | } | 688 | } |
| 680 | 689 | ||
| 681 | #ifdef ARCH_SUPPORTS_KRETPROBES | 690 | #ifdef CONFIG_KRETPROBES |
| 682 | |||
| 683 | /* | 691 | /* |
| 684 | * This kprobe pre_handler is registered with every kretprobe. When probe | 692 | * This kprobe pre_handler is registered with every kretprobe. When probe |
| 685 | * hits it will set up the return probe. | 693 | * hits it will set up the return probe. |
| @@ -722,12 +730,12 @@ int __kprobes register_kretprobe(struct kretprobe *rp) | |||
| 722 | int ret = 0; | 730 | int ret = 0; |
| 723 | struct kretprobe_instance *inst; | 731 | struct kretprobe_instance *inst; |
| 724 | int i; | 732 | int i; |
| 725 | void *addr = rp->kp.addr; | 733 | void *addr; |
| 726 | 734 | ||
| 727 | if (kretprobe_blacklist_size) { | 735 | if (kretprobe_blacklist_size) { |
| 728 | if (addr == NULL) | 736 | addr = kprobe_addr(&rp->kp); |
| 729 | kprobe_lookup_name(rp->kp.symbol_name, addr); | 737 | if (!addr) |
| 730 | addr += rp->kp.offset; | 738 | return -EINVAL; |
| 731 | 739 | ||
| 732 | for (i = 0; kretprobe_blacklist[i].name != NULL; i++) { | 740 | for (i = 0; kretprobe_blacklist[i].name != NULL; i++) { |
| 733 | if (kretprobe_blacklist[i].addr == addr) | 741 | if (kretprobe_blacklist[i].addr == addr) |
| @@ -769,8 +777,7 @@ int __kprobes register_kretprobe(struct kretprobe *rp) | |||
| 769 | return ret; | 777 | return ret; |
| 770 | } | 778 | } |
| 771 | 779 | ||
| 772 | #else /* ARCH_SUPPORTS_KRETPROBES */ | 780 | #else /* CONFIG_KRETPROBES */ |
| 773 | |||
| 774 | int __kprobes register_kretprobe(struct kretprobe *rp) | 781 | int __kprobes register_kretprobe(struct kretprobe *rp) |
| 775 | { | 782 | { |
| 776 | return -ENOSYS; | 783 | return -ENOSYS; |
| @@ -781,8 +788,7 @@ static int __kprobes pre_handler_kretprobe(struct kprobe *p, | |||
| 781 | { | 788 | { |
| 782 | return 0; | 789 | return 0; |
| 783 | } | 790 | } |
| 784 | 791 | #endif /* CONFIG_KRETPROBES */ | |
| 785 | #endif /* ARCH_SUPPORTS_KRETPROBES */ | ||
| 786 | 792 | ||
| 787 | void __kprobes unregister_kretprobe(struct kretprobe *rp) | 793 | void __kprobes unregister_kretprobe(struct kretprobe *rp) |
| 788 | { | 794 | { |
diff --git a/kernel/marker.c b/kernel/marker.c index 50effc01d9a2..48a4ea5afffd 100644 --- a/kernel/marker.c +++ b/kernel/marker.c | |||
| @@ -698,14 +698,12 @@ int marker_probe_unregister(const char *name, | |||
| 698 | { | 698 | { |
| 699 | struct marker_entry *entry; | 699 | struct marker_entry *entry; |
| 700 | struct marker_probe_closure *old; | 700 | struct marker_probe_closure *old; |
| 701 | int ret = 0; | 701 | int ret = -ENOENT; |
| 702 | 702 | ||
| 703 | mutex_lock(&markers_mutex); | 703 | mutex_lock(&markers_mutex); |
| 704 | entry = get_marker(name); | 704 | entry = get_marker(name); |
| 705 | if (!entry) { | 705 | if (!entry) |
| 706 | ret = -ENOENT; | ||
| 707 | goto end; | 706 | goto end; |
| 708 | } | ||
| 709 | if (entry->rcu_pending) | 707 | if (entry->rcu_pending) |
| 710 | rcu_barrier(); | 708 | rcu_barrier(); |
| 711 | old = marker_entry_remove_probe(entry, probe, probe_private); | 709 | old = marker_entry_remove_probe(entry, probe, probe_private); |
| @@ -713,12 +711,15 @@ int marker_probe_unregister(const char *name, | |||
| 713 | marker_update_probes(); /* may update entry */ | 711 | marker_update_probes(); /* may update entry */ |
| 714 | mutex_lock(&markers_mutex); | 712 | mutex_lock(&markers_mutex); |
| 715 | entry = get_marker(name); | 713 | entry = get_marker(name); |
| 714 | if (!entry) | ||
| 715 | goto end; | ||
| 716 | entry->oldptr = old; | 716 | entry->oldptr = old; |
| 717 | entry->rcu_pending = 1; | 717 | entry->rcu_pending = 1; |
| 718 | /* write rcu_pending before calling the RCU callback */ | 718 | /* write rcu_pending before calling the RCU callback */ |
| 719 | smp_wmb(); | 719 | smp_wmb(); |
| 720 | call_rcu(&entry->rcu, free_old_closure); | 720 | call_rcu(&entry->rcu, free_old_closure); |
| 721 | remove_marker(name); /* Ignore busy error message */ | 721 | remove_marker(name); /* Ignore busy error message */ |
| 722 | ret = 0; | ||
| 722 | end: | 723 | end: |
| 723 | mutex_unlock(&markers_mutex); | 724 | mutex_unlock(&markers_mutex); |
| 724 | return ret; | 725 | return ret; |
diff --git a/kernel/res_counter.c b/kernel/res_counter.c index 16cbec2d5d60..efbfc0fc232f 100644 --- a/kernel/res_counter.c +++ b/kernel/res_counter.c | |||
| @@ -113,6 +113,7 @@ ssize_t res_counter_write(struct res_counter *counter, int member, | |||
| 113 | 113 | ||
| 114 | ret = -EINVAL; | 114 | ret = -EINVAL; |
| 115 | 115 | ||
| 116 | strstrip(buf); | ||
| 116 | if (write_strategy) { | 117 | if (write_strategy) { |
| 117 | if (write_strategy(buf, &tmp)) { | 118 | if (write_strategy(buf, &tmp)) { |
| 118 | goto out_free; | 119 | goto out_free; |
