Page MenuHomeFreeBSD

D35988.diff
No OneTemporary

D35988.diff

diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -4173,7 +4173,8 @@
}
struct filedesc_to_leader *
-filedesc_to_leader_alloc(struct filedesc_to_leader *old, struct filedesc *fdp, struct proc *leader)
+filedesc_to_leader_alloc(struct filedesc_to_leader *old, struct filedesc *fdp,
+ struct proc *leader)
{
struct filedesc_to_leader *fdtol;
@@ -4197,6 +4198,15 @@
return (fdtol);
}
+struct filedesc_to_leader *
+filedesc_to_leader_share(struct filedesc_to_leader *fdtol, struct filedesc *fdp)
+{
+ FILEDESC_XLOCK(fdp);
+ fdtol->fdl_refcount++;
+ FILEDESC_XUNLOCK(fdp);
+ return (fdtol);
+}
+
static int
sysctl_kern_proc_nfds(SYSCTL_HANDLER_ARGS)
{
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -451,10 +451,7 @@
* Shared file descriptor table, and shared
* process leaders.
*/
- fdtol = p1->p_fdtol;
- FILEDESC_XLOCK(p1->p_fd);
- fdtol->fdl_refcount++;
- FILEDESC_XUNLOCK(p1->p_fd);
+ fdtol = filedesc_to_leader_share(p1->p_fdtol, p1->p_fd);
} else {
/*
* Shared file descriptor table, and different
diff --git a/sys/sys/filedesc.h b/sys/sys/filedesc.h
--- a/sys/sys/filedesc.h
+++ b/sys/sys/filedesc.h
@@ -270,6 +270,9 @@
struct filedesc_to_leader *
filedesc_to_leader_alloc(struct filedesc_to_leader *old,
struct filedesc *fdp, struct proc *leader);
+struct filedesc_to_leader *
+ filedesc_to_leader_share(struct filedesc_to_leader *fdtol,
+ struct filedesc *fdp);
int getvnode(struct thread *td, int fd, cap_rights_t *rightsp,
struct file **fpp);
int getvnode_path(struct thread *td, int fd, cap_rights_t *rightsp,

File Metadata

Mime Type
text/plain
Expires
Tue, Feb 11, 6:08 AM (11 h, 1 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16589701
Default Alt Text
D35988.diff (1 KB)

Event Timeline