Skip to content

Commit 071d8e4

Browse files
Werkovgregkh
authored andcommitted
kernfs: Relax constraint in draining guard
The active reference lifecycle provides the break/unbreak mechanism but the active reference is not truly active after unbreak -- callers don't use it afterwards but it's important for proper pairing of kn->active counting. Assuming this mechanism is in place, the WARN check in kernfs_should_drain_open_files() is too sensitive -- it may transiently catch those (rightful) callers between kernfs_unbreak_active_protection() and kernfs_put_active() as found out by Chen Ridong: kernfs_remove_by_name_ns kernfs_get_active // active=1 __kernfs_remove // active=0x80000002 kernfs_drain ... wait_event //waiting (active == 0x80000001) kernfs_break_active_protection // active = 0x80000001 // continue kernfs_unbreak_active_protection // active = 0x80000002 ... kernfs_should_drain_open_files // warning occurs kernfs_put_active To avoid the false positives (mind panic_on_warn) remove the check altogether. (This is meant as quick fix, I think active reference break/unbreak may be simplified with larger rework.) Fixes: bdb2fd7 ("kernfs: Skip kernfs_drain_open_files() more aggressively") Link: https://lore.kernel.org/r/kmmrseckjctb4gxcx2rdminrjnq2b4ipf7562nvfd432ld5v5m@2byj5eedkb2o/ Cc: Chen Ridong <chenridong@huawei.com> Signed-off-by: Michal Koutný <mkoutny@suse.com> Acked-by: Tejun Heo <tj@kernel.org> Link: https://lore.kernel.org/r/20250505121201.879823-1-mkoutny@suse.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 2825828 commit 071d8e4

File tree

2 files changed

+5
-3
lines changed

2 files changed

+5
-3
lines changed

fs/kernfs/dir.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1582,8 +1582,9 @@ void kernfs_break_active_protection(struct kernfs_node *kn)
15821582
* invoked before finishing the kernfs operation. Note that while this
15831583
* function restores the active reference, it doesn't and can't actually
15841584
* restore the active protection - @kn may already or be in the process of
1585-
* being removed. Once kernfs_break_active_protection() is invoked, that
1586-
* protection is irreversibly gone for the kernfs operation instance.
1585+
* being drained and removed. Once kernfs_break_active_protection() is
1586+
* invoked, that protection is irreversibly gone for the kernfs operation
1587+
* instance.
15871588
*
15881589
* While this function may be called at any point after
15891590
* kernfs_break_active_protection() is invoked, its most useful location

fs/kernfs/file.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -778,8 +778,9 @@ bool kernfs_should_drain_open_files(struct kernfs_node *kn)
778778
/*
779779
* @kn being deactivated guarantees that @kn->attr.open can't change
780780
* beneath us making the lockless test below safe.
781+
* Callers post kernfs_unbreak_active_protection may be counted in
782+
* kn->active by now, do not WARN_ON because of them.
781783
*/
782-
WARN_ON_ONCE(atomic_read(&kn->active) != KN_DEACTIVATED_BIAS);
783784

784785
rcu_read_lock();
785786
on = rcu_dereference(kn->attr.open);

0 commit comments

Comments
 (0)