{"id":29058,"date":"2026-09-25T20:31:46","date_gmt":"2026-09-25T12:31:46","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-97902"},"modified":"2026-09-25T20:31:46","modified_gmt":"2026-09-25T12:31:46","slug":"cve-2026-97902","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-97902","title":{"rendered":"CVE-2026-97902 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nfs: don&#8217;t return -EIN"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>fs: don&#8217;t return -EINVAL for successful nested thaw<\/p>\n<p>Commit 7366f8b6fc6a (&#8220;fs: handle freezing from multiple devices&#8221;)<br \/>\nreplaced the freeze_holders bitmask with per-holder counters to allow<br \/>\nnested freezes. In the bitmask version, a thaw that released a shared<br \/>\nhold while another holder remained returned 0. Since the rework,<br \/>\nthaw_super_locked() drops the freeze reference via freeze_dec() but<br \/>\nthen returns -EINVAL when other freezers remain, misinforming the<br \/>\ncaller: the thaw did succeed, the superblock just stays frozen for the<br \/>\nremaining holders.<\/p>\n<p>This breaks bdev-initiated freezing. When a filesystem is frozen with<br \/>\nFIFREEZE and additionally frozen via bdev_freeze() &#8212; which nests by<br \/>\ndesign, see fs_bdev_freeze() &#8212; the subsequent bdev_thaw() receives<br \/>\n-EINVAL from the holder op although its freeze reference was dropped,<br \/>\nand therefore keeps bd_fsfreeze_count elevated. Then device-mapper&#8217;s<br \/>\nunlock_fs() ignores bdev_thaw()&#8217;s return value, so nothing rebalances<br \/>\nthe count. After the user&#8217;s FITHAW and umount, the block device can<br \/>\nnever be mounted again:<\/p>\n<p>    dm-1: Can&#8217;t mount, blockdev is frozen<\/p>\n<p>There is no way for userspace to drop the leaked count; only<br \/>\ndestroying the block device (or a reboot) recovers the device.<\/p>\n<p>Reproducer (any kernel since v6.8):<\/p>\n<p>    dmsetup create dut &#8211;table &#8220;0 $(blockdev &#8211;getsz &#8220;$DEV&#8221;) linear $DEV 0&#8243;<br \/>\n    mkfs.ext4 \/dev\/mapper\/dut<br \/>\n    mount \/dev\/mapper\/dut \/mnt<br \/>\n    fsfreeze &#8211;freeze \/mnt      # freeze_ucount == 1<br \/>\n    dmsetup suspend dut         # bd_fsfreeze_count == 1, ucount == 2<br \/>\n    dmsetup resume dut          # ucount 2 -&gt; 1, but thaw_super()<br \/>\n                                # returns -EINVAL, so bdev_thaw()<br \/>\n                                # keeps bd_fsfreeze_count at 1<br \/>\n    fsfreeze &#8211;unfreeze \/mnt    # filesystem thaws fine<br \/>\n    umount \/mnt<br \/>\n    mount \/dev\/mapper\/dut \/mnt  # EBUSY, forever<\/p>\n<p>The same happens with fsfreeze held across an LVM snapshot of the<br \/>\norigin volume.<\/p>\n<p>fs_bdev_thaw()&#8217;s documentation already describes the intended<br \/>\nsemantics: &#8220;If this function returns zero it doesn&#8217;t mean that the<br \/>\nfilesystem is unfrozen as it may have been frozen multiple times&#8221;.<br \/>\nRestore them by returning 0 when a nested thaw drops its hold while<br \/>\nother freezers remain. Thawing without holding a freeze still fails<br \/>\nwith -EINVAL as may_unfreeze() rejects that case before the reference<br \/>\ncount is touched.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>fs: don&#8217;t return -EINVAL for successful nested thaw<\/p>\n<p>Commit 7366f8b6fc6a (&#8220;fs: handle freezing from multiple devices&#8221;)<br \/>\nreplaced the<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-29058","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/29058","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=29058"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=29058"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=29058"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}