Exemple #1
0
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;
}
Exemple #2
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;
}
Exemple #3
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;
}
Exemple #4
0
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); 
}