On Thu, Aug 29, 2019 at 03:23:43PM -0400, Olga Kornievskaia wrote: > I'm stuck again. The idea that Trond gave me is to instead of storing > the pointer to the stateid, (copy) store the stateid_t structure > itself and then use it to look it up the appropriate nfs4_stid. > > The problem with that is when nfsd4_lookup_stateid() is called it > takes is a compound state (cstate) which has a client pointer and > during the lookup it's verified that the client looking up the stateid > is the same that generate the stateid which is not the case with copy > offload. > > I tried also saving a cl_clientid and using that to lookup the > nfs4_client that's needed for the stateid lookup but I'm not sure > that's possible. lookup_clientid() calls find_client_in_id_table() and > always passes "false" for sessions args. Original client has minor > version 2 and then the check if (clp->minor_versions != sessions) > fails. I don't understand what this logic is suppose to check. > > Should I be writing special version of the lookup_clientid that > ignores that check (when called in the path of the copy_notify > verification)? Or any other ideas of how to get passed this would be > appreciated it. Yeah, I think you may want to do the clientid lookup by hand under cl_lock, and take the cl_ref? Or turn things around and ensure that copy stateid's are destroyed before clients are. --b.