On Wed, 31 Jan 2024 22:21:27 -0500 Steven Rostedt rostedt@goodmis.org wrote:
We (Linus and I) got it wrong. It originally had:
d_add(dentry, NULL); [..] return NULL;
OK, so I changed that function to this:
static struct dentry *eventfs_root_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) { struct eventfs_inode *ei_child; struct tracefs_inode *ti; struct eventfs_inode *ei; const char *name = dentry->d_name.name;
ti = get_tracefs(dir); if (!(ti->flags & TRACEFS_EVENT_INODE)) return ERR_PTR(-EIO);
mutex_lock(&eventfs_mutex);
ei = ti->private; if (!ei || ei->is_freed) goto out;
list_for_each_entry(ei_child, &ei->children, list) { if (strcmp(ei_child->name, name) != 0) continue; if (ei_child->is_freed) goto out; lookup_dir_entry(dentry, ei, ei_child); goto out; }
for (int i = 0; i < ei->nr_entries; i++) { void *data; umode_t mode; const struct file_operations *fops; const struct eventfs_entry *entry = &ei->entries[i];
if (strcmp(name, entry->name) != 0) continue;
data = ei->data; if (entry->callback(name, &mode, &data, &fops) <= 0) goto out;
lookup_file_dentry(dentry, ei, i, mode, data, fops); goto out; } out: mutex_unlock(&eventfs_mutex); return NULL; }
And it passes the make kprobe test. I'll send out a v3 of this patch, and remove the inc_nlink(dentry->d_parent->d_inode) and the fsnotify as separate patches as that code was there before Linus touched it.
Thanks,
-- Steve