diff options
| author | EllipticEllipsis <73679967+EllipticEllipsis@users.noreply.github.com> | 2021-12-27 03:36:06 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-27 03:36:06 +0000 |
| commit | 8ebdb504701d136c2d716117712948495ca61bb9 (patch) | |
| tree | 559af1ffb0f5cbcdb5fc9e4387c559141d109bf5 /src | |
| parent | 2664f75ac2e041156e6aaa2d63a7dab5cacc6b67 (diff) | |
pfsfreeblocks OK (#423)
* pfsfreeblocks OK
* Update src/libultra/io/pfsfreeblocks.c
Co-authored-by: Tharo <17233964+Thar0@users.noreply.github.com>
Co-authored-by: Tharo <17233964+Thar0@users.noreply.github.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/libultra/io/pfsfreeblocks.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/src/libultra/io/pfsfreeblocks.c b/src/libultra/io/pfsfreeblocks.c index af10a5b88..b90979c59 100644 --- a/src/libultra/io/pfsfreeblocks.c +++ b/src/libultra/io/pfsfreeblocks.c @@ -1,3 +1,37 @@ #include "global.h" +#include "PR/pfs.h" -#pragma GLOBAL_ASM("asm/non_matchings/boot/pfsfreeblocks/osPfsFreeBlocks.s") +s32 osPfsFreeBlocks(OSPfs* pfs, s32* leftoverBytes) { + s32 j; + s32 pages = 0; + __OSInode inode; + s32 ret = 0; + u8 bank; + s32 offset; + + if (!(pfs->status & PFS_INITIALIZED)) { + return PFS_ERR_INVALID; + } + + ret = __osCheckId(pfs); + if (ret != 0) { + return ret; + } + + for (bank = PFS_ID_BANK_256K; bank < pfs->banks; bank++) { + ret = __osPfsRWInode(pfs, &inode, PFS_READ, bank); + if (ret != 0) { + return ret; + } + + offset = ((bank > PFS_ID_BANK_256K) ? 1 : pfs->inodeStartPage); + for (j = offset; j < PFS_INODE_SIZE_PER_PAGE; j++) { + if (inode.inodePage[j].ipage == PFS_PAGE_NOT_USED) { + pages++; + } + } + } + + *leftoverBytes = pages * PFS_ONE_PAGE * BLOCKSIZE; + return 0; +} |
