CVE-2025-39791CWE-667

CVE-2025-39791

High · published September 11, 2025

CVSS v3.1
7.8
EPSS
0%
Percentile
2.5
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

dm: dm-crypt: Do not partially accept write BIOs with zoned targets

Read and write operations issued to a dm-crypt target may be split

according to the dm-crypt internal limits defined by the max_read_size

and max_write_size module parameters (default is 128 KB). The intent is

to improve processing time of large BIOs by splitting them into smaller

operations that can be parallelized on different CPUs.

For zoned dm-crypt targets, this BIO splitting is still done but without

the parallel execution to ensure that the issuing order of write

operations to the underlying devices remains sequential. However, the

splitting itself causes other problems:

1) Since dm-crypt relies on the block layer zone write plugging to

handle zone append emulation using regular write operations, the

reminder of a split write BIO will always be plugged into the target

zone write plugged. Once the on-going write BIO finishes, this

reminder BIO is unplugged and issued from the zone write plug work.

If this reminder BIO itself needs to be split, the reminder will be

re-issued and plugged again, but that causes a call to a

blk_queue_enter(), which may block if a queue freeze operation was

initiated. This results in a deadlock as DM submission still holds

BIOs that the queue freeze side is waiting for.

2) dm-crypt relies on the emulation done by the block layer using

regular write operations for processing zone append operations. This

still requires to properly return the written sector as the BIO

sector of the original BIO. However, this can be done correctly only

and only if there is a single clone BIO used for processing the

original zone append operation issued by the user. If the size of a

zone append operation is larger than dm-crypt max_write_size, then

the orginal BIO will be split and processed as a chain of regular

write operations. Such chaining result in an incorrect written sector

being returned to the zone append issuer using the original BIO

sector. This in turn results in file system data corruptions using

xfs or btrfs.

Fix this by modifying get_max_request_size() to always return the size

of the BIO to avoid it being split with dm_accpet_partial_bio() in

crypt_map(). get_max_request_size() is renamed to

get_max_request_sectors() to clarify the unit of the value returned

and its interface is changed to take a struct dm_target pointer and a

pointer to the struct bio being processed. In addition to this change,

to ensure that crypt_alloc_buffer() works correctly, set the dm-crypt

device max_hw_sectors limit to be at most

BIO_MAX_VECS << PAGE_SECTORS_SHIFT (1 MB with a 4KB page architecture).

This forces DM core to split write BIOs before passing them to

crypt_map(), and thus guaranteeing that dm-crypt can always accept an

entire write BIO without needing to split it.

This change does not have any effect on the read path of dm-crypt. Read

operations can still be split and the BIO fragments processed in

parallel. There is also no impact on the performance of the write path

given that all zone write BIOs were already processed inline instead of

in parallel.

This change also does not affect in any way regular dm-crypt block

devices.

The record
Technical detail
CVSS v3.1
7.8 · HIGH
Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00131 · 2.5th percentile
Weakness
CWE-667 · Improper Locking
Published
2025-09-11T21:15Z
Affected products (2)
ProductVersionsFixed in
linux/linux_kernel≥ 6.10, < 6.12.446.12.44
linux/linux_kernel≥ 6.13, < 6.16.46.16.4
References (3)
EPSS history
Timeline
  • 11 SEP 16:56Z
    dm: dm-crypt: Do not partially accept write BIOs with zoned targets
    cvelistv5