From 0b5db07948d257a9c754cbf311fd5346cb44e221 Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Tue, 14 Feb 2017 12:54:48 +0100 Subject: [PATCH] vfs fs: ignore dead handle IDs on handle_ack When a directory gets destructed it dissolves the handles of each contained file but the acknowledgement might be still in-flight. If we finally receive it, it leads to an Unknown_id exception on the Handles ID Space in 'handle_ack'. Now we catch it, print a warning, and go on. --- repos/os/src/lib/vfs/fs_file_system.h | 37 +++++++++++++++------------ 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/repos/os/src/lib/vfs/fs_file_system.h b/repos/os/src/lib/vfs/fs_file_system.h index 7da4a52320..2b5521f589 100644 --- a/repos/os/src/lib/vfs/fs_file_system.h +++ b/repos/os/src/lib/vfs/fs_file_system.h @@ -244,26 +244,29 @@ class Vfs::Fs_file_system : public File_system Handle_space::Id const id(packet.handle()); - _handle_space.apply(id, [&] (Fs_vfs_handle &handle) - { - switch (packet.operation()) { - case Packet_descriptor::READ_READY: - handle.read_ready_state = Handle_state::Read_ready_state::READY; - break; + try { + _handle_space.apply(id, [&] (Fs_vfs_handle &handle) + { + switch (packet.operation()) { + case Packet_descriptor::READ_READY: + handle.read_ready_state = Handle_state::Read_ready_state::READY; + break; - case Packet_descriptor::READ: - handle.queued_read_packet = packet; - handle.queued_read_state = Handle_state::Queued_state::ACK; - break; + case Packet_descriptor::READ: + handle.queued_read_packet = packet; + handle.queued_read_state = Handle_state::Queued_state::ACK; + break; - case Packet_descriptor::WRITE: - handle.queued_write_packet = packet; - handle.queued_write_state = Handle_state::Queued_state::ACK; - break; - } + case Packet_descriptor::WRITE: + handle.queued_write_packet = packet; + handle.queued_write_state = Handle_state::Queued_state::ACK; + break; + } - _post_signal_hook.arm(handle.context); - }); + _post_signal_hook.arm(handle.context); + }); + } catch (Handle_space::Unknown_id) { + Genode::warning("ack for unknown VFS handle"); } } }