Commit 0b4d0ac5a28 for nodejs

commit 0b4d0ac5a28d960b2d344d4d61ee9618b2fea2b6
Author: Daniel Cavalcante <dcavalcante@gmail.com>
Date:   Sat Nov 14 13:01:59 2026 -0300

    vfs: add callback readv and writev handlers

    A mounted VFS causes callback readv and writev to call missing
    handlers, breaking both virtual and real file descriptors.

    Add both handlers while preserving I/O for real descriptors.

    Signed-off-by: Daniel Cavalcante <dcavalcante@gmail.com>
    PR-URL: https://github.com/nodejs/node/pull/66548
    Fixes: https://github.com/nodejs/node/issues/66532
    Reviewed-By: Philipp Dunkel <pip@pipobscure.com>
    Reviewed-By: James M Snell <jasnell@gmail.com>

diff --git a/lib/internal/vfs/setup.js b/lib/internal/vfs/setup.js
index 1ed74f5d566..2f4e9f31ab8 100644
--- a/lib/internal/vfs/setup.js
+++ b/lib/internal/vfs/setup.js
@@ -658,12 +658,24 @@ function createVfsHandlers() {
       return vfd.entry.read(buffer, offset, length, position)
         .then(({ bytesRead }) => bytesRead);
     },
+    readv(fd, buffers, position) {
+      const vfd = getVirtualFd(fd);
+      if (!vfd) return undefined;
+      return vfd.entry.readv(buffers, position)
+        .then(({ bytesRead }) => bytesRead);
+    },
     write(fd, buffer, offset, length, position) {
       const vfd = getVirtualFd(fd);
       if (!vfd) return undefined;
       return vfd.entry.write(buffer, offset, length, position)
         .then(({ bytesWritten }) => bytesWritten);
     },
+    writev(fd, buffers, position) {
+      const vfd = getVirtualFd(fd);
+      if (!vfd) return undefined;
+      return vfd.entry.writev(buffers, position)
+        .then(({ bytesWritten }) => bytesWritten);
+    },
     fstat(fd, options) {
       const vfd = getVirtualFd(fd);
       if (!vfd) return undefined;
diff --git a/test/parallel/test-vfs-fs-readv-writev.js b/test/parallel/test-vfs-fs-readv-writev.js
new file mode 100644
index 00000000000..9e4bd1427bc
--- /dev/null
+++ b/test/parallel/test-vfs-fs-readv-writev.js
@@ -0,0 +1,35 @@
+// Flags: --experimental-vfs
+'use strict';
+
+const common = require('../common');
+const assert = require('node:assert');
+const fs = require('node:fs');
+const path = require('node:path');
+const tmpdir = require('../common/tmpdir');
+const vfs = require('node:vfs');
+
+tmpdir.refresh();
+const mounted = vfs.create();
+mounted.mkdirSync('/files', { recursive: true });
+const mountPoint = mounted.mount();
+
+const realFd = fs.openSync(tmpdir.resolve('real.txt'), 'w+');
+const virtualFd = fs.openSync(path.join(mountPoint, 'files/virtual.txt'), 'w+');
+let remaining = 2;
+
+for (const fd of [realFd, virtualFd]) {
+  const chunks = [Buffer.from('hello'), Buffer.from('world')];
+  fs.writev(fd, chunks, null, common.mustSucceed((bytesWritten, buffers) => {
+    assert.strictEqual(bytesWritten, 10);
+    assert.strictEqual(buffers, chunks);
+
+    const received = [Buffer.alloc(5), Buffer.alloc(5)];
+    fs.readv(fd, received, 0, common.mustSucceed((bytesRead, readBuffers) => {
+      assert.strictEqual(bytesRead, 10);
+      assert.strictEqual(readBuffers, received);
+      assert.strictEqual(Buffer.concat(received).toString(), 'helloworld');
+      fs.closeSync(fd);
+      if (--remaining === 0) mounted.unmount();
+    }));
+  }));
+}