27#include "pfs_fioctl.h"
33#ifdef PFS_IOCTL2_INC_CHECKSUM
34extern u32 pfsBlockSize;
38 PFS_AENTRY_MODE_LOOKUP = 0,
40 PFS_AENTRY_MODE_DELETE
46static int devctlFsckStat(
pfs_mount_t *pfsMount,
int mode);
48#ifdef PFS_IOCTL2_INC_CHECKSUM
49static int ioctl2InvalidateInode(
pfs_cache_t *clink);
51static int ioctl2Attr(
pfs_cache_t *clink,
int cmd,
void *arg,
void *outbuf, u32 *offset);
54static int ioctl2AttrDelete(
pfs_cache_t *clink,
void *arg);
55static int ioctl2AttrLookUp(
pfs_cache_t *clink,
char *key,
char *value);
67int pfsFioDevctl(
iomanX_iop_file_t *f,
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen)
78 if(!(pfsMount=pfsFioGetMountedUnit(f->
unit)))
80#ifdef PFS_SUPPORT_BHDD
81 if (strcmp(pfsMount->blockDev->devName,
"bhdd") == 0)
83 SignalSema(pfsFioSema);
98 pfsFioDevctlCloseAll();
101 case PDIOC_CLRFSCKSTAT:
102 rv=devctlFsckStat(pfsMount, PFS_MODE_REMOVE_FLAG);
105 case PDIOC_GETFSCKSTAT:
106 rv=devctlFsckStat(pfsMount, PFS_MODE_CHECK_FLAG);
109 case PDIOC_SHOWBITMAP:
110 pfsBitmapShow(pfsMount);
118 SignalSema(pfsFioSema);
123#ifdef PFS_IOCTL2_INC_CHECKSUM
124static int ioctl2InvalidateInode(
pfs_cache_t *clink)
126 clink->u.inode->checksum++;
127 return clink->pfsMount->blockDev->transfer(clink->pfsMount->fd, clink->u.inode, clink->sub, clink->block << pfsBlockSize, 1 << pfsBlockSize, PFS_IO_MODE_WRITE);
131int pfsFioIoctl2(
iomanX_iop_file_t *f,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen)
140 if(f->
mode & FIO_O_DIROPEN)
141 if(cmd==PIOCATTRREAD)
144 if(!(f->
mode & FIO_O_WRONLY))
156 if((rv=pfsFioCheckFileSlot(fileSlot))<0)
158 pfsMount=fileSlot->clink->pfsMount;
159#ifdef PFS_SUPPORT_BHDD
160 if (strcmp(pfsMount->blockDev->devName,
"bhdd") == 0)
166 rv=pfsAllocZones(fileSlot->clink, *(
int *)(arg), 1);
170 pfsFreeZones(fileSlot->clink);
177 rv=ioctl2Attr(fileSlot->clink, cmd, arg, buf, &fileSlot->aentryOffset);
180#ifdef PFS_IOCTL2_INC_CHECKSUM
182 rv=ioctl2InvalidateInode(fileSlot->clink);
191 if(pfsMount->flags & PFS_FIO_ATTR_WRITEABLE)
192 pfsCacheFlushAllDirty(pfsMount);
193 rv=pfsFioCheckForLastError(pfsMount, rv);
194 SignalSema(pfsFioSema);
199static int ioctl2Attr(
pfs_cache_t *clink,
int cmd,
void *arg,
void *outbuf, u32 *offset)
204 if((flink=pfsCacheGetData(clink->pfsMount, clink->sub, clink->block+1
205 ,PFS_CACHE_FLAG_NOTHING, &rv))==NULL)
211 rv=ioctl2AttrAdd(flink, arg);
215 rv=ioctl2AttrDelete(flink, arg);
219 rv=ioctl2AttrLookUp(flink, arg, outbuf);
223 rv=ioctl2AttrRead(flink, outbuf, offset);
232void pfsFioDevctlCloseAll(
void)
236 for(i=0;(u32)i < pfsConfig.maxOpen;i++)
238 if(pfsFileSlots[i].fd)
239 pfsFioCloseFileSlot(&pfsFileSlots[i]);
241 for(i=0;(u32)i < pfsConfig.maxOpen;i++)
244 if((pfsMount=pfsGetMountedUnit(i))!=NULL)
245 pfsCacheFlushAllDirty(pfsMount);
250static int devctlFsckStat(
pfs_mount_t *pfsMount,
int mode)
255 if((clink=pfsCacheAllocClean(&rv))!=NULL){
256 rv=pfsFsckStat(pfsMount, clink->u.superblock, PFS_FSCK_STAT_ERRORS_FIXED, mode);
273 fullsize=(kLen+strlen(value)+7) & ~3;
278 PFS_PRINTF(PFS_DRV_NAME
" Error: aentry allocated length/4 != 0\n");
279 if(aentry->aLen < ((aentry->kLen+aentry->vLen+7) & ~3))
281 PFS_PRINTF(PFS_DRV_NAME
" Panic: aentry is too small\n");
285 PFS_PRINTF(PFS_DRV_NAME
" Error: aentry too big\n");
289 case PFS_AENTRY_MODE_LOOKUP:
290 if(kLen==aentry->kLen)
291 if(memcmp(key, aentry->str, kLen)==0)
295 case PFS_AENTRY_MODE_ADD:
298 if(aentry->aLen>=fullsize)
301 if(aentry->aLen - ((aentry->kLen+aentry->vLen+7) & ~3) < fullsize)
305 case PFS_AENTRY_MODE_DELETE:
307 if(kLen==aentry->kLen)
309 if(memcmp(key, aentry->str, kLen)==0)
313 aentryLast->aLen+=aentry->aLen;
337 kLen=strlen(attr->key);
338 vLen=strlen(attr->value);
339 if(kLen>=PFS_AENTRY_KEY_MAX || vLen>=PFS_AENTRY_VALUE_MAX)
342 if(kLen==0 || vLen==0)
345 if(getAentry(clink, attr->key, NULL, PFS_AENTRY_MODE_LOOKUP))
347 if((aentry=getAentry(clink, attr->key, attr->value, PFS_AENTRY_MODE_ADD)) == NULL)
353 tmp=aentry->aLen-((aentry->kLen+(aentry->vLen + 7)) & 0x3FC);
360 memcpy(&aentry->str[0], attr->key, aentry->kLen);
361 memcpy(&aentry->str[aentry->kLen], attr->value, aentry->vLen);
362 clink->flags|=PFS_CACHE_FLAG_DIRTY;
367static int ioctl2AttrDelete(
pfs_cache_t *clink,
void *arg)
369 if(getAentry(clink, arg, NULL, PFS_AENTRY_MODE_DELETE) == NULL)
371 clink->flags|=PFS_CACHE_FLAG_DIRTY;
375static int ioctl2AttrLookUp(
pfs_cache_t *clink,
char *key,
char *value)
379 if((aentry=getAentry(clink, key, NULL, PFS_AENTRY_MODE_LOOKUP)) != NULL)
381 memcpy(value, &aentry->str[aentry->kLen], aentry->vLen);
382 value[aentry->vLen]=0;
396 memcpy(attr->key, &aentry->str[0], aentry->kLen);
397 attr->key[aentry->kLen]=0;
398 memcpy(attr->value, &aentry->str[aentry->kLen], aentry->vLen);
399 attr->value[aentry->vLen]=0;
400 *offset+=aentry->aLen;
403 }
while(*offset < 1024);