提交 f4b3e631 编写于 作者: G Greg Kroah-Hartman

Revert "kernfs: make kernfs_get_active() block if the node is deactivated but not removed"

This reverts commit 895a068a.

Tejun writes:
        I'm sorry but can you please revert the whole series?
        get_active() waiting while a node is deactivated has potential
        to lead to deadlock and that deactivate/reactivate interface is
        something fundamentally flawed and that cgroup will have to work
        with the remove_self() like everybody else.  IOW, I think the
        first posting was correct.

Cc: Tejun Heo <tj@kernel.org>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 9b0925a6
......@@ -149,25 +149,12 @@ struct kernfs_node *kernfs_get_active(struct kernfs_node *kn)
if (unlikely(!kn))
return NULL;
if (kernfs_lockdep(kn))
rwsem_acquire_read(&kn->dep_map, 0, 1, _RET_IP_);
/*
* Try to obtain an active ref. If @kn is deactivated, we block
* till either it's reactivated or killed.
*/
do {
if (atomic_inc_unless_negative(&kn->active))
return kn;
wait_event(kernfs_root(kn)->deactivate_waitq,
atomic_read(&kn->active) >= 0 ||
RB_EMPTY_NODE(&kn->rb));
} while (!RB_EMPTY_NODE(&kn->rb));
if (!atomic_inc_unless_negative(&kn->active))
return NULL;
if (kernfs_lockdep(kn))
rwsem_release(&kn->dep_map, 1, _RET_IP_);
return NULL;
rwsem_acquire_read(&kn->dep_map, 0, 1, _RET_IP_);
return kn;
}
/**
......@@ -799,7 +786,6 @@ static void __kernfs_deactivate(struct kernfs_node *kn)
static void __kernfs_remove(struct kernfs_node *kn)
{
struct kernfs_root *root = kernfs_root(kn);
struct kernfs_node *pos;
lockdep_assert_held(&kernfs_mutex);
......@@ -851,9 +837,6 @@ static void __kernfs_remove(struct kernfs_node *kn)
kernfs_put(pos);
} while (pos != kn);
/* some nodes killed, kick get_active waiters */
wake_up_all(&root->deactivate_waitq);
}
/**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册