svn commit: r199652 - stable/8/sys/fs/fifofs

Oliver Pinter oliver.pntr at gmail.com
Sun Nov 22 22:07:54 UTC 2009


this for 7-STABLE?

On 11/22/09, Attilio Rao <attilio at freebsd.org> wrote:
> Author: attilio
> Date: Sun Nov 22 16:09:27 2009
> New Revision: 199652
> URL: http://svn.freebsd.org/changeset/base/199652
>
> Log:
>   MFC r199007:
>   Fix a memory leak.
>
> Modified:
>   stable/8/sys/fs/fifofs/fifo_vnops.c
> Directory Properties:
>   stable/8/sys/   (props changed)
>   stable/8/sys/amd64/include/xen/   (props changed)
>   stable/8/sys/cddl/contrib/opensolaris/   (props changed)
>   stable/8/sys/contrib/dev/acpica/   (props changed)
>   stable/8/sys/contrib/pf/   (props changed)
>   stable/8/sys/dev/xen/xenpci/   (props changed)
>
> Modified: stable/8/sys/fs/fifofs/fifo_vnops.c
> ==============================================================================
> --- stable/8/sys/fs/fifofs/fifo_vnops.c	Sun Nov 22 16:04:49 2009	(r199651)
> +++ stable/8/sys/fs/fifofs/fifo_vnops.c	Sun Nov 22 16:09:27 2009	(r199652)
> @@ -78,6 +78,10 @@ struct fileops fifo_ops_f = {
>  /*
>   * This structure is associated with the FIFO vnode and stores
>   * the state associated with the FIFO.
> + * Notes about locking:
> + *   - fi_readsock and fi_writesock are invariant since init time.
> + *   - fi_readers and fi_writers are vnode lock protected.
> + *   - fi_wgen is fif_mtx lock protected.
>   */
>  struct fifoinfo {
>  	struct socket	*fi_readsock;
> @@ -215,14 +219,9 @@ fail1:
>  	}
>
>  	/*
> -	 * General access to fi_readers and fi_writers is protected using
> -	 * the vnode lock.
> -	 *
> -	 * Protect the increment of fi_readers and fi_writers and the
> -	 * associated calls to wakeup() with the fifo mutex in addition
> -	 * to the vnode lock.  This allows the vnode lock to be dropped
> -	 * for the msleep() calls below, and using the fifo mutex with
> -	 * msleep() prevents the wakeup from being missed.
> +	 * Use the fifo_mtx lock here, in addition to the vnode lock,
> +	 * in order to allow vnode lock dropping before msleep() calls
> +	 * and still avoiding missed wakeups.
>  	 */
>  	mtx_lock(&fifo_mtx);
>  	if (ap->a_mode & FREAD) {
> @@ -241,6 +240,8 @@ fail1:
>  	if (ap->a_mode & FWRITE) {
>  		if ((ap->a_mode & O_NONBLOCK) && fip->fi_readers == 0) {
>  			mtx_unlock(&fifo_mtx);
> +			if (fip->fi_writers == 0)
> +				fifo_cleanup(vp);
>  			return (ENXIO);
>  		}
>  		fip->fi_writers++;
> _______________________________________________
> svn-src-stable at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/svn-src-stable
> To unsubscribe, send any mail to "svn-src-stable-unsubscribe at freebsd.org"
>


More information about the svn-src-all mailing list