Matthew Dillon wrote: > :VOP_GETVOBJECT is a different name, but the VOP was my suggestion, > :to allow an upper layer to obtain a backing object, and to > :collapse intermediate layers. > : > :The issue is that the NULLFS getpages falls through the the > :vfs_default.c vop_stdgetpages(), which calls the function > :vnode_pager_generic_getpages(), which in turn, calls VOP_BMAP(), > :which in null_vnops.c is vop_eopnotsupp(), so it falls back to > :vnode_pager_input_smlfs(), which VOP_BMAP()'s *again*, but off > :the device. > : > :At which point, you've lost coherency. > > It should be calling VOP_BMAP through the VP stored in the VM > object, which will be the underlying file, not the nullfs.
Probably, but it's not doing that. The NULLFS implement VOP_BMAP as vop_eopnotsupp; it doesn't fall through. Even if it did fall through, the vfs_default.c code is not really written with stacking in mind, it's written with a local-media FS in mind. VOP_BMAP is simply not implemented for NULLFS, and is nearly impossible to implement correctly for a stacking VFS layer in any case, given the object aliasing problem. This is a deeply ingrained bug in FreeBSD's implementation of VFS stacking. The only safe workaround is to fail back to the read/write of the buffers, and lose coherency between instances of the FS... and that's what happens: you get coherency down, if you do explicit msync's, but lose it back up into the other instances local copies of the data. -- Terry To Unsubscribe: send mail to [EMAIL PROTECTED] with "unsubscribe freebsd-hackers" in the body of the message