From b1f8b9de5d24213d32022b6023e7513003f1169f Mon Sep 17 00:00:00 2001 From: SulfurNitride Date: Thu, 25 Jun 2026 15:05:03 -0500 Subject: Fix VFS not intercepting writes for games on SD card MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pressure-vessel's default sharing of /run/media and home uses non-recursive bind mounts that don't propagate FUSE submounts into the container. The shouldExposeMountPointToPressureVessel function excluded all paths under /run (isSystemRootPath) and under /run/media (pressureVesselSharesByDefault), so the fuse.mo2linux mount point was never added to PRESSURE_VESSEL_FILESYSTEMS_RW. Inside the container, the game saw the real SD card Data directory instead of the FUSE overlay, so all VFS writes (shader cache, config files, overwrite) bypassed staging entirely — VFS_staging stayed empty and write-heavy mods like Community Shaders logged "Failed to save shader" on every compile. Internal-drive games were unaffected because pressure-vessel's home directory handling is recursive and propagates FUSE submounts correctly. Fix: detect fuse.mo2linux in the mountinfo scan and always add it to PRESSURE_VESSEL_FILESYSTEMS_RW regardless of its parent path classification. Co-Authored-By: Claude Sonnet 4.6 --- src/src/protonlauncher.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/src/protonlauncher.cpp b/src/src/protonlauncher.cpp index f6059e3..e8c2a89 100644 --- a/src/src/protonlauncher.cpp +++ b/src/src/protonlauncher.cpp @@ -169,6 +169,14 @@ bool shouldExposeMountPointToPressureVessel(const QString& mountPoint, const QString& fsType, const QString& source) { + // Always expose our VFS FUSE mount explicitly. pressure-vessel's default + // sharing of /run/media (and home) uses non-recursive bind mounts that do + // not propagate FUSE submounts into the container — games on SD card end up + // writing to the real game directory and bypassing the VFS entirely. + if (fsType == QStringLiteral("fuse.mo2linux")) { + return !mountPoint.isEmpty() && mountPoint != "/"; + } + if (mountPoint.isEmpty() || mountPoint == "/" || pressureVesselSharesByDefault(mountPoint) || isSystemRootPath(mountPoint)) { -- cgit v1.3.1