PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
journal.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright 2001-2004, ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9#
10# APA journal related routines
11*/
12
13#include <errno.h>
14#include <iomanX.h>
15#ifdef _IOP
16#include <sysclib.h>
17#else
18#include <string.h>
19#endif
20#include <stdio.h>
21#include <hdd-ioctl.h>
22
23#include "libapa.h"
24#include "hdd_blkio.h"
25
26// Globals
27static apa_journal_t journalBuf;
28
29int apaJournalFlush(s32 device)
30{// this write any thing that in are journal buffer :)
31 if(blkIoFlushCache(device))
32 return -EIO;
33 if(blkIoDmaTransfer(device, &journalBuf, APA_SECTOR_APAL, 1, BLKIO_DIR_WRITE))
34 return -EIO;
35 if(blkIoFlushCache(device))
36 return -EIO;
37 return 0;
38}
39
40int apaJournalReset(s32 device)
41{
42 memset(&journalBuf, 0, sizeof(apa_journal_t));
43 journalBuf.magic=APAL_MAGIC;
44 return apaJournalFlush(device);
45}
46
47int apaJournalWrite(apa_cache_t *clink)
48{
49 clink->header->checksum=journalCheckSum(clink->header);
50 if(blkIoDmaTransfer(clink->device, clink->header,
51 (journalBuf.num << 1)+APA_SECTOR_APAL_HEADERS, 2, BLKIO_DIR_WRITE))
52 return -EIO;
53 journalBuf.sectors[journalBuf.num]=clink->sector;
54 journalBuf.num++;
55 return 0;
56}
57
58int apaJournalRestore(s32 device)
59{ // copies the journal from the HDD and erases the original.
60 int ret;
61 u32 sector;
62
63 APA_PRINTF(APA_DRV_NAME": checking log...\n");
64 ret = blkIoDmaTransfer(device, &journalBuf, APA_SECTOR_APAL, sizeof(apa_journal_t)/512, BLKIO_DIR_READ) == 0 ? 0 : -EIO;
65 if((ret == 0) && (journalBuf.magic == APAL_MAGIC))
66 {
67 int i;
68 apa_cache_t *clink;
69
70 if(journalBuf.num == 0)
71 return 0;
72
73 clink=apaCacheAlloc();
74 for(i=0, sector=APA_SECTOR_APAL_HEADERS;i<journalBuf.num;i++, sector+=2)
75 {
76 ret = (blkIoDmaTransfer(device, clink->header, sector, 2, BLKIO_DIR_READ) == 0) ? 0 : -EIO;
77 if(ret != 0)
78 break;
79
80 ret = (blkIoDmaTransfer(device, clink->header, journalBuf.sectors[i], 2, BLKIO_DIR_WRITE) == 0) ? 0 : -EIO;
81 if(ret != 0)
82 break;
83 }
84 apaCacheFree(clink);
85 }
86
87 return apaJournalReset(device);
88}
#define EIO
Definition errno.h:29