The branch main has been updated by kib:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=4685fa8e4bef169e6a1ceaf07f149232326de805

commit 4685fa8e4bef169e6a1ceaf07f149232326de805
Author:     Konstantin Belousov <k...@freebsd.org>
AuthorDate: 2025-07-04 18:30:31 +0000
Commit:     Konstantin Belousov <k...@freebsd.org>
CommitDate: 2025-07-05 21:18:43 +0000

    aio: handle errors from fork
    
    Do not try to fork forever if fork() failed.  Propagate the error up.
    
    Reported and tested by: pho
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
---
 sys/kern/vfs_aio.c | 35 +++++++++++++++++++++++++----------
 1 file changed, 25 insertions(+), 10 deletions(-)

diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c
index d7c23122b4d8..66ea50eee77b 100644
--- a/sys/kern/vfs_aio.c
+++ b/sys/kern/vfs_aio.c
@@ -301,7 +301,7 @@ static TAILQ_HEAD(,kaiocb) aio_jobs;                        
/* (c) Async job list */
 static struct unrhdr *aiod_unr;
 
 static void    aio_biocleanup(struct bio *bp);
-static void    aio_init_aioinfo(struct proc *p);
+static int     aio_init_aioinfo(struct proc *p);
 static int     aio_onceonly(void);
 static int     aio_free_entry(struct kaiocb *job);
 static void    aio_process_rw(struct kaiocb *job);
@@ -422,10 +422,11 @@ aio_onceonly(void)
  * Init the per-process aioinfo structure.  The aioinfo limits are set
  * per-process for user limit (resource) management.
  */
-static void
+static int
 aio_init_aioinfo(struct proc *p)
 {
        struct kaioinfo *ki;
+       int error;
 
        ki = uma_zalloc(kaio_zone, M_WAITOK);
        mtx_init(&ki->kaio_mtx, "aiomtx", NULL, MTX_DEF | MTX_NEW);
@@ -451,8 +452,13 @@ aio_init_aioinfo(struct proc *p)
                uma_zfree(kaio_zone, ki);
        }
 
-       while (num_aio_procs < MIN(target_aio_procs, max_aio_procs))
-               aio_newproc(NULL);
+       error = 0;
+       while (num_aio_procs < MIN(target_aio_procs, max_aio_procs)) {
+               error = aio_newproc(NULL);
+               if (error != 0)
+                       break;
+       }
+       return (error);
 }
 
 static int
@@ -1490,8 +1496,11 @@ aio_aqueue(struct thread *td, struct aiocb *ujob, struct 
aioliojob *lj,
        int fd, kqfd;
        u_short evflags;
 
-       if (p->p_aioinfo == NULL)
-               aio_init_aioinfo(p);
+       if (p->p_aioinfo == NULL) {
+               error = aio_init_aioinfo(p);
+               if (error != 0)
+                       goto err1;
+       }
 
        ki = p->p_aioinfo;
 
@@ -2213,8 +2222,11 @@ kern_lio_listio(struct thread *td, int mode, struct 
aiocb * const *uacb_list,
        if (nent < 0 || nent > max_aio_queue_per_proc)
                return (EINVAL);
 
-       if (p->p_aioinfo == NULL)
-               aio_init_aioinfo(p);
+       if (p->p_aioinfo == NULL) {
+               error = aio_init_aioinfo(p);
+               if (error != 0)
+                       return (error);
+       }
 
        ki = p->p_aioinfo;
 
@@ -2503,8 +2515,11 @@ kern_aio_waitcomplete(struct thread *td, struct aiocb 
**ujobp,
                timo = tvtohz(&atv);
        }
 
-       if (p->p_aioinfo == NULL)
-               aio_init_aioinfo(p);
+       if (p->p_aioinfo == NULL) {
+               error = aio_init_aioinfo(p);
+               if (error != 0)
+                       return (error);
+       }
        ki = p->p_aioinfo;
 
        error = 0;

Reply via email to