diff --git a/kernel-src/fs/ext2.c b/kernel-src/fs/ext2.c index dd8fe54d..d9e3f75c 100644 --- a/kernel-src/fs/ext2.c +++ b/kernel-src/fs/ext2.c @@ -1771,7 +1771,9 @@ static int ext2_sync(vnode_t *vnode) { int e = vmmcache_syncvnode(vnode, 0, UINT64_MAX); ext2fs_t *fs = (ext2fs_t *)vnode->vfs; // TODO don't sync the entire disk but rather only the inodes and blocks + VOP_LOCK(fs->backing); int e2 = vmmcache_syncvnode(fs->backing, 0, UINT64_MAX); + VOP_UNLOCK(fs->backing); // only the first errors are reported return e ? e : e2; } diff --git a/kernel-src/fs/vfs.c b/kernel-src/fs/vfs.c index 687cef14..6e3d8bdf 100644 --- a/kernel-src/fs/vfs.c +++ b/kernel-src/fs/vfs.c @@ -215,11 +215,13 @@ static int writenocache(vnode_t *node, page_t *page, uintmax_t pageoffset) { // don't keep the pages in the cache! // if its a file, do the proper filesystem sync. // if its a block device, sync only the page we just dirtied + VOP_LOCK(node); int e; if (node->type == V_TYPE_REGULAR) e = VOP_SYNC(node); else e = vmmcache_syncvnode(node, pageoffset, PAGE_SIZE); + VOP_UNLOCK(node); // try to turn it into anonymous memory vmmcache_evict(page); @@ -288,7 +290,9 @@ int vfs_write(vnode_t *node, void *buffer, size_t size, uintmax_t offset, size_t size_t writesize = min(PAGE_SIZE - startoffset, size); void *address = MAKE_HHDM(pmm_getpageaddress(page)); + memcpy((void *)((uintptr_t)address + startoffset), buffer, writesize); + vmmcache_makedirty(page); *written += writesize; pageoffset += 1;