svn commit: r363770 - head/sys/kern
Conrad Meyer
cem at FreeBSD.org
Sun Aug 2 16:34:28 UTC 2020
Author: cem
Date: Sun Aug 2 16:34:27 2020
New Revision: 363770
URL: https://svnweb.freebsd.org/changeset/base/363770
Log:
Unlocked getblk: Fix new false-positive assertion
A free buf's lock may be held (temporarily) due to unlocked lookup, so
buf_alloc() must acquire it without LK_NOWAIT. The unlocked getblk path
should unlock it promptly once it realizes the identity does not match
the buffer it was searching for.
Reported by: gallatin
Reviewed by: kib
Tested by: pho
X-MFC-With: r363482
Sponsored by: Dell EMC Isilon
Differential Revision: https://reviews.freebsd.org/D25914
Modified:
head/sys/kern/vfs_bio.c
Modified: head/sys/kern/vfs_bio.c
==============================================================================
--- head/sys/kern/vfs_bio.c Sun Aug 2 04:25:36 2020 (r363769)
+++ head/sys/kern/vfs_bio.c Sun Aug 2 16:34:27 2020 (r363770)
@@ -1637,7 +1637,7 @@ static struct buf *
buf_alloc(struct bufdomain *bd)
{
struct buf *bp;
- int freebufs;
+ int freebufs, error;
/*
* We can only run out of bufs in the buf zone if the average buf
@@ -1660,8 +1660,10 @@ buf_alloc(struct bufdomain *bd)
if (freebufs == bd->bd_lofreebuffers)
bufspace_daemon_wakeup(bd);
- if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL) != 0)
- panic("getnewbuf_empty: Locked buf %p on free queue.", bp);
+ error = BUF_LOCK(bp, LK_EXCLUSIVE, NULL);
+ KASSERT(error == 0, ("%s: BUF_LOCK on free buf %p: %d.", __func__, bp,
+ error));
+ (void)error;
KASSERT(bp->b_vp == NULL,
("bp: %p still has vnode %p.", bp, bp->b_vp));
More information about the svn-src-all
mailing list