Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f4b3e631 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

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: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9b0925a6
Loading
Loading
Loading
Loading
+4 −21
Original line number Original line Diff line number Diff line
@@ -149,25 +149,12 @@ struct kernfs_node *kernfs_get_active(struct kernfs_node *kn)
	if (unlikely(!kn))
	if (unlikely(!kn))
		return NULL;
		return NULL;


	if (!atomic_inc_unless_negative(&kn->active))
		return NULL;

	if (kernfs_lockdep(kn))
	if (kernfs_lockdep(kn))
		rwsem_acquire_read(&kn->dep_map, 0, 1, _RET_IP_);
		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;
	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 (kernfs_lockdep(kn))
		rwsem_release(&kn->dep_map, 1, _RET_IP_);
	return NULL;
}
}


/**
/**
@@ -799,7 +786,6 @@ static void __kernfs_deactivate(struct kernfs_node *kn)


static void __kernfs_remove(struct kernfs_node *kn)
static void __kernfs_remove(struct kernfs_node *kn)
{
{
	struct kernfs_root *root = kernfs_root(kn);
	struct kernfs_node *pos;
	struct kernfs_node *pos;


	lockdep_assert_held(&kernfs_mutex);
	lockdep_assert_held(&kernfs_mutex);
@@ -851,9 +837,6 @@ static void __kernfs_remove(struct kernfs_node *kn)


		kernfs_put(pos);
		kernfs_put(pos);
	} while (pos != kn);
	} while (pos != kn);

	/* some nodes killed, kick get_active waiters */
	wake_up_all(&root->deactivate_waitq);
}
}


/**
/**