Date: Mon, 31 May 1999 02:51:31 +0700 (NSS) From: Ustimenko Semen <semen@iclub.nsu.ru> To: freebsd-current@FreeBSD.org Subject: How can i fail buf? Message-ID: <Pine.BSF.4.05.9905301853490.13847-100000@iclub.nsu.ru>
index | next in thread | raw e-mail
Hi!
The problem is following:
FS driver recieves VOP_FSYNC request,
then it scan the queue and pick up dirty buffers to
bwrite(bp) them. bwrite calls VOP_STRATEGY,
FS's strategy routine is trying to VOP_BMAP buf, and
fails (suppose it fails), then xxfs_strategy do:
bp->b_error = error;
bp->b_flags |= B_ERROR;
biodone(bp);
return(bp);
(Looks right, at least IMO)
But:
biodone will not rel*se(bp), as it is not B_ASYNC,
then it returns to bwrite, where it will brelse(bp) after
biowait(bp). Then bp will come to brelse with B_ERROR set.
in the begining, brelse:
...
if ((bp->b_flags & (B_READ | B_ERROR)) == B_ERROR) {
bp->b_flags &= ~B_ERROR;
bdirty(bp);
} ...
then buffer returns to dirty queue, and is dirty, all
repeates infinite.
How this is solved?
Sorry if i miss something obvious...
Sorry for bad english...
Bye
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.05.9905301853490.13847-100000>
