Kernel/Storage: Properly free unused NVMeIO AsyncBlockDeviceRequest

This was the root cause of zombie processes showing up randomly and
disappearing after some disk activity, such as running shell commands -
The NVMeIO AsyncBlockDeviceRequest member simply held a pointer to a
Process object, therefore it could keep it alive a for a long time after
it ceased to actually function at all.
This commit is contained in:
Liav A 2023-08-18 13:18:21 +03:00 committed by Jelle Raaijmakers
parent 65854c3411
commit 0b6424d883
Notes: sideshowbarker 2024-07-17 06:35:23 +09:00
3 changed files with 9 additions and 3 deletions

View File

@ -57,7 +57,7 @@ void NVMeInterruptQueue::complete_current_request(u16 cmdid, u16 status)
request_pdu.request->complete(req_result);
if (request_pdu.end_io_handler)
request_pdu.end_io_handler(status);
request_pdu.used = false;
request_pdu.clear();
};
// There can be submission without any request associated with it such as with
@ -87,7 +87,7 @@ void NVMeInterruptQueue::complete_current_request(u16 cmdid, u16 status)
current_request->complete(AsyncDeviceRequest::OutOfMemory);
if (request_pdu.end_io_handler)
request_pdu.end_io_handler(status);
request_pdu.used = false;
request_pdu.clear();
}
}
}

View File

@ -42,7 +42,7 @@ void NVMePollQueue::complete_current_request(u16 cmdid, u16 status)
request_pdu.request->complete(req_result);
if (request_pdu.end_io_handler)
request_pdu.end_io_handler(status);
request_pdu.used = false;
request_pdu.clear();
};
// There can be submission without any request associated with it such as with

View File

@ -34,6 +34,12 @@ enum class QueueType {
class AsyncBlockDeviceRequest;
struct NVMeIO {
void clear()
{
used = false;
request = nullptr;
end_io_handler = nullptr;
}
RefPtr<AsyncBlockDeviceRequest> request;
bool used = false;
Function<void(u16 status)> end_io_handler;