aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSulfurNitride <lukew19@proton.me>2026-06-25 15:05:03 -0500
committerSulfurNitride <lukew19@proton.me>2026-06-25 15:05:03 -0500
commitb1f8b9de5d24213d32022b6023e7513003f1169f (patch)
tree6ddc89efefdbdbd6849cd210bcb8aa2d9ba46b0d /src
parent22f1f1812ebd554c92d1150a6a7bdfff78c2053b (diff)
Fix VFS not intercepting writes for games on SD card
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 <noreply@anthropic.com>
Diffstat (limited to 'src')
-rw-r--r--src/src/protonlauncher.cpp8
1 files changed, 8 insertions, 0 deletions
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)) {