fd: add fde_copy

To dedup handrolled memcpy. This will be used later to make fd code
atomic-clean.
This commit is contained in:
Mateusz Guzik 2022-02-14 16:43:19 +01:00
parent ec12b4f4ff
commit e68a5225e8
2 changed files with 14 additions and 4 deletions

View File

@ -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

View File

@ -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 */