int devctlFsckStat(pfs_mount_t *pfsMount, int mode) { int rv; pfs_cache_t *clink; if((clink=cacheAllocClean(&rv))!=NULL){ rv=fsckStat(pfsMount, clink->u.superblock, FSCK_STAT_ERROR_0x02, mode); cacheAdd(clink); } return rv; }
int journalResetore(pfs_mount_t *pfsMount) { int rv; int result; pfs_cache_t *clink; u32 i; // Read journal buffer from disk rv = pfsMount->blockDev->transfer(pfsMount->fd, &journalBuf, 0, (pfsMount->log.number << pfsMount->sector_scale), 2, IOCTL2_TMODE_READ); if(rv || (journalBuf.magic != PFS_JOUNRNAL_MAGIC) || (journalBuf.checksum != (u16)journalCheckSum(&journalBuf))) { printf("ps2fs: Error: cannot read log/invalid log\n"); return journalReset(pfsMount); } if(journalBuf.num == 0) { dprintf("ps2fs: System cleanly un-mounted, no journal restore needed\n"); return journalReset(pfsMount); } clink = cacheAllocClean(&result); if(!clink) return result; for(i = 0; i < journalBuf.num; i++) { printf("ps2fs: Log overwrite %d:%08lx\n", journalBuf.log[i].sub, journalBuf.log[i].sector); // Read data in from log section on disk into cache buffer rv = pfsMount->blockDev->transfer(pfsMount->fd, clink->u.data, 0, (pfsMount->log.number << pfsMount->sector_scale) + journalBuf.log[i].logSector, 2, IOCTL2_TMODE_READ); // Write from cache buffer into destination location on disk if(!rv) pfsMount->blockDev->transfer(pfsMount->fd, clink->u.data, journalBuf.log[i].sub, journalBuf.log[i].sector, 2, IOCTL2_TMODE_WRITE); } cacheAdd(clink); return journalReset(pfsMount); }