In bnoreuselist(), check both ends of the specified logical block
numbers range. This effectively skips indirect and extdata blocks on the buffer queue. Since their logical block numbers are negative, bnoreuselist() could loop infinitely. Reported and tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week
This commit is contained in:
parent
52d66ba6ae
commit
fa48f413ef
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=295716
@ -1673,7 +1673,8 @@ bnoreuselist(struct bufv *bufv, struct bufobj *bo, daddr_t startn, daddr_t endn)
|
||||
for (lblkno = startn;;) {
|
||||
again:
|
||||
bp = BUF_PCTRIE_LOOKUP_GE(&bufv->bv_root, lblkno);
|
||||
if (bp == NULL || bp->b_lblkno >= endn)
|
||||
if (bp == NULL || bp->b_lblkno >= endn ||
|
||||
bp->b_lblkno < startn)
|
||||
break;
|
||||
error = BUF_TIMELOCK(bp, LK_EXCLUSIVE | LK_SLEEPFAIL |
|
||||
LK_INTERLOCK, BO_LOCKPTR(bo), "brlsfl", 0, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user