From e68a5225e818380a0038bc9ab346fdb7913c0af9 Mon Sep 17 00:00:00 2001 From: Mateusz Guzik Date: Mon, 14 Feb 2022 16:43:19 +0100 Subject: [PATCH] fd: add fde_copy To dedup handrolled memcpy. This will be used later to make fd code atomic-clean. --- sys/kern/kern_descrip.c | 6 +++--- sys/sys/filedesc.h | 12 +++++++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 57e0d9dee671..259be785f88d 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -1022,7 +1022,7 @@ kern_dup(struct thread *td, u_int mode, int flags, int old, int new) seqc_write_begin(&newfde->fde_seqc); #endif oioctls = filecaps_free_prep(&newfde->fde_caps); - memcpy(newfde, oldfde, fde_change_size); + fde_copy(oldfde, newfde); filecaps_copy_finish(&oldfde->fde_caps, &newfde->fde_caps, nioctls); if ((flags & FDDUP_FLAG_CLOEXEC) != 0) @@ -3628,7 +3628,7 @@ dupfdopen(struct thread *td, struct filedesc *fdp, int dfd, int mode, #ifdef CAPABILITIES seqc_write_begin(&newfde->fde_seqc); #endif - memcpy(newfde, oldfde, fde_change_size); + fde_copy(oldfde, newfde); filecaps_copy_finish(&oldfde->fde_caps, &newfde->fde_caps, ioctls); #ifdef CAPABILITIES @@ -3645,7 +3645,7 @@ dupfdopen(struct thread *td, struct filedesc *fdp, int dfd, int mode, seqc_write_begin(&oldfde->fde_seqc); seqc_write_begin(&newfde->fde_seqc); #endif - memcpy(newfde, oldfde, fde_change_size); + fde_copy(oldfde, newfde); oldfde->fde_file = NULL; fdunused(fdp, dfd); #ifdef CAPABILITIES diff --git a/sys/sys/filedesc.h b/sys/sys/filedesc.h index ed1f8989358e..24eb6eb2c061 100644 --- a/sys/sys/filedesc.h +++ b/sys/sys/filedesc.h @@ -66,7 +66,17 @@ struct filedescent { #define fde_fcntls fde_caps.fc_fcntls #define fde_ioctls fde_caps.fc_ioctls #define fde_nioctls fde_caps.fc_nioctls -#define fde_change_size (offsetof(struct filedescent, fde_seqc)) + +#ifdef _KERNEL +static inline void +fde_copy(struct filedescent *from, struct filedescent *to) +{ + + to->fde_file = from->fde_file; + to->fde_caps = from->fde_caps; + to->fde_flags = from->fde_flags; +} +#endif struct fdescenttbl { int fdt_nfiles; /* number of open files allocated */