feat: (iso9660) rock ridge extension
[lunaix-os.git] / lunaix-os / kernel / fs / pcache.c
index c27f78ba6bf8282139c0f487eb761acb4e456f9d..a6c4c31d34993b9ba9b8da91a195f51b886ad655 100644 (file)
@@ -84,9 +84,10 @@ pcache_get_page(struct pcache* pcache,
 {
     struct pcache_pg* pg = btrie_get(&pcache->tree, index);
     int is_new = 0;
 {
     struct pcache_pg* pg = btrie_get(&pcache->tree, index);
     int is_new = 0;
-    *offset = index & ((1 << pcache->tree.truncated) - 1);
+    u32_t mask = ((1 << pcache->tree.truncated) - 1);
+    *offset = index & mask;
     if (!pg && (pg = pcache_new_page(pcache, index))) {
     if (!pg && (pg = pcache_new_page(pcache, index))) {
-        pg->fpos = index - *offset;
+        pg->fpos = index & ~mask;
         pcache->n_pages++;
         is_new = 1;
     }
         pcache->n_pages++;
         is_new = 1;
     }
@@ -114,6 +115,7 @@ pcache_write(struct v_inode* inode, void* data, uint32_t len, uint32_t fpos)
 
         pcache_set_dirty(pcache, pg);
 
 
         pcache_set_dirty(pcache, pg);
 
+        pg->len = pg_off + wr_bytes;
         buf_off += wr_bytes;
         fpos += wr_bytes;
     }
         buf_off += wr_bytes;
         fpos += wr_bytes;
     }
@@ -137,15 +139,21 @@ pcache_read(struct v_inode* inode, void* data, uint32_t len, uint32_t fpos)
             }
 
             // Filling up the page
             }
 
             // Filling up the page
-            errno = inode->default_fops->read(inode, pg->pg, PG_SIZE, pg->fpos);
+            errno =
+              inode->default_fops->read_page(inode, pg->pg, PG_SIZE, pg->fpos);
             if (errno >= 0 && errno < PG_SIZE) {
                 // EOF
                 len = MIN(len, buf_off + errno);
             } else if (errno < 0) {
                 break;
             }
             if (errno >= 0 && errno < PG_SIZE) {
                 // EOF
                 len = MIN(len, buf_off + errno);
             } else if (errno < 0) {
                 break;
             }
+            pg->len = errno;
         }
         }
-        uint32_t rd_bytes = MIN(PG_SIZE - pg_off, len - buf_off);
+        uint32_t rd_bytes = MIN(pg->len - pg_off, len - buf_off);
+
+        if (!rd_bytes)
+            break;
+
         memcpy((data + buf_off), pg->pg + pg_off, rd_bytes);
 
         buf_off += rd_bytes;
         memcpy((data + buf_off), pg->pg + pg_off, rd_bytes);
 
         buf_off += rd_bytes;
@@ -176,7 +184,7 @@ pcache_commit(struct v_inode* inode, struct pcache_pg* page)
     }
 
     int errno =
     }
 
     int errno =
-      inode->default_fops->write(inode, page->pg, PG_SIZE, page->fpos);
+      inode->default_fops->write_page(inode, page->pg, PG_SIZE, page->fpos);
 
     if (!errno) {
         page->flags &= ~PCACHE_DIRTY;
 
     if (!errno) {
         page->flags &= ~PCACHE_DIRTY;