{"id":6834,"date":"2026-09-04T18:49:19","date_gmt":"2026-09-04T10:49:19","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-72203"},"modified":"2026-09-04T18:49:19","modified_gmt":"2026-09-04T10:49:19","slug":"cve-2026-72203","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-72203","title":{"rendered":"CVE-2026-72203 [HIGH] &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nntfs: skip extent mft"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>ntfs: skip extent mft records in writeback to prevent deadlock<\/p>\n<p>This patch fixes the ABBA deadlock between extent_lock and extent<br \/>\nmrec_lock triggered by xfstests generic\/113, that occurs since the commit<br \/>\n6994acf33bae (&#8220;ntfs: use base mft_no when looking up base inode for<br \/>\n\t\textent record&#8221;).<\/p>\n<p>Path A (inode writeback):<br \/>\n  VFS writeback<br \/>\n    -&gt; ntfs_write_inode()<br \/>\n      -&gt; __ntfs_write_inode()<br \/>\n        -&gt; mutex_lock(&amp;ni-&gt;extent_lock)<br \/>\n        -&gt; mutex_lock(&amp;tni-&gt;mrec_lock)<\/p>\n<p>Path B (MFT folio writeback):<br \/>\n  VFS writeback of $MFT dirty folios<br \/>\n    -&gt; ntfs_mft_writepages()<br \/>\n      -&gt; ntfs_write_mft_block()<br \/>\n        -&gt; ntfs_may_write_mft_record()<br \/>\n          -&gt; holds one extent mrec_lock from a previous iteration<br \/>\n          -&gt; tries to acquire another base inode extent_lock<\/p>\n<p>By removing all extent_lock and extent mrec_lock acquisition from the MFT<br \/>\nfolio writeback path, the ABBA lock ordering is eliminated:<\/p>\n<p>Path A: __ntfs_write_inode(): extent_lock -&gt; mrec_lock<br \/>\nPath B (removed): ntfs_write_mft_block(): mrec_lock -&gt; extent_lock<\/p>\n<p>Path B is always redundant for extent records because:<\/p>\n<p>1. mark_mft_record_dirty(ext_ni) does NOT dirty the MFT folio.<br \/>\n   It only sets NInoDirty(ext_ni) and marks the base VFS inode dirty<br \/>\n   via __mark_inode_dirty(I_DIRTY_DATASYNC), which triggers Path A.<br \/>\n   Therefore, normal extent modifications never create a situation where<br \/>\n   the MFT folio is dirty and Path B is not scheduled.<\/p>\n<p>2. The MFT folio only gets dirtied via ntfs_mft_mark_dirty() inside<br \/>\n   ntfs_mft_record_alloc(). But all identified callers in attrib.c<br \/>\n   (ntfs_attr_add, ntfs_attr_record_move_away,<br \/>\n   ntfs_attr_make_non_resident, ntfs_attr_record_resize) follow through<br \/>\n   with mark_mft_record_dirty(), which triggers Path A to write the<br \/>\n   complete record.<\/p>\n<p>3. ntfs_evict_big_inode() calls ntfs_commit_inode() before freeing extent<br \/>\n   inodes, ensuring all dirty extents are flushed via Path A before the<br \/>\n   base inode leaves the icache.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>ntfs: skip extent mft records in writeback to prevent deadlock<\/p>\n<p>This patch fixes the ABBA deadlock between extent_lock and extent<br \/>\nm<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-6834","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/6834","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=6834"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6834"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6834"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}