Re: [PATCH 1/2] block: only use the cached zone report if BLK_ZONE_REP_CACHED is set

From: shashank Jain

Date: Sun Oct 11 2026 - 12:01:42 EST


On Sun, Oct 11, 2026, Damien Le Moal wrote:
> Can you reverse this if to be "if (rep.flags & BLK_ZONE_REP_CACHED) {" ...
> Also, the condition should probably be:
> if ((rep.flags & BLK_ZONE_REP_CACHED) &&
> blkdev_has_cached_report_zones(bdev))

Reworked exactly as suggested and reposted as v2:
https://lore.kernel.org/all/20261011154018.48913-1-jain.sm@xxxxxxxxx/

blkdev_has_cached_report_zones() is now used from the ioctl, so I moved
it (with its comment) above blkdev_report_zones_ioctl(). Patch 2 is
unchanged and carries your Reviewed-by. Retested on zoned null_blk.

Thanks,
Shashank

On Sun, Oct 11, 2026 at 8:16 PM Damien Le Moal <dlemoal@xxxxxxxxxx> wrote:
>
> On 2026/10/11 7:19, Shashank Mohan Jain wrote:
> > BLKREPORTZONEV2 takes the flags field of struct blk_zone_report as an
> > input. With BLK_ZONE_REP_CACHED the report is built from the zone
> > information cached by the block layer. Without it, BLKREPORTZONEV2 is
> > documented to behave like BLKREPORTZONE and to get the report from the
> > device: this is what the changelog of the commit that added the ioctl
> > and the comments in include/uapi/linux/blkzoned.h say.
> >
> > blkdev_report_zones_ioctl() only uses the flag to validate the input
> > and calls blkdev_report_zones_cached() for every BLKREPORTZONEV2
> > request. A caller that passes flags == 0 gets the cached report, in
> > which implicitly open, explicitly open and closed zones all have the
> > condition BLK_ZONE_COND_ACTIVE, and an explicitly opened empty zone is
> > reported as empty.
> >
> > Example with a zoned null_blk device (10 MiB, 4 MiB zones) after
> > BLKOPENZONE on zone 0, and a write of 8 sectors to zone 1 followed by
> > BLKCLOSEZONE:
> >
> > BLKREPORTZONE: zone 0 cond 0x3 (EXP_OPEN)
> > zone 1 cond 0x4 (CLOSED)
> > BLKREPORTZONEV2, flags 0: zone 0 cond 0x1 (EMPTY)
> > zone 1 cond 0xff (ACTIVE)
> >
> > The uapi header marks BLKREPORTZONE as deprecated in favour of
> > BLKREPORTZONEV2. A program that follows this and does not ask for
> > cached information can no longer tell open zones from closed ones, and
> > is handed BLK_ZONE_COND_ACTIVE, which is only defined for the cached
> > report.
> >
> > Call blkdev_report_zones_cached() only if BLK_ZONE_REP_CACHED is set,
> > and blkdev_report_zones() otherwise.
> >
> > Tested with zoned null_blk devices in qemu: a program that compares
> > the reports of BLKREPORTZONE and BLKREPORTZONEV2 with flags 0 after
> > the sequence above finds the differences before this change and none
> > with it. The report with BLK_ZONE_REP_CACHED is unchanged.
> >
> > Fixes: b30ffcdc0c15 ("block: introduce BLKREPORTZONESV2 ioctl")
> > Cc: stable@xxxxxxxxxxxxxxx
> > Assisted-by: LLM
> > Signed-off-by: Shashank Mohan Jain <jain.sm@xxxxxxxxx>
> > ---
> > Prepared with Claude Code (Anthropic), model Claude Opus 5.5
> > (claude-opus-5-5).
> >
> > block/blk-zoned.c | 7 +++++++
> > 1 file changed, 7 insertions(+)
> >
> > diff --git a/block/blk-zoned.c b/block/blk-zoned.c
> > index 475aa16bc4..9555eae91a 100644
> > --- a/block/blk-zoned.c
> > +++ b/block/blk-zoned.c
> > @@ -400,6 +400,13 @@ int blkdev_report_zones_ioctl(struct block_device *bdev, unsigned int cmd,
> > case BLKREPORTZONEV2:
> > if (rep.flags & ~BLK_ZONE_REPV2_INPUT_FLAGS)
> > return -EINVAL;
> > + if (!(rep.flags & BLK_ZONE_REP_CACHED)) {
> > + ret = blkdev_report_zones(bdev, rep.sector,
> > + rep.nr_zones,
> > + blkdev_copy_zone_to_user,
> > + &args);
> > + break;
> > + }
> > ret = blkdev_report_zones_cached(bdev, rep.sector, rep.nr_zones,
> > blkdev_copy_zone_to_user, &args);
>
> Can you reverse this if to be "if (rep.flags & BLK_ZONE_REP_CACHED) {" and to
> call blkdev_report_zones_cached if the condition is true? That would be a lot
> more logical.
>
> Also, the condition should probably be:
>
> if ((rep.flags & BLK_ZONE_REP_CACHED) &&
> blkdev_has_cached_report_zones(bdev))
>
> to be more efficient and avoid a call to blkdev_report_zones_cached() which will
> turn into a regular device report zones.
>
>
> --
> Damien Le Moal
> Western Digital Research