diff options
author | Tejun Heo <tj@kernel.org> | 2022-08-28 07:04:38 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2022-09-01 18:08:44 +0200 |
commit | f8eb145eb946d543e8c8df3d2db39fcd5c80dacb (patch) | |
tree | a91e15f1a2a7021278c37d563d05e16f22c1d763 /fs/kernfs/dir.c | |
parent | kernfs: Add KERNFS_REMOVING flags (diff) | |
download | linux-f8eb145eb946d543e8c8df3d2db39fcd5c80dacb.tar.xz linux-f8eb145eb946d543e8c8df3d2db39fcd5c80dacb.zip |
kernfs: Factor out kernfs_activate_one()
Factor out kernfs_activate_one() from kernfs_activate() and reorder
operations so that KERNFS_ACTIVATED now simply indicates whether activation
was attempted on the node ignoring whether activation took place. As the
flag doesn't have a reader, the refactoring and reordering shouldn't cause
any behavior difference.
Tested-by: Chengming Zhou <zhouchengming@bytedance.com>
Reviewed-by: Chengming Zhou <zhouchengming@bytedance.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Link: https://lore.kernel.org/r/20220828050440.734579-8-tj@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs/kernfs/dir.c')
-rw-r--r-- | fs/kernfs/dir.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c index f8cbd05e9b68..c9323956c63c 100644 --- a/fs/kernfs/dir.c +++ b/fs/kernfs/dir.c @@ -1305,6 +1305,21 @@ static struct kernfs_node *kernfs_next_descendant_post(struct kernfs_node *pos, return pos->parent; } +static void kernfs_activate_one(struct kernfs_node *kn) +{ + lockdep_assert_held_write(&kernfs_root(kn)->kernfs_rwsem); + + kn->flags |= KERNFS_ACTIVATED; + + if (kernfs_active(kn) || (kn->flags & KERNFS_REMOVING)) + return; + + WARN_ON_ONCE(kn->parent && RB_EMPTY_NODE(&kn->rb)); + WARN_ON_ONCE(atomic_read(&kn->active) != KN_DEACTIVATED_BIAS); + + atomic_sub(KN_DEACTIVATED_BIAS, &kn->active); +} + /** * kernfs_activate - activate a node which started deactivated * @kn: kernfs_node whose subtree is to be activated @@ -1326,16 +1341,8 @@ void kernfs_activate(struct kernfs_node *kn) down_write(&root->kernfs_rwsem); pos = NULL; - while ((pos = kernfs_next_descendant_post(pos, kn))) { - if (kernfs_active(pos) || (pos->flags & KERNFS_REMOVING)) - continue; - - WARN_ON_ONCE(pos->parent && RB_EMPTY_NODE(&pos->rb)); - WARN_ON_ONCE(atomic_read(&pos->active) != KN_DEACTIVATED_BIAS); - - atomic_sub(KN_DEACTIVATED_BIAS, &pos->active); - pos->flags |= KERNFS_ACTIVATED; - } + while ((pos = kernfs_next_descendant_post(pos, kn))) + kernfs_activate_one(pos); up_write(&root->kernfs_rwsem); } |