diff --git a/rpcs3/Emu/Cell/Modules/cellFs.cpp b/rpcs3/Emu/Cell/Modules/cellFs.cpp index e3c608bfc6..6923116f97 100644 --- a/rpcs3/Emu/Cell/Modules/cellFs.cpp +++ b/rpcs3/Emu/Cell/Modules/cellFs.cpp @@ -863,12 +863,6 @@ s32 cellFsStReadWaitCallback(u32 fd, u64 size, vm::ptr using fs_aio_cb_t = vm::ptr xaio, s32 error, s32 xid, u64 size)>; -// temporarily -struct lv2_fs_mount_point -{ - std::mutex mutex; -}; - struct fs_aio_thread : ppu_thread { using ppu_thread::ppu_thread; diff --git a/rpcs3/Emu/Cell/Modules/cellSysCache.cpp b/rpcs3/Emu/Cell/Modules/cellSysCache.cpp index 157a566b2f..7f2f3078bf 100644 --- a/rpcs3/Emu/Cell/Modules/cellSysCache.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSysCache.cpp @@ -28,6 +28,8 @@ void fmt_class_string::format(std::string& out, u64 arg) }); } +extern lv2_fs_mount_point g_mp_sys_dev_hdd1; + struct syscache_info { const std::string cache_root = Emu.GetHdd1Dir() + "/caches/"; @@ -77,6 +79,8 @@ struct syscache_info // Poison opened files in /dev_hdd1 to return CELL_EIO on access if (remove_root) { + std::lock_guard lock(g_mp_sys_dev_hdd1.mutex); + idm::select([](u32 id, lv2_file& file) { if (std::memcmp("/dev_hdd1", file.name.data(), 9) == 0) diff --git a/rpcs3/Emu/Cell/lv2/sys_fs.cpp b/rpcs3/Emu/Cell/lv2/sys_fs.cpp index c93e5cd494..5dff954841 100644 --- a/rpcs3/Emu/Cell/lv2/sys_fs.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_fs.cpp @@ -10,15 +10,6 @@ LOG_CHANNEL(sys_fs); -struct lv2_fs_mount_point -{ - const u32 sector_size = 512; - const u32 block_size = 4096; - const bs_t flags{}; - - shared_mutex mutex; -}; - lv2_fs_mount_point g_mp_sys_dev_hdd0; lv2_fs_mount_point g_mp_sys_dev_hdd1{512, 32768, lv2_mp_flag::no_uid_gid}; lv2_fs_mount_point g_mp_sys_dev_usb{512, 4096, lv2_mp_flag::no_uid_gid}; @@ -1277,14 +1268,14 @@ error_code sys_fs_fcntl(ppu_thread& ppu, u32 fd, u32 op, vm::ptr _arg, u32 fs::file stream; stream.reset(std::move(sdata_file)); - if (const u32 id = idm::import([&]() -> std::shared_ptr + if (const u32 id = idm::import([&file = *file, &stream = stream]() -> std::shared_ptr { if (!g_fxo->get()->npdrm_fds.try_inc(16)) { return nullptr; } - return std::make_shared(*file, std::move(stream), file->mode, file->flags, lv2_file_type::npdrm); + return std::make_shared(file, std::move(stream), file.mode, file.flags, lv2_file_type::npdrm); })) { arg->out_code = CELL_OK; diff --git a/rpcs3/Emu/Cell/lv2/sys_fs.h b/rpcs3/Emu/Cell/lv2/sys_fs.h index e78eebac26..da38317644 100644 --- a/rpcs3/Emu/Cell/lv2/sys_fs.h +++ b/rpcs3/Emu/Cell/lv2/sys_fs.h @@ -3,6 +3,7 @@ #include "Emu/Memory/vm_ptr.h" #include "Emu/Cell/ErrorCodes.h" #include "Utilities/File.h" +#include "Utilities/mutex.h" #include @@ -121,8 +122,6 @@ struct FsMselfEntry u8 m_reserve[16]; }; -struct lv2_fs_mount_point; - enum class lv2_mp_flag { read_only, @@ -138,6 +137,15 @@ enum class lv2_file_type npdrm, }; +struct lv2_fs_mount_point +{ + const u32 sector_size = 512; + const u32 block_size = 4096; + const bs_t flags{}; + + shared_mutex mutex; +}; + struct lv2_fs_object { using id_type = lv2_fs_object;