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 majord...@freebsd.org
with "unsubscribe freebsd-current" in the body of the message

Reply via email to