diff options
| author | Timothy Day <timday@thelustrecollective.com> | 2026-08-11 12:03:29 -0400 |
|---|---|---|
| committer | Jan Kara <jack@suse.cz> | 2026-09-01 15:40:36 +0200 |
| commit | e76ed86ee88f68f19a3ada75de2192d7fbb3ac99 (patch) | |
| tree | f2b3b018fa68bfd92fc32ec6ffebdb4910e9817e | |
| parent | 127b0d87649f946198b80f05ae62123dd87bc6f4 (diff) | |
| download | linux-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.h | 2 | ||||
| -rw-r--r-- | fs/ext2/super.c | 3 |
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); |
