summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy Day <timday@thelustrecollective.com>2026-08-11 12:03:29 -0400
committerJan Kara <jack@suse.cz>2026-09-01 15:40:36 +0200
commite76ed86ee88f68f19a3ada75de2192d7fbb3ac99 (patch)
treef2b3b018fa68bfd92fc32ec6ffebdb4910e9817e
parent127b0d87649f946198b80f05ae62123dd87bc6f4 (diff)
downloadlinux-next-e76ed86ee88f68f19a3ada75de2192d7fbb3ac99.tar.gz
linux-next-e76ed86ee88f68f19a3ada75de2192d7fbb3ac99.zip
ext2: mark s_next_generation as guarded by s_next_gen_lock
s_next_generation is only ever modified while holding s_next_gen_lock (in ext2_new_inode()), so annotate it with __guarded_by() for Clang's context analysis. The only other write is the initialisation in ext2_fill_super(), which runs before the superblock is live. No concurrent access should be possible. Convert the spinlock initialization to use scoped_guard(spinlock_init, ...) and place the write under the guard to prevent a warning. Signed-off-by: Timothy Day <timday@thelustrecollective.com> Acked-by: Marco Elver <elver@google.com> Link: https://patch.msgid.link/20260811160336.782342-2-timday@thelustrecollective.com Signed-off-by: Jan Kara <jack@suse.cz>
-rw-r--r--fs/ext2/ext2.h2
-rw-r--r--fs/ext2/super.c3
2 files changed, 3 insertions, 2 deletions
diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h
index 5642451bf191..690452808d24 100644
--- a/fs/ext2/ext2.h
+++ b/fs/ext2/ext2.h
@@ -93,7 +93,7 @@ struct ext2_sb_info {
int s_inode_size;
int s_first_ino;
spinlock_t s_next_gen_lock;
- u32 s_next_generation;
+ u32 s_next_generation __guarded_by(&s_next_gen_lock);
unsigned long s_dir_count;
u8 *s_debts;
struct percpu_counter s_freeblocks_counter;
diff --git a/fs/ext2/super.c b/fs/ext2/super.c
index a40f530872a4..3d64b28745d3 100644
--- a/fs/ext2/super.c
+++ b/fs/ext2/super.c
@@ -1126,8 +1126,9 @@ static int ext2_fill_super(struct super_block *sb, struct fs_context *fc)
goto failed_mount2;
}
sbi->s_gdb_count = db_count;
- sbi->s_next_generation = get_random_u32();
spin_lock_init(&sbi->s_next_gen_lock);
+ scoped_guard(spinlock, &sbi->s_next_gen_lock)
+ sbi->s_next_generation = get_random_u32();
/* per filesystem reservation list head & lock */
spin_lock_init(&sbi->s_rsv_window_lock);