svn commit: r184641 - in stable/7/sys: . kern
Scott Long
scottl at samsco.org
Tue Nov 4 08:44:00 PST 2008
In stable branches, and especially during release cycles, would it be
possible to annotate whether changes like this fix known panics or
user-visible bugs?
Scott
Konstantin Belousov wrote:
> Author: kib
> Date: Tue Nov 4 15:56:44 2008
> New Revision: 184641
> URL: http://svn.freebsd.org/changeset/base/184641
>
> Log:
> MFC r184409:
> Protect check for v_pollinfo == NULL and assignment of the newly allocated
> vpollinfo with vnode interlock. Fully initialize vpollinfo before putting
> pointer to it into vp->v_pollinfo.
>
> Approved by: re (kensmith)
>
> Modified:
> stable/7/sys/ (props changed)
> stable/7/sys/kern/vfs_subr.c
>
> Modified: stable/7/sys/kern/vfs_subr.c
> ==============================================================================
> --- stable/7/sys/kern/vfs_subr.c Tue Nov 4 15:47:06 2008 (r184640)
> +++ stable/7/sys/kern/vfs_subr.c Tue Nov 4 15:56:44 2008 (r184641)
> @@ -109,7 +109,7 @@ static void vgonel(struct vnode *);
> static void vfs_knllock(void *arg);
> static void vfs_knlunlock(void *arg);
> static int vfs_knllocked(void *arg);
> -
> +static void destroy_vpollinfo(struct vpollinfo *vi);
>
> /*
> * Enable Giant pushdown based on whether or not the vm is mpsafe in this
> @@ -815,11 +815,8 @@ vdestroy(struct vnode *vp)
> #ifdef MAC
> mac_destroy_vnode(vp);
> #endif
> - if (vp->v_pollinfo != NULL) {
> - knlist_destroy(&vp->v_pollinfo->vpi_selinfo.si_note);
> - mtx_destroy(&vp->v_pollinfo->vpi_lock);
> - uma_zfree(vnodepoll_zone, vp->v_pollinfo);
> - }
> + if (vp->v_pollinfo != NULL)
> + destroy_vpollinfo(vp->v_pollinfo);
> #ifdef INVARIANTS
> /* XXX Elsewhere we can detect an already freed vnode via NULL v_op. */
> vp->v_op = NULL;
> @@ -3050,6 +3047,14 @@ vbusy(struct vnode *vp)
> mtx_unlock(&vnode_free_list_mtx);
> }
>
> +static void
> +destroy_vpollinfo(struct vpollinfo *vi)
> +{
> + knlist_destroy(&vi->vpi_selinfo.si_note);
> + mtx_destroy(&vi->vpi_lock);
> + uma_zfree(vnodepoll_zone, vi);
> +}
> +
> /*
> * Initalize per-vnode helper structure to hold poll-related state.
> */
> @@ -3058,15 +3063,20 @@ v_addpollinfo(struct vnode *vp)
> {
> struct vpollinfo *vi;
>
> + if (vp->v_pollinfo != NULL)
> + return;
> vi = uma_zalloc(vnodepoll_zone, M_WAITOK);
> + mtx_init(&vi->vpi_lock, "vnode pollinfo", NULL, MTX_DEF);
> + knlist_init(&vi->vpi_selinfo.si_note, vp, vfs_knllock,
> + vfs_knlunlock, vfs_knllocked);
> + VI_LOCK(vp);
> if (vp->v_pollinfo != NULL) {
> - uma_zfree(vnodepoll_zone, vi);
> + VI_UNLOCK(vp);
> + destroy_vpollinfo(vi);
> return;
> }
> vp->v_pollinfo = vi;
> - mtx_init(&vp->v_pollinfo->vpi_lock, "vnode pollinfo", NULL, MTX_DEF);
> - knlist_init(&vp->v_pollinfo->vpi_selinfo.si_note, vp, vfs_knllock,
> - vfs_knlunlock, vfs_knllocked);
> + VI_UNLOCK(vp);
> }
>
> /*
> @@ -3081,8 +3091,7 @@ int
> vn_pollrecord(struct vnode *vp, struct thread *td, int events)
> {
>
> - if (vp->v_pollinfo == NULL)
> - v_addpollinfo(vp);
> + v_addpollinfo(vp);
> mtx_lock(&vp->v_pollinfo->vpi_lock);
> if (vp->v_pollinfo->vpi_revents & events) {
> /*
> @@ -3917,8 +3926,7 @@ vfs_kqfilter(struct vop_kqfilter_args *a
>
> kn->kn_hook = (caddr_t)vp;
>
> - if (vp->v_pollinfo == NULL)
> - v_addpollinfo(vp);
> + v_addpollinfo(vp);
> if (vp->v_pollinfo == NULL)
> return (ENOMEM);
> knl = &vp->v_pollinfo->vpi_selinfo.si_note;
More information about the svn-src-stable-7
mailing list