Before emitting an FSCACHE_OBJECT_EV_INVALIDATE event, the function __fscache_invalidate() checks whether the fscache_object is currently "dying". This checks only the current state, not the queued events that will very soon lead to the object's death. The problem is that fscache_object_state_machine() will BUG("Unsupported event") when there is object->events includes EV_INVALIDATE during "terminal_transit". Even if we would ignore that check, we could run into "Unexpected event in dead state" later because object->work may still be queued. The solution is to check for EV_RETIRE and EV_RELEASE; if one of those two terminal events is already queued, don't bother to queue EV_INVALIDATE. Signed-off-by: Max Kellermann <mk@xxxxxxxxxx> --- fs/fscache/cookie.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/fscache/cookie.c b/fs/fscache/cookie.c index 8dcb114..ed80d7f 100644 --- a/fs/fscache/cookie.c +++ b/fs/fscache/cookie.c @@ -402,7 +402,8 @@ void __fscache_invalidate(struct fscache_cookie *cookie) object = hlist_entry(cookie->backing_objects.first, struct fscache_object, cookie_link); - if (object->state < FSCACHE_OBJECT_DYING) + if (object->state < FSCACHE_OBJECT_DYING && + (object->events & (FSCACHE_OBJECT_EV_RETIRE|FSCACHE_OBJECT_EV_RELEASE)) == 0) fscache_raise_event( object, FSCACHE_OBJECT_EV_INVALIDATE); } -- Linux-cachefs mailing list Linux-cachefs@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/linux-cachefs