Skip to content

Commit ca18577

Browse files
committed
eventfs: Keep all directory links at 1
The directory link count in eventfs was somewhat bogus. It was only being updated when a directory child was being looked up and not on creation. One solution would be to update in get_attr() the link count by iterating the ei->children list and then adding 2. But that could slow down simple stat() calls, especially if it's done on all directories in eventfs. Another solution would be to add a parent pointer to the eventfs_inode and keep track of the number of sub directories it has on creation. But this adds overhead for something not really worthwhile. The solution decided upon is to keep all directory links in eventfs as 1. This tells user space not to rely on the hard links of directories. Which in this case it shouldn't. Link: https://lore.kernel.org/linux-trace-kernel/20240201002719.GS2087318@ZenIV/ Link: https://lore.kernel.org/linux-trace-kernel/20240201161617.339968298@goodmis.org Cc: stable@vger.kernel.org Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Christian Brauner <brauner@kernel.org> Cc: Al Viro <viro@ZenIV.linux.org.uk> Cc: Ajay Kaher <ajay.kaher@broadcom.com> Fixes: c1504e5 ("eventfs: Implement eventfs dir creation functions") Suggested-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
1 parent 12d823b commit ca18577

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

fs/tracefs/event_inode.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -404,9 +404,7 @@ static struct dentry *lookup_dir_entry(struct dentry *dentry,
404404

405405
dentry->d_fsdata = get_ei(ei);
406406

407-
inc_nlink(inode);
408407
d_add(dentry, inode);
409-
inc_nlink(dentry->d_parent->d_inode);
410408
return NULL;
411409
}
412410

@@ -769,9 +767,17 @@ struct eventfs_inode *eventfs_create_events_dir(const char *name, struct dentry
769767

770768
dentry->d_fsdata = get_ei(ei);
771769

772-
/* directory inodes start off with i_nlink == 2 (for "." entry) */
773-
inc_nlink(inode);
770+
/*
771+
* Keep all eventfs directories with i_nlink == 1.
772+
* Due to the dynamic nature of the dentry creations and not
773+
* wanting to add a pointer to the parent eventfs_inode in the
774+
* eventfs_inode structure, keeping the i_nlink in sync with the
775+
* number of directories would cause too much complexity for
776+
* something not worth much. Keeping directory links at 1
777+
* tells userspace not to trust the link number.
778+
*/
774779
d_instantiate(dentry, inode);
780+
/* The dentry of the "events" parent does keep track though */
775781
inc_nlink(dentry->d_parent->d_inode);
776782
fsnotify_mkdir(dentry->d_parent->d_inode, dentry);
777783
tracefs_end_creating(dentry);

0 commit comments

Comments
 (0)