]> Zhao Yanbai Git Server - kernel.git/commitdiff
修复vfs读写位置错误的问题
authoracevest <zhaoyanbai@126.com>
Fri, 11 Oct 2024 15:02:56 +0000 (23:02 +0800)
committeracevest <zhaoyanbai@126.com>
Fri, 11 Oct 2024 15:02:56 +0000 (23:02 +0800)
fs/read.c
fs/write.c

index 743be3fb4f83efaa59ecf3cc65f4ee7b0dbc736d..6d3e071a8c9cc6846ac1185425b7576885826ddc 100644 (file)
--- a/fs/read.c
+++ b/fs/read.c
@@ -29,7 +29,7 @@ ssize_t vfs_generic_file_read(file_t *file, char *buf, size_t size, loff_t *p_po
     uint32_t offset = pos & (PAGE_SIZE - 1);
     size_t left = size;
 
-    while (true) {
+    while (left > 0) {
         page_t *page = NULL;
         uint32_t end_index = inode->i_size >> PAGE_SHIFT;
         if (index > end_index) {
@@ -57,9 +57,13 @@ ssize_t vfs_generic_file_read(file_t *file, char *buf, size_t size, loff_t *p_po
         // TODO 增加page引用计数
 
         // copy data
+        bytes = bytes < left ? bytes : left;
         void *addr = page2va(page);
+        // printk("memcpy bytes %u index %u\n", bytes, index);
+        // printk("read addr %x bytes %u index %u offset %u\n", addr, bytes, index, offset);
         memcpy(buf, addr, bytes);
 
+        buf += bytes;
         offset += bytes;
         index += offset >> PAGE_SHIFT;
         offset &= (PAGE_SIZE - 1);
index d29ca9a6516250c34faaadcbdc2219b94dff0e46..d3e70f11b39b2ee53e065f757833692b212461a3 100644 (file)
@@ -68,7 +68,8 @@ ssize_t vfs_generic_file_write(file_t *file, const char *buf, size_t size, loff_
         // ...
 
         // 写入page
-        memcpy(addr, buf, bytes);
+        memcpy(addr, buf + pos, bytes);
+        // printk("write addr %x bytes %u index %u offset %u\n", addr, bytes, index, offset);
 
         // TODO
         // ...