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:
Mateusz Guzik 2014-06-22 21:37:27 +00:00
parent 6aa225165f
commit 158627616c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=267755

View File

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