Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_aio.c
Show First 20 Lines • Show All 1,413 Lines • ▼ Show 20 Lines | |||||
aiocb_copyin(struct aiocb *ujob, struct kaiocb *kjob, int type) | aiocb_copyin(struct aiocb *ujob, struct kaiocb *kjob, int type) | ||||
{ | { | ||||
struct aiocb *kcb = &kjob->uaiocb; | struct aiocb *kcb = &kjob->uaiocb; | ||||
int error; | int error; | ||||
error = copyin(ujob, kcb, sizeof(struct aiocb)); | error = copyin(ujob, kcb, sizeof(struct aiocb)); | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
if (type == LIO_NOP) | |||||
type = kcb->aio_lio_opcode; | |||||
if (type & LIO_VECTORED) { | if (type & LIO_VECTORED) { | ||||
/* malloc a uio and copy in the iovec */ | /* malloc a uio and copy in the iovec */ | ||||
error = copyinuio(__DEVOLATILE(struct iovec*, kcb->aio_iov), | error = copyinuio(__DEVOLATILE(struct iovec*, kcb->aio_iov), | ||||
kcb->aio_iovcnt, &kjob->uiop); | kcb->aio_iovcnt, &kjob->uiop); | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 122 Lines • ▼ Show 20 Lines | if ((job->uaiocb.aio_sigevent.sigev_notify == SIGEV_SIGNAL || | ||||
error = EINVAL; | error = EINVAL; | ||||
goto err2; | goto err2; | ||||
} | } | ||||
/* Get the opcode. */ | /* Get the opcode. */ | ||||
if (type == LIO_NOP) { | if (type == LIO_NOP) { | ||||
switch (job->uaiocb.aio_lio_opcode) { | switch (job->uaiocb.aio_lio_opcode) { | ||||
case LIO_WRITE: | case LIO_WRITE: | ||||
case LIO_WRITEV: | |||||
case LIO_NOP: | case LIO_NOP: | ||||
case LIO_READ: | case LIO_READ: | ||||
case LIO_READV: | |||||
opcode = job->uaiocb.aio_lio_opcode; | opcode = job->uaiocb.aio_lio_opcode; | ||||
break; | break; | ||||
default: | default: | ||||
error = EINVAL; | error = EINVAL; | ||||
goto err2; | goto err2; | ||||
} | } | ||||
} else | } else | ||||
opcode = job->uaiocb.aio_lio_opcode = type; | opcode = job->uaiocb.aio_lio_opcode = type; | ||||
▲ Show 20 Lines • Show All 1,587 Lines • Show Last 20 Lines |