On 30 Sep 2014, at 18:24, Emmanuel Dreyfus <m...@netbsd.org> wrote: > On Tue, Sep 30, 2014 at 03:30:05PM +0000, Antti Kantee wrote: >> Is it really better to sync fallocate, put stuff in the page cache and flush >> the page cache some day instead of just having a write-through (or >> write-first) page cache on the write() path? You also get rid of the >> fallocate-not-implemented problem that way. > > GOP_ALLOC calls puffs_gop_alloc for chunks bigger than pages > (I observed 1 MB for now). If we have fallocate implemented in the > filesystem, this is really efficient, since fallocate saves us from > sending any data to write. Hence IMO fallocate should be the preferred > way if available. > > But if it is not there, indeed, doing a write on first attemps should > do the trick. > >> Writing zeroes might be a bad emulation for distributed file systems, though >> I guess you're the expert in that field and can evaluate the risks better >> than me. > > I understand that areas fallocate'd should return zeroes, so it should be > fine. The real problem is performances. I am not sure what approach is best. > > I first though about a puffs_gop_alloc like below, but that will not work, > as VOP_PUTPAGES goes to genfs_putpages, which calls > GOP_WRITE (genfs_gop_write), which calls VOP_STRATEGY without checking > for failure.
genfs_gop_write calls genfs_do_io which does "error = biowait(mbp);" near the end. This will catch errors from VOP_STRATEGY. But why do you need GOP_ALLOC? Is there a consumer beside genfs_getpages filling holes? Puffs doesn't return holes as its VOP_BMAP always returns valid ( != -1 ) block addrs. > Should I directly call VOP_STRATEGY? > > int > puffs_gop_alloc(struct vnode *vp, off_t off, off_t len, > int flags, kauth_cred_t cred) > { > int error; > > if (EXISTSOP(pmp, FALLOCATE)) > return _puffs_vnop_fallocate(vp, off, len); > else > return VOP_PUTPAGES(vp, off, off + len, > PGO_CLEANIT|PGO_SYNCIO); > } > > -- > Emmanuel Dreyfus > m...@netbsd.org -- J. Hannken-Illjes - hann...@eis.cs.tu-bs.de - TU Braunschweig (Germany)