From 947623b5f638f3140722647a85c851a8387d7482 Mon Sep 17 00:00:00 2001 From: Matheus Date: Wed, 18 Sep 2024 19:04:59 -0300 Subject: [PATCH] fs: fix some sync locking issues --- kernel-src/fs/ext2.c | 2 ++ kernel-src/fs/vfs.c | 4 ++++ 2 files changed, 6 insertions(+) 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;