Applying with these fixes on my side:
- the example: a whole 1M cluster [0, 2048) built from bios [0, 1024)
  and [2048, 3072), instead of [0, 512) and [1024, 1536)
- "range in the file" -> "range of the device", "always" dropped
- added why the limit is USHRT_MAX and what the user sees, split into
  paragraphs

On Mon, 09 Nov 2026 18:36:19 +0300, Andrey Zhadchenko wrote:
> Imagine we have a request with starting sector 0 and length 1024,
> so read or write means [0, 1024) range in the file. For discard this
> request can have 2 bios [0, 512) and [1024, 1536), but we always
> discarded [0, 1024).

ploop_handle_discard_pio() ignores a discard that is not a whole
cluster, so with the default 1M cluster this request discards nothing.
Data is lost only when a gapped request adds up to a whole cluster. The
message now reads:

    Discard is a special type of request that can have non-contiguous
    bios: dm-ploop keeps the dm stacking default max_discard_segments =
    USHRT_MAX, so the block layer merges discard bios with gaps.

    Imagine we have 1M clusters and a request with starting sector 0 and
    length 2048 sectors, so read or write means the [0, 2048) range of
    the device. For discard this request can have 2 bios [0, 1024) and
    [2048, 3072), but we discarded the whole cluster [0, 2048).

    Data in sectors 1024-2047 reads back as zeroes.

    Set max_discard_segments to 1 to avoid such merges.

-- 
Konstantin Khorenko,
Virtuozzo Linux Kernel Team

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to