Skip site navigation (1)Skip section navigation (2)
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>