Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Sep 2005 10:01:18 +0300
From:      Alex Lyashkov <umka@sevcity.net>
To:        Peter Edwards <peadar.edwards@gmail.com>
Cc:        freebsd-current@freebsd.org
Subject:   Re: biodone panics
Message-ID:  <1127977278.3383.7.camel@berloga.shadowland>
In-Reply-To: <34cb7c8405092815247dc89bf6@mail.gmail.com>
References:  <34cb7c8405092815247dc89bf6@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

> 
> the call to wakeup may set in motion some events that cause the bio to
> be freed. By the time the mtx_unlock completes, "bp" could point to an
> invalid bio, and the "if (bp->bio_done != NULL)" is bogus. True?
> Shouldn't it be
> 
> > biodone(struct bio *bp)
> > {
> >         void (*done)(struct bio *);
> >
> >         mtx_lock(&bdonelock);
> >         bp->bio_flags |= BIO_DONE;
> >         done = bp->bio_done
> >         if (done == NULL)
> >                 wakeup(bp);
> >         mtx_unlock(&bdonelock);
> >         if (done != NULL)
> >                 bp->bio_done(bp);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
posible 
if( done != NULL )
	done(bp);
?
> > }
> 
> Anyone agree?




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1127977278.3383.7.camel>