Skip to content

Commit 5a49f99

Browse files
committed
eventfs: Warn if an eventfs_inode is freed without is_freed being set
There should never be a case where an evenfs_inode is being freed without is_freed being set. Add a WARN_ON_ONCE() if it ever happens. That would mean there was one too many put_ei()s. Link: https://lore.kernel.org/linux-trace-kernel/[email protected] Cc: Linus Torvalds <[email protected]> Cc: Masami Hiramatsu <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Mathieu Desnoyers <[email protected]> Cc: Christian Brauner <[email protected]> Cc: Al Viro <[email protected]> Cc: Ajay Kaher <[email protected]> Signed-off-by: Steven Rostedt (Google) <[email protected]>
1 parent 1389358 commit 5a49f99

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

fs/tracefs/event_inode.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ enum {
7373
static void release_ei(struct kref *ref)
7474
{
7575
struct eventfs_inode *ei = container_of(ref, struct eventfs_inode, kref);
76+
77+
WARN_ON_ONCE(!ei->is_freed);
78+
7679
kfree(ei->entry_attrs);
7780
kfree_const(ei->name);
7881
kfree_rcu(ei, rcu);
@@ -84,6 +87,14 @@ static inline void put_ei(struct eventfs_inode *ei)
8487
kref_put(&ei->kref, release_ei);
8588
}
8689

90+
static inline void free_ei(struct eventfs_inode *ei)
91+
{
92+
if (ei) {
93+
ei->is_freed = 1;
94+
put_ei(ei);
95+
}
96+
}
97+
8798
static inline struct eventfs_inode *get_ei(struct eventfs_inode *ei)
8899
{
89100
if (ei)
@@ -679,7 +690,7 @@ struct eventfs_inode *eventfs_create_dir(const char *name, struct eventfs_inode
679690

680691
/* Was the parent freed? */
681692
if (list_empty(&ei->list)) {
682-
put_ei(ei);
693+
free_ei(ei);
683694
ei = NULL;
684695
}
685696
return ei;
@@ -770,7 +781,7 @@ struct eventfs_inode *eventfs_create_events_dir(const char *name, struct dentry
770781
return ei;
771782

772783
fail:
773-
put_ei(ei);
784+
free_ei(ei);
774785
tracefs_failed_creating(dentry);
775786
return ERR_PTR(-ENOMEM);
776787
}
@@ -801,9 +812,8 @@ static void eventfs_remove_rec(struct eventfs_inode *ei, int level)
801812
list_for_each_entry(ei_child, &ei->children, list)
802813
eventfs_remove_rec(ei_child, level + 1);
803814

804-
ei->is_freed = 1;
805815
list_del(&ei->list);
806-
put_ei(ei);
816+
free_ei(ei);
807817
}
808818

809819
/**

0 commit comments

Comments
 (0)