On Wed, 2022-02-02 at 04:09 +0000, inoguchi.yuki@xxxxxxxxxxx wrote: > > I don't think that case adds anything interesting. When the file > > is > > closed, the lock is dropped. If there were any writes without a > > delegation, then the changeid isn't a reliable indication that no > > other > > client wrote. So the cache must be dropped. > > I've understood it. > > I've made the patch based on your idea. It invalidates the cache > after a client without write-delegation sends CLOSE call. > My Open MPI test program confirmed that this fix resolves the > problem. > > The patch is as follows. What do you think? > ----- > diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c > index b18f31b2c9e7..67021786034d 100644 > --- a/fs/nfs/nfs4proc.c > +++ b/fs/nfs/nfs4proc.c > @@ -3711,7 +3711,8 @@ static const struct rpc_call_ops nfs4_close_ops > = { > */ > int nfs4_do_close(struct nfs4_state *state, gfp_t gfp_mask, int > wait) > { > - struct nfs_server *server = NFS_SERVER(state->inode); > + struct inode *inode = state->inode; > + struct nfs_server *server = NFS_SERVER(inode); > struct nfs_seqid *(*alloc_seqid)(struct nfs_seqid_counter *, > gfp_t); > struct nfs4_closedata *calldata; > struct nfs4_state_owner *sp = state->owner; > @@ -3773,6 +3774,15 @@ int nfs4_do_close(struct nfs4_state *state, > gfp_t gfp_mask, int wait) > status = 0; > if (wait) > status = rpc_wait_for_completion_task(task); > + > + if (status >= 0 && !NFS_PROTO(inode)->have_delegation(inode, > FMODE_WRITE)) { > + nfs_set_cache_invalid(inode, NFS_INO_INVALID_ATTR > + | NFS_INO_INVALID_DATA > + | NFS_INO_INVALID_ACCESS > + | NFS_INO_INVALID_ACL > + | NFS_INO_REVAL_PAGECACHE); > + } > + > rpc_put_task(task); > return status; > out_free_calldata: > ----- NACK. That is completely unacceptable. -- Trond Myklebust Linux NFS client maintainer, Hammerspace trond.myklebust@xxxxxxxxxxxxxxx