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



Am 12.10.11 22:26, schrieb Alexander Nasonov:
> 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.

IMO, this is just a hack.  aio ist fundamentally broken, or rather not
working at the moment due to it's design.  There is another aio PR open,
see there for details.

> 
> 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; 


-- 
  \~~~~~.                The NetBSD Foundation
   \~~~~~'               Marc Balmer, Developer / Marketing
  NetBSD
     \                   mbalmer%NetBSD.org@localhost   http://www.NetBSD.org/


Home | Main Index | Thread Index | Old Index