NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/45441: aio_write and aio_read connected to one pipe don't make progress



alnsn%NetBSD.org@localhost wrote:
> If you initialize two aiocb structs to connect to one pipe and call aio_read 
> before aio_write, then aio_error() calls will always be returning EINPROGRESS.
...
>Fix:
> not known

The best fix, I think, is return ESPIPE for non-seekable fildes rather
than silently ignoring aio_offset. This would indirectly solve the issue
described in this PR.

Any objections if I commit the patch below? (I'll document ESPIPE as well)
Alex


Index: sys/kern/sys_aio.c
===================================================================
RCS file: /cvsroot/src/sys/kern/sys_aio.c,v
retrieving revision 1.37
diff -p -u -u -r1.37 sys_aio.c
--- sys/kern/sys_aio.c  17 Feb 2011 19:02:50 -0000      1.37
+++ sys/kern/sys_aio.c  12 Oct 2011 20:15:34 -0000
@@ -360,6 +360,7 @@ aio_process(struct aio_job *a_job)
        struct proc *p = curlwp->l_proc;
        struct aiocb *aiocbp = &a_job->aiocbp;
        struct file *fp;
+       struct vnode *vp;
        int fd = aiocbp->aio_fildes;
        int error = 0;
 
@@ -380,6 +381,13 @@ aio_process(struct aio_job *a_job)
                        goto done;
                }
 
+               vp = (struct vnode *)fp->f_data;
+               if (fp->f_type != DTYPE_VNODE || vp->v_type == VFIFO) {
+                       fd_putfile(fd);
+                       error = ESPIPE;
+                       goto done;
+               }
+
                aiov.iov_base = (void *)(uintptr_t)aiocbp->aio_buf;
                aiov.iov_len = aiocbp->aio_nbytes;
                auio.uio_iov = &aiov;
@@ -427,7 +435,6 @@ aio_process(struct aio_job *a_job)
                /*
                 * Perform a file Sync operation
                 */
-               struct vnode *vp;
 
                if ((error = fd_getvnode(fd, &fp)) != 0)
                        goto done; 


Home | Main Index | Thread Index | Old Index