1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-18 10:35:55 +00:00

Close a race in biodone(), whereby the bio_done field of the passed

bio may have been freed and reassigned by the wakeup before being
tested after releasing the bdonelock.

There's a non-zero chance this is the cause of a few of the crashes
knocking around with biodone() sitting in the stack backtrace.

Reviewed By: phk@
This commit is contained in:
Peter Edwards 2005-09-29 10:37:20 +00:00
parent 0896d83c56
commit d41c4674c2
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=150705

View File

@ -2882,14 +2882,16 @@ allocbuf(struct buf *bp, int size)
void
biodone(struct bio *bp)
{
void (*done)(struct bio *);
mtx_lock(&bdonelock);
bp->bio_flags |= BIO_DONE;
if (bp->bio_done == NULL)
done = bp->bio_done;
if (done == NULL)
wakeup(bp);
mtx_unlock(&bdonelock);
if (bp->bio_done != NULL)
bp->bio_done(bp);
if (done != NULL)
done(bp);
}
/*