24extern u32 pfsBlockSize;
27u32 pfsCacheNumBuffers;
32 PFS_PRINTF(PFS_DRV_NAME
": Warning: NULL buffer returned\n");
37 PFS_PRINTF(PFS_DRV_NAME
": Error: Unused cache returned\n");
42 if(clink->pfsMount!=NULL) {
45 pfsCacheLink(pfsCacheBuf->prev, clink);
49 PFS_PRINTF(PFS_DRV_NAME
": Warning: Invalidated buffer is in use\n");
52 pfsCacheLink(pfsCacheBuf, clink);
58 cnew->next=clink->next;
59 clink->next->prev=cnew;
65 clink->prev->next=clink->next;
66 clink->next->prev=clink->prev;
81 if(pfsMount->lastError == 0) {
82 if((err=pfsMount->blockDev->transfer(pfsMount->fd, clink->u.data, clink->sub,
83 clink->block << pfsBlockSize, 1 << pfsBlockSize, mode))==0) {
84 if(mode==PFS_IO_MODE_READ) {
85 if(clink->flags & PFS_CACHE_FLAG_SEGD && ((
pfs_inode_t *)clink->u.inode)->magic!=PFS_SEGD_MAGIC)
87 if(clink->flags & PFS_CACHE_FLAG_SEGI && ((
pfs_inode_t *)clink->u.inode)->magic!=PFS_SEGI_MAGIC)
89 if(clink->flags & (PFS_CACHE_FLAG_SEGD|PFS_CACHE_FLAG_SEGI)) {
90 if(((
pfs_inode_t *)clink->u.inode)->checksum!=(u32)(pfsInodeCheckSum(clink->u.inode)))
96 PFS_PRINTF(PFS_DRV_NAME
": Error: Disk error partition %ld, block %ld, err %d\n",
97 clink->sub, clink->block, err);
98#ifndef PFS_NO_WRITE_ERROR_STAT
99 pfsMount->blockDev->setPartitionError(pfsMount->fd);
100 pfsFsckStat(pfsMount, clink->u.superblock, PFS_FSCK_STAT_WRITE_ERROR, PFS_MODE_SET_FLAG);
101 pfsMount->lastError=err;
105 clink->flags&=~PFS_CACHE_FLAG_DIRTY;
106 return pfsMount->lastError;
114 for(i=1;i<pfsCacheNumBuffers+1;i++){
115 if(pfsCacheBuf[i].pfsMount == pfsMount &&
116 pfsCacheBuf[i].flags & PFS_CACHE_FLAG_DIRTY)
120 pfsJournalWrite(pfsMount, pfsCacheBuf+1, pfsCacheNumBuffers);
121 for(i=1;i<pfsCacheNumBuffers+1;i++){
122 if(pfsCacheBuf[i].pfsMount == pfsMount &&
123 pfsCacheBuf[i].flags & PFS_CACHE_FLAG_DIRTY)
124 pfsCacheTransfer(&pfsCacheBuf[i], 1);
128 pfsJournalReset(pfsMount);
132 int flags,
int *result)
136 if (pfsCacheBuf->prev==pfsCacheBuf && pfsCacheBuf->prev->next==pfsCacheBuf->prev) {
137 PFS_PRINTF(PFS_DRV_NAME
": Error: Free buffer list is empty\n");
141 allocated=pfsCacheBuf->next;
142 if (pfsCacheBuf->next==NULL)
143 PFS_PRINTF(PFS_DRV_NAME
": Panic: Null pointer allocated\n");
144 if (allocated->pfsMount && (allocated->flags & PFS_CACHE_FLAG_DIRTY))
145 pfsCacheFlushAllDirty(allocated->pfsMount);
146 allocated->flags = flags & PFS_CACHE_FLAG_MASKTYPE;
147 allocated->pfsMount = pfsMount;
148 allocated->sub = sub;
149 allocated->block = block;
150 allocated->nused = 1;
151 return pfsCacheUnLink(allocated);
155 int flags,
int *result)
162 for (i=1; i < pfsCacheNumBuffers + 1; i++)
163 if ( pfsCacheBuf[i].pfsMount &&
164 (pfsCacheBuf[i].pfsMount==pfsMount) &&
165 (pfsCacheBuf[i].block == block))
166 if (pfsCacheBuf[i].sub==sub){
167 pfsCacheBuf[i].flags &= PFS_CACHE_FLAG_MASKSTATUS;
168 pfsCacheBuf[i].flags |= flags & PFS_CACHE_FLAG_MASKTYPE;
169 if (pfsCacheBuf[i].nused == 0)
170 pfsCacheUnLink(&pfsCacheBuf[i]);
171 pfsCacheBuf[i].nused++;
172 return &pfsCacheBuf[i];
175 clink=pfsCacheAlloc(pfsMount, sub, block, flags, result);
178 if (flags & PFS_CACHE_FLAG_NOLOAD)
181 if ((*result=pfsCacheTransfer(clink, PFS_IO_MODE_READ))>=0)
184 clink->pfsMount=NULL;
193 return pfsCacheAlloc(NULL, 0, 0, 0, result);
197int pfsCacheIsFull(
void)
199 if (pfsCacheBuf->prev != pfsCacheBuf)
return 0;
200 return pfsCacheBuf->prev->next == pfsCacheBuf->prev;
203int pfsCacheInit(u32 numBuf, u32 bufSize)
209 PFS_PRINTF(PFS_DRV_NAME
": Error: Number of buffers larger than 127.\n");
213 cacheData = pfsAllocMem(numBuf * bufSize);
215 if(!cacheData || !(pfsCacheBuf = pfsAllocMem((numBuf + 1) *
sizeof(
pfs_cache_t))))
218 pfsCacheNumBuffers = numBuf;
219 memset(pfsCacheBuf, 0, (numBuf + 1) *
sizeof(
pfs_cache_t));
221 pfsCacheBuf->next = pfsCacheBuf;
222 pfsCacheBuf->prev = pfsCacheBuf;
224 for(i = 1; i < numBuf + 1; i++)
226 pfsCacheBuf[i].u.data = cacheData;
227 pfsCacheLink(pfsCacheBuf->prev, &pfsCacheBuf[i]);
228 cacheData += bufSize;
234int pfsCacheDeinit(
void)
239 for(i = 1; i < pfsCacheNumBuffers + 1; i++){
241 apaFreeMem(pfsCacheBuf[i].u.data);
245 if (pfsCacheNumBuffers > 1)
247 pfsFreeMem(pfsCacheBuf[1].u.data);
250 pfsFreeMem(pfsCacheBuf);
258#ifdef PFS_SUPPORT_BHDD
259 if (strcmp(pfsMount->blockDev->devName,
"bhdd") != 0)
262 pfsCacheFlushAllDirty(pfsMount);
264 for(i=1; i < pfsCacheNumBuffers+1;i++){
265 if(pfsCacheBuf[i].pfsMount==pfsMount)
266 pfsCacheBuf[i].pfsMount=NULL;
270void pfsCacheMarkClean(
const pfs_mount_t *pfsMount, u32 subpart, u32 blockStart, u32 blockEnd)
274 for(i=1; i< pfsCacheNumBuffers+1;i++){
275 if(pfsCacheBuf[i].pfsMount==pfsMount && pfsCacheBuf[i].sub==subpart) {
276 if(pfsCacheBuf[i].block >= blockStart && pfsCacheBuf[i].block < blockEnd)
277 pfsCacheBuf[i].flags&=~PFS_CACHE_FLAG_DIRTY;