Re: [PATCH v2] ocfs2: Cache the mount context for dentry lock callbacks
From: Joseph Qi
Date: Tue Oct 20 2026 - 08:14:59 EST
On 10/19/26 9:49 PM, Cen Zhang wrote:
> ocfs2_drop_dentry_lock() drops the inode reference before releasing the
> DENTRY lock. This lets inode eviction release the local inode and open
> locks before a remote unlink can proceed past the DENTRY lock.
>
> A DLM callback can still arrive before the DENTRY lock has been dropped.
> ocfs2_get_dentry_osb() obtains the mount context through dl_inode->i_sb,
> which can access a freed inode when the downconvert thread drops the
> last inode reference in its post-unlock callback:
>
> Downconvert thread DLM callback thread
> ------------------ -------------------
> ocfs2_process_blocked_lock()
> ocfs2_dentry_post_unlock()
> ocfs2_dentry_lock_put()
> ocfs2_drop_dentry_lock()
> iput(dl->dl_inode)
> [inode reclaimed after RCU]
> ocfs2_blocking_ast()
> ocfs2_get_dentry_osb()
> dl->dl_inode->i_sb
> ocfs2_simple_drop_lockres()
>
> Store the mount context in the DENTRY lock resource's l_priv field and
> use the default mount-context lookup. Recover the containing dentry
> lock with container_of(), as already done for refcount locks, and remove
> ocfs2_get_dentry_osb(). ocfs2_dismount_volume() shuts down the DLM before
> freeing the mount context, so callbacks can use it without accessing the
> inode. Preserve the existing iput-before-unlock order to avoid delaying
> local inode and open lock release until after the DENTRY lock is released.
>
ocfs2_dentry_convert_worker() still reaches the inode via
OCFS2_I(dl->dl_inode) and writes oi->ip_flags |= OCFS2_INODE_MAYBE_ORPHANED
before its OCFS2_LOCK_FREEING/dl_count guard, and ocfs2_unblock_lock()
invokes the worker without testing OCFS2_LOCK_FREEING.
Thanks,
Joseph