Page MenuHomeFreeBSD

D27942.diff
No OneTemporary

D27942.diff

diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c
--- a/sys/kern/sys_socket.c
+++ b/sys/kern/sys_socket.c
@@ -775,10 +775,10 @@
so = job->fd_file->f_data;
opcode = job->uaiocb.aio_lio_opcode;
- if (opcode == LIO_READ || opcode == LIO_READV)
+ if (opcode & LIO_READ)
sb = &so->so_rcv;
else {
- MPASS(opcode == LIO_WRITE || opcode == LIO_WRITEV);
+ MPASS(opcode & LIO_WRITE);
sb = &so->so_snd;
}
@@ -808,13 +808,11 @@
if (error == 0)
return (0);
- switch (job->uaiocb.aio_lio_opcode) {
+ switch (job->uaiocb.aio_lio_opcode & (LIO_WRITE | LIO_READ)) {
case LIO_READ:
- case LIO_READV:
sb = &so->so_rcv;
break;
case LIO_WRITE:
- case LIO_WRITEV:
sb = &so->so_snd;
break;
default:
diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c
--- a/sys/kern/vfs_aio.c
+++ b/sys/kern/vfs_aio.c
@@ -817,8 +817,7 @@
if (error != 0 && job->uiop->uio_resid != cnt) {
if (error == ERESTART || error == EINTR || error == EWOULDBLOCK)
error = 0;
- if (error == EPIPE &&
- (opcode == LIO_WRITE || opcode == LIO_WRITEV)) {
+ if (error == EPIPE && (opcode & LIO_WRITE)) {
PROC_LOCK(job->userproc);
kern_psignal(job->userproc, SIGPIPE);
PROC_UNLOCK(job->userproc);
@@ -841,8 +840,7 @@
struct file *fp = job->fd_file;
int error = 0;
- KASSERT(job->uaiocb.aio_lio_opcode == LIO_SYNC ||
- job->uaiocb.aio_lio_opcode == LIO_DSYNC,
+ KASSERT(job->uaiocb.aio_lio_opcode & LIO_SYNC,
("%s: opcode %d", __func__, job->uaiocb.aio_lio_opcode));
td->td_ucred = job->cred;
@@ -1239,8 +1237,7 @@
if (vp->v_bufobj.bo_bsize == 0)
return (-1);
- bio_cmd = opcode == LIO_WRITE || opcode == LIO_WRITEV ? BIO_WRITE :
- BIO_READ;
+ bio_cmd = (opcode & LIO_WRITE) ? BIO_WRITE : BIO_READ;
iovcnt = job->uiop->uio_iovcnt;
if (iovcnt > max_buf_aio)
return (-1);
@@ -1422,7 +1419,7 @@
error = copyin(ujob, kcb, sizeof(struct aiocb));
if (error)
return (error);
- if (type == LIO_READV || type == LIO_WRITEV) {
+ if (type & LIO_VECTORED) {
/* malloc a uio and copy in the iovec */
error = copyinuio(__DEVOLATILE(struct iovec*, kcb->aio_iov),
kcb->aio_iovcnt, &kjob->uiop);
@@ -1609,7 +1606,7 @@
if (error)
goto err3;
- if ((opcode == LIO_SYNC || opcode == LIO_DSYNC) && fp->f_vnode == NULL) {
+ if ((opcode & LIO_SYNC) && fp->f_vnode == NULL) {
error = EINVAL;
goto err3;
}
@@ -1669,14 +1666,10 @@
job->jobflags = KAIOCB_QUEUEING;
job->lio = lj;
- switch (opcode) {
- case LIO_READV:
- case LIO_WRITEV:
+ if (opcode & LIO_VECTORED) {
/* Use the uio copied in by aio_copyin */
MPASS(job->uiop != &job->uio && job->uiop != NULL);
- break;
- case LIO_READ:
- case LIO_WRITE:
+ } else {
/* Setup the inline uio */
job->iov[0].iov_base = (void *)(uintptr_t)job->uaiocb.aio_buf;
job->iov[0].iov_len = job->uaiocb.aio_nbytes;
@@ -1684,18 +1677,13 @@
job->uio.uio_iovcnt = 1;
job->uio.uio_resid = job->uaiocb.aio_nbytes;
job->uio.uio_segflg = UIO_USERSPACE;
- /* FALLTHROUGH */
- default:
job->uiop = &job->uio;
- break;
}
- switch (opcode) {
+ switch (opcode & (LIO_READ | LIO_WRITE)) {
case LIO_READ:
- case LIO_READV:
job->uiop->uio_rw = UIO_READ;
break;
case LIO_WRITE:
- case LIO_WRITEV:
job->uiop->uio_rw = UIO_WRITE;
break;
}
@@ -1813,21 +1801,14 @@
return (EOPNOTSUPP);
}
- switch (job->uaiocb.aio_lio_opcode) {
- case LIO_READ:
- case LIO_READV:
- case LIO_WRITE:
- case LIO_WRITEV:
+ if (job->uaiocb.aio_lio_opcode & (LIO_WRITE | LIO_READ)) {
aio_schedule(job, aio_process_rw);
error = 0;
- break;
- case LIO_SYNC:
- case LIO_DSYNC:
+ } else if (job->uaiocb.aio_lio_opcode & LIO_SYNC) {
AIO_LOCK(ki);
TAILQ_FOREACH(job2, &ki->kaio_jobqueue, plist) {
if (job2->fd_file == job->fd_file &&
- job2->uaiocb.aio_lio_opcode != LIO_SYNC &&
- job2->uaiocb.aio_lio_opcode != LIO_DSYNC &&
+ ((job2->uaiocb.aio_lio_opcode & LIO_SYNC) == 0) &&
job2->seqno < job->seqno) {
job2->jobflags |= KAIOCB_CHECKSYNC;
job->pending++;
@@ -1847,8 +1828,7 @@
AIO_UNLOCK(ki);
aio_schedule(job, aio_process_sync);
error = 0;
- break;
- default:
+ } else {
error = EINVAL;
}
return (error);
@@ -2498,7 +2478,7 @@
*/
if (flags & BIO_ERROR)
atomic_set_int(&job->error, bio_error);
- if (opcode == LIO_WRITE || opcode == LIO_WRITEV)
+ if (opcode & LIO_WRITE)
atomic_add_int(&job->outblock, nblks);
else
atomic_add_int(&job->inblock, nblks);
@@ -2836,7 +2816,7 @@
CP(job32, *kcb, aio_fildes);
CP(job32, *kcb, aio_offset);
CP(job32, *kcb, aio_lio_opcode);
- if (type == LIO_READV || type == LIO_WRITEV) {
+ if (type & LIO_VECTORED) {
iov32 = PTRIN(job32.aio_iov);
CP(job32, *kcb, aio_iovcnt);
/* malloc a uio and copy in the iovec */
diff --git a/sys/sys/aio.h b/sys/sys/aio.h
--- a/sys/sys/aio.h
+++ b/sys/sys/aio.h
@@ -44,11 +44,12 @@
#define LIO_WRITE 0x1
#define LIO_READ 0x2
#if defined(_KERNEL) || defined(_WANT_ALL_LIO_OPCODES)
-#define LIO_SYNC 0x3
-#define LIO_MLOCK 0x4
-#define LIO_WRITEV 0x5
-#define LIO_READV 0x6
-#define LIO_DSYNC 0x7
+#define LIO_VECTORED 0x4
+#define LIO_WRITEV (LIO_WRITE | LIO_VECTORED)
+#define LIO_READV (LIO_READ | LIO_VECTORED)
+#define LIO_SYNC 0x8
+#define LIO_DSYNC (0x10 | LIO_SYNC)
+#define LIO_MLOCK 0x20
#endif
/*

File Metadata

Mime Type
text/plain
Expires
Sun, Feb 9, 12:08 PM (20 h, 55 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16552865
Default Alt Text
D27942.diff (5 KB)

Event Timeline