27#include "pfs_fioctl.h"
32static const u8 openFlagArray[] = { 0, 4, 2, 6, 0, 0, 0, 0 };
38extern u32 pfsCacheNumBuffers;
41#ifdef PFS_STAT_RETURN_INODE_LBA
42extern u32 pfsBlockSize;
49static int fileTransferRemainder(
pfs_file_slot_t *fileSlot,
void *buf,
int size,
int operation);
50static int fileTransfer(
pfs_file_slot_t *fileSlot, u8 *buf,
int size,
int operation);
52static s64 _seek(
pfs_file_slot_t *fileSlot, s64 offset,
int whence,
int mode);
53static int _remove(
pfs_mount_t *pfsMount,
const char *path,
int mode);
55static void _sync(
void);
60int pfsFioCheckForLastError(
pfs_mount_t *pfsMount,
int rv)
62 return pfsMount->lastError ? pfsMount->lastError : (u32)rv;
69 if(fileSlot->clink==NULL)
71 SignalSema(pfsFioSema);
82 if(fileSlot->fd->
mode & FIO_O_WRONLY)
84 if(fileSlot->unaligned.dirty!=0)
86 pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->unaligned.buffer,
87 fileSlot->unaligned.sub, fileSlot->unaligned.sector, 1, PFS_IO_MODE_WRITE);
89 pfsInodeSetTime(fileSlot->clink);
90 fileSlot->clink->u.inode->attr|=PFS_FIO_ATTR_CLOSED;
91 if(pfsMount->flags & PFS_FIO_ATTR_WRITEABLE)
92 pfsCacheFlushAllDirty(pfsMount);
94 pfsCacheFree(fileSlot->block_pos.inode);
95 pfsCacheFree(fileSlot->clink);
103 WaitSema(pfsFioSema);
104 if((pfsMount=pfsGetMountedUnit(unit))==NULL)
105 SignalSema(pfsFioSema);
114 if((u32)unit >= pfsConfig.maxMount)
117 if(pfsMountBuf[unit].flags & PFS_MOUNT_BUSY)
120 for(i = 0; (u32)i < pfsConfig.maxMount; i++)
121 if((pfsMountBuf[i].flags & PFS_MOUNT_BUSY) &&
122 (blockDev == pfsMountBuf[i].blockDev) &&
123 (fd == pfsMountBuf[i].fd))
126 pfsMountBuf[unit].blockDev = blockDev;
127 pfsMountBuf[unit].fd = fd;
128 pfsMountBuf[unit].flags = flag;
130 rv = pfsMountSuperBlock(&pfsMountBuf[unit]);
134 pfsMountBuf[unit].flags |= PFS_MOUNT_BUSY;
142 int result, result2, result3, result4;
147#ifdef PFS_SUPPORT_BHDD
148 if (strcmp(pfsMount->blockDev->devName,
"bhdd") == 0)
149 if (openFlags & FIO_O_CREAT)
154 if ((parentInode=pfsInodeGetParent(pfsMount, NULL, filename, file, &result))==0)
160 fileInode=pfsInodeGetFileInDir(parentInode, file, &result);
169 flags=openFlagArray[openFlags & FIO_O_RDWR];
170 if (openFlags & FIO_O_TRUNC) flags |= 2;
171 if (openFlags & PFS_FDIRO) flags |= 4;
172 if ((mode & 0x10000) ||
173 ((openFlags & (FIO_O_CREAT|FIO_O_EXCL)) == (FIO_O_CREAT|FIO_O_EXCL))){
189 parentInode=pfsInodeGetParent(pfsMount, parentInode, (
char*)&fileInode->u.inode->data[1],
191 pfsCacheFree(fileInode);
192 if ((parentInode==0) ||
193 ((fileInode=pfsInodeGetFileInDir(parentInode, file, &result))==0))
199 if ((openFlags & PFS_FDIRO) == 0)
210 ((result=pfsCheckAccess(fileInode, flags & 0xFFFF))==0) &&
211 (openFlags & FIO_O_TRUNC))
213 cached=pfsCacheGetData(fileInode->pfsMount, fileInode->sub, fileInode->block+1, PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result2);
218 cached->flags |= PFS_CACHE_FLAG_DIRTY;
219 pfsCacheFree(cached);
223 fileInode->u.inode->size = 0;
224 fileInode->u.inode->attr &= ~PFS_FIO_ATTR_CLOSED;
225 fileInode->flags |= PFS_CACHE_FLAG_DIRTY;
226 pfsFreeZones(fileInode);
233 if ((openFlags & FIO_O_CREAT) && (result==-
ENOENT) &&
234 ((result=pfsCheckAccess(parentInode, 2))==0) &&
235 (fileInode=pfsInodeCreate(parentInode, mode, PFS_UID,
240 strcpy((
char*)&fileInode->u.inode->data[1], (
char*)freeSlot);
247 cached=pfsCacheGetData(fileInode->pfsMount, fileInode->u.inode->data[1].subpart,
248 fileInode->u.inode->data[1].number << fileInode->pfsMount->inode_scale,
249 PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result3);
252 pfsFillSelfAndParentDentries(cached,
253 &fileInode->u.inode->inode_block,
254 &parentInode->u.inode->inode_block);
255 cached->flags |= PFS_CACHE_FLAG_DIRTY;
256 pfsCacheFree(cached);
261 cached=pfsCacheGetData(fileInode->pfsMount, fileInode->sub, fileInode->block+1,
262 PFS_CACHE_FLAG_NOLOAD | PFS_CACHE_FLAG_NOTHING, &result4);
267 cached->flags |= PFS_CACHE_FLAG_DIRTY;
268 pfsCacheFree(cached);
274 if ((result==0) && (cached=pfsDirAddEntry(parentInode, file, &fileInode->u.inode->inode_block,
277 pfsInodeSetTimeParent(parentInode, cached);
278 pfsCacheFree(cached);
283 pfsCacheFree(parentInode);
284 if ((result==0) && freeSlot && fileInode)
286 freeSlot->clink=fileInode;
287 if (openFlags & FIO_O_APPEND)
288 freeSlot->position = fileInode->u.inode->size;
290 freeSlot->position = 0;
292 result=pfsBlockInitPos(freeSlot->clink, &freeSlot->block_pos, freeSlot->position);
295 if ((openFlags & FIO_O_WRONLY) &&
296 (fileInode->u.inode->attr & PFS_FIO_ATTR_CLOSED)){
297 fileInode->u.inode->attr &= ~PFS_FIO_ATTR_CLOSED;
298 fileInode->flags |= PFS_CACHE_FLAG_DIRTY;
299 if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE)
300 pfsCacheFlushAllDirty(pfsMount);
302 if ((result=pfsFioCheckForLastError(pfsMount, result))==0)
305 freeSlot->clink=NULL;
308 if(fileInode) pfsCacheFree(fileInode);
310 return pfsFioCheckForLastError(pfsMount, result);
313static int fileTransferRemainder(
pfs_file_slot_t *fileSlot,
void *buf,
int size,
int operation)
324 sector = ((bi->number+blockpos->block_offset) << pfsMount->sector_scale) +
325 (blockpos->byte_offset >> 9);
326 pos = blockpos->byte_offset & 0x1FF;
330 for(i = 0; (u32)i < pfsConfig.maxOpen; i++)
332 if((pfsFileSlots[i].clink != NULL)
333 && (pfsFileSlots[i].clink->pfsMount == pfsMount)
334 && (pfsFileSlots[i].unaligned.dirty)
335 && (pfsFileSlots[i].unaligned.sub == bi->subpart)
336 && (pfsFileSlots[i].unaligned.sector == sector))
338 unaligned2 = &pfsFileSlots[i].unaligned;
339 if(unaligned != unaligned2)
340 memcpy(unaligned->buffer, unaligned2->buffer,
sizeof(unaligned->buffer));
348 if(unaligned2 == NULL)
350 if((unaligned->sector != sector) || (unaligned->sub!=bi->subpart))
352 if (unaligned->dirty)
354 result=pfsMount->blockDev->transfer(pfsMount->fd, unaligned->buffer, unaligned->sub, unaligned->sector, 1, PFS_IO_MODE_WRITE);
360 unaligned->sub=bi->subpart;
361 unaligned->sector=sector;
363 if(pos || (fileSlot->position != fileSlot->clink->u.inode->size))
365 result = pfsMount->blockDev->transfer(pfsMount->fd, unaligned->buffer, unaligned->sub, unaligned->sector, 1, PFS_IO_MODE_READ);
367 return result | 0x10000;
373 memcpy(buf, &unaligned->buffer[pos], size=min(size, (
int)
sizeof(unaligned->buffer)-(
int)pos));
375 memcpy(&unaligned->buffer[pos], buf, size=min(size, (
int)
sizeof(unaligned->buffer)-(
int)pos));
379 if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE)
381 if ((result=pfsMount->blockDev->transfer(pfsMount->fd, unaligned->buffer, unaligned->sub,
382 unaligned->sector, operation, operation)))
386 for(i = 0; (u32)i < pfsConfig.maxOpen; i++)
388 if((pfsFileSlots[i].clink != NULL)
389 && (pfsFileSlots[i].clink->pfsMount == pfsMount)
390 && (pfsFileSlots[i].unaligned.sub == fileSlot->unaligned.sub)
391 && (pfsFileSlots[i].unaligned.sector == fileSlot->unaligned.sector))
393 if(!pfsFileSlots[i].unaligned.dirty)
394 memcpy(pfsFileSlots[i].unaligned.buffer, unaligned->buffer,
sizeof(pfsFileSlots[i].unaligned.buffer));
399 unaligned->dirty=operation;
405static int fileTransfer(
pfs_file_slot_t *fileSlot, u8 *buf,
int size,
int operation)
415 if ((operation==1) &&
416 (fileSlot->clink->u.inode->number_data - 1 == blockpos->block_segment))
418 bytes_remain = (pfsBlockGetCurrent(blockpos)->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset;
420 if (bytes_remain < (u32)size)
422 pfsBlockExpandSegment(fileSlot->clink, blockpos,
423 ((size-bytes_remain+pfsMount->zsize-1) & (~(pfsMount->zsize-1))) / pfsMount->zsize);
433 bi=pfsBlockGetCurrent(blockpos);
436 bytes_remain=(bi->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset;
442 if (blockpos->block_segment == fileSlot->clink->u.inode->number_data-1){
444 PFS_PRINTF(PFS_DRV_NAME
" Panic: This is a bug!\n");
448 result = pfsBlockAllocNewSegment(fileSlot->clink, blockpos,
449 (size - 1 + pfsMount->zsize) / pfsMount->zsize);
455 if ((result=pfsBlockSeekNextSegment(fileSlot->clink, blockpos)))
460 bi=pfsBlockGetCurrent(blockpos);
461 bytes_remain=(bi->count - blockpos->block_offset) * pfsMount->zsize - blockpos->byte_offset;
466 PFS_PRINTF(PFS_DRV_NAME
" Panic: There is no zone.\n");
470 if(fileSlot->unaligned.dirty)
472 u32 sector = ((bi->number + fileSlot->block_pos.block_offset) << pfsMount->sector_scale) + (fileSlot->block_pos.byte_offset / 512);
473 if((fileSlot->unaligned.sector == sector) &&
474 (fileSlot->unaligned.sub == bi->subpart)
477 if((result = pfsMount->blockDev->transfer(pfsMount->fd, fileSlot->unaligned.buffer, fileSlot->unaligned.sub, fileSlot->unaligned.sector, 1, PFS_IO_MODE_WRITE)) != 0)
480 fileSlot->unaligned.dirty = 0;
487 if ((blockpos->byte_offset & 0x1FF) || (size < 512) || ((uiptr)buf & 3))
489 if ((result=fileTransferRemainder(fileSlot, buf, size, operation)) < 0)
494 sectors = (u32)(bytes_remain / 512);
495 if ((u32)(size / 512) < sectors) sectors = size / 512;
498 result=pfsMount->blockDev->transfer(pfsMount->fd, buf, bi->subpart,
499 ((bi->number + blockpos->block_offset) << pfsMount->sector_scale)+(blockpos->byte_offset / 512),
506 result = sectors * 512;
510 fileSlot->position += result;
514 if(fileSlot->clink->u.inode->size < fileSlot->position)
516 fileSlot->clink->u.inode->size = fileSlot->position;
517 fileSlot->clink->flags |= PFS_CACHE_FLAG_DIRTY;
520 blockpos->block_offset+=pfsBlockSyncPos(blockpos, result);
522 return result < 0 ? result : total;
536 pfsFioSema = CreateSema(&sema);
545 pfsFioDevctlCloseAll();
547 DeleteSema(pfsFioSema);
552int pfsFioFormat(
iomanX_iop_file_t *f,
const char *dev,
const char *blockdev,
void *args,
int arglen)
554 int *arg = (
int *)args;
564 if((arglen == (3 *
sizeof(
int))) && (arg[1] == 0x2D66))
567 if((blockDev = pfsGetBlockDeviceTable(blockdev)) == 0)
570#ifdef PFS_SUPPORT_BHDD
571 if (strcmp(blockDev->devName,
"bhdd") == 0)
575 WaitSema(pfsFioSema);
577 fd = iomanX_open(blockdev, FIO_O_RDWR);
582 rv = pfsFormat(blockDev, fd, arg[0], fragment);
586 SignalSema(pfsFioSema);
603 if(!(pfsMount = pfsFioGetMountedUnit(f->
unit)))
609 for(i = 0; (u32)i < pfsConfig.maxOpen; i++)
611 if(!pfsFileSlots[i].fd) {
612 freeSlot = &pfsFileSlots[i];
613 goto pfsOpen_slotFound;
617 PFS_PRINTF(PFS_DRV_NAME
" Error: There are no free file slots!\n");
628 if((rv = openFile(pfsMount, freeSlot, name, f->
mode, (mode & 0xfff) |
FIO_S_IFREG)))
636 SignalSema(pfsFioSema);
646 rv = pfsFioCheckFileSlot(fileSlot);
650 pfsFioCloseFileSlot(fileSlot);
652 SignalSema(pfsFioSema);
660 int result = pfsFioCheckFileSlot(fileSlot);
668 if(fileSlot->clink->u.inode->size < (fileSlot->position + size))
669 size = (int)(fileSlot->clink->u.inode->size - fileSlot->position);
671 result = size ? fileTransfer(fileSlot, buf, size, 0) : 0;
672 result = pfsFioCheckForLastError(fileSlot->clink->pfsMount, result);
674 SignalSema(pfsFioSema);
682 int result = pfsFioCheckFileSlot(fileSlot);
687 pfsMount = fileSlot->clink->pfsMount;
689 if(fileSlot->position + (
unsigned int)size < fileSlot->position)
693#ifdef PFS_SUPPORT_BHDD
694 if (strcmp(pfsMount->blockDev->devName,
"bhdd") == 0)
699 result = fileTransfer(fileSlot, buf, size, 1);
703 if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE)
704 pfsCacheFlushAllDirty(pfsMount);
706 result = pfsFioCheckForLastError(pfsMount, result);
707 SignalSema(pfsFioSema);
711static s64 _seek(
pfs_file_slot_t *fileSlot, s64 offset,
int whence,
int mode)
714 s64 startPos, newPos;
716 if (mode & FIO_O_DIROPEN)
727 startPos= fileSlot->position;
730 startPos = fileSlot->clink->u.inode->size;
735 newPos = startPos + offset;
737 if (((offset < 0) && (startPos < newPos)) ||
738 ((offset > 0) && (startPos > newPos)) ||
739 (fileSlot->clink->u.inode->size < (u64)newPos))
744 pfsCacheFree(fileSlot->block_pos.inode);
745 rv=pfsBlockInitPos(fileSlot->clink, &fileSlot->block_pos, newPos);
747 fileSlot->position = newPos;
749 fileSlot->position = 0;
750 pfsBlockInitPos(fileSlot->clink, &fileSlot->block_pos, 0);
764 int result = pfsFioCheckFileSlot(fileSlot);
769 result = (u32)_seek(fileSlot, (s64)pos, whence, f->
mode);
771 SignalSema(pfsFioSema);
780 rv=pfsFioCheckFileSlot(fileSlot);
783 rv=_seek(fileSlot, offset, whence, f->
mode);
784 SignalSema(pfsFioSema);
789static int _remove(
pfs_mount_t *pfsMount,
const char *path,
int mode)
796#ifdef PFS_SUPPORT_BHDD
797 if (strcmp(pfsMount->blockDev->devName,
"bhdd") == 0)
801 if((parent=pfsInodeGetParent(pfsMount, NULL, path, szPath, &rv))==NULL)
804 if((file=pfsInodeGetFileInDir(parent, szPath, &rv))!=NULL)
810 else if(pfsCheckDirForFiles(file)==0)
812 else if(((u16)file->u.inode->inode_block.number==pfsMount->root_dir.number) &&
813 ((u16)file->u.inode->inode_block.subpart==pfsMount->root_dir.subpart))
815 else if(((u16)file->u.inode->inode_block.number==pfsMount->current_dir.number) &&
816 ((u16)file->u.inode->inode_block.subpart==pfsMount->current_dir.subpart))
825 if(file->u.inode->uid!=0)
826 rv=pfsCheckAccess(file, 2);
830 return pfsInodeRemove(parent, file, szPath);
834 pfsCacheFree(parent);
835 return pfsFioCheckForLastError(pfsMount, rv);
843 if(!(pfsMount = pfsFioGetMountedUnit(f->
unit)))
846 rv = _remove(pfsMount, name, 0);
848 SignalSema(pfsFioSema);
860 if(!(pfsMount = pfsFioGetMountedUnit(f->
unit)))
863 rv = openFile(pfsMount, NULL, path, FIO_O_CREAT | FIO_O_WRONLY, mode);
865 SignalSema(pfsFioSema);
876 temp = path + strlen(path);
880 if(!(pfsMount = pfsFioGetMountedUnit(f->
unit)))
883 rv = _remove(pfsMount, path, 0x01);
885 SignalSema(pfsFioSema);
892 return pfsFioOpen(f, name, 0, 0);
904 rv = pfsFioCheckFileSlot(fileSlot);
908 pfsMount = fileSlot->clink->pfsMount;
916 if((rv = pfsGetNextDentry(fileSlot->clink, &fileSlot->block_pos, (u32 *)&fileSlot->position,
917 dirent->name, &bi)) > 0)
920 clink = pfsInodeGetData(pfsMount, bi.subpart, bi.number, &result);
923 fioStatFiller(clink, &dirent->stat);
932 rv = pfsFioCheckForLastError(pfsMount, rv);
933 SignalSema(pfsFioSema);
940 stat->mode = clink->u.inode->mode;
941 stat->attr = clink->u.inode->attr;
942 stat->size = (u32)clink->u.inode->size;
943 stat->hisize = (u32)(clink->u.inode->size >> 32);
944 memcpy(&stat->ctime, &clink->u.inode->ctime,
sizeof(
pfs_datetime_t));
945 memcpy(&stat->atime, &clink->u.inode->atime,
sizeof(
pfs_datetime_t));
946 memcpy(&stat->mtime, &clink->u.inode->mtime,
sizeof(
pfs_datetime_t));
947 stat->private_0 = clink->u.inode->uid;
948 stat->private_1 = clink->u.inode->gid;
949 stat->private_2 = clink->u.inode->number_blocks;
950 stat->private_3 = clink->u.inode->number_data;
951#ifndef PFS_STAT_RETURN_INODE_LBA
955 stat->private_4 = clink->sub;
956 stat->private_5 = clink->block << pfsBlockSize;
966 if(!(pfsMount = pfsFioGetMountedUnit(f->
unit)))
969 clink=pfsInodeGetFile(pfsMount, NULL, name, &rv);
972 fioStatFiller(clink, stat);
976 SignalSema(pfsFioSema);
977 return pfsFioCheckForLastError(pfsMount, rv);
986 if(!(pfsMount = pfsFioGetMountedUnit(f->
unit)))
988#ifdef PFS_SUPPORT_BHDD
989 if (strcmp(pfsMount->blockDev->devName,
"bhdd") == 0)
991 SignalSema(pfsFioSema);
995 clink = pfsInodeGetFile(pfsMount, NULL, name, &rv);
998 rv = pfsCheckAccess(clink, 0x02);
1001 clink->flags |= PFS_CACHE_FLAG_DIRTY;
1004 clink->u.inode->mode = (clink->u.inode->mode &
FIO_S_IFMT) | (stat->mode & 0xfff);
1005 if(statmask & FIO_CST_ATTR)
1006 clink->u.inode->attr = (clink->u.inode->attr & 0xA0) | (stat->attr & 0xFF5F);
1007 if(statmask & FIO_CST_SIZE)
1009 if(statmask & FIO_CST_CT)
1010 memcpy(&clink->u.inode->ctime, stat->ctime,
sizeof(
pfs_datetime_t));
1011 if(statmask & FIO_CST_AT)
1012 memcpy(&clink->u.inode->atime, stat->atime,
sizeof(
pfs_datetime_t));
1013 if(statmask & FIO_CST_MT)
1014 memcpy(&clink->u.inode->mtime, stat->mtime,
sizeof(
pfs_datetime_t));
1021 if(pfsMount->flags & PFS_FIO_ATTR_WRITEABLE)
1022 pfsCacheFlushAllDirty(pfsMount);
1025 pfsCacheFree(clink);
1029 SignalSema(pfsFioSema);
1030 return pfsFioCheckForLastError(pfsMount, rv);
1035 char path1[256], path2[256];
1044 pfsMount=pfsFioGetMountedUnit(ff->
unit);
1045 if (pfsMount==0)
return -
ENODEV;
1046#ifdef PFS_SUPPORT_BHDD
1047 if (strcmp(pfsMount->blockDev->devName,
"bhdd") == 0)
1049 SignalSema(pfsFioSema);
1053 parentOld=pfsInodeGetParent(pfsMount, NULL, old, path1, &result);
1055 u32 nused=parentOld->nused;
1062 if ((iFileOld=pfsInodeGetFileInDir(parentOld, path1, &result))==NULL)
goto exit;
1064 if ((parentNew=pfsInodeGetParent(pfsMount, NULL,
new, path2, &result))==NULL)
goto exit;
1068 sameParent = parentOld == parentNew;
1070 if ((parentNew->nused != nused) && ((!sameParent) || (parentNew->nused!=2))){
1075 iFileNew=pfsInodeGetFileInDir(parentNew, path2, &result);
1081 if (pfsCheckDirForFiles(iFileNew)){
1082 if (iFileNew->nused >= 2)
1085 if (iFileOld==iFileNew)
1094 if (iFileNew->nused >= 2)
1097 if (iFileOld==iFileNew)
1104 if (result)
goto exit;
1106 if (f && (!sameParent)){
1109 parent=pfsCacheUsedAdd(parentNew);
1113 if (parent==iFileOld){
1117 tmp=pfsInodeGetFileInDir(parent,
"..", &result);
1118 pfsCacheFree(parent);
1119 if (tmp==parent)
break;
1122 pfsCacheFree(parent);
1126 if (strcmp(path1,
".") && strcmp(path1,
"..") &&
1127 strcmp(path2,
".") && strcmp(path2,
"..")){
1128 result=pfsCheckAccess(parentOld, 3);
1130 result=pfsCheckAccess(parentNew, 3);
1135 if (iFileNew && ((removeNew=pfsDirRemoveEntry(parentNew, path2))==NULL))
1138 removeOld=pfsDirRemoveEntry(parentOld, path1);
1142 addNew=pfsDirAddEntry(parentNew, path2, &iFileOld->u.inode->inode_block, iFileOld->u.inode->mode, &result);
1143 if (addNew && f && (!sameParent))
1144 newParent=pfsSetDentryParent(iFileOld, &parentNew->u.inode->inode_block, &result);
1151 if (removeNew) removeNew->pfsMount=NULL;
1152 if (removeOld) removeOld->pfsMount=NULL;
1153 if (addNew) addNew->pfsMount=NULL;
1154 if (iFileNew) iFileNew->pfsMount=NULL;
1155 parentOld->pfsMount=NULL;
1156 parentNew->pfsMount=NULL;
1159 if (removeOld!=addNew)
1160 removeOld->flags |= PFS_CACHE_FLAG_DIRTY;
1163 pfsInodeSetTimeParent(parentOld, removeOld);
1165 pfsInodeSetTimeParent(parentNew, addNew);
1167 if (newParent != NULL){
1168 pfsInodeSetTimeParent(iFileOld, newParent);
1169 pfsCacheFree(newParent);
1172 if (iFileNew != NULL){
1173 iFileNew->flags &= ~PFS_CACHE_FLAG_DIRTY;
1174 pfsBitmapFreeInodeBlocks(iFileNew);
1178 pfsCacheFlushAllDirty(pfsMount);
1180 if (removeOld) pfsCacheFree(removeOld);
1181 if (addNew) pfsCacheFree(addNew);
1182 if (removeNew) pfsCacheFree(removeNew);
1184 if (iFileNew) pfsCacheFree(iFileNew);
1185 pfsCacheFree(iFileOld);
1186 pfsCacheFree(parentOld);
1187 pfsCacheFree(parentNew);
1189 SignalSema(pfsFioSema);
1190 return pfsFioCheckForLastError(pfsMount, result);
1199 if(!(pfsMount = pfsFioGetMountedUnit(f->
unit)))
1202 clink = pfsInodeGetFile(pfsMount, 0, name, &result);
1208 result = pfsCheckAccess(clink, 0x01);
1211 memcpy(&pfsMount->current_dir, &clink->u.inode->inode_block,
sizeof(
pfs_blockinfo_t));
1214 pfsCacheFree(clink);
1217 SignalSema(pfsFioSema);
1218 return pfsFioCheckForLastError(pfsMount, result);
1221static void _sync(
void)
1225 for(i=0;(u32)i<pfsConfig.maxOpen;i++)
1228 if(unaligned->dirty) {
1229 pfs_mount_t *pfsMount=pfsFileSlots[i].clink->pfsMount;
1230 pfsMount->blockDev->transfer(pfsMount->fd, unaligned->buffer,
1231 unaligned->sub, unaligned->sector, 1, PFS_IO_MODE_WRITE);
1234 for(j = 0; (u32)j < pfsConfig.maxOpen; j++)
1236 if((pfsFileSlots[j].clink != NULL)
1237 && (pfsFileSlots[i].clink->pfsMount == pfsFileSlots[j].clink->pfsMount)
1238 && (pfsFileSlots[i].unaligned.sub == pfsFileSlots[j].unaligned.sub)
1239 && (pfsFileSlots[i].unaligned.sector == pfsFileSlots[j].unaligned.sector))
1241 if(!pfsFileSlots[j].unaligned.dirty)
1242 memcpy(pfsFileSlots[j].unaligned.buffer, pfsFileSlots[i].unaligned.buffer,
sizeof(pfsFileSlots[j].unaligned.buffer));
1258 if(!(pfsMount = pfsFioGetMountedUnit(f->
unit)))
1260#ifdef PFS_SUPPORT_BHDD
1261 if (strcmp(pfsMount->blockDev->devName,
"bhdd") == 0)
1263 SignalSema(pfsFioSema);
1268 pfsCacheFlushAllDirty(pfsMount);
1270 SignalSema(pfsFioSema);
1271 return pfsFioCheckForLastError(pfsMount, 0);
1274int pfsFioMount(
iomanX_iop_file_t *f,
const char *fsname,
const char *devname,
int flag,
void *arg,
int arglen)
1284 if(!(blockDev = pfsGetBlockDeviceTable(devname)))
1287 WaitSema(pfsFioSema);
1289 fd = iomanX_open(devname, (flag & FIO_MT_RDONLY) ? FIO_O_RDONLY : FIO_O_RDWR);
1293 if((rv=mountDevice(blockDev, fd, f->
unit, flag)) < 0)
1296 SignalSema(pfsFioSema);
1309 if((pfsMount = pfsFioGetMountedUnit(f->
unit))==NULL)
1312 for(i = 0; (u32)i < pfsConfig.maxOpen; i++)
1314 if((pfsFileSlots[i].clink!=NULL) && (pfsFileSlots[i].clink->pfsMount==pfsMount))
1322 pfsCacheClose(pfsMount);
1323 iomanX_close(pfsMount->fd);
1324 pfsClearMount(pfsMount);
1329 SignalSema(pfsFioSema);
1339 if(old==NULL ||
new==NULL)
1342 if(!(pfsMount=pfsFioGetMountedUnit(f->
unit)))
1345 rv = openFile(pfsMount, (
pfs_file_slot_t *)old, (
const char *)
new, FIO_O_CREAT|FIO_O_WRONLY, mode);
1346 SignalSema(pfsFioSema);
1350int pfsFioReadlink(
iomanX_iop_file_t *f,
const char *path,
char *buf,
unsigned int buflen)
1358 if(!(pfsMount=pfsFioGetMountedUnit(f->
unit)))
1361 if((clink=pfsInodeGetFile(pfsMount, NULL, path, &rv))!=NULL)
1363 if(!FIO_S_ISLNK(clink->u.inode->mode))
1367 rv=strlen((
char *)&clink->u.inode->data[1]);
1368 if(buflen < (
unsigned int)rv)
1370 memcpy(buf, &clink->u.inode->data[1], rv);
1372 pfsCacheFree(clink);
1374 SignalSema(pfsFioSema);
1376 return pfsFioCheckForLastError(pfsMount, rv);
u32 count
start sector of fragmented bd/file