int journalResetore(u32 device) { // copys apa headers from apal to apa system int i; u32 sector; apa_cache *clink; dprintf1("ps2hdd: checking log...\n"); if(atadDmaTransfer(device, &journalBuf, APA_SECTOR_APAL, sizeof(apa_journal_t)/512, ATAD_MODE_READ)){ journalReset(device); return -EIO; } if(journalBuf.magic==APAL_MAGIC) { if(journalBuf.num==0) return 0; clink=cacheGetFree(); for(i=0, sector=APA_SECTOR_APAL_HEADERS;i<journalBuf.num;i++, sector+=2) { if(atadDmaTransfer(device, clink->header, sector, 2, ATAD_MODE_READ)) break; if(atadDmaTransfer(device, clink->header, journalBuf.sectors[i], 2, ATAD_MODE_WRITE)) break; } cacheAdd(clink); return journalReset(device);// only do if journal.. } memset(&journalBuf, 0, sizeof(apa_journal_t));// safe e journalBuf.magic=APAL_MAGIC; return 0;//-EINVAL; }
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); }
void cacheFlushAllDirty(pfs_mount_t *pfsMount) { u32 i; int found=0; for(i=1;i<numBuffers+1;i++){ if(cacheBuf[i].pfsMount == pfsMount && cacheBuf[i].flags & CACHE_FLAG_DIRTY) found=1; } if(found) { journalWrite(pfsMount, cacheBuf+1, numBuffers); for(i=1;i<numBuffers+1;i++){ if(cacheBuf[i].pfsMount == pfsMount && cacheBuf[i].flags & CACHE_FLAG_DIRTY) cacheTransfer(&cacheBuf[i], 1); } journalReset(pfsMount); } }
int hddFormat(iop_file_t *f, const char *dev, const char *blockdev, void *arg, size_t arglen) { int rv=0; apa_cache *clink; int i; input_param params; u32 emptyBlocks[32]; if(f->unit >= 2) return -ENXIO; // clear all errors on hdd clink=cacheGetFree(); memset(clink->header, 0, sizeof(apa_header)); if(atadDmaTransfer(f->unit, clink->header, APA_SECTOR_SECTOR_ERROR, 1, ATAD_MODE_WRITE)){ cacheAdd(clink); return -EIO; } if(atadDmaTransfer(f->unit, clink->header, APA_SECTOR_PART_ERROR, 1, ATAD_MODE_WRITE)){ cacheAdd(clink); return -EIO; } // clear apa headers for(i=1024*8;i<hddDeviceBuf[f->unit].totalLBA;i+=(1024*256)) { atadDmaTransfer(f->unit, clink->header, i, sizeof(apa_header)/512, ATAD_MODE_WRITE); } cacheAdd(clink); if((rv=journalReset(f->unit))!=0) return rv; // set up mbr :) if((clink=cacheGetHeader(f->unit, 0, 1, &rv))){ apa_header *header=clink->header; memset(header, 0, sizeof(apa_header)); header->magic=APA_MAGIC; header->length=(1024*256); // 128MB header->type=APA_TYPE_MBR; strcpy(header->id,"__mbr"); memcpy(header->mbr.magic, mbrMagic, 32); header->mbr.version=APA_MBR_VERSION; header->mbr.nsector=0; getPs2Time(&header->created); getPs2Time(&header->mbr.created); header->checksum=apaCheckSum(header); clink->flags|=CACHE_FLAG_DIRTY; cacheFlushDirty(clink); atadFlushCache(f->unit); cacheAdd(clink); hddDeviceBuf[f->unit].status=0; hddDeviceBuf[f->unit].format=APA_MBR_VERSION; } memset(&emptyBlocks, 0, sizeof(emptyBlocks)); memset(¶ms, 0, sizeof(input_param)); params.size=(1024*256); params.type=APA_TYPE_PFS; // add __net, __system.... for(i=0;formatPartList[i];i++) { memset(params.id, 0, APA_IDMAX); strcpy(params.id, formatPartList[i]); if(!(clink=apaAddPartitionHere(f->unit, ¶ms, emptyBlocks, i ? clink->sector : 0, &rv))) return rv; cacheAdd(clink); params.size<<=1; if(hddDeviceBuf[f->unit].partitionMaxSize < params.size) params.size=hddDeviceBuf[f->unit].partitionMaxSize; } return rv; }