{"id":21413,"date":"2026-09-12T04:31:09","date_gmt":"2026-09-11T20:31:09","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89491"},"modified":"2026-09-12T04:31:09","modified_gmt":"2026-09-11T20:31:09","slug":"cve-2026-89491","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89491","title":{"rendered":"CVE-2026-89491 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nocfs2: cluster: don&#8217;t"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>ocfs2: cluster: don&#8217;t sleep while holding o2hb_live_lock in o2hb_region_pin()<\/p>\n<p>Patch series &#8220;ocfs2: cluster: o2hb_region_pin() fixes&#8221;, v2.<\/p>\n<p>This series fixes three related issues in o2hb_region_pin(), all are from<br \/>\nthe original implementation in commit: 58a3158a5d17 (&#8220;ocfs2\/cluster:<br \/>\nPin\/unpin o2hb regions&#8221;):<\/p>\n<p>1) It is called with o2hb_live_lock (a spinlock) held, but the<br \/>\n   underlying configfs_depend_item() sleeps (takes inode rwsem and<br \/>\n   pins the filesystem).  This triggers BUG under<br \/>\n   CONFIG_DEBUG_ATOMIC_SLEEP.<\/p>\n<p>2) When called from the configfs drop_item callback, it creates a<br \/>\n   lock order inversion: parent inode_lock -&gt; configfs root<br \/>\n   inode_lock, which can deadlock against subsystem unregistration<br \/>\n   paths taking root -&gt; parent.<\/p>\n<p>3) If pinning fails partway through o2hb_region_inc_user(), the<br \/>\n   o2hb_dependent_users counter is leaked and partially-pinned<br \/>\n   regions are never released, leaving heartbeat regions<br \/>\n   unprotected on subsequent mounts.<\/p>\n<p>Patch 1 reworks o2hb_region_pin() to drop o2hb_live_lock across each<br \/>\nsleeping configfs_depend_item() call, using a config_item reference to<br \/>\nkeep the region alive while unlocked.<\/p>\n<p>Patch 2 adds a from_callback parameter to select<br \/>\nconfigfs_depend_item_unlocked() when called from configfs context,<br \/>\navoiding the inode_lock nesting.<\/p>\n<p>Patch 3 fixes the error path in o2hb_region_inc_user() to unpin and<br \/>\ndecrement the counter on failure.<\/p>\n<p>This patch (of 3):<\/p>\n<p>o2hb_region_pin() is always called with the o2hb_live_lock spinlock held<br \/>\n(from o2hb_region_inc_user() and o2hb_heartbeat_group_drop_item()), but it<br \/>\ncalls o2nm_depend_item() -&gt; configfs_depend_item(), which sleeps: it pins<br \/>\nthe configfs filesystem and takes the configfs root inode rwsem.  Under<br \/>\nCONFIG_DEBUG_ATOMIC_SLEEP this triggers:<\/p>\n<p>  BUG: sleeping function called from invalid context at kernel\/locking\/rwsem.c<br \/>\n  in_atomic(): 1, &#8230; name: mount.ocfs2<br \/>\n    down_write<br \/>\n    configfs_depend_item<br \/>\n    o2hb_region_pin<br \/>\n    o2hb_region_inc_user<br \/>\n    o2hb_register_callback<br \/>\n    dlm_register_domain_handlers<br \/>\n    &#8230;<br \/>\n    ocfs2_dlm_init<br \/>\n    ocfs2_mount_volume<br \/>\n    ocfs2_fill_super<\/p>\n<p>Rework o2hb_region_pin() to pin one region at a time with the lock dropped<br \/>\nacross the sleeping call: under o2hb_live_lock find the next eligible<br \/>\nregion and take a config_item reference to keep it alive, drop the lock,<br \/>\ncall o2nm_depend_item(), then retake the lock and record the pin.  The<br \/>\nconfig_item_put() is done with the lock released as well, since<br \/>\no2hb_region_release() also acquires o2hb_live_lock and can sleep.  The<br \/>\nregion list may change while unlocked, so the scan restarts from the top<br \/>\nafter each pin.  Local heartbeat still pins only the matching region;<br \/>\nglobal heartbeat pins all eligible regions.<\/p>\n<p>The unpin path is unaffected: configfs_undepend_item() only takes a<br \/>\nspinlock and does not sleep.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>ocfs2: cluster: don&#8217;t sleep while holding o2hb_live_lock in o2hb_region_pin()<\/p>\n<p>Patch series &#8220;ocfs2: cluster: o2hb_region_pin() fixe<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-21413","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/21413","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21413"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21413"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21413"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}