|
@@ -6668,7 +6668,7 @@ static void perf_event_addr_filters_exec(struct perf_event *event, void *data)
|
|
|
|
|
|
raw_spin_lock_irqsave(&ifh->lock, flags);
|
|
raw_spin_lock_irqsave(&ifh->lock, flags);
|
|
list_for_each_entry(filter, &ifh->list, entry) {
|
|
list_for_each_entry(filter, &ifh->list, entry) {
|
|
- if (filter->inode) {
|
|
|
|
|
|
+ if (filter->path.dentry) {
|
|
event->addr_filters_offs[count] = 0;
|
|
event->addr_filters_offs[count] = 0;
|
|
restart++;
|
|
restart++;
|
|
}
|
|
}
|
|
@@ -7333,7 +7333,7 @@ static bool perf_addr_filter_match(struct perf_addr_filter *filter,
|
|
struct file *file, unsigned long offset,
|
|
struct file *file, unsigned long offset,
|
|
unsigned long size)
|
|
unsigned long size)
|
|
{
|
|
{
|
|
- if (filter->inode != file_inode(file))
|
|
|
|
|
|
+ if (d_inode(filter->path.dentry) != file_inode(file))
|
|
return false;
|
|
return false;
|
|
|
|
|
|
if (filter->offset > offset + size)
|
|
if (filter->offset > offset + size)
|
|
@@ -8686,8 +8686,7 @@ static void free_filters_list(struct list_head *filters)
|
|
struct perf_addr_filter *filter, *iter;
|
|
struct perf_addr_filter *filter, *iter;
|
|
|
|
|
|
list_for_each_entry_safe(filter, iter, filters, entry) {
|
|
list_for_each_entry_safe(filter, iter, filters, entry) {
|
|
- if (filter->inode)
|
|
|
|
- iput(filter->inode);
|
|
|
|
|
|
+ path_put(&filter->path);
|
|
list_del(&filter->entry);
|
|
list_del(&filter->entry);
|
|
kfree(filter);
|
|
kfree(filter);
|
|
}
|
|
}
|
|
@@ -8784,7 +8783,7 @@ static void perf_event_addr_filters_apply(struct perf_event *event)
|
|
* Adjust base offset if the filter is associated to a binary
|
|
* Adjust base offset if the filter is associated to a binary
|
|
* that needs to be mapped:
|
|
* that needs to be mapped:
|
|
*/
|
|
*/
|
|
- if (filter->inode)
|
|
|
|
|
|
+ if (filter->path.dentry)
|
|
event->addr_filters_offs[count] =
|
|
event->addr_filters_offs[count] =
|
|
perf_addr_filter_apply(filter, mm);
|
|
perf_addr_filter_apply(filter, mm);
|
|
|
|
|
|
@@ -8858,7 +8857,6 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr,
|
|
{
|
|
{
|
|
struct perf_addr_filter *filter = NULL;
|
|
struct perf_addr_filter *filter = NULL;
|
|
char *start, *orig, *filename = NULL;
|
|
char *start, *orig, *filename = NULL;
|
|
- struct path path;
|
|
|
|
substring_t args[MAX_OPT_ARGS];
|
|
substring_t args[MAX_OPT_ARGS];
|
|
int state = IF_STATE_ACTION, token;
|
|
int state = IF_STATE_ACTION, token;
|
|
unsigned int kernel = 0;
|
|
unsigned int kernel = 0;
|
|
@@ -8971,19 +8969,18 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr,
|
|
goto fail_free_name;
|
|
goto fail_free_name;
|
|
|
|
|
|
/* look up the path and grab its inode */
|
|
/* look up the path and grab its inode */
|
|
- ret = kern_path(filename, LOOKUP_FOLLOW, &path);
|
|
|
|
|
|
+ ret = kern_path(filename, LOOKUP_FOLLOW,
|
|
|
|
+ &filter->path);
|
|
if (ret)
|
|
if (ret)
|
|
goto fail_free_name;
|
|
goto fail_free_name;
|
|
|
|
|
|
- filter->inode = igrab(d_inode(path.dentry));
|
|
|
|
- path_put(&path);
|
|
|
|
kfree(filename);
|
|
kfree(filename);
|
|
filename = NULL;
|
|
filename = NULL;
|
|
|
|
|
|
ret = -EINVAL;
|
|
ret = -EINVAL;
|
|
- if (!filter->inode ||
|
|
|
|
- !S_ISREG(filter->inode->i_mode))
|
|
|
|
- /* free_filters_list() will iput() */
|
|
|
|
|
|
+ if (!filter->path.dentry ||
|
|
|
|
+ !S_ISREG(d_inode(filter->path.dentry)
|
|
|
|
+ ->i_mode))
|
|
goto fail;
|
|
goto fail;
|
|
|
|
|
|
event->addr_filters.nr_file_filters++;
|
|
event->addr_filters.nr_file_filters++;
|