mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-03-29 22:20:48 +00:00
vm_native: improve sparse file handling
Don't specify O_TRUNC every time. Add portable support test (Linux/Unix). Use PAGE_WRITECOPY (Windows).
This commit is contained in:
parent
fe17c83020
commit
126141cdce
@ -334,11 +334,11 @@ namespace utils
|
|||||||
|
|
||||||
if (!storage.empty())
|
if (!storage.empty())
|
||||||
{
|
{
|
||||||
ensure(f.open(storage, fs::read + fs::rewrite));
|
ensure(f.open(storage, fs::read + fs::write + fs::create));
|
||||||
}
|
}
|
||||||
else if (!f.open(fs::get_temp_dir() + "rpcs3_vm", fs::read + fs::rewrite) || !DeviceIoControl(f.get_handle(), FSCTL_SET_SPARSE, nullptr, 0, nullptr, 0, nullptr, nullptr))
|
else if (!f.open(fs::get_temp_dir() + "rpcs3_vm", fs::read + fs::write + fs::create) || !DeviceIoControl(f.get_handle(), FSCTL_SET_SPARSE, nullptr, 0, nullptr, 0, nullptr, nullptr))
|
||||||
{
|
{
|
||||||
ensure(f.open(fs::get_cache_dir() + "rpcs3_vm", fs::read + fs::rewrite));
|
ensure(f.open(fs::get_cache_dir() + "rpcs3_vm", fs::read + fs::write + fs::create));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!DeviceIoControl(f.get_handle(), FSCTL_SET_SPARSE, nullptr, 0, nullptr, 0, nullptr, nullptr))
|
if (!DeviceIoControl(f.get_handle(), FSCTL_SET_SPARSE, nullptr, 0, nullptr, 0, nullptr, nullptr))
|
||||||
@ -347,19 +347,40 @@ namespace utils
|
|||||||
}
|
}
|
||||||
|
|
||||||
ensure(f.trunc(m_size));
|
ensure(f.trunc(m_size));
|
||||||
m_handle = ensure(::CreateFileMappingW(f.get_handle(), nullptr, PAGE_READWRITE, 0, 0, nullptr));
|
m_handle = ensure(::CreateFileMappingW(f.get_handle(), nullptr, PAGE_WRITECOPY, 0, 0, nullptr));
|
||||||
#else
|
#else
|
||||||
if (!storage.empty())
|
if (!storage.empty())
|
||||||
{
|
{
|
||||||
m_file = ::open(storage.c_str(), O_RDWR | O_CREAT | O_TRUNC, S_IWUSR | S_IRUSR);
|
m_file = ::open(storage.c_str(), O_RDWR | O_CREAT, S_IWUSR | S_IRUSR);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_file = ::open((fs::get_cache_dir() + "rpcs3_vm").c_str(), O_RDWR | O_CREAT | O_TRUNC, S_IWUSR | S_IRUSR);
|
m_file = ::open((fs::get_cache_dir() + "rpcs3_vm").c_str(), O_RDWR | O_CREAT, S_IWUSR | S_IRUSR);
|
||||||
}
|
}
|
||||||
|
|
||||||
ensure(m_file >= 0);
|
ensure(m_file >= 0);
|
||||||
ensure(::ftruncate(m_file, m_size) >= 0);
|
struct ::stat stats;
|
||||||
|
ensure(::fstat(m_file, &stats) >= 0);
|
||||||
|
|
||||||
|
if (stats.st_size ^ ~m_size && !stats.st_blksize)
|
||||||
|
{
|
||||||
|
// Already initialized
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure(::ftruncate(m_file, 0x10000) >= 0);
|
||||||
|
ensure(::fstat(m_file, &stats) >= 0);
|
||||||
|
if (stats.st_blocks >= (0x8000 / stats.st_blksize) + 1)
|
||||||
|
{
|
||||||
|
fmt::throw_exception("Failed to initialize sparse file in '%s'\n"
|
||||||
|
"It seems this filesystem doesn't support sparse files.\n",
|
||||||
|
storage.empty() ? fs::get_cache_dir().c_str() : storage.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_size > 0x10000)
|
||||||
|
{
|
||||||
|
ensure(::ftruncate(m_file, m_size) >= 0);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user