git: e68a5225e818 - main - fd: add fde_copy
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 15 Feb 2022 17:51:33 UTC
The branch main has been updated by mjg:
URL: https://cgit.FreeBSD.org/src/commit/?id=e68a5225e818380a0038bc9ab346fdb7913c0af9
commit e68a5225e818380a0038bc9ab346fdb7913c0af9
Author: Mateusz Guzik <mjg@FreeBSD.org>
AuthorDate: 2022-02-14 15:43:19 +0000
Commit: Mateusz Guzik <mjg@FreeBSD.org>
CommitDate: 2022-02-15 17:51:08 +0000
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 */