mirror of
https://github.com/d0k3/GodMode9.git
synced 2025-06-26 13:42:47 +00:00
Fix corruption on RAMdrive mount / unmount
This commit is contained in:
parent
9af01de7dc
commit
a3744ae7a3
52
source/fs.c
52
source/fs.c
@ -9,6 +9,7 @@
|
|||||||
#include "ff.h"
|
#include "ff.h"
|
||||||
|
|
||||||
#define NORM_FS 10
|
#define NORM_FS 10
|
||||||
|
#define IMGN_FS 3 // image normal filesystems
|
||||||
#define VIRT_FS 8
|
#define VIRT_FS 8
|
||||||
|
|
||||||
#define SKIP_CUR (1<<3)
|
#define SKIP_CUR (1<<3)
|
||||||
@ -39,27 +40,58 @@ bool InitSDCardFS() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool InitExtFS() {
|
bool InitExtFS() {
|
||||||
u32 mount_state = GetMountState();
|
|
||||||
u32 last_fs = (mount_state == IMG_NAND) ? NORM_FS :
|
|
||||||
((mount_state == IMG_FAT) || (mount_state == IMG_RAMDRV)) ? NORM_FS - 2 : NORM_FS - 3;
|
|
||||||
if (!fs_mounted[0])
|
if (!fs_mounted[0])
|
||||||
return false;
|
return false;
|
||||||
for (u32 i = 1; i < last_fs; i++) {
|
for (u32 i = 1; i < NORM_FS; i++) {
|
||||||
char fsname[8];
|
char fsname[8];
|
||||||
snprintf(fsname, 7, "%lu:", i);
|
snprintf(fsname, 7, "%lu:", i);
|
||||||
if (fs_mounted[i]) continue;
|
if (fs_mounted[i]) continue;
|
||||||
fs_mounted[i] = (f_mount(fs + i, fsname, 1) == FR_OK);
|
fs_mounted[i] = (f_mount(fs + i, fsname, 1) == FR_OK);
|
||||||
if ((i == 7) && !fs_mounted[7] && (mount_state == IMG_RAMDRV)) {
|
|
||||||
f_mkfs("7:", FM_ANY, 0, MAIN_BUFFER, MAIN_BUFFER_SIZE); // format ramdrive if required
|
|
||||||
f_mount(NULL, fsname, 1);
|
|
||||||
fs_mounted[7] = (f_mount(fs + 7, "7:", 1) == FR_OK);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
SetupNandSdDrive("A:", "0:", "1:/private/movable.sed", 0);
|
SetupNandSdDrive("A:", "0:", "1:/private/movable.sed", 0);
|
||||||
SetupNandSdDrive("B:", "0:", "4:/private/movable.sed", 1);
|
SetupNandSdDrive("B:", "0:", "4:/private/movable.sed", 1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool InitImgFS(const char* path) {
|
||||||
|
// deinit image filesystem
|
||||||
|
for (u32 i = NORM_FS - 1; i >= NORM_FS - IMGN_FS; i--) {
|
||||||
|
char fsname[8];
|
||||||
|
snprintf(fsname, 7, "%lu:", i);
|
||||||
|
if (!fs_mounted[i]) continue;
|
||||||
|
f_mount(NULL, fsname, 1);
|
||||||
|
fs_mounted[i] = false;
|
||||||
|
}
|
||||||
|
// (re)mount image, done if path == NULL
|
||||||
|
MountImage(path);
|
||||||
|
InitVGameDrive();
|
||||||
|
if (!GetMountState()) return false;
|
||||||
|
// reinit image filesystem
|
||||||
|
for (u32 i = NORM_FS - IMGN_FS; i < NORM_FS; i++) {
|
||||||
|
char fsname[8];
|
||||||
|
snprintf(fsname, 7, "%lu:", i);
|
||||||
|
fs_mounted[i] = (f_mount(fs + i, fsname, 1) == FR_OK);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InitRamDriveFS() {
|
||||||
|
u32 pdrv = NORM_FS - IMGN_FS;
|
||||||
|
char fsname[8];
|
||||||
|
snprintf(fsname, 7, "%lu:", pdrv);
|
||||||
|
|
||||||
|
InitImgFS(NULL);
|
||||||
|
MountRamDrive();
|
||||||
|
fs_mounted[pdrv] = (f_mount(fs + pdrv, fsname, 1) == FR_OK);
|
||||||
|
if (!fs_mounted[pdrv] && (GetMountState() == IMG_RAMDRV)) {
|
||||||
|
f_mkfs(fsname, FM_ANY, 0, MAIN_BUFFER, MAIN_BUFFER_SIZE); // format ramdrive if required
|
||||||
|
f_mount(NULL, fsname, 1);
|
||||||
|
fs_mounted[pdrv] = (f_mount(fs + pdrv, fsname, 1) == FR_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void DeinitExtFS() {
|
void DeinitExtFS() {
|
||||||
SetupNandSdDrive(NULL, NULL, NULL, 0);
|
SetupNandSdDrive(NULL, NULL, NULL, 0);
|
||||||
SetupNandSdDrive(NULL, NULL, NULL, 1);
|
SetupNandSdDrive(NULL, NULL, NULL, 1);
|
||||||
@ -70,7 +102,7 @@ void DeinitExtFS() {
|
|||||||
f_mount(NULL, fsname, 1);
|
f_mount(NULL, fsname, 1);
|
||||||
fs_mounted[i] = false;
|
fs_mounted[i] = false;
|
||||||
}
|
}
|
||||||
if ((i == 7) && (GetMountState() != IMG_RAMDRV)) { // unmount image
|
if ((i == NORM_FS - IMGN_FS) && (GetMountState() != IMG_RAMDRV)) { // unmount image
|
||||||
MountImage(NULL);
|
MountImage(NULL);
|
||||||
InitVGameDrive();
|
InitVGameDrive();
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,8 @@
|
|||||||
|
|
||||||
bool InitSDCardFS();
|
bool InitSDCardFS();
|
||||||
bool InitExtFS();
|
bool InitExtFS();
|
||||||
|
bool InitImgFS(const char* path);
|
||||||
|
bool InitRamDriveFS();
|
||||||
void DeinitExtFS();
|
void DeinitExtFS();
|
||||||
void DeinitSDCardFS();
|
void DeinitSDCardFS();
|
||||||
|
|
||||||
|
@ -84,7 +84,7 @@ void DrawUserInterface(const char* curr_path, DirEntry* curr_entry, DirStruct* c
|
|||||||
int drvtype = DriveType(curr_entry->path);
|
int drvtype = DriveType(curr_entry->path);
|
||||||
char drvstr[32];
|
char drvstr[32];
|
||||||
snprintf(drvstr, 31, "(%s%s)",
|
snprintf(drvstr, 31, "(%s%s)",
|
||||||
((drvtype & DRV_SDCARD) ? "SD" : (drvtype & DRV_RAMDRIVE) ? "RAMDrive" : (drvtype & DRV_RAMDRIVE) ? "Game" :
|
((drvtype & DRV_SDCARD) ? "SD" : (drvtype & DRV_RAMDRIVE) ? "RAMDrive" : (drvtype & DRV_GAME) ? "Game" :
|
||||||
(drvtype & DRV_SYSNAND) ? "SysNAND" : (drvtype & DRV_EMUNAND) ? "EmuNAND" : (drvtype & DRV_IMAGE) ? "Image" :
|
(drvtype & DRV_SYSNAND) ? "SysNAND" : (drvtype & DRV_EMUNAND) ? "EmuNAND" : (drvtype & DRV_IMAGE) ? "Image" :
|
||||||
(drvtype & DRV_MEMORY) ? "Memory" : (drvtype & DRV_ALIAS) ? "Alias" : (drvtype & DRV_SEARCH) ? "Search" : ""),
|
(drvtype & DRV_MEMORY) ? "Memory" : (drvtype & DRV_ALIAS) ? "Alias" : (drvtype & DRV_SEARCH) ? "Search" : ""),
|
||||||
((drvtype & DRV_FAT) ? " FAT" : (drvtype & DRV_VIRTUAL) ? " Virtual" : ""));
|
((drvtype & DRV_FAT) ? " FAT" : (drvtype & DRV_VIRTUAL) ? " Virtual" : ""));
|
||||||
@ -692,18 +692,12 @@ u32 GodMode() {
|
|||||||
clipboard->n_entries = 0;
|
clipboard->n_entries = 0;
|
||||||
}
|
}
|
||||||
} else if ((int) user_select == mountable) { // -> mount file as image
|
} else if ((int) user_select == mountable) { // -> mount file as image
|
||||||
if (clipboard->n_entries && (DriveType(clipboard->entry[0].path) & DRV_IMAGE))
|
if (clipboard->n_entries && (DriveType(clipboard->entry[0].path) & (DRV_IMAGE|DRV_RAMDRIVE)))
|
||||||
clipboard->n_entries = 0; // remove last mounted image clipboard entries
|
clipboard->n_entries = 0; // remove last mounted image clipboard entries
|
||||||
DeinitExtFS();
|
InitImgFS(curr_entry->path);
|
||||||
InitExtFS();
|
if (!(DriveType("7:")||DriveType("8:")||DriveType("9:")||DriveType("G:"))) {
|
||||||
u32 mount_state = MountImage(curr_entry->path);
|
|
||||||
InitExtFS();
|
|
||||||
InitVGameDrive();
|
|
||||||
if (!mount_state || !(DriveType("7:")||DriveType("8:")||DriveType("9:")||DriveType("G:"))) {
|
|
||||||
ShowPrompt(false, "Mounting image: failed");
|
ShowPrompt(false, "Mounting image: failed");
|
||||||
DeinitExtFS();
|
InitImgFS(NULL);
|
||||||
InitExtFS();
|
|
||||||
InitVGameDrive();
|
|
||||||
} else {
|
} else {
|
||||||
*current_path = '\0';
|
*current_path = '\0';
|
||||||
GetDirContents(current_dir, current_path);
|
GetDirContents(current_dir, current_path);
|
||||||
@ -803,12 +797,10 @@ u32 GodMode() {
|
|||||||
// highly specific commands
|
// highly specific commands
|
||||||
if (!*current_path) { // in the root folder...
|
if (!*current_path) { // in the root folder...
|
||||||
if (switched && (pad_state & BUTTON_X)) { // unmount image
|
if (switched && (pad_state & BUTTON_X)) { // unmount image
|
||||||
if (clipboard->n_entries && (DriveType(clipboard->entry[0].path) & DRV_IMAGE))
|
if (clipboard->n_entries && (DriveType(clipboard->entry[0].path) & (DRV_IMAGE|DRV_RAMDRIVE)))
|
||||||
clipboard->n_entries = 0; // remove last mounted image clipboard entries
|
clipboard->n_entries = 0; // remove last mounted image clipboard entries
|
||||||
if (!GetMountState()) MountRamDrive();
|
if (!GetMountState()) InitRamDriveFS();
|
||||||
else MountImage(NULL);
|
else InitImgFS(NULL);
|
||||||
DeinitExtFS();
|
|
||||||
InitExtFS();
|
|
||||||
GetDirContents(current_dir, current_path);
|
GetDirContents(current_dir, current_path);
|
||||||
} else if (switched && (pad_state & BUTTON_Y)) {
|
} else if (switched && (pad_state & BUTTON_Y)) {
|
||||||
SetWritePermissions((GetWritePermissions() > PERM_BASE) ? PERM_BASE : PERM_ALL, false);
|
SetWritePermissions((GetWritePermissions() > PERM_BASE) ? PERM_BASE : PERM_ALL, false);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user