The Pedigree Project 0.1
ScsiDisk-paging.cc
1/*
2 * Copyright (c) 2026, Pedigree Developers
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted.
6 */
7#include "ScsiController.h"
8#include "ScsiDisk.h"
9
10ScsiController* ScsiDisk::acquirePagingController(OperationBarrier::Lease& use) {
11 auto* controller = static_cast<ScsiController*>(m_pParent);
12 if (!controller || !controller->canWaitForCompletion() || !controller->acquireDiskOperation(use))
13 return nullptr;
14 return controller;
15}
16PagingStatus ScsiDisk::doPagingTransfer(PagingOperation, uint64_t, void*) {
17 return PagingStatus::Unsupported;
18}
19PagingStatus ScsiDisk::preparePagingCache(PagingTransport& transport) {
21 const auto prepared = m_Cache.prepareDiscardFrom(0, nullptr, 0, discard);
22 if (prepared != Cache::DiscardStatus::Ready) {
23 if (prepared == Cache::DiscardStatus::NoMemory)
24 return PagingStatus::NoMemory;
25 return prepared == Cache::DiscardStatus::Closed ? PagingStatus::Closed : PagingStatus::Busy;
26 }
27 if (!discard.get()->writeback(retireCachePageCallback, this))
28 return PagingStatus::IoError;
29 // The volatile hardware cache must drain even if no RAM cache page existed.
30 const PagingStatus flushed = transport.transfer(PagingOperation::Flush, 0, nullptr);
31 if (flushed != PagingStatus::Success)
32 return flushed;
33 discard.get()->commit();
34 return PagingStatus::Success;
35}
36
37bool ScsiDisk::hasNoCacheLoans() {
39 return m_Cache.prepareDiscardFrom(0, nullptr, 0, discard) == Cache::DiscardStatus::Ready;
40}
DiscardStatus prepareDiscardFrom(uintptr_t cutoff, const DiscardReference *references, size_t count, UniquePointer< PreparedDiscard > &result)
Device * m_pParent
Definition Device.h:353
static bool retireCachePageCallback(uintptr_t key, uintptr_t page, void *meta)
Definition ScsiDisk.cc:227