> -----Original Message----- > From: Klaus Jensen <i...@irrelevant.dk> > Sent: Tuesday, September 15, 2020 3:10 PM > To: Dmitry Fomichev <dmitry.fomic...@wdc.com> > Cc: Keith Busch <kbu...@kernel.org>; Klaus Jensen > <k.jen...@samsung.com>; Kevin Wolf <kw...@redhat.com>; Philippe > Mathieu-Daudé <phi...@redhat.com>; Maxim Levitsky > <mlevi...@redhat.com>; Fam Zheng <f...@euphon.net>; Niklas Cassel > <niklas.cas...@wdc.com>; Damien Le Moal <damien.lem...@wdc.com>; > qemu-bl...@nongnu.org; qemu-devel@nongnu.org; Alistair Francis > <alistair.fran...@wdc.com>; Matias Bjorling <matias.bjorl...@wdc.com> > Subject: Re: [PATCH v3 14/15] hw/block/nvme: Use zone metadata file for > persistence > > On Sep 14 07:14, Dmitry Fomichev wrote: > > A ZNS drive that is emulated by this module is currently initialized > > with all zones Empty upon startup. However, actual ZNS SSDs save the > > state and condition of all zones in their internal NVRAM in the event > > of power loss. When such a drive is powered up again, it closes or > > finishes all zones that were open at the moment of shutdown. Besides > > that, the write pointer position as well as the state and condition > > of all zones is preserved across power-downs. > > > > This commit adds the capability to have a persistent zone metadata > > to the device. The new optional module property, "zone_file", > > is introduced. If added to the command line, this property specifies > > the name of the file that stores the zone metadata. If "zone_file" is > > omitted, the device will be initialized with all zones empty, the same > > as before. > > > > If zone metadata is configured to be persistent, then zone descriptor > > extensions also persist across controller shutdowns. > > > > Signed-off-by: Dmitry Fomichev <dmitry.fomic...@wdc.com> > > This doesn't build on mingw.
Thanks for letting me know. I'll try to look into this. Do you cross-compile with mingw64? > > > --- > > hw/block/nvme.c | 370 > +++++++++++++++++++++++++++++++++++++++++++++--- > > hw/block/nvme.h | 37 +++++ > > 2 files changed, 386 insertions(+), 21 deletions(-) > > > > diff --git a/hw/block/nvme.c b/hw/block/nvme.c > > index b49ae83dd5..41f4c0dacd 100644 > > --- a/hw/block/nvme.c > > +++ b/hw/block/nvme.c > > @@ -3429,7 +3557,188 @@ static int nvme_init_zone_meta(NvmeCtrl *n, > NvmeNamespace *ns, > > return 0; > > } > > > > -static void nvme_zoned_init_ctrl(NvmeCtrl *n, Error **errp) > > +static int nvme_open_zone_file(NvmeCtrl *n, bool *init_meta) > > +{ > > + struct stat statbuf; > > + size_t fsize; > > + int ret; > > + > > + ret = stat(n->params.zone_file, &statbuf); > > + if (ret && errno == ENOENT) { > > + *init_meta = true; > > + } else if (!S_ISREG(statbuf.st_mode)) { > > + fprintf(stderr, "%s is not a regular file\n", strerror(errno)); > > + return -1; > > + } > > + > > + n->zone_file_fd = open(n->params.zone_file, > > + O_RDWR | O_LARGEFILE | O_BINARY | O_CREAT, 644); > > mode is wrong - I think you meant for it to be octal. Nice catch, needs to be 0644...