- while (buf_off < len) {
- pcache_get_page(pcache, fpos, &pg_off, &pg);
- if (!pg) {
- return ENOMEM;
+ while (buf_off < len && errno >= 0) {
+ u32_t wr_bytes = MIN(PG_SIZE - pg_off, len - buf_off);
+
+ int new_page = pcache_get_page(pcache, fpos, &pg_off, &pg);
+
+ if (new_page) {
+ // Filling up the page
+ errno = inode->default_fops->read_page(inode, pg->pg, pg->fpos);
+
+ if (errno < 0) {
+ break;
+ }
+ if (errno < PG_SIZE) {
+ // EOF
+ len = MIN(len, buf_off + errno);
+ }
+ } else if (!pg) {
+ errno = inode->default_fops->write(inode, data, wr_bytes, fpos);
+ continue;