tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: VOP_PUTPAGE ignores mount_nfs -o soft,intr



On Tue, 23 Jun 2015, Emmanuel Dreyfus wrote:

> I note we have this in genfs_do_io(), and I suspect this is the same 2 value:
> 
>         if (iowrite) {
>                 mutex_enter(vp->v_interlock);
>                 vp->v_numoutput += 2;
>                 mutex_exit(vp->v_interlock);  
>         }               
>         mbp = ge
> 
> Why the vp->v_numoutput += 2 ?

From what I recall it's because this is a nested buf.  You need one for 
the biodone of the parent buf, and another for the child.

Look at the bottom of the routine you will see:

loopdone:
	if (skipbytes) {
		UVMHIST_LOG(ubchist, "skipbytes %d", skipbytes, 0,0,0);
	}
	nestiobuf_done(mbp, skipbytes, error);
	if (async) {
		UVMHIST_LOG(ubchist, "returning 0 (async)", 0,0,0,0);
		return (0);
	}
	UVMHIST_LOG(ubchist, "waiting for mbp %p", mbp,0,0,0);
	error = biowait(mbp);
	s = splbio();
	(*iodone)(mbp);
	splx(s);
	UVMHIST_LOG(ubchist, "returning, error %d", error,0,0,0);
	return (error);
}


So nestiobuf_done() will result in a call to biodone(), and there is an 
additional (*iodone)() call at the end for sync operations which also 
calls biodone().  For async operations the second biodone() is called by 
the storage driver when the I/O operation completes.

Eduardo


Home | Main Index | Thread Index | Old Index