mirror of https://github.com/xemu-project/xemu.git
hw/nvme: fix lbaf formats initialization
Currently LBAF formats are being intialized based on metadata size if and only if nvme-ns "ms" parameter is non-zero value. Since FormatNVM command being supported device parameter "ms" may not be the criteria to initialize the supported LBAFs. And make LBAF array as read-only. Signed-off-by: Gollu Appalanaidu <anaidu.gollu@samsung.com> Reviewed-by: Klaus Jensen <k.jensen@samsung.com> Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
This commit is contained in:
parent
18de1526ba
commit
421a309271
53
hw/nvme/ns.c
53
hw/nvme/ns.c
|
@ -81,39 +81,32 @@ static int nvme_ns_init(NvmeNamespace *ns, Error **errp)
|
||||||
ds = 31 - clz32(ns->blkconf.logical_block_size);
|
ds = 31 - clz32(ns->blkconf.logical_block_size);
|
||||||
ms = ns->params.ms;
|
ms = ns->params.ms;
|
||||||
|
|
||||||
if (ns->params.ms) {
|
id_ns->mc = NVME_ID_NS_MC_EXTENDED | NVME_ID_NS_MC_SEPARATE;
|
||||||
id_ns->mc = NVME_ID_NS_MC_EXTENDED | NVME_ID_NS_MC_SEPARATE;
|
|
||||||
|
|
||||||
if (ns->params.mset) {
|
if (ms && ns->params.mset) {
|
||||||
id_ns->flbas |= NVME_ID_NS_FLBAS_EXTENDED;
|
id_ns->flbas |= NVME_ID_NS_FLBAS_EXTENDED;
|
||||||
}
|
|
||||||
|
|
||||||
id_ns->dpc = 0x1f;
|
|
||||||
id_ns->dps = ((ns->params.pil & 0x1) << 3) | ns->params.pi;
|
|
||||||
|
|
||||||
NvmeLBAF lbaf[16] = {
|
|
||||||
[0] = { .ds = 9 },
|
|
||||||
[1] = { .ds = 9, .ms = 8 },
|
|
||||||
[2] = { .ds = 9, .ms = 16 },
|
|
||||||
[3] = { .ds = 9, .ms = 64 },
|
|
||||||
[4] = { .ds = 12 },
|
|
||||||
[5] = { .ds = 12, .ms = 8 },
|
|
||||||
[6] = { .ds = 12, .ms = 16 },
|
|
||||||
[7] = { .ds = 12, .ms = 64 },
|
|
||||||
};
|
|
||||||
|
|
||||||
memcpy(&id_ns->lbaf, &lbaf, sizeof(lbaf));
|
|
||||||
id_ns->nlbaf = 7;
|
|
||||||
} else {
|
|
||||||
NvmeLBAF lbaf[16] = {
|
|
||||||
[0] = { .ds = 9 },
|
|
||||||
[1] = { .ds = 12 },
|
|
||||||
};
|
|
||||||
|
|
||||||
memcpy(&id_ns->lbaf, &lbaf, sizeof(lbaf));
|
|
||||||
id_ns->nlbaf = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
id_ns->dpc = 0x1f;
|
||||||
|
id_ns->dps = ns->params.pi;
|
||||||
|
if (ns->params.pi && ns->params.pil) {
|
||||||
|
id_ns->dps |= NVME_ID_NS_DPS_FIRST_EIGHT;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const NvmeLBAF lbaf[16] = {
|
||||||
|
[0] = { .ds = 9 },
|
||||||
|
[1] = { .ds = 9, .ms = 8 },
|
||||||
|
[2] = { .ds = 9, .ms = 16 },
|
||||||
|
[3] = { .ds = 9, .ms = 64 },
|
||||||
|
[4] = { .ds = 12 },
|
||||||
|
[5] = { .ds = 12, .ms = 8 },
|
||||||
|
[6] = { .ds = 12, .ms = 16 },
|
||||||
|
[7] = { .ds = 12, .ms = 64 },
|
||||||
|
};
|
||||||
|
|
||||||
|
memcpy(&id_ns->lbaf, &lbaf, sizeof(lbaf));
|
||||||
|
id_ns->nlbaf = 7;
|
||||||
|
|
||||||
for (i = 0; i <= id_ns->nlbaf; i++) {
|
for (i = 0; i <= id_ns->nlbaf; i++) {
|
||||||
NvmeLBAF *lbaf = &id_ns->lbaf[i];
|
NvmeLBAF *lbaf = &id_ns->lbaf[i];
|
||||||
if (lbaf->ds == ds) {
|
if (lbaf->ds == ds) {
|
||||||
|
|
Loading…
Reference in New Issue