Re: [PATCH] smb: client: hold the inode across cifs_oplock_break()

From: Paulo Alcantara

Date: Tue Nov 10 2026 - 10:37:13 EST


Joseph Qi <joseph.qi@xxxxxxxxxxxxxxxxx> writes:

> cifs_oplock_break() drops the handle reference in the middle of the
> handler and keeps using cinode afterwards, to send the break
> acknowledgment and again in cifs_done_oplock_break(). The reference
> cifs_queue_oplock_break() takes is the only pin: the handle holds the
> dentry and the dentry is what keeps the inode alive.
>
> When that put is the last reference, the dput() in
> cifsFileInfo_put_final() kills an unhashed dentry, drops the last
> i_count and evicts the inode, so the rest of the handler runs on an
> object whose free is only RCU-deferred. An unhashed dentry that a
> handle still references is an ordinary state: unlinking an open file
> leaves the dentry that way, and so does the dcache teardown at unmount.
>
> Take a reference on the inode for the lifetime of the handler and drop
> it once the break has been reported. This also covers the
> cifs_get_tlink() failure path, where the put is followed directly by
> the out label.
> ...

Applied.