19extern u32 pfsMetaSize;
20extern u32 pfsBlockSize;
22u32 pfsBitsPerBitmapChunk = 8192;
28 size = pfsMount->blockDev->getSize(pfsMount->fd, subpart) >> pfsMount->sector_scale;
30 info->chunk = number / pfsBitsPerBitmapChunk;
31 info->bit = number & 31;
32 info->index = (number % pfsBitsPerBitmapChunk) / 32;
33 info->partitionChunks = size / pfsBitsPerBitmapChunk;
34 info->partitionRemainder = size % pfsBitsPerBitmapChunk;
38void pfsBitmapAllocFree(
pfs_cache_t *clink, u32 operation, u32 subpart, u32 chunk, u32 index, u32 _bit, u32
count)
48 bitmapEnd = (u32*)&((u8*)clink->u.bitmap)[pfsMetaSize];
49 for (bitmapWord = &clink->u.bitmap[index]; (bitmapWord < bitmapEnd) &&
count; bitmapWord++, _bit = 0)
51 for (bit = _bit; bit < 32 &&
count; bit++,
count--)
53 if(operation == PFS_BITMAP_ALLOC)
55 if (*bitmapWord & (1 << bit))
56 PFS_PRINTF(PFS_DRV_NAME
": Error: Tried to allocate used block!\n");
58 *bitmapWord |= (1 << bit);
62 if ((*bitmapWord & (1 << bit))==0)
63 PFS_PRINTF(PFS_DRV_NAME
": Error: Tried to free unused block!\n");
65 *bitmapWord &= ~(1 << bit);
71 clink->flags |= PFS_CACHE_FLAG_DIRTY;
79 sector = (1 << clink->pfsMount->inode_scale) + chunk;
81 sector += 0x2000 >> pfsBlockSize;
83 clink = pfsCacheGetData(clink->pfsMount, subpart, sector, PFS_CACHE_FLAG_BITMAP, &result);
95 u32 *bitmapWord, *bitmapEnd;
97 pfsBitmapSetupInfo(pfsMount, &
info, bi->subpart, bi->number+bi->count);
100 if ((u32)USHRT_MAX - bi->count <
count)
101 count = USHRT_MAX - bi->count;
105 while ((((
info.partitionRemainder==0) && (
info.chunk <
info.partitionChunks )) ||
106 ((
info.partitionRemainder!=0) && (
info.chunk <
info.partitionChunks+1))) &&
count)
108 u32 sector=(1<<pfsMount->inode_scale) +
info.chunk;
112 sector += 0x2000 >> pfsBlockSize;
115 c=pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result);
120 bitmapMax =
info.chunk==
info.partitionChunks ?
info.partitionRemainder / 8 : pfsMetaSize;
121 bitmapEnd = (u32*)&((u8*)c->u.bitmap)[bitmapMax];
122 for (bitmapWord=&c->u.bitmap[
info.index]; (bitmapWord < bitmapEnd) &&
count; bitmapWord++,
info.bit=0)
130 if (*bitmapWord & (1<<
info.bit))
138 *bitmapWord |= 1<<
info.bit;
140 c->flags |= PFS_CACHE_FLAG_DIRTY;
150 pfsMount->free_zone[bi->subpart]-=res;
151 pfsMount->zfree-=res;
161 u32 startBit = 0, startPos = 0, startChunk = 0,
count = 0;
167 pfsBitmapSetupInfo(pfsMount, &
info, bi->subpart, bi->number);
169 for ( ; ((
info.partitionRemainder==0) && (
info.chunk <
info.partitionChunks))||
170 ((
info.partitionRemainder!=0) && (
info.chunk <
info.partitionChunks+1));
info.chunk++){
173 sector =
info.chunk + (1 << pfsMount->inode_scale);
175 sector += 0x2000 >> pfsBlockSize;
178 bitmap = pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result);
182 bitmapMax =
info.chunk ==
info.partitionChunks ?
info.partitionRemainder / 8 : pfsMetaSize;
183 bitmapEnd = (u32*)&((u8*)bitmap->u.bitmap)[bitmapMax];
184 for (bitmapWord=&bitmap->u.bitmap[
info.index]; bitmapWord < bitmapEnd;
info.bit=0, bitmapWord++)
186 for (i=
info.bit; i < 32; i++)
189 if (((*bitmapWord >> i) & 1)==0)
194 startChunk =
info.chunk;
195 startPos = bitmapWord - bitmap->u.bitmap;
197 if (++
count == amount)
199 bi->number = (startPos * 32) + (startChunk * pfsBitsPerBitmapChunk) + startBit;
203 if (bitmap->block != (startChunk + (1 << pfsMount->inode_scale)))
205 pfsCacheFree(bitmap);
206 sector = (1 << pfsMount->inode_scale) + startChunk;
208 sector += 0x2000 >> pfsBlockSize;
210 bitmap = pfsCacheGetData(pfsMount, bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &result);
213 pfsBitmapAllocFree(bitmap, PFS_BITMAP_ALLOC, bi->subpart, startChunk, startPos, startBit, bi->count);
221 pfsCacheFree(bitmap);
232 u32 num,
count, n, i;
234 num = pfsMount->num_subs + 1;
236 if (bi->subpart >= num)
239 num = pfsMount->num_subs + 2;
241 count = max_count < 33 ? max_count : 32;
246 for(i = num - 1; i < num; i--)
248 for (n =
count; n; n /= 2)
250 if ((pfsMount->free_zone[bi->subpart] >= n) &&
251 pfsBitmapAllocZones(pfsMount, bi, n))
253 pfsMount->free_zone[bi->subpart] -= bi->count;
254 pfsMount->zfree -= bi->count;
262 if(bi->subpart == pfsMount->num_subs + 1)
276 pfsBitmapSetupInfo(pfsMount, &
info, bi->subpart, bi->number);
278 sector = (1 << pfsMount->inode_scale) +
info.chunk;
280 sector += 0x2000 >> pfsBlockSize;
282 if((clink=pfsCacheGetData(pfsMount, (u16)bi->subpart, sector, PFS_CACHE_FLAG_BITMAP, &rv)) != NULL)
284 pfsBitmapAllocFree(clink, PFS_BITMAP_FREE, bi->subpart,
info.chunk,
info.index,
info.bit, bi->count);
285 pfsMount->free_zone[(u16)bi->subpart]+=bi->count;
286 pfsMount->zfree+=bi->count;
291int pfsBitmapCalcFreeZones(
pfs_mount_t *pfsMount,
int sub)
294 const u32 pfsFreeZoneBitmap[16]={4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0};
297 u32 i, bitmapSize, zoneFree=0, sector;
299 pfsBitmapSetupInfo(pfsMount, &
info, sub, 0);
301 while (((
info.partitionRemainder!=0) && (
info.chunk<
info.partitionChunks+1)) ||
302 ((
info.partitionRemainder==0) && (
info.chunk<
info.partitionChunks)))
306 bitmapSize =
info.chunk==
info.partitionChunks ?
info.partitionRemainder / 8 : pfsMetaSize;
308 sector = (1<<pfsMount->inode_scale) +
info.chunk;
310 sector +=0x2000>>pfsBlockSize;
312 if ((clink=pfsCacheGetData(pfsMount, sub, sector, PFS_CACHE_FLAG_BITMAP, &result)))
314 for (i=0; i<bitmapSize; i++)
316 zoneFree+=pfsFreeZoneBitmap[((u8*)clink->u.bitmap)[i] & 0xF]
317 +pfsFreeZoneBitmap[((u8*)clink->u.bitmap)[i] >> 4];
335 for (pn=0; pn < pfsMount->num_subs+1; pn++)
337 bitcnt=pfsBitsPerBitmapChunk;
338 pfsBitmapSetupInfo(pfsMount, &
info, pn, 0);
340 while (((
info.partitionRemainder!=0) && (
info.chunk<
info.partitionChunks+1)) ||
341 ((
info.partitionRemainder==0) && (
info.chunk<
info.partitionChunks)))
344 u32 sector = (1<<pfsMount->inode_scale) +
info.chunk;
348 sector += 0x2000 >> pfsBlockSize;
349 clink=pfsCacheGetData(pfsMount, pn, sector, PFS_CACHE_FLAG_BITMAP, &result);
351 if (
info.chunk ==
info.partitionChunks)
352 bitcnt=
info.partitionRemainder;
354 PFS_PRINTF(PFS_DRV_NAME
": Zone show: pn %ld, bn %ld, bitcnt %ld\n", pn,
info.chunk, bitcnt);
356 for(i=0; (i < (u32)(1<<pfsBlockSize)) && ((i * 512) < (bitcnt / 8)); i++)
357 pfsPrintBitmap(clink->u.bitmap+128*i);
371 pfsCacheUsedAdd(clink);
372 for(i=0;i < clink->u.inode->number_data; i++)
374 u32 index = pfsFixIndex(i);
380 if((clink = pfsBlockGetNextSegment(clink, &err))==NULL)
384 pfsBitmapFreeBlockSegment(pfsMount, bi);
385 pfsCacheMarkClean(pfsMount, (u16)bi->subpart, bi->number << pfsMount->inode_scale,
386 (bi->number + bi->count) << pfsMount->inode_scale);
u32 count
start sector of fragmented bd/file