Re: [RESEND] [PATCH] eventfs: Have inodes have unique inode numbers
From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Date: 2024-01-26 20:24:18
Also in:
linux-fsdevel, lkml
From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Date: 2024-01-26 20:24:18
Also in:
linux-fsdevel, lkml
On 2024-01-26 15:12, Steven Rostedt wrote: [...]
diff --git a/fs/tracefs/inode.c b/fs/tracefs/inode.c index e1b172c0e091..2187be6d7b23 100644 --- a/fs/tracefs/inode.c +++ b/fs/tracefs/inode.c@@ -223,13 +223,41 @@ static const struct inode_operations tracefs_file_inode_operations = { .setattr = tracefs_setattr, }; +/* Copied from get_next_ino() but adds allocation for multiple inodes */ +#define LAST_INO_BATCH 1024 +#define LAST_INO_MASK (~(LAST_INO_BATCH - 1)) +static DEFINE_PER_CPU(unsigned int, last_ino); + +unsigned int tracefs_get_next_ino(int files) +{ + unsigned int *p = &get_cpu_var(last_ino); + unsigned int res = *p; + +#ifdef CONFIG_SMP + /* Check if adding files+1 overflows */
How does it handle a @files input where: * (files+1 > LAST_INO_BATCH) ? * (files+1 == LAST_INO_BATCH) ?
+ if (unlikely(!res || (res & LAST_INO_MASK) != ((res + files + 1) & LAST_INO_MASK))) {
+ static atomic_t shared_last_ino;
+ int next = atomic_add_return(LAST_INO_BATCH, &shared_last_ino);
+
+ res = next - LAST_INO_BATCH;
+ }
+#endif
+
+ res++;
+ /* get_next_ino should not provide a 0 inode number */
+ if (unlikely(!res))
+ res++;I suspect that bumping this res++ in the 0 case can cause inode range reservation issues at (files+1 == LAST_INO_BATCH-1). Thanks, Mathieu
+ *p = res + files; + put_cpu_var(last_ino); + return res; +}
-- Mathieu Desnoyers EfficiOS Inc. https://www.efficios.com