summaryrefslogtreecommitdiffstats
path: root/fs/kernfs
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-01-13 14:13:39 -0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-01-13 14:13:39 -0800
commitf4b3e631b39db31f7375cce0b5e4111d14cde511 (patch)
tree2dc8a21d0432bad2fe86c5a41cc24f972948025e /fs/kernfs
parent9b0925a6ff64a33be45497e3c798bfee8790b102 (diff)
Revert "kernfs: make kernfs_get_active() block if the node is deactivated but not removed"
This reverts commit 895a068a524e134900b9d98b519309b7aae7bbb1. 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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs/kernfs')
-rw-r--r--fs/kernfs/dir.c25
1 files changed, 4 insertions, 21 deletions
diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c
index 37dd6408f5f..770d687ee9f 100644
--- a/fs/kernfs/dir.c
+++ b/fs/kernfs/dir.c
@@ -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);
}
/**