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

Commit d461d26d authored by David Howells's avatar David Howells
Browse files

FS-Cache: Make sure FSCACHE_COOKIE_LOOKING_UP cleared on lookup failure



We must make sure that FSCACHE_COOKIE_LOOKING_UP is cleared on lookup failure
(if an object reaches the LC_DYING state), and we should clear it before
clearing FSCACHE_COOKIE_CREATING.

If this doesn't happen then fscache_wait_for_deferred_lookup() may hold
allocation and retrieval operations indefinitely until they're interrupted by
signals - which in turn pins the dying object until they go away.

Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent 2175bb06
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -105,6 +105,7 @@ static inline void fscache_done_parent_op(struct fscache_object *object)
static void fscache_object_state_machine(struct fscache_object *object)
{
	enum fscache_object_state new_state;
	struct fscache_cookie *cookie;

	ASSERT(object != NULL);

@@ -158,11 +159,17 @@ static void fscache_object_state_machine(struct fscache_object *object)

		spin_lock(&object->lock);
		object->state = FSCACHE_OBJECT_DYING;
		if (object->cookie &&
		    test_and_clear_bit(FSCACHE_COOKIE_CREATING,
				       &object->cookie->flags))
			wake_up_bit(&object->cookie->flags,
		cookie = object->cookie;
		if (cookie) {
			if (test_and_clear_bit(FSCACHE_COOKIE_LOOKING_UP,
					       &cookie->flags))
				wake_up_bit(&cookie->flags,
					    FSCACHE_COOKIE_LOOKING_UP);
			if (test_and_clear_bit(FSCACHE_COOKIE_CREATING,
					       &cookie->flags))
				wake_up_bit(&cookie->flags,
					    FSCACHE_COOKIE_CREATING);
		}
		spin_unlock(&object->lock);

		fscache_done_parent_op(object);