mirror of https://gitee.com/openkylin/linux.git
uprobes/tracing: Fix uprobe_perf_open() on uprobe_apply() failure
uprobe_perf_open()->uprobe_apply() can fail, but this error is wrongly ignored. Change uprobe_perf_open() to do uprobe_perf_close() and return the error code in this case. Change uprobe_perf_close() to propogate the error from uprobe_apply() as well, although it should not fail. Signed-off-by: Oleg Nesterov <oleg@redhat.com> Acked-by: Steven Rostedt <rostedt@goodmis.org> Acked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
This commit is contained in:
parent
ce5f36a58f
commit
927d687480
|
@ -1026,7 +1026,7 @@ static int uprobe_perf_close(struct trace_uprobe *tu, struct perf_event *event)
|
|||
write_unlock(&tu->filter.rwlock);
|
||||
|
||||
if (!done)
|
||||
uprobe_apply(tu->inode, tu->offset, &tu->consumer, false);
|
||||
return uprobe_apply(tu->inode, tu->offset, &tu->consumer, false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1034,6 +1034,7 @@ static int uprobe_perf_close(struct trace_uprobe *tu, struct perf_event *event)
|
|||
static int uprobe_perf_open(struct trace_uprobe *tu, struct perf_event *event)
|
||||
{
|
||||
bool done;
|
||||
int err;
|
||||
|
||||
write_lock(&tu->filter.rwlock);
|
||||
if (event->hw.tp_target) {
|
||||
|
@ -1055,10 +1056,13 @@ static int uprobe_perf_open(struct trace_uprobe *tu, struct perf_event *event)
|
|||
}
|
||||
write_unlock(&tu->filter.rwlock);
|
||||
|
||||
if (!done)
|
||||
uprobe_apply(tu->inode, tu->offset, &tu->consumer, true);
|
||||
|
||||
return 0;
|
||||
err = 0;
|
||||
if (!done) {
|
||||
err = uprobe_apply(tu->inode, tu->offset, &tu->consumer, true);
|
||||
if (err)
|
||||
uprobe_perf_close(tu, event);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static bool uprobe_perf_filter(struct uprobe_consumer *uc,
|
||||
|
|
Loading…
Reference in New Issue