]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
super: take lock after last reference count
authorChristian Brauner <brauner@kernel.org>
Tue, 16 Jun 2026 14:08:19 +0000 (16:08 +0200)
committerChristian Brauner <brauner@kernel.org>
Mon, 29 Jun 2026 08:31:51 +0000 (10:31 +0200)
commit9c486f28994fdfc1a83f5f60129402cf4379957b
tree7e3d9006138aea6366c2dda4feccbe27f1d3433f
parent3ec9800c2d33c783dd3b27d4cc3bb22b9385f828
super: take lock after last reference count

__put_super() required the caller to hold sb_lock, so put_super()
wrapped it. The per-device superblock table introduced later drops its
passive references from contexts that do not hold sb_lock, so make
put_super() self-locking: drop the count first and take sb_lock only for
the final list_del.

With the count now dropped outside sb_lock a superblock can briefly sit
on @super_blocks with s_passive == 0 before it is unlinked, so the list
walkers (__iterate_supers(), iterate_supers_type(), user_get_super())
switch to refcount_inc_not_zero() and skip it.

Link: https://patch.msgid.link/20260616-work-super-bdev_holder_global-v2-3-7df6b864028e@kernel.org
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
fs/super.c