On Wed, 31 Jan 2024 22:21:27 -0500
Steven Rostedt <rost...@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

Reply via email to