diff --git a/rpcsx/io-device.cpp b/rpcsx/io-device.cpp index adbd34e..1c4eb93 100644 --- a/rpcsx/io-device.cpp +++ b/rpcsx/io-device.cpp @@ -30,6 +30,7 @@ struct HostFile : orbis::File { bool closeOnExit = true; + bool alignTruncate = false; ~HostFile() { if (hostFd > 0 && closeOnExit) { @@ -437,10 +438,12 @@ static orbis::ErrorCode host_truncate(orbis::File *file, std::uint64_t len, return orbis::ErrorCode::ISDIR; } + if (hostFile->alignTruncate) { + len = rx::alignUp(len, vm::kPageSize); + } + if (::ftruncate(hostFile->hostFd, len)) { - auto result = convertErrno(); - ORBIS_LOG_ERROR("host_truncate", hostFile->hostFd, len); - return result; + return convertErrno(); } return {}; @@ -934,11 +937,13 @@ orbis::ErrorCode HostFsDevice::rename(const char *from, const char *to, return convertErrorCode(ec); } -orbis::File *createHostFile(int hostFd, orbis::Ref device) { +orbis::File *createHostFile(int hostFd, orbis::Ref device, + bool alignTruncate) { auto newFile = orbis::knew(); newFile->hostFd = hostFd; newFile->ops = &hostOps; - newFile->device = std::move(device); + newFile->device = device; + newFile->alignTruncate = alignTruncate; return newFile; } diff --git a/rpcsx/io-device.hpp b/rpcsx/io-device.hpp index 567e300..26f6937 100644 --- a/rpcsx/io-device.hpp +++ b/rpcsx/io-device.hpp @@ -74,5 +74,5 @@ IoDevice *createHostIoDevice(orbis::kstring hostPath, orbis::kstring virtualPath orbis::Ref wrapSocket(int hostFd, orbis::kstring name, int dom, int type, int prot); orbis::ErrorCode createSocket(orbis::Ref *file, orbis::kstring name, int dom, int type, int prot); -orbis::File *createHostFile(int hostFd, orbis::Ref device); +orbis::File *createHostFile(int hostFd, orbis::Ref device, bool alignTruncate = false); IoDevice *createFdWrapDevice(int fd); diff --git a/rpcsx/iodev/shm.cpp b/rpcsx/iodev/shm.cpp index 0d7be91..ba02cfa 100644 --- a/rpcsx/iodev/shm.cpp +++ b/rpcsx/iodev/shm.cpp @@ -35,7 +35,7 @@ orbis::ErrorCode ShmDevice::open(orbis::Ref *file, return convertErrno(); } - auto hostFile = createHostFile(fd, this); + auto hostFile = createHostFile(fd, this, true); *file = hostFile; return {}; }