In v_addpollinfo(), we allocate storage to back vp->v_pollinfo. However,

we may sleep when doing so; check that we didn't race with another thread
allocating storage for the vnode after allocation is made to a local
pointer, and only update the vnode pointer if it's still NULL.  Otherwise,
accept that another thread got there first, and release the local storage.

Discussed with:	jmg
This commit is contained in:
Robert Watson 2004-08-11 01:27:53 +00:00
parent 0209f41086
commit 87e83e7d4c

View File

@ -3247,8 +3247,14 @@ vbusy(vp)
void
v_addpollinfo(struct vnode *vp)
{
struct vpollinfo *vi;
vp->v_pollinfo = uma_zalloc(vnodepoll_zone, M_WAITOK);
vi = uma_zalloc(vnodepoll_zone, M_WAITOK);
if (vp->v_pollinfo != NULL) {
uma_zfree(vnodepoll_zone, vi);
return;
}
vp->v_pollinfo = vi;
mtx_init(&vp->v_pollinfo->vpi_lock, "vnode pollinfo", NULL, MTX_DEF);
}