59 for (
size_t i = 0; i < npages; i++)
62 if (!ppage.has_value())
88 const auto page = cache->
pages.
get(pgoff);
114 size_t bytes_read = 0;
115 size_t bytes_left =
size;
116 while (bytes_left > 0)
120 const size_t inpage_size = std::min(
MOS_PAGE_SIZE - inpage_offset, bytes_left);
126 return page.getErr();
129 memcpy((
char *) buf + bytes_read, (
void *) (
phyframe_va(page.get()) + inpage_offset), inpage_size);
131 bytes_read += inpage_size;
132 bytes_left -= inpage_size;
133 offset += inpage_size;
147 size_t bytes_written = 0;
148 size_t bytes_left = total_size;
149 while (bytes_left > 0)
153 const size_t inpage_size = std::min(
MOS_PAGE_SIZE - inpage_offset, bytes_left);
157 const bool can_write =
ops->page_write_begin(
icache, offset, inpage_size, &page, &private_data);
160 pr_warn(
"page_write_begin failed");
165 memcpy((
char *) (
phyframe_va(page) + inpage_offset), (
char *) buf + bytes_written, inpage_size);
166 ops->page_write_end(
icache, offset, inpage_size, page, private_data);
168 bytes_written += inpage_size;
169 bytes_left -= inpage_size;
170 offset += inpage_size;
174 return bytes_written;
#define MOS_ASSERT_X(cond, msg,...)
void insert(const Key &key, const Value &value)
std::optional< Value > get(const Key &key)
std::optional< Value > remove(const Key &key)
#define phyframe_va(frame)
#define pmm_unref_one(thing)
#define mmstat_dec1(type)
#define mmstat_inc1(type)
PtrResult< phyframe_t > pagecache_get_page_for_read(inode_cache_t *cache, off_t pgoff)
Get a page from the page cache.
long pagecache_flush_or_drop(inode_cache_t *icache, off_t pgoff, size_t npages, bool drop_page)
Flush or drop a range of pages from the page cache.
ssize_t vfs_write_pagecache(inode_cache_t *icache, const void *buf, size_t total_size, off_t offset)
long pagecache_flush_or_drop_all(inode_cache_t *icache, bool drop_page)
Flush or drop all pages in the page cache.
PtrResult< phyframe_t > pagecache_get_page_for_write(inode_cache_t *cache, off_t pgoff)
Get a page from the page cache for writing.
static bool do_flush_and_drop_cached_page(const size_t pgoff, phyframe_t *page, _flush_and_drop_data *fdd)
ssize_t vfs_read_pagecache(inode_cache_t *icache, void *buf, size_t size, off_t offset)
static void * memcpy(void *s1, const void *s2, size_t n)
#define mutex_acquire(mutex)
#define mutex_release(mutex)
PtrResult< phyframe_t >(* fill_cache)(inode_cache_t *cache, uint64_t pgoff)
Read a page from the underlying storage, at file offset pgoff * MOS_PAGE_SIZE.
long(* flush_page)(inode_cache_t *cache, uint64_t pgoff, phyframe_t *page)
Flush a page to the underlying storage.
mos::HashMap< size_t, phyframe_t * > pages
const inode_cache_ops_t * ops
long simple_flush_page_discard_data(inode_cache_t *icache, off_t pgoff, phyframe_t *page)