From owner-svn-src-all@FreeBSD.ORG Tue Nov 4 16:03:40 2008 Return-Path: Delivered-To: svn-src-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 11B531065670; Tue, 4 Nov 2008 16:03:40 +0000 (UTC) (envelope-from scottl@samsco.org) Received: from pooker.samsco.org (pooker.samsco.org [168.103.85.57]) by mx1.freebsd.org (Postfix) with ESMTP id AF3B28FC16; Tue, 4 Nov 2008 16:03:39 +0000 (UTC) (envelope-from scottl@samsco.org) Received: from phobos.local ([192.168.254.200]) (authenticated bits=0) by pooker.samsco.org (8.14.2/8.14.2) with ESMTP id mA4G3Wau032927; Tue, 4 Nov 2008 09:03:32 -0700 (MST) (envelope-from scottl@samsco.org) Message-ID: <49107254.9070307@samsco.org> Date: Tue, 04 Nov 2008 09:03:32 -0700 From: Scott Long User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.13) Gecko/20080313 SeaMonkey/1.1.9 MIME-Version: 1.0 To: Konstantin Belousov References: <200811041556.mA4FuijN001109@svn.freebsd.org> In-Reply-To: <200811041556.mA4FuijN001109@svn.freebsd.org> X-Enigmail-Version: 0.95.6 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-4.4 required=3.8 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.1.8 X-Spam-Checker-Version: SpamAssassin 3.1.8 (2007-02-13) on pooker.samsco.org Cc: svn-src-stable@FreeBSD.org, svn-src-all@FreeBSD.org, src-committers@FreeBSD.org, svn-src-stable-7@FreeBSD.org Subject: Re: svn commit: r184641 - in stable/7/sys: . kern X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 04 Nov 2008 16:03:40 -0000 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;