int pfsFioIoctl2(iop_file_t *f, int cmd, void *arg, size_t arglen, void *buf, size_t buflen) { int rv; pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; pfs_mount_t *pfsMount; if (f->mode & O_DIROPEN) if (cmd == PIOCATTRREAD) return -EISDIR; if (!(f->mode & O_WRONLY)) { switch (cmd) { case PIOCATTRLOOKUP: case PIOCATTRREAD: case PIOCINVINODE: break; default: return -EACCES; } } if ((rv = pfsFioCheckFileSlot(fileSlot)) < 0) return rv; pfsMount = fileSlot->clink->pfsMount; switch (cmd) { case PIOCALLOC: rv = pfsAllocZones(fileSlot->clink, *(int *)(arg), 1); break; case PIOCFREE: pfsFreeZones(fileSlot->clink); break; case PIOCATTRADD: case PIOCATTRDEL: case PIOCATTRLOOKUP: case PIOCATTRREAD: rv = ioctl2Attr(fileSlot->clink, cmd, arg, buf, &fileSlot->aentryOffset); break; #ifdef PFS_IOCTL2_INC_CHECKSUM case PIOCINVINODE: rv = ioctl2InvalidateInode(fileSlot->clink); break; #endif default: rv = -EINVAL; break; } if (pfsMount->flags & PFS_FIO_ATTR_WRITEABLE) pfsCacheFlushAllDirty(pfsMount); rv = pfsFioCheckForLastError(pfsMount, rv); SignalSema(pfsFioSema); return rv; }
int pfsIoctl2(iop_file_t *f, int cmd, void *arg, size_t arglen, void *buf, size_t buflen) { int rv; pfs_file_slot_t *fileSlot = (pfs_file_slot_t *)f->privdata; pfs_mount_t *pfsMount; if(f->mode & O_DIROPEN) if(cmd==PFS_IOCTL2_ATTR_READ) return -EISDIR; if(!(f->mode & O_WRONLY)) { if(cmd!=PFS_IOCTL2_ATTR_LOOKUP) if(cmd!=PFS_IOCTL2_ATTR_READ) return -EACCES; } if((rv=checkFileSlot(fileSlot))<0) return rv; pfsMount=fileSlot->clink->pfsMount; switch(cmd) { case PFS_IOCTL2_MALLOC: rv=ioctl2Alloc(fileSlot->clink, *(int *)(arg), 1); break; case PFS_IOCTL2_FREE: ioctl2Free(fileSlot->clink); break; case PFS_IOCTL2_ATTR_ADD: case PFS_IOCTL2_ATTR_DEL: case PFS_IOCTL2_ATTR_LOOKUP: case PFS_IOCTL2_ATTR_READ: rv=ioctl2Attr(fileSlot->clink, cmd, arg, buf, &fileSlot->aentryOffset); break; default: rv=-EINVAL; break; } if(pfsMount->flags & FIO_ATTR_WRITEABLE) cacheFlushAllDirty(pfsMount); rv=checkForLastError(pfsMount, rv); SignalSema(pfsFioSema); return rv; }