On 02 Oct 2014, at 06:45, Emmanuel Dreyfus <m...@netbsd.org> wrote: > J. Hannken-Illjes <hann...@eis.cs.tu-bs.de> wrote: > >> genfs_gop_write calls genfs_do_io which does "error = biowait(mbp);" >> near the end. This will catch errors from VOP_STRATEGY. > > I run the code below but VOP_PUTPAGES never return anything else than 0.
Sure -- why should it? GOP_ALLOC() gets called from VOP_GETPAGES() for missing pages. Here you run VOP_PUTPAGES() on a range known to be unmapped so it becomes a NOP. GOP_ALLOC() aka puffs_gop_alloc() has to run on the client to make sure the pages in question are allocated and may be faulted in. The client has to fill holes or extend files. > int > puffs_gop_alloc(struct vnode *vp, off_t off, off_t len, > int flags, kauth_cred_t cred) > { > struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount); > off_t start, end; > int pgo_flags = PGO_CLEANIT|PGO_SYNCIO|PGO_PASTEOF; > int u_flags = PUFFS_UPDATESIZE|PUFFS_UPDATEMTIME|PUFFS_UPDATECTIME; > int error; > > if (EXISTSOP(pmp, FALLOCATE)) { > error = _puffs_vnop_fallocate(vp, off, len); > goto out; > } > > start = trunc_page(off); > end = round_page(off + len); > > if (off + len > vp->v_size) > uvm_vnp_setwritesize(vp, off + len); > > mutex_enter(vp->v_interlock); > error = VOP_PUTPAGES(vp, start, end, pgo_flags); > > if (off + len > vp->v_size) { > if (error == 0) { > uvm_vnp_setsize(vp, off + len); > puffs_updatenode(VPTOPP(vp), u_flags, vp->v_size); > } else { > uvm_vnp_setwritesize(vp, vp->v_size); > } > } > out: > return error; > } -- J. Hannken-Illjes - hann...@eis.cs.tu-bs.de - TU Braunschweig (Germany)