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

Published Sep 11, 2025
·
Updated

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 maxreadsize and maxwritesize 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 blkqueueenter(), 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 maxwritesize, 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 getmaxrequestsize() to always return the size of the BIO to avoid it being split with dmaccpetpartialbio() in cryptmap(). getmaxrequestsize() is renamed to getmaxrequestsectors() to clarify the unit of the value returned and its interface is changed to take a struct dmtarget pointer and a pointer to the struct bio being processed. In addition to this change, to ensure that cryptallocbuffer() works correctly, set the dm-crypt device maxhwsectors limit to be at most BIOMAXVECS << PAGESECTORSSHIFT (1 MB with a 4KB page architecture). This forces DM core to split write BIOs before passing them to cryptmap(), 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.

Affected Software

4 affected componentsFixes available
Linux Linux kernel
Linux Linux kernel>=6.10<6.12.44
Linux Linux kernel>=6.13<6.16.4
debian/linux
6.1.176-16.1.190-16.12.107-16.12.113-17.2.12-17.2.13-1

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade debian/linux to a version that resolves this vulnerability.

    Fixed in 6.1.176-1Fixed in 6.1.190-1Fixed in 6.12.107-1Fixed in 6.12.113-1Fixed in 7.2.12-1Fixed in 7.2.13-1
  2. Configuration

    Modify get_max_request_size() (renamed get_max_request_sectors()) to return the full BIO size so dm-crypt does not partially accept or split write BIOs, have DM core split write BIOs before crypt_map(), and set the dm-crypt device max_hw_sectors limit to at most BIO_MAX_VECS << PAGE_SECTORS_SHIFT.

    Linux kernel dm-crypt zoned targets dm-crypt BIO acceptance and dm-crypt device max_hw_sectors = get_max_request_size() always returns the size of the BIO; max_hw_sectors is at most BIO_MAX_VECS << PAGE_SECTORS_SHIFT (1 MB with a 4KB page architecture)

Event History

Sep 11, 2025
CVE Published
via MITRE·04:56 PM
Data Sourced
via MITRE·04:56 PM
DescriptionSeverity
Data Sourced
via NVD·05:15 PM
RemedyDescriptionSeverityWeaknessAffected Software

Parent advisories

This vulnerability appears in the following advisories.

Frequently Asked Questions

1

What is the severity of CVE-2025-39791?

CVE-2025-39791 has been classified with a moderate severity rating due to its potential impact on data integrity in dm-crypt operations.

2

How do I fix CVE-2025-39791?

To remediate CVE-2025-39791, ensure that your Linux kernel is updated to the latest version that includes the patch addressing this vulnerability.

3

What software is affected by CVE-2025-39791?

CVE-2025-39791 affects the Linux kernel specifically in the dm-crypt functionality when handling write BIOs with zoned targets.

4

What are the potential risks of CVE-2025-39791?

The risks associated with CVE-2025-39791 include potential data corruption during write operations in systems utilizing dm-crypt.

5

Is there a workaround for CVE-2025-39791?

Currently, the recommended approach is to apply the available kernel update rather than relying on a workaround for CVE-2025-39791.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203