From: Joseph Qi <joseph.qi@linux.alibaba.com>
To: Cen Zhang <zzzccc427@gmail.com>,
Andrew Morton <akpm@linux-foundation.org>
Cc: mark@fasheh.com, jlbec@evilplan.org, heming.zhao@suse.com,
ocfs2-devel@lists.linux.dev, linux-kernel@vger.kernel.org,
stable@vger.kernel.org, baijiaju1990@gmail.com,
jjzuming@gmail.com
Subject: Re: [PATCH v4] ocfs2/dlm: serialize migration MLE cleanup on failure
Date: Fri, 30 Oct 2026 11:27:06 +0800 [thread overview]
Message-ID: <f80554e4-fde7-4811-9c2e-ae9407793bf7@linux.alibaba.com> (raw)
In-Reply-To: <pm-ocfs2-objects-candidate-0038-v9-659f247ea980d5f3fbeb@gmail.com>
On 10/27/26 6:14 PM, Cen Zhang wrote:
> A migration MLE has a base reference for the mastering answer and an
> in-use reference held by dlm_migrate_lockres(). The finishing assertion
> consumes the base reference, but migration failure drops it again
> without checking whether the assertion already consumed it.
>
> The target queues its migration worker before it acknowledges the
> ALL_DONE packet, so its finishing assertion can be handled while the
> sender still waits for the status. If the connection fails before the
> status arrives, dlm_send_one_lockres() returns an error for a migration
> that the target has already completed:
>
> Old-master sender Finishing assertion
> ----------------- -------------------
> publish MLE; take in-use reference
> send ALL_DONE; wait for status
> take lookup reference
> unlink MLE
> put lookup and base references
> send returns a connection error
> put base reference again; free MLE
> put in-use reference; access freed MLE
>
> dlm_assert_master_handler() holds dlm->spinlock from the MLE lookup to
> the final puts, and it takes dlm->master_lock around the unlink and the
> puts. Decide under the same locks: if the MLE is already unhashed, the
> assertion consumed the base reference, so drop only the sender's in-use
> reference. Otherwise unlink it before consuming the base reference so a
> later assertion no longer finds it.
>
> An assertion that got there first has also made the target the owner
> and cleared DLM_LOCK_RES_MIGRATING. Treating the attempt as failed at
> that point would leave the lockres owned by the target while this node
> still holds the other nodes' locks and refmap bits, so it could neither
> be purged nor migrated again. Finish our side as a completed migration
> does instead: drop those locks under res->spinlock if the target still
> owns the lockres, and recalculate its usage.
>
> Use the same cleanup for the pre-send failure, the send failure and the
> target-death failure paths. The sender's in-use reference keeps the MLE
> alive until its final put outside the nested locks. Successful
> migration retains its existing in-use-only put.
>
> A target that has died cannot assert after the sender has seen its
> death. The o2net node-down callback runs before the DLM one; it
> disconnects the node and flushes the workqueue that runs the message
> handlers, so an assertion already received has been handled by the time
> the DLM removes the node from the domain map. A node that leaves the
> domain cleanly sends its exit message only after its assertions have
> been answered.
>
> Two windows of the hand-over itself are left as they are: the handler
> switches the owner and the sender drops the other nodes' locks moments
> later, and an assertion from a live target that arrives after the
> sender has given up still meets the owner check in the handler. Waiting
> for the target before giving up would only stretch the first window
> into the time in which recovery of the target can observe it.
>
> KASAN report, only the relevant frames are kept:
>
> BUG: KASAN: slab-use-after-free in dlm_put_mle_inuse+0xce/0xe0
> Read of size 8 at addr ffff8881190e3c20 by task umount/593
>
> Call Trace:
> <TASK>
> dlm_put_mle_inuse+0xce/0xe0
> dlm_migrate_lockres+0x16af/0x20d0
> dlm_empty_lockres+0x60a/0xbd0
> dlm_unregister_domain+0x53b/0x11d0
> o2cb_cluster_disconnect+0xa5/0x110
> ocfs2_cluster_disconnect+0x73/0xc0
> ocfs2_dlm_shutdown+0x311/0x440
> ocfs2_dismount_volume+0x696/0x940
> generic_shutdown_super+0x15f/0x490
> kill_block_super+0x40/0xa0
> deactivate_locked_super+0xae/0x120
> deactivate_super+0xa2/0xc0
> cleanup_mnt+0x217/0x450
> task_work_run+0x144/0x230
> </TASK>
>
> Allocated by task 593:
> kmem_cache_alloc_noprof+0x20b/0x5c0
> dlm_migrate_lockres+0x20e/0x20d0
> dlm_empty_lockres+0x60a/0xbd0
> dlm_unregister_domain+0x53b/0x11d0
> o2cb_cluster_disconnect+0xa5/0x110
> ocfs2_cluster_disconnect+0x73/0xc0
> ocfs2_dlm_shutdown+0x311/0x440
> ocfs2_dismount_volume+0x696/0x940
>
> Freed by task 593:
> kmem_cache_free+0x242/0x580
> __dlm_put_mle+0x4b2/0x660
> dlm_migrate_lockres+0x1690/0x20d0
> dlm_empty_lockres+0x60a/0xbd0
> dlm_unregister_domain+0x53b/0x11d0
> o2cb_cluster_disconnect+0xa5/0x110
> ocfs2_cluster_disconnect+0x73/0xc0
> ocfs2_dlm_shutdown+0x311/0x440
>
> The buggy address belongs to the object at ffff8881190e3c00
> which belongs to the cache o2dlm_mle of size 480
> The buggy address is located 32 bytes inside of
> freed 480-byte region [ffff8881190e3c00, ffff8881190e3de0)
>
> Fixes: 6714d8e86bf4 ("[PATCH] OCFS2: The Second Oracle Cluster Filesystem")
> Cc: stable@vger.kernel.org
> Assisted-by: LLM
> Signed-off-by: Cen Zhang <zzzccc427@gmail.com>
Looks fine.
Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
prev parent reply other threads:[~2026-10-30 3:27 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-27 10:14 Cen Zhang
2026-10-30 3:27 ` Joseph Qi [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f80554e4-fde7-4811-9c2e-ae9407793bf7@linux.alibaba.com \
--to=joseph.qi@linux.alibaba.com \
--cc=akpm@linux-foundation.org \
--cc=baijiaju1990@gmail.com \
--cc=heming.zhao@suse.com \
--cc=jjzuming@gmail.com \
--cc=jlbec@evilplan.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark@fasheh.com \
--cc=ocfs2-devel@lists.linux.dev \
--cc=stable@vger.kernel.org \
--cc=zzzccc427@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®