git: b3a93154db74 - main - Extract exterr_to_ue()
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 03 Jun 2025 04:07:34 UTC
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=b3a93154db74e44d44d0210c728e12c713393a50
commit b3a93154db74e44d44d0210c728e12c713393a50
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2025-05-31 21:08:57 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2025-06-03 02:43:58 +0000
Extract exterr_to_ue()
Reviewed by: brooks
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D50633
---
sys/kern/sys_generic.c | 28 +++++++++++++++++++---------
sys/sys/exterrvar.h | 2 ++
2 files changed, 21 insertions(+), 9 deletions(-)
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c
index 91bf3e93fa7c..ec61d0bdc541 100644
--- a/sys/kern/sys_generic.c
+++ b/sys/kern/sys_generic.c
@@ -2202,6 +2202,23 @@ file_kcmp_generic(struct file *fp1, struct file *fp2, struct thread *td)
return (kcmp_cmp((uintptr_t)fp1->f_data, (uintptr_t)fp2->f_data));
}
+int
+exterr_to_ue(struct thread *td, struct uexterror *ue)
+{
+ if ((td->td_pflags2 & TDP2_EXTERR) == 0)
+ return (ENOENT);
+
+ memset(ue, 0, sizeof(*ue));
+ ue->error = td->td_kexterr.error;
+ ue->cat = td->td_kexterr.cat;
+ ue->src_line = td->td_kexterr.src_line;
+ ue->p1 = td->td_kexterr.p1;
+ ue->p2 = td->td_kexterr.p2;
+ if (td->td_kexterr.msg != NULL)
+ strlcpy(ue->msg, td->td_kexterr.msg, sizeof(ue->msg));
+ return (0);
+}
+
void
exterr_copyout(struct thread *td)
{
@@ -2215,18 +2232,11 @@ exterr_copyout(struct thread *td)
uloc = (char *)td->td_exterr_ptr + __offsetof(struct uexterror,
error);
- if ((td->td_pflags2 & TDP2_EXTERR) == 0) {
+ error = exterr_to_ue(td, &ue);
+ if (error != 0) {
ue.error = 0;
sz = sizeof(ue.error);
} else {
- memset(&ue, 0, sizeof(ue));
- ue.error = td->td_kexterr.error;
- ue.cat = td->td_kexterr.cat;
- ue.src_line = td->td_kexterr.src_line;
- ue.p1 = td->td_kexterr.p1;
- ue.p2 = td->td_kexterr.p2;
- if (td->td_kexterr.msg != NULL)
- strlcpy(ue.msg, td->td_kexterr.msg, sizeof(ue.msg));
sz = sizeof(ue) - __offsetof(struct uexterror, error);
}
error = copyout(&ue.error, uloc, sz);
diff --git a/sys/sys/exterrvar.h b/sys/sys/exterrvar.h
index 5f55e377239a..3fe2c7446ed1 100644
--- a/sys/sys/exterrvar.h
+++ b/sys/sys/exterrvar.h
@@ -62,6 +62,8 @@ struct uexterror {
#define SET_ERROR0(eerror, mmsg) SET_ERROR2(eerror, mmsg, 0, 0)
#define SET_ERROR1(eerror, mmsg, pp1) SET_ERROR2(eerror, mmsg, pp1, 0)
+int exterr_to_ue(struct thread *td, struct uexterror *ue);
+
#else /* _KERNEL */
__BEGIN_DECLS