On Thu, Nov 12, 2020 at 11:05:57PM +0000, Daire Byrne wrote: > So, I can't lay claim to identifying the exact optimisation/hack that > improves the retention of the re-export server's client cache when > re-exporting an NFSv3 server (which is then read by many clients). We > were working with an engineer at the time who showed an interest in > our use case and after we supplied a reproducer he suggested modifying > the nfs/inode.c > > - if (!inode_eq_iversion_raw(inode, fattr->change_attr)) { > + if (inode_peek_iversion_raw(inode) < fattr->change_attr) > { > > His reasoning at the time was: > > "Fixes inode invalidation caused by read access. The least important > bit is ORed with 1 and causes the inode version to differ from the one > seen on the NFS share. This in turn causes unnecessary re-download > impacting the performance significantly. This fix makes it only > re-fetch file content if inode version seen on the server is newer > than the one on the client." > > But I've always been puzzled by why this only seems to be the case > when using knfsd to re-export the (NFSv3) client mount. Using multiple > processes on a standard client mount never causes any similar > re-validations. And this happens with a completely read-only share > which is why I started to think it has something to do with atimes as > that could perhaps still cause a "write" modification even when > read-only? Ah-hah! So, it's inode_query_iversion() that's modifying a nfs inode's i_version. That's a special thing that only nfsd would do. I think that's totally fixable, we'll just have to think a little about how.... --b.