Beispiel #1
0
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;
}
Beispiel #2
0
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;
}