Message ID | 20210126121529.317189-1-its@irrelevant.dk |
---|---|
State | New |
Headers | show |
Series | [v2] hw/block/nvme: add missing mor/mar constraint checks | expand |
On Tue, 2021-01-26 at 13:15 +0100, Klaus Jensen wrote: > From: Klaus Jensen <k.jensen@samsung.com> > > Firstly, if zoned.max_active is non-zero, zoned.max_open must be less > than or equal to zoned.max_active. > > Secondly, if only zones.max_active is set, we have to explicitly set > zones.max_open or we end up with an invalid MAR/MOR configuration. This > is an artifact of the parameters not being zeroes-based like in the > spec. > > Cc: Dmitry Fomichev <dmitry.fomichev@wdc.com> > Reported-by: Gollu Appalanaidu <anaidu.gollu@samsung.com> > Signed-off-by: Klaus Jensen <k.jensen@samsung.com> Reviewed-by: Dmitry Fomichev <dmitry.fomichev@wdc.com> > --- > > v2: > > * Jumped the gun on removing the check on zoned.max_open. It should > still be done since the device might only have a constraint on open > zones, not active. > * Instead, added an explicit set of zoned.max_open if only > zoned.max_active is specifed. > > hw/block/nvme-ns.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/hw/block/nvme-ns.c b/hw/block/nvme-ns.c > index 62b25cf69bfa..df514287b58f 100644 > --- a/hw/block/nvme-ns.c > +++ b/hw/block/nvme-ns.c > @@ -153,6 +153,18 @@ static int nvme_ns_zoned_check_calc_geometry(NvmeNamespace *ns, Error **errp) > return -1; > } > > > > > + if (ns->params.max_active_zones) { > + if (ns->params.max_open_zones > ns->params.max_active_zones) { > + error_setg(errp, "max_open_zones (%u) exceeds max_active_zones (%u)", > + ns->params.max_open_zones, ns->params.max_active_zones); > + return -1; > + } > + > + if (!ns->params.max_open_zones) { > + ns->params.max_open_zones = ns->params.max_active_zones; > + } > + } > + > if (ns->params.zd_extension_size) { > if (ns->params.zd_extension_size & 0x3f) { > error_setg(errp,
On Feb 8 00:13, Dmitry Fomichev wrote: > On Tue, 2021-01-26 at 13:15 +0100, Klaus Jensen wrote: > > From: Klaus Jensen <k.jensen@samsung.com> > > > > Firstly, if zoned.max_active is non-zero, zoned.max_open must be less > > than or equal to zoned.max_active. > > > > Secondly, if only zones.max_active is set, we have to explicitly set > > zones.max_open or we end up with an invalid MAR/MOR configuration. This > > is an artifact of the parameters not being zeroes-based like in the > > spec. > > > > Cc: Dmitry Fomichev <dmitry.fomichev@wdc.com> > > Reported-by: Gollu Appalanaidu <anaidu.gollu@samsung.com> > > Signed-off-by: Klaus Jensen <k.jensen@samsung.com> > > Reviewed-by: Dmitry Fomichev <dmitry.fomichev@wdc.com> > Thanks, applied!
diff --git a/hw/block/nvme-ns.c b/hw/block/nvme-ns.c index 62b25cf69bfa..df514287b58f 100644 --- a/hw/block/nvme-ns.c +++ b/hw/block/nvme-ns.c @@ -153,6 +153,18 @@ static int nvme_ns_zoned_check_calc_geometry(NvmeNamespace *ns, Error **errp) return -1; } + if (ns->params.max_active_zones) { + if (ns->params.max_open_zones > ns->params.max_active_zones) { + error_setg(errp, "max_open_zones (%u) exceeds max_active_zones (%u)", + ns->params.max_open_zones, ns->params.max_active_zones); + return -1; + } + + if (!ns->params.max_open_zones) { + ns->params.max_open_zones = ns->params.max_active_zones; + } + } + if (ns->params.zd_extension_size) { if (ns->params.zd_extension_size & 0x3f) { error_setg(errp,