int apaJournalWrite(apa_cache_t *clink) { clink->header->checksum=journalCheckSum(clink->header); if(ata_device_sector_io(clink->device, clink->header, (journalBuf.num << 1)+APA_SECTOR_APAL_HEADERS, 2, ATA_DIR_WRITE)) return -EIO; journalBuf.sectors[journalBuf.num]=clink->sector; journalBuf.num++; return 0; }
int journalWrite(apa_cache *clink) { clink->header->checksum=journalCheckSum(clink->header); if(atadDmaTransfer(clink->device, clink->header, (journalBuf.num << 1)+APA_SECTOR_APAL_HEADERS, 2, ATAD_MODE_WRITE)) return -EIO; journalBuf.sectors[journalBuf.num]=clink->sector; journalBuf.num++; return 0; }
int journalFlush(pfs_mount_t *pfsMount) {// this write any thing that in are journal buffer :) int rv; pfsMount->blockDev->flushCache(pfsMount->fd); journalBuf.checksum=journalCheckSum(&journalBuf); rv=pfsMount->blockDev->transfer(pfsMount->fd, &journalBuf, 0, (pfsMount->log.number << pfsMount->sector_scale), 2, IOCTL2_TMODE_WRITE); pfsMount->blockDev->flushCache(pfsMount->fd); 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); }