From c7b02cd5d42667519fe21c8cea02031770a21cff Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Sun, 25 Nov 2012 22:01:42 +0100 Subject: [PATCH] --- yaml --- r: 350083 b: refs/heads/master c: 06b7bcd8cbd7eb1af331e437ec3d8f5182ae1b7e h: refs/heads/master i: 350081: 423ea4540cc8b95d94bb86d69798165b9cf4f0f5 350079: d406930bb4190f5ee38efa5f5aa031e74c5c6b9c v: v3 --- [refs] | 2 +- trunk/kernel/events/uprobes.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 77743190f0fd..1e71867c0c04 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 441f1eb7db8babe2b6b4bc805f023739dbb70e33 +refs/heads/master: 06b7bcd8cbd7eb1af331e437ec3d8f5182ae1b7e diff --git a/trunk/kernel/events/uprobes.c b/trunk/kernel/events/uprobes.c index 5d38b40644b8..358baddc8ac2 100644 --- a/trunk/kernel/events/uprobes.c +++ b/trunk/kernel/events/uprobes.c @@ -669,6 +669,10 @@ remove_breakpoint(struct uprobe *uprobe, struct mm_struct *mm, unsigned long vad return set_orig_insn(&uprobe->arch, mm, vaddr); } +static inline bool uprobe_is_active(struct uprobe *uprobe) +{ + return !RB_EMPTY_NODE(&uprobe->rb_node); +} /* * There could be threads that have already hit the breakpoint. They * will recheck the current insn and restart if find_uprobe() fails. @@ -676,9 +680,13 @@ remove_breakpoint(struct uprobe *uprobe, struct mm_struct *mm, unsigned long vad */ static void delete_uprobe(struct uprobe *uprobe) { + if (WARN_ON(!uprobe_is_active(uprobe))) + return; + spin_lock(&uprobes_treelock); rb_erase(&uprobe->rb_node, &uprobes_tree); spin_unlock(&uprobes_treelock); + RB_CLEAR_NODE(&uprobe->rb_node); /* for uprobe_is_active() */ iput(uprobe->inode); put_uprobe(uprobe); }