mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 18:47:34 +00:00
Kernel: Fix race condition completing IDEChannel async request
This commit is contained in:
parent
a66c9fc593
commit
8177f2474b
1 changed files with 3 additions and 0 deletions
|
@ -124,6 +124,7 @@ void IDEChannel::complete_current_request(AsyncDeviceRequest::RequestResult resu
|
||||||
// before Processor::deferred_call_queue returns!
|
// before Processor::deferred_call_queue returns!
|
||||||
Processor::deferred_call_queue([this, result]() {
|
Processor::deferred_call_queue([this, result]() {
|
||||||
dbgln_if(PATA_DEBUG, "IDEChannel::complete_current_request result: {}", (int)result);
|
dbgln_if(PATA_DEBUG, "IDEChannel::complete_current_request result: {}", (int)result);
|
||||||
|
ScopedSpinLock lock(m_request_lock);
|
||||||
VERIFY(m_current_request);
|
VERIFY(m_current_request);
|
||||||
auto& request = *m_current_request;
|
auto& request = *m_current_request;
|
||||||
m_current_request = nullptr;
|
m_current_request = nullptr;
|
||||||
|
@ -132,6 +133,7 @@ void IDEChannel::complete_current_request(AsyncDeviceRequest::RequestResult resu
|
||||||
if (result == AsyncDeviceRequest::Success) {
|
if (result == AsyncDeviceRequest::Success) {
|
||||||
if (request.request_type() == AsyncBlockDeviceRequest::Read) {
|
if (request.request_type() == AsyncBlockDeviceRequest::Read) {
|
||||||
if (!request.write_to_buffer(request.buffer(), m_dma_buffer_page->paddr().offset(0xc0000000).as_ptr(), 512 * request.block_count())) {
|
if (!request.write_to_buffer(request.buffer(), m_dma_buffer_page->paddr().offset(0xc0000000).as_ptr(), 512 * request.block_count())) {
|
||||||
|
lock.unlock();
|
||||||
request.complete(AsyncDeviceRequest::MemoryFault);
|
request.complete(AsyncDeviceRequest::MemoryFault);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -142,6 +144,7 @@ void IDEChannel::complete_current_request(AsyncDeviceRequest::RequestResult resu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lock.unlock();
|
||||||
request.complete(result);
|
request.complete(result);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue