Hi, This is better I think. Muhammad Usama Anjum <musamaanjum@xxxxxxxxx> writes: > @@ -894,6 +891,10 @@ int open_cached_dir(unsigned int xid, struct cifs_tcon *tcon, > > /* BB TBD check to see if oplock level check can be removed below */ > if (o_rsp->OplockLevel == SMB2_OPLOCK_LEVEL_LEASE) { > + /* > + * caller expects this func to set the fid in crfid to valid > + * cached root, so increment the refcount. > + */ This comment is misleading. crfid variable doesn't exist anymore, and the kref_get() here is because of this commit: commit 2f94a3125b87 Author: Ronnie Sahlberg <lsahlber@xxxxxxxxxx> Date: Thu Mar 28 11:20:02 2019 +1000 cifs: fix kref underflow in close_shroot() [...] --> This extra get() is only used to hold the structure until we get a lease --> break from the server at which point we will kref_put() it during lease --> processing. [...] When we queue a lease break, we usually get() the cifsFileInfo, but if that cifsFileInfo is backed by a cached_fid, the cached_fid isn't bumped. That commit was probably a work around for that. @Ronnie : struct cached_fid is starting to look very much like struct cifsFileInfo. I wonder why we couldn't use it, along with find_writable_file()/find_readable_file() to handle the caching. Alternatively, make cifsFileInfo use cached_fid (perhaps renaming it in the process, I don't know) Because I suspect a lot more issues will come up regarding cached_fid refcount and cifsFileInfo refcount going out of sync otherwise. Cheers, -- Aurélien Aptel / SUSE Labs Samba Team GPG: 1839 CB5F 9F5B FB9B AA97 8C99 03C8 A49B 521B D5D3 SUSE Software Solutions Germany GmbH, Maxfeldstr. 5, 90409 Nürnberg, DE GF: Felix Imendörffer, Mary Higgins, Sri Rasiah HRB 247165 (AG München)