18#include "bitmap_fsck.h"
20#define NUM_BITMAP_ENTRIES 5
21#define BITMAP_BUFFER_SIZE 256
22#define BITMAP_BUFFER_SIZE_BYTES (BITMAP_BUFFER_SIZE * 512)
24extern u32 pfsMetaSize;
25extern u32 pfsBlockSize;
28static void *pfsBitmapBuffer;
29static int PfsTempBitmapFD;
35 return pfsCacheGetData(mount, subpart, chunk + (1 << mount->inode_scale) + (0x2000 >> pfsBlockSize), PFS_CACHE_FLAG_BITMAP, &result);
39static int pfsBitmapTransfer(
pfs_bitmap_t *bitmap,
int mode)
45 xferParams.sector = (bitmap->index << 8);
46 xferParams.
size = BITMAP_BUFFER_SIZE;
47 xferParams.
mode = mode;
48 xferParams.buffer = bitmap->bitmap;
50 if ((result = iomanX_ioctl2(PfsTempBitmapFD,
HIOCTRANSFER, &xferParams, 0, NULL, 0)) < 0) {
51 PFS_PRINTF(
"error: could not read/write bitmap.\n");
65 for (i = 1, pBitmap = NULL; i < NUM_BITMAP_ENTRIES; i++) {
66 if (pfsBitmapData[i].index == index) {
67 pBitmap = &pfsBitmapData[i];
72 if (pBitmap != NULL) {
73 if (pBitmap->nused == 0) {
79 pBitmap = pfsBitmapData->next;
80 if (pBitmap->isDirty != 0) {
81 if (pfsBitmapTransfer(pBitmap, PFS_IO_MODE_WRITE) < 0) {
86 pBitmap->index = index;
89 if (pfsBitmapTransfer(pBitmap, PFS_IO_MODE_READ) < 0) {
101 if (bitmap->nused == 0) {
102 PFS_PRINTF(
"error: unused cache returned\n");
105 if (bitmap->nused == 0) {
112u32 *pfsGetBitmapEntry(u32 index)
117 if ((bitmap = pfsBitmapRead(index >> 20)) != NULL) {
118 pfsBitmapFree(bitmap);
119 result = &bitmap->bitmap[(index >> 5) & 0x7FFF];
128int pfsBitmapPartInit(u32 size)
131 unsigned int bitmapCount;
133 bitmapCount = (size >> 20) + (0 < ((size >> 3) & 0x0001FFFF));
135 for (i = 1; i < NUM_BITMAP_ENTRIES; i++) {
136 pfsBitmapData[i].isDirty = 0;
137 pfsBitmapData[i].nused = 0;
138 pfsBitmapData[i].index = i - 1;
139 memset(pfsBitmapData[i].bitmap, 0, BITMAP_BUFFER_SIZE_BYTES);
142 if (bitmapCount >= NUM_BITMAP_ENTRIES) {
143 for (i = 1; i < NUM_BITMAP_ENTRIES; i++) {
144 if ((result = pfsBitmapTransfer(&pfsBitmapData[i], PFS_IO_MODE_WRITE)) < 0) {
145 PFS_PRINTF(
"error: could not initialize bitmap.\n");
150 for (i = NUM_BITMAP_ENTRIES - 1; (u32)i < bitmapCount; i++) {
151 pfsBitmapData[NUM_BITMAP_ENTRIES - 1].index = i;
152 if ((result = pfsBitmapTransfer(&pfsBitmapData[NUM_BITMAP_ENTRIES - 1], PFS_IO_MODE_WRITE)) < 0) {
153 PFS_PRINTF(
"error: could not initialize bitmap.\n");
167int pfsBitmapInit(
void)
173 iomanX_remove(
"hdd0:_tmp");
175 if ((PfsTempBitmapFD = iomanX_open(
"hdd0:_tmp,,,128M,PFS", O_CREAT | O_RDWR)) < 0)
176 PFS_PRINTF(
"error: could not create temporary partition.\n");
178 if ((PfsTempBitmapFD = iomanX_open(
"hdd0:__mbr", O_RDWR)) < 0) {
179 PFS_PRINTF(
"error: could not open mbr partition.\n");
180 return PfsTempBitmapFD;
184 if ((pfsBitmapBuffer = pfsAllocMem((NUM_BITMAP_ENTRIES - 1) * BITMAP_BUFFER_SIZE_BYTES)) == NULL || (pfsBitmapData = pfsAllocMem(NUM_BITMAP_ENTRIES *
sizeof(
pfs_bitmap_t))) == NULL) {
188 memset(pfsBitmapData, 0, NUM_BITMAP_ENTRIES *
sizeof(
pfs_bitmap_t));
190 pfsBitmapData[0].next = pfsBitmapData;
191 pfsBitmapData[0].prev = pfsBitmapData;
193 bitmap = pfsBitmapBuffer;
194 for (i = 1; i < NUM_BITMAP_ENTRIES; i++) {
195 pfsBitmapData[i].bitmap = bitmap;
196 bitmap = (u32 *)((u8 *)bitmap + BITMAP_BUFFER_SIZE_BYTES);