From 50159b11f9bb88f910062213ff910775e37c77c9 Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Wed, 25 Mar 2026 18:44:58 +0100 Subject: [PATCH 1/3] [WasmFS] Skip mounting special files under NODERAWFS Resolves: #24836. --- system/lib/wasmfs/backend.h | 2 ++ system/lib/wasmfs/backends/node_backend.cpp | 2 ++ system/lib/wasmfs/wasmfs.cpp | 7 ++++++- test/test_other.py | 5 +++-- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/system/lib/wasmfs/backend.h b/system/lib/wasmfs/backend.h index d8e584c01136a..60daf884d5746 100644 --- a/system/lib/wasmfs/backend.h +++ b/system/lib/wasmfs/backend.h @@ -21,6 +21,8 @@ class Backend { virtual std::shared_ptr createDirectory(mode_t mode) = 0; virtual std::shared_ptr createSymlink(std::string target) = 0; + virtual bool shouldMountSpecialFiles() { return true; } + virtual ~Backend() = default; }; diff --git a/system/lib/wasmfs/backends/node_backend.cpp b/system/lib/wasmfs/backends/node_backend.cpp index a3a7ad19b32f3..5358ca3bc65cf 100644 --- a/system/lib/wasmfs/backends/node_backend.cpp +++ b/system/lib/wasmfs/backends/node_backend.cpp @@ -294,6 +294,8 @@ class NodeBackend : public Backend { std::shared_ptr createSymlink(std::string target) override { WASMFS_UNREACHABLE("TODO: implement NodeBackend::createSymlink"); } + + virtual bool shouldMountSpecialFiles() override { return false; } }; // TODO: symlink diff --git a/system/lib/wasmfs/wasmfs.cpp b/system/lib/wasmfs/wasmfs.cpp index 7a771a8ff4bd0..8cc68ca3053bf 100644 --- a/system/lib/wasmfs/wasmfs.cpp +++ b/system/lib/wasmfs/wasmfs.cpp @@ -106,8 +106,13 @@ std::shared_ptr WasmFS::initRootDirectory() { // The root directory is its own parent. lockedRoot.setParent(rootDirectory); + // Don't mount special files if not needed (e.g. in NODERAWFS mode). + if (!rootBackend->shouldMountSpecialFiles()) { + return rootDirectory; + } + // If the /dev/ directory does not already exist, create it. (It may already - // exist in NODERAWFS mode, or if those files have been preloaded.) + // exist if those files have been preloaded.) auto devDir = lockedRoot.insertDirectory("dev", S_IRUGO | S_IXUGO); if (devDir) { auto lockedDev = devDir->locked(); diff --git a/test/test_other.py b/test/test_other.py index f5fab92327817..b93cb669186f4 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -5553,6 +5553,8 @@ def test_fsync(self, args): def test_fs_dev_random(self): if WINDOWS and self.get_setting('NODERAWFS'): self.skipTest('Crashes on Windows and NodeFS') + if self.get_setting('NODERAWFS') and self.get_setting('WASMFS'): + self.skipTest('https://github.com/emscripten-core/emscripten/issues/24830') self.do_runf('fs/test_fs_dev_random.c', 'success') @parameterized({ @@ -13254,11 +13256,10 @@ def test_unistd_chown(self): self.set_setting('WASMFS') self.do_run_in_out_file_test('wasmfs/wasmfs_chown.c') - @wasmfs_all_backends def test_wasmfs_getdents(self): # Run only in WASMFS for now. self.set_setting('FORCE_FILESYSTEM') - self.do_run_in_out_file_test('wasmfs/wasmfs_getdents.c') + self.do_run_in_out_file_test('wasmfs/wasmfs_getdents.c', cflags=['-sWASMFS']) def test_wasmfs_jsfile(self): self.set_setting('WASMFS') From e1da2f5b0d42c1f257910332f4e923251ef152d2 Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Thu, 2 Apr 2026 09:28:17 +0000 Subject: [PATCH 2/3] Automatic rebaseline of codesize expectations. NFC This is an automatic change generated by tools/maint/rebaseline_tests.py. The following (2) test expectation files were updated by running the tests with `--rebaseline`: ``` codesize/test_codesize_cxx_wasmfs.json: 179737 => 179764 [+27 bytes / +0.02%] codesize/test_codesize_files_wasmfs.json: 63883 => 63908 [+25 bytes / +0.04%] Average change: +0.03% (+0.02% - +0.04%) ``` --- test/codesize/test_codesize_cxx_wasmfs.json | 8 ++++---- test/codesize/test_codesize_files_wasmfs.json | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/test/codesize/test_codesize_cxx_wasmfs.json b/test/codesize/test_codesize_cxx_wasmfs.json index 9d83f3e7f89b1..579edead6e4ca 100644 --- a/test/codesize/test_codesize_cxx_wasmfs.json +++ b/test/codesize/test_codesize_cxx_wasmfs.json @@ -1,10 +1,10 @@ { "a.out.js": 7023, "a.out.js.gz": 3310, - "a.out.nodebug.wasm": 172714, - "a.out.nodebug.wasm.gz": 63316, - "total": 179737, - "total_gz": 66626, + "a.out.nodebug.wasm": 172741, + "a.out.nodebug.wasm.gz": 63348, + "total": 179764, + "total_gz": 66658, "sent": [ "__cxa_throw", "_abort_js", diff --git a/test/codesize/test_codesize_files_wasmfs.json b/test/codesize/test_codesize_files_wasmfs.json index 327251e75f6b3..cfb4980397a26 100644 --- a/test/codesize/test_codesize_files_wasmfs.json +++ b/test/codesize/test_codesize_files_wasmfs.json @@ -1,10 +1,10 @@ { "a.out.js": 5465, "a.out.js.gz": 2575, - "a.out.nodebug.wasm": 58418, - "a.out.nodebug.wasm.gz": 18067, - "total": 63883, - "total_gz": 20642, + "a.out.nodebug.wasm": 58443, + "a.out.nodebug.wasm.gz": 18094, + "total": 63908, + "total_gz": 20669, "sent": [ "a (emscripten_date_now)", "b (emscripten_err)", From f3b85c992943f0ef20765fbac3ff61b3b580135d Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Thu, 2 Apr 2026 20:03:17 +0200 Subject: [PATCH 3/3] Incorporate feedback --- test/test_other.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/test_other.py b/test/test_other.py index b93cb669186f4..448025913feb2 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -13256,10 +13256,13 @@ def test_unistd_chown(self): self.set_setting('WASMFS') self.do_run_in_out_file_test('wasmfs/wasmfs_chown.c') + @wasmfs_all_backends def test_wasmfs_getdents(self): + if self.get_setting('NODERAWFS'): + self.skipTest('test expectations assumes /dev is virtualized') # Run only in WASMFS for now. self.set_setting('FORCE_FILESYSTEM') - self.do_run_in_out_file_test('wasmfs/wasmfs_getdents.c', cflags=['-sWASMFS']) + self.do_run_in_out_file_test('wasmfs/wasmfs_getdents.c') def test_wasmfs_jsfile(self): self.set_setting('WASMFS')