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:
parent
0209f41086
commit
87e83e7d4c
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user