Skip to content

Commit

Permalink
eventfs: Remove "lookup" parameter from create_dir/file_dentry()
Browse files Browse the repository at this point in the history
The "lookup" parameter is a way to differentiate the call to
create_file/dir_dentry() from when it's just a lookup (no need to up the
dentry refcount) and accessed via a readdir (need to up the refcount).

But reality, it just makes the code more complex. Just up the refcount and
let the caller decide to dput() the result or not.

Link: https://lore.kernel.org/linux-trace-kernel/20240103102553.17a19cea@gandalf.local.home
Link: https://lore.kernel.org/linux-trace-kernel/20240104015435.517502710@goodmis.org

Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Ajay Kaher <akaher@vmware.com>
Cc: Al Viro <viro@ZenIV.linux.org.uk>
Cc: Christian Brauner <brauner@kernel.org>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
  • Loading branch information
Steven Rostedt (Google) committed Jan 4, 2024
1 parent fd56cd5 commit b0f7e2d
Showing 1 changed file with 20 additions and 35 deletions.
55 changes: 20 additions & 35 deletions fs/tracefs/event_inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -390,16 +390,14 @@ void eventfs_set_ei_status_free(struct tracefs_inode *ti, struct dentry *dentry)
* @mode: The mode of the file.
* @data: The data to use to set the inode of the file with on open()
* @fops: The fops of the file to be created.
* @lookup: If called by the lookup routine, in which case, dput() the created dentry.
*
* Create a dentry for a file of an eventfs_inode @ei and place it into the
* address located at @e_dentry. If the @e_dentry already has a dentry, then
* just do a dget() on it and return. Otherwise create the dentry and attach it.
* address located at @e_dentry.
*/
static struct dentry *
create_file_dentry(struct eventfs_inode *ei, int idx,
struct dentry *parent, const char *name, umode_t mode, void *data,
const struct file_operations *fops, bool lookup)
const struct file_operations *fops)
{
struct eventfs_attr *attr = NULL;
struct dentry **e_dentry = &ei->d_children[idx];
Expand All @@ -414,9 +412,7 @@ create_file_dentry(struct eventfs_inode *ei, int idx,
}
/* If the e_dentry already has a dentry, use it */
if (*e_dentry) {
/* lookup does not need to up the ref count */
if (!lookup)
dget(*e_dentry);
dget(*e_dentry);
mutex_unlock(&eventfs_mutex);
return *e_dentry;
}
Expand All @@ -441,13 +437,12 @@ create_file_dentry(struct eventfs_inode *ei, int idx,
* way to being freed, don't return it. If e_dentry is NULL
* it means it was already freed.
*/
if (ei->is_freed)
if (ei->is_freed) {
dentry = NULL;
else
} else {
dentry = *e_dentry;
/* The lookup does not need to up the dentry refcount */
if (dentry && !lookup)
dget(dentry);
}
mutex_unlock(&eventfs_mutex);
return dentry;
}
Expand All @@ -465,9 +460,6 @@ create_file_dentry(struct eventfs_inode *ei, int idx,
}
mutex_unlock(&eventfs_mutex);

if (lookup)
dput(dentry);

return dentry;
}

Expand Down Expand Up @@ -500,13 +492,12 @@ static void eventfs_post_create_dir(struct eventfs_inode *ei)
* @pei: The eventfs_inode parent of ei.
* @ei: The eventfs_inode to create the directory for
* @parent: The dentry of the parent of this directory
* @lookup: True if this is called by the lookup code
*
* This creates and attaches a directory dentry to the eventfs_inode @ei.
*/
static struct dentry *
create_dir_dentry(struct eventfs_inode *pei, struct eventfs_inode *ei,
struct dentry *parent, bool lookup)
struct dentry *parent)
{
struct dentry *dentry = NULL;

Expand All @@ -518,11 +509,9 @@ create_dir_dentry(struct eventfs_inode *pei, struct eventfs_inode *ei,
return NULL;
}
if (ei->dentry) {
/* If the dentry already has a dentry, use it */
/* If the eventfs_inode already has a dentry, use it */
dentry = ei->dentry;
/* lookup does not need to up the ref count */
if (!lookup)
dget(dentry);
dget(dentry);
mutex_unlock(&eventfs_mutex);
return dentry;
}
Expand All @@ -542,7 +531,7 @@ create_dir_dentry(struct eventfs_inode *pei, struct eventfs_inode *ei,
* way to being freed.
*/
dentry = ei->dentry;
if (dentry && !lookup)
if (dentry)
dget(dentry);
mutex_unlock(&eventfs_mutex);
return dentry;
Expand All @@ -562,9 +551,6 @@ create_dir_dentry(struct eventfs_inode *pei, struct eventfs_inode *ei,
}
mutex_unlock(&eventfs_mutex);

if (lookup)
dput(dentry);

return dentry;
}

Expand All @@ -589,8 +575,8 @@ static struct dentry *eventfs_root_lookup(struct inode *dir,
struct eventfs_inode *ei;
struct dentry *ei_dentry = NULL;
struct dentry *ret = NULL;
struct dentry *d;
const char *name = dentry->d_name.name;
bool created = false;
umode_t mode;
void *data;
int idx;
Expand Down Expand Up @@ -626,13 +612,10 @@ static struct dentry *eventfs_root_lookup(struct inode *dir,
ret = simple_lookup(dir, dentry, flags);
if (IS_ERR(ret))
goto out;
create_dir_dentry(ei, ei_child, ei_dentry, true);
created = true;
break;
}

if (created)
d = create_dir_dentry(ei, ei_child, ei_dentry);
dput(d);
goto out;
}

for (i = 0; i < ei->nr_entries; i++) {
entry = &ei->entries[i];
Expand All @@ -650,8 +633,8 @@ static struct dentry *eventfs_root_lookup(struct inode *dir,
ret = simple_lookup(dir, dentry, flags);
if (IS_ERR(ret))
goto out;
create_file_dentry(ei, i, ei_dentry, name, mode, cdata,
fops, true);
d = create_file_dentry(ei, i, ei_dentry, name, mode, cdata, fops);
dput(d);
break;
}
}
Expand Down Expand Up @@ -768,9 +751,10 @@ static int dcache_dir_open_wrapper(struct inode *inode, struct file *file)
inode_lock(parent->d_inode);
list_for_each_entry_srcu(ei_child, &ei->children, list,
srcu_read_lock_held(&eventfs_srcu)) {
d = create_dir_dentry(ei, ei_child, parent, false);
d = create_dir_dentry(ei, ei_child, parent);
if (d) {
ret = add_dentries(&dentries, d, cnt);
dput(d);
if (ret < 0)
break;
cnt++;
Expand All @@ -790,9 +774,10 @@ static int dcache_dir_open_wrapper(struct inode *inode, struct file *file)
mutex_unlock(&eventfs_mutex);
if (r <= 0)
continue;
d = create_file_dentry(ei, i, parent, name, mode, cdata, fops, false);
d = create_file_dentry(ei, i, parent, name, mode, cdata, fops);
if (d) {
ret = add_dentries(&dentries, d, cnt);
dput(d);
if (ret < 0)
break;
cnt++;
Expand Down

0 comments on commit b0f7e2d

Please sign in to comment.