Don't take filedesc lock in fdunshare().
We can read refcnt safely and only care if it is equal to 1. If it could suddenly change from 1 to something bigger the code would be buggy even in the previous form and transitions from > 1 to 1 are equally racy and harmless (we copy even though there is no need). MFC after: 1 week
This commit is contained in:
parent
6aa225165f
commit
158627616c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=267755
@ -1852,17 +1852,14 @@ fdshare(struct filedesc *fdp)
|
||||
void
|
||||
fdunshare(struct proc *p, struct thread *td)
|
||||
{
|
||||
struct filedesc *tmp;
|
||||
|
||||
FILEDESC_XLOCK(p->p_fd);
|
||||
if (p->p_fd->fd_refcnt > 1) {
|
||||
struct filedesc *tmp;
|
||||
if (p->p_fd->fd_refcnt == 1)
|
||||
return;
|
||||
|
||||
FILEDESC_XUNLOCK(p->p_fd);
|
||||
tmp = fdcopy(p->p_fd);
|
||||
fdescfree(td);
|
||||
p->p_fd = tmp;
|
||||
} else
|
||||
FILEDESC_XUNLOCK(p->p_fd);
|
||||
tmp = fdcopy(p->p_fd);
|
||||
fdescfree(td);
|
||||
p->p_fd = tmp;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user