Dear folks, i've noticed that if a FS returns an error in its VOP_STRATEGY() its bluntly ignored by genfs resulting in a cp(1) action just continuing as if nothing happend. With the accompanied patch the cp(1) action returns the error as it should be. gop_write() calls genfs_do_io() but returns the error it gets from genfs_do_io(). That error is allways zero if its done async so the cp(1) action never gets the signal that something is wrong. The patch fixes this by returning the error from the mbp buffer. If the transaction can be done in one buffer this is correct, if it needs to be done in multiple transactions then it will have the result till now as a prediction. OK to commit? It is not altering the semantics. With regards, Reinoud Index: genfs_io.c =================================================================== RCS file: /cvsroot/src/sys/miscfs/genfs/genfs_io.c,v retrieving revision 1.19 diff -u -p -r1.19 genfs_io.c --- genfs_io.c 23 Feb 2009 21:27:51 -0000 1.19 +++ genfs_io.c 26 Mar 2009 17:04:51 -0000 @@ -1379,8 +1379,8 @@ genfs_do_io(struct vnode *vp, off_t off, } nestiobuf_done(mbp, skipbytes, error); if (async) { - UVMHIST_LOG(ubchist, "returning 0 (async)", 0,0,0,0); - return (0); + UVMHIST_LOG(ubchist, "returning mbp->b_error (async)", 0,0,0,0); + return mbp->b_error; } UVMHIST_LOG(ubchist, "waiting for mbp %p", mbp,0,0,0); error = biowait(mbp);
Attachment:
pgp2mPEc9wQdJ.pgp
Description: PGP signature