Module Name:    src
Committed By:   riastradh
Date:           Sat Dec  7 02:38:52 UTC 2024

Modified Files:
        src/sys/kern: sys_aio.c

Log Message:
sys/kern/sys_aio.c: Sprinkle SET_ERROR dtrace probes.

PR kern/58378: Kernel error code origination lacks dtrace probes


To generate a diff of this commit:
cvs rdiff -u -r1.49 -r1.50 src/sys/kern/sys_aio.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/sys_aio.c
diff -u src/sys/kern/sys_aio.c:1.49 src/sys/kern/sys_aio.c:1.50
--- src/sys/kern/sys_aio.c:1.49	Sat Dec  7 02:38:35 2024
+++ src/sys/kern/sys_aio.c	Sat Dec  7 02:38:51 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys_aio.c,v 1.49 2024/12/07 02:38:35 riastradh Exp $	*/
+/*	$NetBSD: sys_aio.c,v 1.50 2024/12/07 02:38:51 riastradh Exp $	*/
 
 /*
  * Copyright (c) 2007 Mindaugas Rasiukevicius <rmind at NetBSD org>
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_aio.c,v 1.49 2024/12/07 02:38:35 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_aio.c,v 1.50 2024/12/07 02:38:51 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -54,6 +54,7 @@ __KERNEL_RCSID(0, "$NetBSD: sys_aio.c,v 
 #include <sys/pool.h>
 #include <sys/proc.h>
 #include <sys/queue.h>
+#include <sys/sdt.h>
 #include <sys/signal.h>
 #include <sys/signalvar.h>
 #include <sys/syscall.h>
@@ -124,7 +125,7 @@ aio_fini(bool interface)
 		if (p != NULL) {
 			error = syscall_establish(NULL, aio_syscalls);
 			KASSERT(error == 0);
-			return EBUSY;
+			return SET_ERROR(EBUSY);
 		}
 	}
 
@@ -168,7 +169,7 @@ aio_modcmd(modcmd_t cmd, void *arg)
 	case MODULE_CMD_FINI:
 		return aio_fini(true);
 	default:
-		return ENOTTY;
+		return SET_ERROR(ENOTTY);
 	}
 }
 
@@ -199,7 +200,7 @@ aio_procinit(struct proc *p)
 	uaddr = uvm_uarea_alloc();
 	if (uaddr == 0) {
 		aio_exit(p, aio);
-		return EAGAIN;
+		return SET_ERROR(EAGAIN);
 	}
 	error = lwp_create(curlwp, p, uaddr, 0, NULL, 0, aio_worker,
 	    NULL, &l, curlwp->l_class, &curlwp->l_sigmask, &curlwp->l_sigstk);
@@ -360,13 +361,13 @@ aio_process(struct aio_job *a_job)
 		struct uio auio;
 
 		if (aiocbp->aio_nbytes > SSIZE_MAX) {
-			error = EINVAL;
+			error = SET_ERROR(EINVAL);
 			goto done;
 		}
 
 		fp = fd_getfile(fd);
 		if (fp == NULL) {
-			error = EBADF;
+			error = SET_ERROR(EBADF);
 			goto done;
 		}
 
@@ -385,7 +386,7 @@ aio_process(struct aio_job *a_job)
 
 			if ((fp->f_flag & FREAD) == 0) {
 				fd_putfile(fd);
-				error = EBADF;
+				error = SET_ERROR(EBADF);
 				goto done;
 			}
 			auio.uio_rw = UIO_READ;
@@ -399,7 +400,7 @@ aio_process(struct aio_job *a_job)
 
 			if ((fp->f_flag & FWRITE) == 0) {
 				fd_putfile(fd);
-				error = EBADF;
+				error = SET_ERROR(EBADF);
 				goto done;
 			}
 			auio.uio_rw = UIO_WRITE;
@@ -424,7 +425,7 @@ aio_process(struct aio_job *a_job)
 
 		if ((fp->f_flag & FWRITE) == 0) {
 			fd_putfile(fd);
-			error = EBADF;
+			error = SET_ERROR(EBADF);
 			goto done;
 		}
 
@@ -487,7 +488,7 @@ aio_enqueue_job(int op, void *aiocb_uptr
 
 	/* Non-accurate check for the limit */
 	if (aio_jobs_count + 1 > aio_max)
-		return EAGAIN;
+		return SET_ERROR(EAGAIN);
 
 	/* Get the data structure from user-space */
 	error = copyin(aiocb_uptr, &aiocbp, sizeof(struct aiocb));
@@ -498,12 +499,12 @@ aio_enqueue_job(int op, void *aiocb_uptr
 	sig = &aiocbp.aio_sigevent;
 	if (sig->sigev_signo < 0 || sig->sigev_signo >= NSIG ||
 	    sig->sigev_notify < SIGEV_NONE || sig->sigev_notify > SIGEV_SA)
-		return EINVAL;
+		return SET_ERROR(EINVAL);
 
 	/* Buffer and byte count */
 	if (((AIO_SYNC | AIO_DSYNC) & op) == 0)
 		if (aiocbp.aio_buf == NULL || aiocbp.aio_nbytes > SSIZE_MAX)
-			return EINVAL;
+			return SET_ERROR(EINVAL);
 
 	/* Check the opcode, if LIO_NOP - simply ignore */
 	if (op == AIO_LIO) {
@@ -513,7 +514,8 @@ aio_enqueue_job(int op, void *aiocb_uptr
 		else if (aiocbp.aio_lio_opcode == LIO_READ)
 			op = AIO_READ;
 		else
-			return (aiocbp.aio_lio_opcode == LIO_NOP) ? 0 : EINVAL;
+			return (aiocbp.aio_lio_opcode == LIO_NOP) ? 0 :
+			    SET_ERROR(EINVAL);
 	} else {
 		KASSERT(lio == NULL);
 	}
@@ -529,7 +531,7 @@ aio_enqueue_job(int op, void *aiocb_uptr
 			if (a_job->aiocb_uptr != aiocb_uptr)
 				continue;
 			mutex_exit(&aio->aio_mtx);
-			return EINVAL;
+			return SET_ERROR(EINVAL);
 		}
 		mutex_exit(&aio->aio_mtx);
 	}
@@ -541,7 +543,7 @@ aio_enqueue_job(int op, void *aiocb_uptr
 	 */
 	if (lio == NULL && p->p_aio == NULL)
 		if (aio_procinit(p))
-			return EAGAIN;
+			return SET_ERROR(EAGAIN);
 	aio = p->p_aio;
 
 	/*
@@ -549,7 +551,7 @@ aio_enqueue_job(int op, void *aiocb_uptr
 	 * structure back to the user-space.
 	 */
 	aiocbp._state = JOB_WIP;
-	aiocbp._errno = EINPROGRESS;
+	aiocbp._errno = SET_ERROR(EINPROGRESS);
 	aiocbp._retval = -1;
 	error = copyout(&aiocbp, aiocb_uptr, sizeof(struct aiocb));
 	if (error)
@@ -580,7 +582,7 @@ aio_enqueue_job(int op, void *aiocb_uptr
 		atomic_dec_uint(&aio_jobs_count);
 		mutex_exit(&aio->aio_mtx);
 		pool_put(&aio_job_pool, a_job);
-		return EAGAIN;
+		return SET_ERROR(EAGAIN);
 	}
 
 	TAILQ_INSERT_TAIL(&aio->jobs_queue, a_job, list);
@@ -625,9 +627,9 @@ sys_aio_cancel(struct lwp *l, const stru
 	fildes = (unsigned int)SCARG(uap, fildes);
 	dt = atomic_load_consume(&fdp->fd_dt);
 	if (fildes >= dt->dt_nfiles)
-		return EBADF;
+		return SET_ERROR(EBADF);
 	if (dt->dt_ff[fildes] == NULL || dt->dt_ff[fildes]->ff_file == NULL)
-		return EBADF;
+		return SET_ERROR(EBADF);
 
 	/* Check if AIO structure is initialized */
 	if (p->p_aio == NULL) {
@@ -649,7 +651,7 @@ sys_aio_cancel(struct lwp *l, const stru
 				continue;
 			if (fildes != a_job->aiocbp.aio_fildes) {
 				mutex_exit(&aio->aio_mtx);
-				return EBADF;
+				return SET_ERROR(EBADF);
 			}
 		} else if (a_job->aiocbp.aio_fildes != fildes)
 			continue;
@@ -687,7 +689,7 @@ sys_aio_cancel(struct lwp *l, const stru
 		a_job = TAILQ_FIRST(&tmp_jobs_list);
 		TAILQ_REMOVE(&tmp_jobs_list, a_job, list);
 		/* Set the errno and copy structures back to the user-space */
-		a_job->aiocbp._errno = ECANCELED;
+		a_job->aiocbp._errno = SET_ERROR(ECANCELED);
 		a_job->aiocbp._state = JOB_DONE;
 		if (copyout(&a_job->aiocbp, a_job->aiocb_uptr,
 		    sizeof(struct aiocb)))
@@ -703,7 +705,7 @@ sys_aio_cancel(struct lwp *l, const stru
 	}
 
 	if (errcnt)
-		return EFAULT;
+		return SET_ERROR(EFAULT);
 
 	/* Set a correct return value */
 	if (*retval == 0)
@@ -725,14 +727,14 @@ sys_aio_error(struct lwp *l, const struc
 	int error;
 
 	if (aio == NULL)
-		return EINVAL;
+		return SET_ERROR(EINVAL);
 
 	error = copyin(SCARG(uap, aiocbp), &aiocbp, sizeof(struct aiocb));
 	if (error)
 		return error;
 
 	if (aiocbp._state == JOB_NONE)
-		return EINVAL;
+		return SET_ERROR(EINVAL);
 
 	*retval = aiocbp._errno;
 
@@ -750,7 +752,7 @@ sys_aio_fsync(struct lwp *l, const struc
 	int op = SCARG(uap, op);
 
 	if ((op != O_DSYNC) && (op != O_SYNC))
-		return EINVAL;
+		return SET_ERROR(EINVAL);
 
 	op = O_DSYNC ? AIO_DSYNC : AIO_SYNC;
 
@@ -781,14 +783,14 @@ sys_aio_return(struct lwp *l, const stru
 	int error;
 
 	if (aio == NULL)
-		return EINVAL;
+		return SET_ERROR(EINVAL);
 
 	error = copyin(SCARG(uap, aiocbp), &aiocbp, sizeof(struct aiocb));
 	if (error)
 		return error;
 
 	if (aiocbp._errno == EINPROGRESS || aiocbp._state != JOB_DONE)
-		return EINVAL;
+		return SET_ERROR(EINVAL);
 
 	*retval = aiocbp._retval;
 
@@ -816,7 +818,7 @@ sys___aio_suspend50(struct lwp *l, const
 
 	nent = SCARG(uap, nent);
 	if (nent <= 0 || nent > aio_listio_max)
-		return EAGAIN;
+		return SET_ERROR(EAGAIN);
 
 	if (SCARG(uap, timeout)) {
 		/* Convert timespec to ticks */
@@ -846,7 +848,7 @@ aio_suspend1(struct lwp *l, struct aiocb
 	int i, error, timo;
 
 	if (p->p_aio == NULL)
-		return EAGAIN;
+		return SET_ERROR(EAGAIN);
 	aio = p->p_aio;
 
 	if (ts) {
@@ -854,7 +856,7 @@ aio_suspend1(struct lwp *l, struct aiocb
 		if (timo == 0 && ts->tv_sec == 0 && ts->tv_nsec > 0)
 			timo = 1;
 		if (timo <= 0)
-			return EAGAIN;
+			return SET_ERROR(EAGAIN);
 	} else
 		timo = 0;
 
@@ -898,7 +900,7 @@ aio_suspend1(struct lwp *l, struct aiocb
 		error = cv_timedwait_sig(&aio->done_cv, &aio->aio_mtx, timo);
 		if (error) {
 			if (error == EWOULDBLOCK)
-				error = EAGAIN;
+				error = SET_ERROR(EAGAIN);
 			break;
 		}
 	}
@@ -938,14 +940,14 @@ sys_lio_listio(struct lwp *l, const stru
 
 	/* Non-accurate checks for the limit and invalid values */
 	if (nent < 1 || nent > aio_listio_max)
-		return EINVAL;
+		return SET_ERROR(EINVAL);
 	if (aio_jobs_count + nent > aio_max)
-		return EAGAIN;
+		return SET_ERROR(EAGAIN);
 
 	/* Check if AIO structure is initialized, if not - initialize it */
 	if (p->p_aio == NULL)
 		if (aio_procinit(p))
-			return EAGAIN;
+			return SET_ERROR(EAGAIN);
 	aio = p->p_aio;
 
 	/* Create a LIO structure */
@@ -969,12 +971,12 @@ sys_lio_listio(struct lwp *l, const stru
 			    sig->sigev_signo >= NSIG ||
 			    sig->sigev_notify < SIGEV_NONE ||
 			    sig->sigev_notify > SIGEV_SA))
-				error = EINVAL;
+				error = SET_ERROR(EINVAL);
 		} else
 			memset(&lio->sig, 0, sizeof(struct sigevent));
 		break;
 	default:
-		error = EINVAL;
+		error = SET_ERROR(EINVAL);
 		break;
 	}
 
@@ -1008,7 +1010,7 @@ sys_lio_listio(struct lwp *l, const stru
 
 	/* Return an error, if any */
 	if (errcnt) {
-		error = EIO;
+		error = SET_ERROR(EIO);
 		goto err;
 	}
 
@@ -1020,7 +1022,7 @@ sys_lio_listio(struct lwp *l, const stru
 		while (lio->refcnt > 1 && error == 0)
 			error = cv_wait_sig(&aio->done_cv, &aio->aio_mtx);
 		if (error)
-			error = EINTR;
+			error = SET_ERROR(EINTR);
 	}
 
 err:
@@ -1054,7 +1056,7 @@ sysctl_aio_listio_max(SYSCTLFN_ARGS)
 		return error;
 
 	if (newsize < 1 || newsize > aio_max)
-		return EINVAL;
+		return SET_ERROR(EINVAL);
 	aio_listio_max = newsize;
 
 	return 0;
@@ -1075,7 +1077,7 @@ sysctl_aio_max(SYSCTLFN_ARGS)
 		return error;
 
 	if (newsize < 1 || newsize < aio_listio_max)
-		return EINVAL;
+		return SET_ERROR(EINVAL);
 	aio_max = newsize;
 
 	return 0;

Reply via email to