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/9] [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/9] 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/9] 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') From fca030ea1490df14892b53150b046acb5d9bbafa Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Mon, 4 May 2026 08:14:15 +0000 Subject: [PATCH 4/9] 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: 179773 => 179800 [+27 bytes / +0.02%] codesize/test_codesize_files_wasmfs.json: 63899 => 63924 [+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 7f6c324000085..00ebe8af66564 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": 172750, - "a.out.nodebug.wasm.gz": 63325, - "total": 179773, - "total_gz": 66635, + "a.out.nodebug.wasm": 172777, + "a.out.nodebug.wasm.gz": 63357, + "total": 179800, + "total_gz": 66667, "sent": [ "__cxa_throw", "_abort_js", diff --git a/test/codesize/test_codesize_files_wasmfs.json b/test/codesize/test_codesize_files_wasmfs.json index 6655b98c5070c..a186b3ad7479d 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": 58434, - "a.out.nodebug.wasm.gz": 18190, - "total": 63899, - "total_gz": 20765, + "a.out.nodebug.wasm": 58459, + "a.out.nodebug.wasm.gz": 18218, + "total": 63924, + "total_gz": 20793, "sent": [ "a (emscripten_date_now)", "b (emscripten_err)", From bf1fd4fd29ab8a7e01affe60da9d254a0cf9cba8 Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Fri, 22 May 2026 07:05:26 +0000 Subject: [PATCH 5/9] 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: 179751 => 179778 [+27 bytes / +0.02%] codesize/test_codesize_files_wasmfs.json: 63811 => 63836 [+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 1025f7dcdff31..1cc44cc86256a 100644 --- a/test/codesize/test_codesize_cxx_wasmfs.json +++ b/test/codesize/test_codesize_cxx_wasmfs.json @@ -1,10 +1,10 @@ { "a.out.js": 7056, "a.out.js.gz": 3322, - "a.out.nodebug.wasm": 172695, - "a.out.nodebug.wasm.gz": 63388, - "total": 179751, - "total_gz": 66710, + "a.out.nodebug.wasm": 172722, + "a.out.nodebug.wasm.gz": 63399, + "total": 179778, + "total_gz": 66721, "sent": [ "__cxa_throw", "_abort_js", diff --git a/test/codesize/test_codesize_files_wasmfs.json b/test/codesize/test_codesize_files_wasmfs.json index afd68b66e9882..d0378a40a23e2 100644 --- a/test/codesize/test_codesize_files_wasmfs.json +++ b/test/codesize/test_codesize_files_wasmfs.json @@ -1,10 +1,10 @@ { "a.out.js": 5487, "a.out.js.gz": 2586, - "a.out.nodebug.wasm": 58324, - "a.out.nodebug.wasm.gz": 18216, - "total": 63811, - "total_gz": 20802, + "a.out.nodebug.wasm": 58349, + "a.out.nodebug.wasm.gz": 18248, + "total": 63836, + "total_gz": 20834, "sent": [ "a (emscripten_date_now)", "b (emscripten_err)", From 98baba6d83ff86d6790ae608fcd90a19a69a1715 Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Fri, 22 May 2026 09:10:31 +0200 Subject: [PATCH 6/9] Incorporate suggestion --- system/lib/wasmfs/backend.h | 2 +- system/lib/wasmfs/backends/node_backend.cpp | 2 +- system/lib/wasmfs/wasmfs.cpp | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/system/lib/wasmfs/backend.h b/system/lib/wasmfs/backend.h index 60daf884d5746..437b5cb3773f6 100644 --- a/system/lib/wasmfs/backend.h +++ b/system/lib/wasmfs/backend.h @@ -21,7 +21,7 @@ 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 bool shouldPopulateRoot() { return true; } virtual ~Backend() = default; }; diff --git a/system/lib/wasmfs/backends/node_backend.cpp b/system/lib/wasmfs/backends/node_backend.cpp index 3b7e463973f4c..c408c8d6134ca 100644 --- a/system/lib/wasmfs/backends/node_backend.cpp +++ b/system/lib/wasmfs/backends/node_backend.cpp @@ -297,7 +297,7 @@ class NodeBackend : public Backend { WASMFS_UNREACHABLE("TODO: implement NodeBackend::createSymlink"); } - virtual bool shouldMountSpecialFiles() override { return false; } + virtual bool shouldPopulateRoot() override { return false; } }; // TODO: symlink diff --git a/system/lib/wasmfs/wasmfs.cpp b/system/lib/wasmfs/wasmfs.cpp index 8cc68ca3053bf..0ba1fea8ec016 100644 --- a/system/lib/wasmfs/wasmfs.cpp +++ b/system/lib/wasmfs/wasmfs.cpp @@ -106,8 +106,9 @@ 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()) { + // Skip setting up the root directory when not needed (e.g. in NODERAWFS + // mode). + if (!rootBackend->shouldPopulateRoot()) { return rootDirectory; } From 884e58a050982311f9bd5b4b145a3a9531ca1964 Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Wed, 27 May 2026 08:58:59 +0000 Subject: [PATCH 7/9] 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: 179751 => 179778 [+27 bytes / +0.02%] codesize/test_codesize_files_wasmfs.json: 63811 => 63836 [+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 954e689d7009d..f03d677a036c9 100644 --- a/test/codesize/test_codesize_cxx_wasmfs.json +++ b/test/codesize/test_codesize_cxx_wasmfs.json @@ -1,10 +1,10 @@ { "a.out.js": 7056, "a.out.js.gz": 3322, - "a.out.nodebug.wasm": 172695, - "a.out.nodebug.wasm.gz": 63383, - "total": 179751, - "total_gz": 66705, + "a.out.nodebug.wasm": 172722, + "a.out.nodebug.wasm.gz": 63393, + "total": 179778, + "total_gz": 66715, "sent": [ "__cxa_throw", "_abort_js", diff --git a/test/codesize/test_codesize_files_wasmfs.json b/test/codesize/test_codesize_files_wasmfs.json index 9d9818ea4adfd..0faaf6dbef762 100644 --- a/test/codesize/test_codesize_files_wasmfs.json +++ b/test/codesize/test_codesize_files_wasmfs.json @@ -1,10 +1,10 @@ { "a.out.js": 5487, "a.out.js.gz": 2586, - "a.out.nodebug.wasm": 58324, - "a.out.nodebug.wasm.gz": 18215, - "total": 63811, - "total_gz": 20801, + "a.out.nodebug.wasm": 58349, + "a.out.nodebug.wasm.gz": 18247, + "total": 63836, + "total_gz": 20833, "sent": [ "a (emscripten_date_now)", "b (emscripten_err)", From 57025b8886306449ff1237377d2c456a58102eb1 Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Tue, 9 Jun 2026 07:58:29 +0000 Subject: [PATCH 8/9] Automatic rebaseline of codesize expectations. NFC This is an automatic change generated by tools/maint/rebaseline_tests.py. The following (1) test expectation files were updated by running the tests with `--rebaseline`: ``` codesize/test_codesize_cxx_wasmfs.json: 179733 => 179760 [+27 bytes / +0.02%] Average change: +0.02% (+0.02% - +0.02%) ``` --- test/codesize/test_codesize_cxx_wasmfs.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/codesize/test_codesize_cxx_wasmfs.json b/test/codesize/test_codesize_cxx_wasmfs.json index fb8d6b62c2e33..d193795d76819 100644 --- a/test/codesize/test_codesize_cxx_wasmfs.json +++ b/test/codesize/test_codesize_cxx_wasmfs.json @@ -1,10 +1,10 @@ { "a.out.js": 7056, "a.out.js.gz": 3322, - "a.out.nodebug.wasm": 172677, - "a.out.nodebug.wasm.gz": 63357, - "total": 179733, - "total_gz": 66679, + "a.out.nodebug.wasm": 172704, + "a.out.nodebug.wasm.gz": 63373, + "total": 179760, + "total_gz": 66695, "sent": [ "__cxa_throw", "_abort_js", From 5386d2ff9bdbf4d669fa81be6098aaaed201a27b Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Sat, 20 Jun 2026 10:23:05 +0000 Subject: [PATCH 9/9] 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: 179741 => 179768 [+27 bytes / +0.02%] codesize/test_codesize_files_wasmfs.json: 63892 => 63917 [+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 3fd32b3e1faf4..a829127c25e2a 100644 --- a/test/codesize/test_codesize_cxx_wasmfs.json +++ b/test/codesize/test_codesize_cxx_wasmfs.json @@ -1,10 +1,10 @@ { "a.out.js": 6938, "a.out.js.gz": 3259, - "a.out.nodebug.wasm": 172803, - "a.out.nodebug.wasm.gz": 63374, - "total": 179741, - "total_gz": 66633, + "a.out.nodebug.wasm": 172830, + "a.out.nodebug.wasm.gz": 63389, + "total": 179768, + "total_gz": 66648, "sent": [ "__cxa_throw", "_abort_js", diff --git a/test/codesize/test_codesize_files_wasmfs.json b/test/codesize/test_codesize_files_wasmfs.json index 6ef587b23b45f..e7bbf45a125b6 100644 --- a/test/codesize/test_codesize_files_wasmfs.json +++ b/test/codesize/test_codesize_files_wasmfs.json @@ -1,10 +1,10 @@ { "a.out.js": 5372, "a.out.js.gz": 2527, - "a.out.nodebug.wasm": 58520, - "a.out.nodebug.wasm.gz": 18225, - "total": 63892, - "total_gz": 20752, + "a.out.nodebug.wasm": 58545, + "a.out.nodebug.wasm.gz": 18255, + "total": 63917, + "total_gz": 20782, "sent": [ "a (emscripten_date_now)", "b (emscripten_err)",